Chromium Code Reviews| 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 3182df8241a0a1af8b4beca730bb49a980c4776b..c06421bb6cac525f77504ae8f546cd8623aff5ca 100644 |
| --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc |
| @@ -4555,7 +4555,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); |
| } |
| @@ -5638,58 +5647,22 @@ 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); |
| + ProgramManager* manager = GetContextGroup()->program_manager(); |
|
greggman
2012/06/15 08:10:24
you can just use program_manager();
No need to g
dmurph
2012/06/19 01:08:33
Done.
|
| + ShaderCache* cache = manager->GetShaderCache(); |
| + if (cache && |
|
greggman
2012/06/15 08:10:24
If you get rid of the WeakPtr there should ways be
dmurph
2012/06/15 16:40:23
See above comment. This would be the fastest opti
|
| + cache->getShaderCompilationStatus(info->source()->c_str()) |
|
greggman
2012/06/15 08:10:24
style: functions start with UpperCase
|
| + == SHADER_CACHE_COMPILATION_SUCCEEDED) { |
| + info->SetStatus(true, "possible cache hit", translator); |
|
greggman
2012/06/15 08:10:24
I don't think it's valid to set the status string
dmurph
2012/06/19 01:08:33
Done.
|
| + return; |
|
greggman
2012/06/15 08:10:24
the 6 lines above seem like they belong in Program
dmurph
2012/06/19 01:08:33
Well, we need separation between using the cache a
|
| } |
| + |
| + manager->DoCompileShader(info, translator, feature_info_); |
| }; |
| void GLES2DecoderImpl::DoGetShaderiv( |