Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index 956dee098ed19bb61453d53a4c8b55c9da61d0dd..65fc86d2493020f14544ba4461b4bbcb9f983928 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -1097,9 +1097,12 @@ class GLES2DecoderImpl : public GLES2Decoder, |
} |
// Creates a vertex attrib manager for the given vertex array. |
- void CreateVertexAttribManager(GLuint client_id, GLuint service_id) { |
- vertex_array_manager()->CreateVertexAttribManager( |
- client_id, service_id, group_->max_vertex_attribs()); |
+ scoped_refptr<VertexAttribManager> CreateVertexAttribManager( |
+ GLuint client_id, |
+ GLuint service_id, |
+ bool client_visible) { |
+ return vertex_array_manager()->CreateVertexAttribManager( |
+ client_id, service_id, group_->max_vertex_attribs(), client_visible); |
} |
void DoBindAttribLocation(GLuint client_id, GLuint index, const char* name); |
@@ -2347,7 +2350,17 @@ bool GLES2DecoderImpl::Initialize( |
disallowed_features_ = disallowed_features; |
state_.attrib_values.resize(group_->max_vertex_attribs()); |
- state_.default_vertex_attrib_manager = new VertexAttribManager(); |
+ vertex_array_manager_.reset(new VertexArrayManager()); |
+ |
+ GLuint default_vertex_attrib_service_id = 0; |
+ if (features().native_vertex_array_object) { |
+ glGenVertexArraysOES(1, &default_vertex_attrib_service_id); |
+ glBindVertexArrayOES(default_vertex_attrib_service_id); |
+ } |
+ |
+ state_.default_vertex_attrib_manager = |
+ CreateVertexAttribManager(0, default_vertex_attrib_service_id, false); |
+ |
state_.default_vertex_attrib_manager->Initialize( |
group_->max_vertex_attribs(), |
feature_info_->workarounds().init_vertex_attributes); |
@@ -2356,7 +2369,6 @@ bool GLES2DecoderImpl::Initialize( |
DoBindVertexArrayOES(0); |
query_manager_.reset(new QueryManager(this, feature_info_.get())); |
- vertex_array_manager_.reset(new VertexArrayManager()); |
util_.set_num_compressed_texture_formats( |
validators_->compressed_texture_format.GetValues().size()); |
@@ -9684,14 +9696,14 @@ bool GLES2DecoderImpl::GenVertexArraysOESHelper( |
if (!features().native_vertex_array_object) { |
// Emulated VAO |
for (GLsizei ii = 0; ii < n; ++ii) { |
- CreateVertexAttribManager(client_ids[ii], 0); |
+ CreateVertexAttribManager(client_ids[ii], 0, true); |
} |
} else { |
scoped_ptr<GLuint[]> service_ids(new GLuint[n]); |
glGenVertexArraysOES(n, service_ids.get()); |
for (GLsizei ii = 0; ii < n; ++ii) { |
- CreateVertexAttribManager(client_ids[ii], service_ids[ii]); |
+ CreateVertexAttribManager(client_ids[ii], service_ids[ii], true); |
} |
} |
@@ -9714,7 +9726,6 @@ void GLES2DecoderImpl::DeleteVertexArraysOESHelper( |
void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { |
VertexAttribManager* vao = NULL; |
- GLuint service_id = 0; |
if (client_id != 0) { |
vao = GetVertexAttribManager(client_id); |
if (!vao) { |
@@ -9726,8 +9737,6 @@ void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { |
"glBindVertexArrayOES", "bad vertex array id."); |
current_decoder_error_ = error::kNoError; |
return; |
- } else { |
- service_id = vao->service_id(); |
} |
} else { |
vao = state_.default_vertex_attrib_manager.get(); |
@@ -9739,6 +9748,7 @@ void GLES2DecoderImpl::DoBindVertexArrayOES(GLuint client_id) { |
if (!features().native_vertex_array_object) { |
EmulateVertexArrayState(); |
} else { |
+ GLuint service_id = vao->service_id(); |
glBindVertexArrayOES(service_id); |
} |
} |