12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file.
42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <GLES2/gl2.h>
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/containers/hash_tables.h"
11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/macros.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "gles2_impl_export.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gpu {
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace gles2 {
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GLES2Implementation;
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GLES2CmdHelper;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VertexArrayObject;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// VertexArrayObjectManager manages vertex array objects on the client side
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// of the command buffer.
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class GLES2_IMPL_EXPORT VertexArrayObjectManager {
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VertexArrayObjectManager(
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint max_vertex_attribs,
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint array_buffer_id,
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint element_array_buffer_id);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ~VertexArrayObjectManager();
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsReservedId(GLuint id) const;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Binds an element array.
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if service should be called.
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool BindElementArray(GLuint id);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unbind buffer.
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UnbindBuffer(GLuint id);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Geneates array objects for the given ids.
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void GenVertexArrays(GLsizei n, const GLuint* arrays);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Deletes array objects for the given ids.
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void DeleteVertexArrays(GLsizei n, const GLuint* arrays);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Binds a vertex array.
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // changed will be set to true if the service should be called.
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if array is an unknown id.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool BindVertexArray(GLuint array, bool* changed);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // simulated will be set to true if buffers were simulated.
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true service should be called.
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SetupSimulatedClientSideBuffers(
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const char* function_name,
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLES2Implementation* gl,
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLES2CmdHelper* gl_helper,
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei num_elements,
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei primcount,
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool* simulated);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if buffers were setup.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SetupSimulatedIndexAndClientSideBuffers(
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const char* function_name,
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLES2Implementation* gl,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLES2CmdHelper* gl_helper,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei count,
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum type,
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei primcount,
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const void* indices,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint* offset,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      bool* simulated);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool HaveEnabledClientSideBuffers() const;
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetAttribEnable(GLuint index, bool enabled);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetVertexAttrib(GLuint index, GLenum pname, uint32* param);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool GetAttribPointer(GLuint index, GLenum pname, void** ptr) const;
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if error.
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool SetAttribPointer(
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint buffer_id,
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLuint index,
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLint size,
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLenum type,
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLboolean normalized,
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      GLsizei stride,
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const void* ptr);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetAttribDivisor(GLuint index, GLuint divisor);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint bound_element_array_buffer() const;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private:
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  typedef base::hash_map<GLuint, VertexArrayObject*> VertexArrayObjectMap;
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsDefaultVAOBound() const;
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei CollectData(const void* data,
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      GLsizei bytes_per_element,
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      GLsizei real_stride,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      GLsizei num_elements);
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint max_vertex_attribs_;
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint array_buffer_id_;
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei array_buffer_size_;
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei array_buffer_offset_;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLuint element_array_buffer_id_;
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei element_array_buffer_size_;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GLsizei collection_buffer_size_;
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<int8[]> collection_buffer_;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VertexArrayObject* default_vertex_array_object_;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VertexArrayObject* bound_vertex_array_object_;
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  VertexArrayObjectMap vertex_array_objects_;
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(VertexArrayObjectManager);
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gles2
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace gpu
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // GPU_COMMAND_BUFFER_CLIENT_VERTEX_ARRAY_OBJECT_MANAGER_H_
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
127