| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 47428)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
|
| @@ -804,9 +804,6 @@
|
| // Wrapper for glCheckFramebufferStatus
|
| GLenum DoCheckFramebufferStatus(GLenum target);
|
|
|
| - // Helper for CommandBufferEnable cmd.
|
| - void DoCommandBufferEnable(GLenum pname, GLboolean enable);
|
| -
|
| // Wrapper for glCompileShader.
|
| void DoCompileShader(GLuint shader);
|
|
|
| @@ -1079,6 +1076,8 @@
|
| // The last error message set.
|
| std::string last_error_;
|
|
|
| + bool use_shader_translator_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(GLES2DecoderImpl);
|
| };
|
|
|
| @@ -1341,7 +1340,8 @@
|
| active_texture_unit_(0),
|
| black_2d_texture_id_(0),
|
| black_cube_texture_id_(0),
|
| - anti_aliased_(false) {
|
| + anti_aliased_(false),
|
| + use_shader_translator_(true) {
|
| }
|
|
|
| bool GLES2DecoderImpl::Initialize(gfx::GLContext* context,
|
| @@ -2355,7 +2355,9 @@
|
| return error::kInvalidArguments;
|
| }
|
| std::string name_str;
|
| - bucket->GetAsString(&name_str);
|
| + if (!bucket->GetAsString(&name_str)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| glBindAttribLocation(info->service_id(), index, name_str.c_str());
|
| return error::kNoError;
|
| }
|
| @@ -3068,29 +3070,32 @@
|
| const char* shader_src = info->source().c_str();
|
| #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) && !defined(UNIT_TEST)
|
| #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
|
| - int dbg_options = 0;
|
| - EShLanguage language = info->shader_type() == GL_VERTEX_SHADER ?
|
| - EShLangVertex : EShLangFragment;
|
| - TBuiltInResource resources;
|
| - // TODO(alokp): Ask gman how to get appropriate values.
|
| - resources.maxVertexAttribs = 8;
|
| - resources.maxVertexUniformVectors = 128;
|
| - resources.maxVaryingVectors = 8;
|
| - resources.maxVertexTextureImageUnits = 0;
|
| - resources.maxCombinedTextureImageUnits = 8;
|
| - resources.maxTextureImageUnits = 8;
|
| - resources.maxFragmentUniformVectors = 16;
|
| - resources.maxDrawBuffers = 1;
|
| - ShHandle compiler = ShConstructCompiler(language, dbg_options);
|
| - if (!ShCompile(compiler, &shader_src, 1, EShOptNone, &resources,
|
| - dbg_options)) {
|
| - // TODO(alokp): Ask gman where to set compile-status and info-log.
|
| - // May be add member variables to ShaderManager::ShaderInfo?
|
| - //const char* info_log = ShGetInfoLog(compiler);
|
| - ShDestruct(compiler);
|
| - return;
|
| + ShHandle compiler;
|
| + if (use_shader_translator_) {
|
| + int dbg_options = 0;
|
| + EShLanguage language = info->shader_type() == GL_VERTEX_SHADER ?
|
| + EShLangVertex : EShLangFragment;
|
| + TBuiltInResource resources;
|
| + // TODO(alokp): Ask gman how to get appropriate values.
|
| + resources.maxVertexAttribs = group_->max_vertex_attribs();
|
| + resources.maxVertexUniformVectors = 128;
|
| + resources.maxVaryingVectors = 8;
|
| + resources.maxVertexTextureImageUnits = 0;
|
| + resources.maxCombinedTextureImageUnits = group_->max_texture_units();
|
| + resources.maxTextureImageUnits = 8;
|
| + resources.maxFragmentUniformVectors = 16;
|
| + resources.maxDrawBuffers = 1;
|
| + compiler = ShConstructCompiler(language, dbg_options);
|
| + if (!ShCompile(compiler, &shader_src, 1, EShOptNone, &resources,
|
| + dbg_options)) {
|
| + // TODO(alokp): Ask gman where to set compile-status and info-log.
|
| + // May be add member variables to ShaderManager::ShaderInfo?
|
| + // const char* info_log = ShGetInfoLog(compiler);
|
| + ShDestruct(compiler);
|
| + return;
|
| + }
|
| + shader_src = ShGetObjectCode(compiler);
|
| }
|
| - shader_src = ShGetObjectCode(compiler);
|
| #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
|
| #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2
|
|
|
| @@ -3100,7 +3105,9 @@
|
|
|
| #if !defined(GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2) && !defined(UNIT_TEST)
|
| #ifdef GLES2_GPU_SERVICE_TRANSLATE_SHADER
|
| - ShDestruct(compiler);
|
| + if (use_shader_translator_) {
|
| + ShDestruct(compiler);
|
| + }
|
| #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
|
| #endif // GLES2_GPU_SERVICE_BACKEND_NATIVE_GLES2
|
| };
|
| @@ -3494,7 +3501,9 @@
|
| return error::kInvalidArguments;
|
| }
|
| std::string name_str;
|
| - bucket->GetAsString(&name_str);
|
| + if (!bucket->GetAsString(&name_str)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| return GetAttribLocationHelper(
|
| c.program, c.location_shm_id, c.location_shm_offset, name_str);
|
| }
|
| @@ -3559,7 +3568,9 @@
|
| return error::kInvalidArguments;
|
| }
|
| std::string name_str;
|
| - bucket->GetAsString(&name_str);
|
| + if (!bucket->GetAsString(&name_str)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| return GetUniformLocationHelper(
|
| c.program, c.location_shm_id, c.location_shm_offset, name_str);
|
| }
|
| @@ -4278,14 +4289,35 @@
|
| return error::kNoError;
|
| }
|
|
|
| -void GLES2DecoderImpl::DoCommandBufferEnable(GLenum pname, GLboolean enable) {
|
| - switch (pname) {
|
| - case GLES2_ALLOW_BUFFERS_ON_MULTIPLE_TARGETS:
|
| - buffer_manager()->set_allow_buffers_on_multiple_targets(enable != 0);
|
| - break;
|
| - default:
|
| - break;
|
| +error::Error GLES2DecoderImpl::HandleCommandBufferEnable(
|
| + uint32 immediate_data_size, const gles2::CommandBufferEnable& c) {
|
| + Bucket* bucket = GetBucket(c.bucket_id);
|
| + typedef gles2::CommandBufferEnable::Result Result;
|
| + Result* result = GetSharedMemoryAs<Result*>(
|
| + c.result_shm_id, c.result_shm_offset, sizeof(*result));
|
| + if (!result) {
|
| + return error::kOutOfBounds;
|
| }
|
| + // Check that the client initialized the result.
|
| + if (*result != 0) {
|
| + return error::kInvalidArguments;
|
| + }
|
| + std::string feature_str;
|
| + if (!bucket->GetAsString(&feature_str)) {
|
| + return error::kInvalidArguments;
|
| + }
|
| +
|
| + // TODO(gman): make this some kind of table to function pointer thingy.
|
| + if (feature_str.compare(PEPPER3D_ALLOW_BUFFERS_ON_MULTIPLE_TARGETS) == 0) {
|
| + buffer_manager()->set_allow_buffers_on_multiple_targets(true);
|
| + } else if (feature_str.compare(PEPPER3D_SKIP_GLSL_TRANSLATION) == 0) {
|
| + use_shader_translator_ = false;
|
| + } else {
|
| + return error::kNoError;
|
| + }
|
| +
|
| + *result = 1; // true.
|
| + return error::kNoError;
|
| }
|
|
|
| // Include the auto-generated part of this file. We split this because it means
|
|
|