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