Index: gpu/command_buffer/service/shader_translator.cc |
=================================================================== |
--- gpu/command_buffer/service/shader_translator.cc (revision 68245) |
+++ gpu/command_buffer/service/shader_translator.cc (working copy) |
@@ -4,6 +4,8 @@ |
#include "gpu/command_buffer/service/shader_translator.h" |
+#include <string.h> |
+ |
#include "base/at_exit.h" |
#include "base/logging.h" |
@@ -62,7 +64,9 @@ |
namespace gpu { |
namespace gles2 { |
-ShaderTranslator::ShaderTranslator() : compiler_(NULL) { |
+ShaderTranslator::ShaderTranslator() |
+ : compiler_(NULL), |
+ implementation_is_glsl_es_(false) { |
} |
ShaderTranslator::~ShaderTranslator() { |
@@ -72,7 +76,8 @@ |
bool ShaderTranslator::Init(ShShaderType shader_type, |
ShShaderSpec shader_spec, |
- const ShBuiltInResources* resources) { |
+ const ShBuiltInResources* resources, |
+ bool implementation_is_glsl_es) { |
// Make sure Init is called only once. |
DCHECK(compiler_ == NULL); |
DCHECK(shader_type == SH_FRAGMENT_SHADER || shader_type == SH_VERTEX_SHADER); |
@@ -83,6 +88,7 @@ |
return false; |
compiler_ = ShConstructCompiler(shader_type, shader_spec, resources); |
+ implementation_is_glsl_es_ = implementation_is_glsl_es; |
return compiler_ != NULL; |
} |
@@ -96,12 +102,23 @@ |
int compile_options = SH_OBJECT_CODE | SH_ATTRIBUTES_UNIFORMS; |
if (ShCompile(compiler_, &shader, 1, compile_options)) { |
success = true; |
- // Get translated shader. |
- int obj_code_len = 0; |
- ShGetInfo(compiler_, SH_OBJECT_CODE_LENGTH, &obj_code_len); |
- if (obj_code_len > 1) { |
- translated_shader_.reset(new char[obj_code_len]); |
- ShGetObjectCode(compiler_, translated_shader_.get()); |
+ if (!implementation_is_glsl_es_) { |
+ // Get translated shader. |
+ int obj_code_len = 0; |
+ ShGetInfo(compiler_, SH_OBJECT_CODE_LENGTH, &obj_code_len); |
+ if (obj_code_len > 1) { |
+ translated_shader_.reset(new char[obj_code_len]); |
+ ShGetObjectCode(compiler_, translated_shader_.get()); |
+ } |
+ } else { |
+ // Pass down the original shader's source rather than the |
+ // compiler's output. TODO(kbr): once the shader compiler has a |
+ // GLSL ES backend, use its output. |
+ int shader_code_len = 1 + strlen(shader); |
+ if (shader_code_len > 1) { |
+ translated_shader_.reset(new char[shader_code_len]); |
+ strncpy(translated_shader_.get(), shader, shader_code_len); |
+ } |
} |
// Get info for attribs and uniforms. |
GetVariableInfo(compiler_, SH_ACTIVE_ATTRIBUTES, &attrib_map_); |