Index: gpu/command_buffer/service/gles2_cmd_decoder.cc |
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
index 273df90dd028b1d976eceb2aebd1dc6dd97f0de0..9b926bc109bface9d0f388f529fe26c0335215dc 100644 |
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
@@ -4719,7 +4719,16 @@ void GLES2DecoderImpl::DoLinkProgram(GLuint program) { |
return; |
} |
- if (info->Link()) { |
+ ShaderTranslator* vertex_translator = NULL; |
+ ShaderTranslator* fragment_translator = NULL; |
+ if (use_shader_translator_) { |
+ vertex_translator = vertex_translator_; |
+ fragment_translator = fragment_translator_; |
+ } |
+ if (info->Link(shader_manager(), |
+ vertex_translator, |
+ fragment_translator, |
+ feature_info_)) { |
if (info == current_program_.get()) { |
program_manager()->ClearUniforms(info); |
} |
@@ -5812,58 +5821,13 @@ void GLES2DecoderImpl::DoCompileShader(GLuint client_id) { |
if (!info) { |
return; |
} |
- // Translate GL ES 2.0 shader to Desktop GL shader and pass that to |
- // glShaderSource and then glCompileShader. |
- const char* shader_src = info->source() ? info->source()->c_str() : ""; |
ShaderTranslator* translator = NULL; |
if (use_shader_translator_) { |
translator = info->shader_type() == GL_VERTEX_SHADER ? |
vertex_translator_.get() : fragment_translator_.get(); |
- |
- if (!translator->Translate(shader_src)) { |
- info->SetStatus(false, translator->info_log(), NULL); |
- return; |
- } |
- shader_src = translator->translated_shader(); |
- if (!feature_info_->feature_flags().angle_translated_shader_source) |
- info->UpdateTranslatedSource(shader_src); |
- } |
- |
- glShaderSource(info->service_id(), 1, &shader_src, NULL); |
- glCompileShader(info->service_id()); |
- if (feature_info_->feature_flags().angle_translated_shader_source) { |
- GLint max_len = 0; |
- glGetShaderiv(info->service_id(), |
- GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE, |
- &max_len); |
- scoped_array<char> temp(new char[max_len]); |
- GLint len = 0; |
- glGetTranslatedShaderSourceANGLE( |
- info->service_id(), max_len, &len, temp.get()); |
- DCHECK(max_len == 0 || len < max_len); |
- DCHECK(len == 0 || temp[len] == '\0'); |
- info->UpdateTranslatedSource(temp.get()); |
- } |
- |
- GLint status = GL_FALSE; |
- glGetShaderiv(info->service_id(), GL_COMPILE_STATUS, &status); |
- if (status) { |
- info->SetStatus(true, "", translator); |
- } else { |
- // We cannot reach here if we are using the shader translator. |
- // All invalid shaders must be rejected by the translator. |
- // All translated shaders must compile. |
- LOG_IF(ERROR, use_shader_translator_) |
- << "Shader translator allowed/produced an invalid shader."; |
- GLint max_len = 0; |
- glGetShaderiv(info->service_id(), GL_INFO_LOG_LENGTH, &max_len); |
- scoped_array<char> temp(new char[max_len]); |
- GLint len = 0; |
- glGetShaderInfoLog(info->service_id(), max_len, &len, temp.get()); |
- DCHECK(max_len == 0 || len < max_len); |
- DCHECK(len == 0 || temp[len] == '\0'); |
- info->SetStatus(false, std::string(temp.get(), len).c_str(), NULL); |
} |
+ |
+ program_manager()->DoCompileShader(info, translator, feature_info_); |
}; |
void GLES2DecoderImpl::DoGetShaderiv( |