Chromium Code Reviews| 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..d9b13d9d816ba0d02573ec01e482c821d30e18fb 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc |
| @@ -539,6 +539,174 @@ GLES2DecoderPassthroughImpl::GetTranslator(GLenum type) { |
| return nullptr; |
| } |
| +void* GLES2DecoderPassthroughImpl::GetScratchMemory(size_t size) { |
| + if (scratch_memory_.size() < size) { |
| + scratch_memory_.resize(size, 0); |
| + } |
| + return scratch_memory_.data(); |
| +} |
| + |
| +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]( |
|
piman
2016/11/17 21:08:52
nit: this could be a regular template member funct
Geoff Lang
2016/11/17 22:01:15
Done, added a helper.
|
| + 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 |
| +#define INSTANTIATE_PATCH_NUMERIC_RESULTS(type) \ |
| + template error::Error GLES2DecoderPassthroughImpl::PatchGetNumericResults( \ |
| + GLenum, GLsizei, type*) |
| +INSTANTIATE_PATCH_NUMERIC_RESULTS(GLint); |
| +INSTANTIATE_PATCH_NUMERIC_RESULTS(GLint64); |
| +INSTANTIATE_PATCH_NUMERIC_RESULTS(GLfloat); |
| +INSTANTIATE_PATCH_NUMERIC_RESULTS(GLboolean); |
| +#undef INSTANTIATE_PATCH_NUMERIC_RESULTS |
| + |
| +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*>( |