| Index: gpu/command_buffer/service/gles2_cmd_decoder.cc
|
| ===================================================================
|
| --- gpu/command_buffer/service/gles2_cmd_decoder.cc (revision 147496)
|
| +++ gpu/command_buffer/service/gles2_cmd_decoder.cc (working copy)
|
| @@ -38,7 +38,6 @@
|
| #include "gpu/command_buffer/service/gles2_cmd_validation.h"
|
| #include "gpu/command_buffer/service/gpu_switches.h"
|
| #include "gpu/command_buffer/service/mailbox_manager.h"
|
| -#include "gpu/command_buffer/service/program_cache.h"
|
| #include "gpu/command_buffer/service/program_manager.h"
|
| #include "gpu/command_buffer/service/query_manager.h"
|
| #include "gpu/command_buffer/service/renderbuffer_manager.h"
|
| @@ -4720,16 +4719,7 @@
|
| return;
|
| }
|
|
|
| - 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->Link()) {
|
| if (info == current_program_.get()) {
|
| program_manager()->ClearUniforms(info);
|
| }
|
| @@ -5816,13 +5806,58 @@
|
| 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);
|
| }
|
|
|
| - program_manager()->DoCompileShader(info, translator, feature_info_);
|
| + 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);
|
| + }
|
| };
|
|
|
| void GLES2DecoderImpl::DoGetShaderiv(
|
|
|