| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 53644)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
|
| @@ -1143,6 +1143,8 @@
|
| std::string last_error_;
|
|
|
| bool use_shader_translator_;
|
| + void* vertex_compiler_;
|
| + void* fragment_compiler_;
|
|
|
| // Cached from the context group.
|
| const Validators* validators_;
|
| @@ -1408,6 +1410,8 @@
|
| black_cube_texture_id_(0),
|
| anti_aliased_(false),
|
| use_shader_translator_(true),
|
| + vertex_compiler_(NULL),
|
| + fragment_compiler_(NULL),
|
| validators_(group->validators()) {
|
| attrib_0_value_.v[0] = 0.0f;
|
| attrib_0_value_.v[1] = 0.0f;
|
| @@ -1549,15 +1553,39 @@
|
|
|
| #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
|
| // Initialize GLSL ES to GLSL translator.
|
| - static bool glsl_translator_initialized = false;
|
| - if (!glsl_translator_initialized) {
|
| - if (!ShInitialize()) {
|
| - DLOG(ERROR) << "Could not initialize GLSL translator.";
|
| + if (!ShInitialize()) {
|
| + DLOG(ERROR) << "Could not initialize GLSL translator.";
|
| + Destroy();
|
| + return false;
|
| + }
|
| +
|
| + TBuiltInResource resources;
|
| + resources.maxVertexAttribs = group_->max_vertex_attribs();
|
| + resources.maxVertexUniformVectors =
|
| + group_->max_vertex_uniform_vectors();
|
| + resources.maxVaryingVectors = group_->max_varying_vectors();
|
| + resources.maxVertexTextureImageUnits =
|
| + group_->max_vertex_texture_image_units();
|
| + resources.maxCombinedTextureImageUnits = group_->max_texture_units();
|
| + resources.maxTextureImageUnits = group_->max_texture_image_units();
|
| + resources.maxFragmentUniformVectors =
|
| + group_->max_fragment_uniform_vectors();
|
| + resources.maxDrawBuffers = 1;
|
| + vertex_compiler_ = ShConstructCompiler(EShLangVertex, EShSpecGLES2,
|
| + &resources);
|
| + if (vertex_compiler_ == NULL) {
|
| + DLOG(ERROR) << "Could not create vertex shader translator.";
|
| Destroy();
|
| return false;
|
| - }
|
| - glsl_translator_initialized = true;
|
| }
|
| + fragment_compiler_ = ShConstructCompiler(EShLangFragment, EShSpecGLES2,
|
| + &resources);
|
| + if (fragment_compiler_ == NULL) {
|
| + DLOG(ERROR) << "Could not create fragment shader translator.";
|
| + Destroy();
|
| + return false;
|
| + }
|
| +
|
| #endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
|
|
|
| return true;
|
| @@ -1883,6 +1911,18 @@
|
| }
|
|
|
| void GLES2DecoderImpl::Destroy() {
|
| +#if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
|
| + if (vertex_compiler_ != NULL) {
|
| + ShDestruct(vertex_compiler_);
|
| + vertex_compiler_ = NULL;
|
| + }
|
| + if (fragment_compiler_ != NULL) {
|
| + ShDestruct(fragment_compiler_);
|
| + fragment_compiler_ = NULL;
|
| + }
|
| + ShFinalize();
|
| +#endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER)
|
| +
|
| if (context_.get()) {
|
| MakeCurrent();
|
|
|
| @@ -3285,28 +3325,13 @@
|
| // glShaderSource and then glCompileShader.
|
| const char* shader_src = info->source().c_str();
|
| #if defined(GLES2_GPU_SERVICE_TRANSLATE_SHADER)
|
| - ShHandle compiler = 0;
|
| if (use_shader_translator_) {
|
| int dbg_options = 0;
|
| - EShLanguage language = info->shader_type() == GL_VERTEX_SHADER ?
|
| - EShLangVertex : EShLangFragment;
|
| - TBuiltInResource resources;
|
| - resources.maxVertexAttribs = group_->max_vertex_attribs();
|
| - resources.maxVertexUniformVectors =
|
| - group_->max_vertex_uniform_vectors();
|
| - resources.maxVaryingVectors = group_->max_varying_vectors();
|
| - resources.maxVertexTextureImageUnits =
|
| - group_->max_vertex_texture_image_units();
|
| - resources.maxCombinedTextureImageUnits = group_->max_texture_units();
|
| - resources.maxTextureImageUnits = group_->max_texture_image_units();
|
| - resources.maxFragmentUniformVectors =
|
| - group_->max_fragment_uniform_vectors();
|
| - resources.maxDrawBuffers = 1;
|
| - compiler = ShConstructCompiler(language, dbg_options);
|
| - if (!ShCompile(compiler, &shader_src, 1, EShOptNone, &resources,
|
| - dbg_options)) {
|
| + ShHandle compiler = info->shader_type() == GL_VERTEX_SHADER ?
|
| + vertex_compiler_ : fragment_compiler_;
|
| +
|
| + if (!ShCompile(compiler, &shader_src, 1, EShOptNone, dbg_options)) {
|
| info->SetStatus(false, ShGetInfoLog(compiler));
|
| - ShDestruct(compiler);
|
| return;
|
| }
|
| shader_src = ShGetObjectCode(compiler);
|
| @@ -3326,11 +3351,6 @@
|
| glGetShaderInfoLog(info->service_id(), len, &len, temp.get());
|
| info->SetStatus(false, std::string(temp.get(), len));
|
| }
|
| -#ifdef GLES2_GPU_SERVICE_TRANSLATE_SHADER
|
| - if (use_shader_translator_) {
|
| - ShDestruct(compiler);
|
| - }
|
| -#endif // GLES2_GPU_SERVICE_TRANSLATE_SHADER
|
| };
|
|
|
| void GLES2DecoderImpl::DoGetShaderiv(
|
|
|