Index: gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc |
index 12e6e006d30bcb5544f4be1ea6baf0e8dbd51f4e..4e3c13b29378fc80430e2515224770ebefad5c09 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc |
@@ -539,6 +539,175 @@ GLES2DecoderPassthroughImpl::GetTranslator(GLenum type) { |
return nullptr; |
} |
+template <typename T> |
+error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults(GLenum pname, |
+ GLsizei length, |
+ T* params) { |
+ // Likely a gl error if no parameters were returned |
+ if (length < 1) { |
+ return error::kNoError; |
+ } |
+ |
+ auto get_binding_client_id = [this]( |
+ const ClientServiceMap<GLuint, GLuint>* map, T service_id, T* result) { |
+ GLuint client_id = 0; |
+ if (!map->GetClientID(static_cast<GLuint>(service_id), &client_id)) { |
+ return false; |
+ } |
+ *result = static_cast<T>(client_id); |
+ return true; |
+ }; |
+ |
+ switch (pname) { |
+ case GL_NUM_EXTENSIONS: |
+ *params = *params + static_cast<T>(emulated_extensions_.size()); |
+ break; |
+ |
+ case GL_TEXTURE_BINDING_2D: |
+ case GL_TEXTURE_BINDING_CUBE_MAP: |
+ case GL_TEXTURE_BINDING_2D_ARRAY: |
+ case GL_TEXTURE_BINDING_3D: |
+ if (!get_binding_client_id(&resources_->texture_id_map, *params, |
+ params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_ARRAY_BUFFER_BINDING: |
+ case GL_ELEMENT_ARRAY_BUFFER_BINDING: |
+ case GL_PIXEL_PACK_BUFFER_BINDING: |
+ case GL_PIXEL_UNPACK_BUFFER_BINDING: |
+ case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: |
+ case GL_COPY_READ_BUFFER_BINDING: |
+ case GL_COPY_WRITE_BUFFER_BINDING: |
+ case GL_UNIFORM_BUFFER_BINDING: |
+ if (!get_binding_client_id(&resources_->buffer_id_map, *params, params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_RENDERBUFFER_BINDING: |
+ if (!get_binding_client_id(&resources_->renderbuffer_id_map, *params, |
+ params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_SAMPLER_BINDING: |
+ if (!get_binding_client_id(&resources_->sampler_id_map, *params, |
+ params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_ACTIVE_PROGRAM: |
+ if (!get_binding_client_id(&resources_->program_id_map, *params, |
+ params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_FRAMEBUFFER_BINDING: |
+ case GL_READ_FRAMEBUFFER_BINDING: |
+ if (!get_binding_client_id(&framebuffer_id_map_, *params, params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_TRANSFORM_FEEDBACK_BINDING: |
+ if (!get_binding_client_id(&transform_feedback_id_map_, *params, |
+ params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ case GL_VERTEX_ARRAY_BINDING: |
+ if (!get_binding_client_id(&vertex_array_id_map_, *params, params)) { |
+ return error::kInvalidArguments; |
+ } |
+ break; |
+ |
+ default: |
+ break; |
+ } |
+ |
+ return error::kNoError; |
+} |
+ |
+// Instantiate templated functions |
+template error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults( |
+ GLenum pname, |
+ GLsizei length, |
+ GLint* params); |
+template error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults( |
+ GLenum pname, |
+ GLsizei length, |
+ GLint64* params); |
+template error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults( |
+ GLenum pname, |
+ GLsizei length, |
+ GLfloat* params); |
+template error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults( |
+ GLenum pname, |
+ GLsizei length, |
+ GLboolean* params); |
+ |
+error::Error |
+GLES2DecoderPassthroughImpl::PatchGetFramebufferAttachmentParameter( |
+ GLenum target, |
+ GLenum attachment, |
+ GLenum pname, |
+ GLsizei length, |
+ GLint* params) { |
+ // Likely a gl error if no parameters were returned |
+ if (length < 1) { |
+ return error::kNoError; |
+ } |
+ |
+ switch (pname) { |
+ // If the attached object name was requested, it needs to be converted back |
+ // to a client id. |
+ case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME: { |
+ GLint object_type = GL_NONE; |
+ glGetFramebufferAttachmentParameterivEXT( |
+ target, attachment, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, |
+ &object_type); |
+ |
+ switch (object_type) { |
+ case GL_TEXTURE: { |
+ GLuint client_id = 0; |
+ if (!resources_->texture_id_map.GetClientID(*params, &client_id)) { |
+ return error::kInvalidArguments; |
+ } |
+ *params = static_cast<GLint>(client_id); |
+ } break; |
+ |
+ case GL_RENDERBUFFER: { |
+ GLuint client_id = 0; |
+ if (!resources_->renderbuffer_id_map.GetClientID(*params, |
+ &client_id)) { |
+ return error::kInvalidArguments; |
+ } |
+ *params = static_cast<GLint>(client_id); |
+ } break; |
+ |
+ case GL_NONE: |
+ // Default framebuffer, don't transform the result |
+ break; |
+ |
+ default: |
+ NOTREACHED(); |
+ break; |
+ } |
+ } break; |
+ |
+ default: |
+ break; |
+ } |
+ |
+ return error::kNoError; |
+} |
+ |
void GLES2DecoderPassthroughImpl::BuildExtensionsString() { |
std::ostringstream combined_string_stream; |
combined_string_stream << reinterpret_cast<const char*>( |