| 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*>(
|
|
|