#ifndef GPU_COMMAND_BUFFER_SERVICE_VERTEX_ARRAY_MANAGER_H_
#define GPU_COMMAND_BUFFER_SERVICE_VERTEX_ARRAY_MANAGER_H_
#include <stdint.h>
#include <unordered_map>
#include "base/memory/ref_counted.h"
#include "gpu/command_buffer/service/gl_utils.h"
#include "gpu/gpu_gles2_export.h"
namespace gpu {
namespace gles2 {
class VertexAttribManager;
class GPU_GLES2_EXPORT VertexArrayManager {
public:
VertexArrayManager();
VertexArrayManager(const VertexArrayManager&) = delete;
VertexArrayManager& operator=(const VertexArrayManager&) = delete;
~VertexArrayManager();
void Destroy(bool have_context);
void MarkContextLost() { have_context_ = false; }
scoped_refptr<VertexAttribManager> CreateVertexAttribManager(
GLuint client_id,
GLuint service_id,
uint32_t num_vertex_attribs,
bool client_visible,
bool do_buffer_refcounting);
VertexAttribManager* GetVertexAttribManager(GLuint client_id);
void RemoveVertexAttribManager(GLuint client_id);
bool GetClientId(GLuint service_id, GLuint* client_id) const;
private:
friend class VertexAttribManager;
void StartTracking(VertexAttribManager* vertex_attrib_manager);
void StopTracking(VertexAttribManager* vertex_attrib_manager);
typedef std::unordered_map<GLuint, scoped_refptr<VertexAttribManager>>
VertexAttribManagerMap;
VertexAttribManagerMap client_vertex_attrib_managers_;
std::vector<scoped_refptr<VertexAttribManager>> other_vertex_attrib_managers_;
unsigned int vertex_attrib_manager_count_;
bool have_context_;
};
}
}
#endif