Chromium Code Reviews| 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 b9da39a4b959df1c0eaa3d78051826fe76b2514e..1b8837e12499713cc635e42cf6f18e5efd65b2b0 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc |
| @@ -1015,7 +1015,24 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformBlockName( |
| GLuint program, |
| GLuint index, |
| std::string* name) { |
| - NOTIMPLEMENTED(); |
| + FlushErrors(); |
| + |
| + GLint active_uniform_block_max_length = 0; |
|
Zhenyao Mo
2017/03/23 17:02:46
nit: should be *max_name_length.
Geoff Lang
2017/03/23 17:39:44
Done.
|
| + glGetProgramiv(GetProgramServiceID(program, resources_), |
| + GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH, |
| + &active_uniform_block_max_length); |
| + |
| + if (FlushErrors() || active_uniform_block_max_length) { |
| + return error::kNoError; |
| + } |
| + |
| + std::vector<GLchar> buffer(active_uniform_block_max_length, 0); |
| + GLsizei length = 0; |
| + glGetActiveUniformBlockName(GetProgramServiceID(program, resources_), index, |
|
Zhenyao Mo
2017/03/23 17:02:46
Can we cache the service_id above so we don't have
Geoff Lang
2017/03/23 17:39:44
Done.
|
| + active_uniform_block_max_length, &length, |
| + buffer.data()); |
| + *name = length > 0 ? std::string(buffer.data()) : std::string(); |
|
Zhenyao Mo
2017/03/23 17:02:46
To be on the safe side, can we DCHECK length < act
Zhenyao Mo
2017/03/23 17:02:46
nit: can we DCHECK(name) before using it?
Geoff Lang
2017/03/23 17:39:43
name is safe to use, it is a local variable from t
Geoff Lang
2017/03/23 17:39:44
Done.
|
| + |
| return error::kNoError; |
| } |
| @@ -1024,10 +1041,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetActiveUniformsiv( |
| GLsizei count, |
| const GLuint* indices, |
| GLenum pname, |
| - GLsizei bufSize, |
| - GLsizei* length, |
| GLint* params) { |
| - NOTIMPLEMENTED(); |
| + glGetActiveUniformsiv(GetProgramServiceID(program, resources_), count, |
| + indices, pname, params); |
| return error::kNoError; |
| } |
| @@ -1036,7 +1052,8 @@ error::Error GLES2DecoderPassthroughImpl::DoGetAttachedShaders( |
| GLsizei maxcount, |
| GLsizei* count, |
| GLuint* shaders) { |
| - NOTIMPLEMENTED(); |
| + glGetAttachedShaders(GetProgramServiceID(program, resources_), maxcount, |
| + count, shaders); |
| return error::kNoError; |
| } |
| @@ -1214,10 +1231,15 @@ error::Error GLES2DecoderPassthroughImpl::DoGetProgramiv(GLuint program, |
| error::Error GLES2DecoderPassthroughImpl::DoGetProgramInfoLog( |
| GLuint program, |
| std::string* infolog) { |
| + FlushErrors(); |
| GLint info_log_len = 0; |
| glGetProgramiv(GetProgramServiceID(program, resources_), GL_INFO_LOG_LENGTH, |
| &info_log_len); |
| + if (FlushErrors()) { |
| + return error::kNoError; |
| + } |
| + |
| std::vector<char> buffer(info_log_len, 0); |
| glGetProgramInfoLog(GetProgramServiceID(program, resources_), info_log_len, |
| nullptr, buffer.data()); |
| @@ -1270,9 +1292,15 @@ error::Error GLES2DecoderPassthroughImpl::DoGetShaderiv(GLuint shader, |
| error::Error GLES2DecoderPassthroughImpl::DoGetShaderInfoLog( |
| GLuint shader, |
| std::string* infolog) { |
| + FlushErrors(); |
| + |
| GLuint service_id = GetShaderServiceID(shader, resources_); |
| GLint info_log_len = 0; |
| glGetShaderiv(service_id, GL_INFO_LOG_LENGTH, &info_log_len); |
| + if (FlushErrors()) { |
| + return error::kNoError; |
| + } |
| + |
| std::vector<char> buffer(info_log_len, 0); |
| glGetShaderInfoLog(service_id, info_log_len, nullptr, buffer.data()); |
| *infolog = info_log_len > 0 ? std::string(buffer.data()) : std::string(); |
| @@ -1294,7 +1322,20 @@ error::Error GLES2DecoderPassthroughImpl::DoGetShaderPrecisionFormat( |
| error::Error GLES2DecoderPassthroughImpl::DoGetShaderSource( |
| GLuint shader, |
| std::string* source) { |
| - NOTIMPLEMENTED(); |
| + FlushErrors(); |
| + |
| + GLint shader_source_length = 0; |
| + glGetShaderiv(GetShaderServiceID(shader, resources_), GL_SHADER_SOURCE_LENGTH, |
| + &shader_source_length); |
| + if (FlushErrors()) { |
| + return error::kNoError; |
| + } |
| + |
| + std::vector<char> buffer(shader_source_length, 0); |
| + glGetShaderSource(GetShaderServiceID(shader, resources_), |
| + shader_source_length, nullptr, buffer.data()); |
| + *source = |
| + shader_source_length > 0 ? std::string(buffer.data()) : std::string(); |
|
Zhenyao Mo
2017/03/23 17:02:46
Same suggestions here.
Geoff Lang
2017/03/23 17:39:44
Done.
|
| return error::kNoError; |
| } |
| @@ -1376,7 +1417,8 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformBlockIndex( |
| GLuint program, |
| const char* name, |
| GLint* index) { |
| - NOTIMPLEMENTED(); |
| + *index = |
| + glGetUniformBlockIndex(GetProgramServiceID(program, resources_), name); |
| return error::kNoError; |
| } |
| @@ -1421,9 +1463,9 @@ error::Error GLES2DecoderPassthroughImpl::DoGetUniformIndices( |
| GLsizei count, |
| const char* const* names, |
| GLsizei bufSize, |
| - GLsizei* length, |
| GLuint* indices) { |
| - NOTIMPLEMENTED(); |
| + glGetUniformIndices(GetProgramServiceID(program, resources_), count, names, |
| + indices); |
| return error::kNoError; |
| } |
| @@ -1535,7 +1577,6 @@ error::Error GLES2DecoderPassthroughImpl::DoInvalidateSubFramebuffer( |
| error::Error GLES2DecoderPassthroughImpl::DoIsBuffer(GLuint buffer, |
| uint32_t* result) { |
| - NOTIMPLEMENTED(); |
| *result = glIsBuffer(GetBufferServiceID(buffer, resources_, false)); |
| return error::kNoError; |
| } |
| @@ -1561,7 +1602,6 @@ error::Error GLES2DecoderPassthroughImpl::DoIsProgram(GLuint program, |
| error::Error GLES2DecoderPassthroughImpl::DoIsRenderbuffer(GLuint renderbuffer, |
| uint32_t* result) { |
| - NOTIMPLEMENTED(); |
| *result = glIsRenderbufferEXT( |
| GetRenderbufferServiceID(renderbuffer, resources_, false)); |
| return error::kNoError; |
| @@ -1722,7 +1762,11 @@ error::Error GLES2DecoderPassthroughImpl::DoShaderBinary(GLsizei n, |
| GLenum binaryformat, |
| const void* binary, |
| GLsizei length) { |
| - NOTIMPLEMENTED(); |
| + std::vector<GLuint> service_shaders(n, 0); |
| + for (GLsizei i = 0; i < n; i++) { |
| + service_shaders[i] = GetShaderServiceID(shaders[i], resources_); |
| + } |
| + glShaderBinary(n, service_shaders.data(), binaryformat, binary, length); |
| return error::kNoError; |
| } |
| @@ -2380,7 +2424,9 @@ error::Error GLES2DecoderPassthroughImpl::DoFramebufferTexture2DMultisampleEXT( |
| GLuint texture, |
| GLint level, |
| GLsizei samples) { |
| - NOTIMPLEMENTED(); |
| + glFramebufferTexture2DMultisampleEXT( |
| + target, attachment, textarget, |
| + GetTextureServiceID(texture, resources_, false), level, samples); |
| return error::kNoError; |
| } |