Index: gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc |
index 5f4cb99091026cf42e266459d350ca665a729bdb..77049c59825abe6c706a63a4bbe3ae01af7ed6c3 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc |
@@ -136,13 +136,23 @@ |
} |
GLuint GetTransformFeedbackServiceID(GLuint client_id, |
- ClientServiceMap<GLuint, GLuint>* id_map) { |
- return id_map->GetServiceIDOrInvalid(client_id); |
+ ClientServiceMap<GLuint, GLuint>* id_map, |
+ bool create_if_missing) { |
+ return GetServiceID(client_id, id_map, create_if_missing, []() { |
+ GLuint service_id = 0; |
+ glGenTransformFeedbacks(1, &service_id); |
+ return service_id; |
+ }); |
} |
GLuint GetVertexArrayServiceID(GLuint client_id, |
- ClientServiceMap<GLuint, GLuint>* id_map) { |
- return id_map->GetServiceIDOrInvalid(client_id); |
+ ClientServiceMap<GLuint, GLuint>* id_map, |
+ bool create_if_missing) { |
+ return GetServiceID(client_id, id_map, create_if_missing, []() { |
+ GLuint service_id = 0; |
+ glGenVertexArraysOES(1, &service_id); |
+ return service_id; |
+ }); |
} |
GLuint GetProgramServiceID(GLuint client_id, PassthroughResources* resources) { |
@@ -280,7 +290,8 @@ |
GLuint transformfeedback) { |
glBindTransformFeedback( |
target, GetTransformFeedbackServiceID(transformfeedback, |
- &transform_feedback_id_map_)); |
+ &transform_feedback_id_map_, |
+ bind_generates_resource_)); |
return error::kNoError; |
} |
@@ -712,9 +723,20 @@ |
GLenum attachment, |
GLenum renderbuffertarget, |
GLuint renderbuffer) { |
- glFramebufferRenderbufferEXT( |
- target, attachment, renderbuffertarget, |
- GetRenderbufferServiceID(renderbuffer, resources_, false)); |
+ // TODO(geofflang): Handle this case in ANGLE by adding a WebGL validation |
+ // mode. |
+ if (attachment == GL_DEPTH_STENCIL_ATTACHMENT) { |
+ glFramebufferRenderbufferEXT( |
+ target, GL_DEPTH_ATTACHMENT, renderbuffertarget, |
+ GetRenderbufferServiceID(renderbuffer, resources_, false)); |
+ glFramebufferRenderbufferEXT( |
+ target, GL_STENCIL_ATTACHMENT, renderbuffertarget, |
+ GetRenderbufferServiceID(renderbuffer, resources_, false)); |
+ } else { |
+ glFramebufferRenderbufferEXT( |
+ target, attachment, renderbuffertarget, |
+ GetRenderbufferServiceID(renderbuffer, resources_, false)); |
+ } |
return error::kNoError; |
} |
@@ -1322,7 +1344,7 @@ |
GLuint transformfeedback, |
uint32_t* result) { |
*result = glIsTransformFeedback(GetTransformFeedbackServiceID( |
- transformfeedback, &transform_feedback_id_map_)); |
+ transformfeedback, &transform_feedback_id_map_, false)); |
return error::kNoError; |
} |
@@ -2187,13 +2209,14 @@ |
error::Error GLES2DecoderPassthroughImpl::DoIsVertexArrayOES(GLuint array, |
uint32_t* result) { |
- *result = |
- glIsVertexArrayOES(GetVertexArrayServiceID(array, &vertex_array_id_map_)); |
+ *result = glIsVertexArrayOES( |
+ GetVertexArrayServiceID(array, &vertex_array_id_map_, false)); |
return error::kNoError; |
} |
error::Error GLES2DecoderPassthroughImpl::DoBindVertexArrayOES(GLuint array) { |
- glBindVertexArrayOES(GetVertexArrayServiceID(array, &vertex_array_id_map_)); |
+ glBindVertexArrayOES(GetVertexArrayServiceID(array, &vertex_array_id_map_, |
+ bind_generates_resource_)); |
return error::kNoError; |
} |