Home | History | Annotate | Download | only in client
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
      6 #define GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
      7 
      8 #include <GLES2/gl2.h>
      9 #include "base/containers/hash_tables.h"
     10 #include "base/memory/scoped_ptr.h"
     11 #include "gles2_impl_export.h"
     12 #include "gpu/command_buffer/common/types.h"
     13 
     14 namespace gpu {
     15 namespace gles2 {
     16 
     17 class GLES2Implementation;
     18 class GLES2CmdHelper;
     19 class VertexArrayObject;
     20 
     21 // VertexArrayObjectManager manages vertex array objects on the client side
     22 // of the command buffer.
     23 class GLES2_IMPL_EXPORT VertexArrayObjectManager {
     24  public:
     25   VertexArrayObjectManager(
     26       GLuint max_vertex_attribs,
     27       GLuint array_buffer_id,
     28       GLuint element_array_buffer_id);
     29   ~VertexArrayObjectManager();
     30 
     31   bool IsReservedId(GLuint id) const;
     32 
     33   // Binds an element array.
     34   // Returns true if service should be called.
     35   bool BindElementArray(GLuint id);
     36 
     37   // Unbind buffer.
     38   void UnbindBuffer(GLuint id);
     39 
     40   // Geneates array objects for the given ids.
     41   void GenVertexArrays(GLsizei n, const GLuint* arrays);
     42 
     43   // Deletes array objects for the given ids.
     44   void DeleteVertexArrays(GLsizei n, const GLuint* arrays);
     45 
     46   // Binds a vertex array.
     47   // changed will be set to true if the service should be called.
     48   // Returns false if array is an unknown id.
     49   bool BindVertexArray(GLuint array, bool* changed);
     50 
     51   // simulated will be set to true if buffers were simulated.
     52   // Returns true service should be called.
     53   bool SetupSimulatedClientSideBuffers(
     54       const char* function_name,
     55       GLES2Implementation* gl,
     56       GLES2CmdHelper* gl_helper,
     57       GLsizei num_elements,
     58       GLsizei primcount,
     59       bool* simulated);
     60 
     61   // Returns true if buffers were setup.
     62   bool SetupSimulatedIndexAndClientSideBuffers(
     63       const char* function_name,
     64       GLES2Implementation* gl,
     65       GLES2CmdHelper* gl_helper,
     66       GLsizei count,
     67       GLenum type,
     68       GLsizei primcount,
     69       const void* indices,
     70       GLuint* offset,
     71       bool* simulated);
     72 
     73   bool HaveEnabledClientSideBuffers() const;
     74 
     75   void SetAttribEnable(GLuint index, bool enabled);
     76 
     77   bool GetVertexAttrib(GLuint index, GLenum pname, uint32* param);
     78 
     79   bool GetAttribPointer(GLuint index, GLenum pname, void** ptr) const;
     80 
     81   // Returns false if error.
     82   bool SetAttribPointer(
     83       GLuint buffer_id,
     84       GLuint index,
     85       GLint size,
     86       GLenum type,
     87       GLboolean normalized,
     88       GLsizei stride,
     89       const void* ptr);
     90 
     91   void SetAttribDivisor(GLuint index, GLuint divisor);
     92 
     93   GLuint bound_element_array_buffer() const;
     94 
     95  private:
     96   typedef base::hash_map<GLuint, VertexArrayObject*> VertexArrayObjectMap;
     97 
     98   bool IsDefaultVAOBound() const;
     99 
    100   GLsizei CollectData(const void* data,
    101                       GLsizei bytes_per_element,
    102                       GLsizei real_stride,
    103                       GLsizei num_elements);
    104 
    105   GLuint max_vertex_attribs_;
    106   GLuint array_buffer_id_;
    107   GLsizei array_buffer_size_;
    108   GLsizei array_buffer_offset_;
    109   GLuint element_array_buffer_id_;
    110   GLsizei element_array_buffer_size_;
    111   GLsizei collection_buffer_size_;
    112   scoped_ptr<int8[]> collection_buffer_;
    113 
    114   VertexArrayObject* default_vertex_array_object_;
    115   VertexArrayObject* bound_vertex_array_object_;
    116   VertexArrayObjectMap vertex_array_objects_;
    117 
    118   DISALLOW_COPY_AND_ASSIGN(VertexArrayObjectManager);
    119 };
    120 
    121 }  // namespace gles2
    122 }  // namespace gpu
    123 
    124 #endif  // GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
    125 
    126