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