summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorzmo@google.com <zmo@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-05 00:09:36 +0000
committerzmo@google.com <zmo@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2011-10-05 00:09:36 +0000
commitd6a53e4cba5710d51b1cab1f34d9f76a5fcf04c7 (patch)
treeb11e1e89beb1d7a49df291e99b2a0f253d0a61bf /gpu
parent439d75cecba1d3947b405c07b41e3986091b688b (diff)
downloadchromium_src-d6a53e4cba5710d51b1cab1f34d9f76a5fcf04c7.zip
chromium_src-d6a53e4cba5710d51b1cab1f34d9f76a5fcf04c7.tar.gz
chromium_src-d6a53e4cba5710d51b1cab1f34d9f76a5fcf04c7.tar.bz2
Implement 'ANGLE_translated_shader_source' extension in command-buffer.
This works with ANGLE r780. So if it's on top of ANGLE, query the translated HLSL using ANGLE's GetTranslatedShaderSource extension; otherwise, return the cached translated shader source from ANGLE shader translator. BUG=95531 TEST=unittest Review URL: http://codereview.chromium.org/8120020 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104036 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r--gpu/GLES2/gl2ext.h15
-rwxr-xr-xgpu/command_buffer/build_gles2_cmd_buffer.py12
-rw-r--r--gpu/command_buffer/client/gles2_c_lib_autogen.h5
-rw-r--r--gpu/command_buffer/client/gles2_cmd_helper_autogen.h6
-rw-r--r--gpu/command_buffer/client/gles2_implementation_autogen.h25
-rw-r--r--gpu/command_buffer/common/gl_mock.h3
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_autogen.h38
-rw-r--r--gpu/command_buffer/common/gles2_cmd_format_test_autogen.h16
-rw-r--r--gpu/command_buffer/common/gles2_cmd_ids_autogen.h1
-rw-r--r--gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h3
-rw-r--r--gpu/command_buffer/service/feature_info.cc1
-rw-r--r--gpu/command_buffer/service/feature_info_unittest.cc2
-rw-r--r--gpu/command_buffer/service/gl_utils.h3
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc43
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h1
-rw-r--r--gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h1
-rw-r--r--gpu/command_buffer/service/shader_manager.h15
-rw-r--r--gpu/command_buffer/service/shader_manager_unittest.cc7
18 files changed, 192 insertions, 5 deletions
diff --git a/gpu/GLES2/gl2ext.h b/gpu/GLES2/gl2ext.h
index fe9d2f4..67bd0cc 100644
--- a/gpu/GLES2/gl2ext.h
+++ b/gpu/GLES2/gl2ext.h
@@ -1079,6 +1079,21 @@ typedef void (GL_APIENTRYP PFNGLENABLEFEATURECHROMIUM) (const GLchar *feature);
#endif
#endif
+/* GL_ANGLE_translated_shader_source */
+#ifndef GL_ANGLE_translated_shader_source
+#define GL_ANGLE_translated_shader_source 1
+#ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
+#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x6900
+#endif
+#ifdef GL_GLEXT_PROTOTYPES
+#define glGetTranslatedShaderSourceANGLE GLES2_GET_FUN(GetTranslatedShaderSourceANGLE)
+#if !defined(GLES2_USE_CPP_BINDINGS)
+GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
+#endif
+#endif
+typedef void (GL_APIENTRYP PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC) (GLuint shader, GLsizei bufsize, GLsizei* length, GLchar* source);
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 00c152b..22d22a9 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -223,6 +223,7 @@ GL_APICALL void GL_APIENTRY glPlaceholder447CHROMIUM (void);
GL_APICALL GLuint GL_APIENTRY glCreateStreamTextureCHROMIUM (GLuint texture);
GL_APICALL void GL_APIENTRY glDestroyStreamTextureCHROMIUM (GLuint texture);
GL_APICALL void GL_APIENTRY glPlaceholder453CHROMIUM (void);
+GL_APICALL void GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLidShader shader, GLsizeiNotNegative bufsize, GLsizei* length, char* source);
"""
# This is the list of all commmands that will be generated and their Id.
@@ -431,6 +432,7 @@ _CMD_ID_TABLE = {
'Placeholder453CHROMIUM': 453,
'GetMultipleIntegervCHROMIUM': 454,
'GetProgramInfoCHROMIUM': 455,
+ 'GetTranslatedShaderSourceANGLE': 456,
}
# This is a list of enum names and their valid values. It is used to map
@@ -831,6 +833,7 @@ _ENUM_LISTS = {
'GL_COMPILE_STATUS',
'GL_INFO_LOG_LENGTH',
'GL_SHADER_SOURCE_LENGTH',
+ 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
],
},
'ShaderPrecision': {
@@ -1424,6 +1427,12 @@ _FUNCTION_INFO = {
},
'GetTexParameterfv': {'type': 'GETn', 'result': ['SizedResult<GLfloat>']},
'GetTexParameteriv': {'type': 'GETn', 'result': ['SizedResult<GLint>']},
+ 'GetTranslatedShaderSourceANGLE': {
+ 'type': 'STRn',
+ 'get_len_func': 'DoGetShaderiv',
+ 'get_len_enum': 'GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE',
+ 'unit_test': False,
+ },
'GetUniformfv': {
'type': 'Custom',
'immediate': False,
@@ -4169,7 +4178,8 @@ TEST_F(%(test_name)s, %(name)sInvalidArgsBadSharedMemoryId) {
class STRnHandler(TypeHandler):
- """Handler for GetProgramInfoLog, GetShaderInfoLog and GetShaderSource."""
+ """Handler for GetProgramInfoLog, GetShaderInfoLog, GetShaderSource, and
+ GetTranslatedShaderSourceANGLE."""
def __init__(self):
TypeHandler.__init__(self)
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index 265b4fe..e046662 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -581,6 +581,11 @@ GLuint GLES2CreateStreamTextureCHROMIUM(GLuint texture) {
void GLES2DestroyStreamTextureCHROMIUM(GLuint texture) {
gles2::GetGLContext()->DestroyStreamTextureCHROMIUM(texture);
}
+void GLES2GetTranslatedShaderSourceANGLE(
+ GLuint shader, GLsizei bufsize, GLsizei* length, char* source) {
+ gles2::GetGLContext()->GetTranslatedShaderSourceANGLE(
+ shader, bufsize, length, source);
+}
#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_C_LIB_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index 82bf39a..0705fb3 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -1241,5 +1241,11 @@
c.Init(texture);
}
+ void GetTranslatedShaderSourceANGLE(GLuint shader, uint32 bucket_id) {
+ gles2::GetTranslatedShaderSourceANGLE& c =
+ GetCmdSpace<gles2::GetTranslatedShaderSourceANGLE>();
+ c.Init(shader, bucket_id);
+ }
+
#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_CMD_HELPER_AUTOGEN_H_
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index fc2dc5c..46c01c0 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1272,5 +1272,30 @@ GLuint CreateStreamTextureCHROMIUM(GLuint texture);
void DestroyStreamTextureCHROMIUM(GLuint texture);
+void GetTranslatedShaderSourceANGLE(
+ GLuint shader, GLsizei bufsize, GLsizei* length, char* source) {
+ GPU_CLIENT_VALIDATE_DESTINATION_INITALIZATION(GLsizei, length);
+ GPU_CLIENT_LOG("[" << this << "] glGetTranslatedShaderSourceANGLE" << "("
+ << shader << ", "
+ << bufsize << ", "
+ << static_cast<void*>(length) << ", "
+ << static_cast<void*>(source) << ")");
+ helper_->SetBucketSize(kResultBucketId, 0);
+ helper_->GetTranslatedShaderSourceANGLE(shader, kResultBucketId);
+ std::string str;
+ GLsizei max_size = 0;
+ if (GetBucketAsString(kResultBucketId, &str)) {
+ if (bufsize > 0) {
+ max_size =
+ std::min(static_cast<size_t>(bufsize) - 1, str.size());
+ memcpy(source, str.c_str(), max_size);
+ source[max_size] = '\0';
+ GPU_CLIENT_LOG("------\n" << source << "\n------");
+ }
+ }
+ if (length != NULL) {
+ *length = max_size;
+ }
+}
#endif // GPU_COMMAND_BUFFER_CLIENT_GLES2_IMPLEMENTATION_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/gl_mock.h b/gpu/command_buffer/common/gl_mock.h
index 4c5c114..7e81251c 100644
--- a/gpu/command_buffer/common/gl_mock.h
+++ b/gpu/command_buffer/common/gl_mock.h
@@ -236,6 +236,9 @@ class MockGLInterface : public GLInterface {
MOCK_METHOD3(GetTexParameteriv, void(
GLenum target, GLenum pname, GLint* params));
+ MOCK_METHOD4(GetTranslatedShaderSourceANGLE, void(
+ GLuint shader, GLsizei bufsize, GLsizei* length, char* source));
+
MOCK_METHOD3(GetUniformfv,
void(GLuint program, GLint location, GLfloat* params));
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index 1c1b9db..ef34bad 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -9127,6 +9127,44 @@ COMPILE_ASSERT(sizeof(Placeholder453CHROMIUM) == 4,
COMPILE_ASSERT(offsetof(Placeholder453CHROMIUM, header) == 0,
OffsetOf_Placeholder453CHROMIUM_header_not_0);
+struct GetTranslatedShaderSourceANGLE {
+ typedef GetTranslatedShaderSourceANGLE ValueType;
+ static const CommandId kCmdId = kGetTranslatedShaderSourceANGLE;
+ static const cmd::ArgFlags kArgFlags = cmd::kFixed;
+
+ static uint32 ComputeSize() {
+ return static_cast<uint32>(sizeof(ValueType)); // NOLINT
+ }
+
+ void SetHeader() {
+ header.SetCmd<ValueType>();
+ }
+
+ void Init(GLuint _shader, uint32 _bucket_id) {
+ SetHeader();
+ shader = _shader;
+ bucket_id = _bucket_id;
+ }
+
+ void* Set(void* cmd, GLuint _shader, uint32 _bucket_id) {
+ static_cast<ValueType*>(cmd)->Init(_shader, _bucket_id);
+ return NextCmdAddress<ValueType>(cmd);
+ }
+
+ gpu::CommandHeader header;
+ uint32 shader;
+ uint32 bucket_id;
+};
+
+COMPILE_ASSERT(sizeof(GetTranslatedShaderSourceANGLE) == 12,
+ Sizeof_GetTranslatedShaderSourceANGLE_is_not_12);
+COMPILE_ASSERT(offsetof(GetTranslatedShaderSourceANGLE, header) == 0,
+ OffsetOf_GetTranslatedShaderSourceANGLE_header_not_0);
+COMPILE_ASSERT(offsetof(GetTranslatedShaderSourceANGLE, shader) == 4,
+ OffsetOf_GetTranslatedShaderSourceANGLE_shader_not_4);
+COMPILE_ASSERT(offsetof(GetTranslatedShaderSourceANGLE, bucket_id) == 8,
+ OffsetOf_GetTranslatedShaderSourceANGLE_bucket_id_not_8);
+
#endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index 1983e72..a150a58 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -3543,5 +3543,21 @@ TEST_F(GLES2FormatTest, Placeholder453CHROMIUM) {
next_cmd, sizeof(cmd));
}
+TEST_F(GLES2FormatTest, GetTranslatedShaderSourceANGLE) {
+ GetTranslatedShaderSourceANGLE& cmd =
+ *GetBufferAs<GetTranslatedShaderSourceANGLE>();
+ void* next_cmd = cmd.Set(
+ &cmd,
+ static_cast<GLuint>(11),
+ static_cast<uint32>(12));
+ EXPECT_EQ(static_cast<uint32>(GetTranslatedShaderSourceANGLE::kCmdId),
+ cmd.header.command);
+ EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
+ EXPECT_EQ(static_cast<GLuint>(11), cmd.shader);
+ EXPECT_EQ(static_cast<uint32>(12), cmd.bucket_id);
+ CheckBytesWrittenMatchesExpectedSize(
+ next_cmd, sizeof(cmd));
+}
+
#endif // GPU_COMMAND_BUFFER_COMMON_GLES2_CMD_FORMAT_TEST_AUTOGEN_H_
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index 2594aba..0c9aa01 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -210,6 +210,7 @@
OP(Placeholder453CHROMIUM) /* 453 */ \
OP(GetMultipleIntegervCHROMIUM) /* 454 */ \
OP(GetProgramInfoCHROMIUM) /* 455 */ \
+ OP(GetTranslatedShaderSourceANGLE) /* 456 */ \
enum CommandId {
kStartPoint = cmd::kLastCommonId, // All GLES2 commands start after this.
diff --git a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
index b74a318..3a5f252 100644
--- a/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_utils_implementation_autogen.h
@@ -345,6 +345,7 @@ static GLES2Util::EnumToString enum_to_string_table[] = {
{ 0x84C4, "GL_TEXTURE4", },
{ 0x85B5, "GL_VERTEX_ARRAY_BINDING_OES", },
{ 0x8253, "GL_GUILTY_CONTEXT_RESET_ARB", },
+ { 0x6900, "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE", },
{ 0x00200000, "GL_STENCIL_BUFFER_BIT5_QCOM", },
{ 0x8D68, "GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES", },
{ 0x8D61, "GL_HALF_FLOAT_OES", },
@@ -869,6 +870,8 @@ std::string GLES2Util::GetStringShaderParameter(uint32 value) {
{ GL_COMPILE_STATUS, "GL_COMPILE_STATUS" },
{ GL_INFO_LOG_LENGTH, "GL_INFO_LOG_LENGTH" },
{ GL_SHADER_SOURCE_LENGTH, "GL_SHADER_SOURCE_LENGTH" },
+ { GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE,
+ "GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE" },
};
return GLES2Util::GetQualifiedEnumString(
string_table, arraysize(string_table), value);
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc
index c90d5a3..c3998cb 100644
--- a/gpu/command_buffer/service/feature_info.cc
+++ b/gpu/command_buffer/service/feature_info.cc
@@ -106,6 +106,7 @@ void FeatureInfo::AddFeatures(const char* desired_features) {
AddExtensionString("GL_CHROMIUM_strict_attribs");
AddExtensionString("GL_CHROMIUM_swapbuffers_complete_callback");
AddExtensionString("GL_CHROMIUM_rate_limit_offscreen_context");
+ AddExtensionString("GL_ANGLE_translated_shader_source");
// Only turn this feature on if it is requested. Not by default.
if (desired_features && ext.Desire("GL_CHROMIUM_webglsl")) {
diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc
index eb944a8..55949d9 100644
--- a/gpu/command_buffer/service/feature_info_unittest.cc
+++ b/gpu/command_buffer/service/feature_info_unittest.cc
@@ -69,6 +69,8 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) {
// Check default extensions are there
EXPECT_THAT(info_.extensions(), HasSubstr("GL_CHROMIUM_resource_safe"));
EXPECT_THAT(info_.extensions(), HasSubstr("GL_CHROMIUM_strict_attribs"));
+ EXPECT_THAT(info_.extensions(),
+ HasSubstr("GL_ANGLE_translated_shader_source"));
// Check a couple of random extensions that should not be there.
EXPECT_THAT(info_.extensions(), Not(HasSubstr("GL_CHROMIUM_webglsl")));
diff --git a/gpu/command_buffer/service/gl_utils.h b/gpu/command_buffer/service/gl_utils.h
index abc9ff2..8ac4f13 100644
--- a/gpu/command_buffer/service/gl_utils.h
+++ b/gpu/command_buffer/service/gl_utils.h
@@ -39,6 +39,9 @@
#define GL_TEXTURE_BINDING_EXTERNAL_OES 0x8D67
#define GL_REQUIRED_TEXTURE_IMAGE_UNITS_OES 0x8D68
+// GL_ANGLE_translated_shader_source
+#define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x6900
+
#define GL_GLEXT_PROTOTYPES 1
// Define this for extra GL error debugging (slower).
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index cf9ee5b..35ae5b9 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -4674,7 +4674,7 @@ error::Error GLES2DecoderImpl::ShaderSourceHelper(
}
// Note: We don't actually call glShaderSource here. We wait until
// the call to glCompileShader.
- info->Update(std::string(data, data + data_size).c_str());
+ info->UpdateSource(std::string(data, data + data_size).c_str());
return error::kNoError;
}
@@ -4731,10 +4731,26 @@ void GLES2DecoderImpl::DoCompileShader(GLuint client_id) {
return;
}
shader_src = translator->translated_shader();
+ if (!IsAngle())
+ info->UpdateTranslatedSource(shader_src);
}
glShaderSource(info->service_id(), 1, &shader_src, NULL);
glCompileShader(info->service_id());
+ if (IsAngle()) {
+ 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) {
@@ -4751,7 +4767,7 @@ void GLES2DecoderImpl::DoCompileShader(GLuint client_id) {
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');
+ DCHECK(len == 0 || temp[len] == '\0');
info->SetStatus(false, std::string(temp.get(), len).c_str(), NULL);
}
};
@@ -4773,6 +4789,10 @@ void GLES2DecoderImpl::DoGetShaderiv(
case GL_INFO_LOG_LENGTH:
*params = info->log_info() ? info->log_info()->size() + 1 : 0;
return;
+ case GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE:
+ *params = info->translated_source() ?
+ info->translated_source()->size() + 1 : 0;
+ return;
default:
break;
}
@@ -4794,6 +4814,25 @@ error::Error GLES2DecoderImpl::HandleGetShaderSource(
return error::kNoError;
}
+error::Error GLES2DecoderImpl::HandleGetTranslatedShaderSourceANGLE(
+ uint32 immediate_data_size,
+ const gles2::GetTranslatedShaderSourceANGLE& c) {
+ GLuint shader = c.shader;
+
+ uint32 bucket_id = static_cast<uint32>(c.bucket_id);
+ Bucket* bucket = CreateBucket(bucket_id);
+ ShaderManager::ShaderInfo* info = GetShaderInfoNotProgram(
+ shader, "glTranslatedGetShaderSourceANGLE");
+ if (!info) {
+ bucket->SetSize(0);
+ return error::kNoError;
+ }
+
+ bucket->SetFromString(info->translated_source() ?
+ info->translated_source()->c_str() : NULL);
+ return error::kNoError;
+}
+
error::Error GLES2DecoderImpl::HandleGetProgramInfoLog(
uint32 immediate_data_size, const gles2::GetProgramInfoLog& c) {
GLuint program = c.program;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
index 70eae81..e5b9d40 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_3_autogen.h
@@ -14,5 +14,6 @@
// TODO(gman): DestroyStreamTextureCHROMIUM
+// TODO(gman): GetTranslatedShaderSourceANGLE
#endif // GPU_COMMAND_BUFFER_SERVICE_GLES2_CMD_DECODER_UNITTEST_3_AUTOGEN_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
index 361c2dc..5008692 100644
--- a/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_validation_implementation_autogen.h
@@ -303,6 +303,7 @@ static GLenum valid_shader_parameter_table[] = {
GL_COMPILE_STATUS,
GL_INFO_LOG_LENGTH,
GL_SHADER_SOURCE_LENGTH,
+ GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE,
};
static GLenum valid_shader_precision_table[] = {
diff --git a/gpu/command_buffer/service/shader_manager.h b/gpu/command_buffer/service/shader_manager.h
index d1091c6..4168152 100644
--- a/gpu/command_buffer/service/shader_manager.h
+++ b/gpu/command_buffer/service/shader_manager.h
@@ -32,8 +32,14 @@ class ShaderManager {
typedef scoped_refptr<ShaderInfo> Ref;
typedef ShaderTranslator::VariableInfo VariableInfo;
- void Update(const char* source) {
+ void UpdateSource(const char* source) {
source_.reset(source ? new std::string(source) : NULL);
+ translated_source_.reset(NULL);
+ }
+
+ void UpdateTranslatedSource(const char* translated_source) {
+ translated_source_.reset(
+ translated_source ? new std::string(translated_source) : NULL);
}
GLuint service_id() const {
@@ -48,6 +54,10 @@ class ShaderManager {
return source_.get();
}
+ const std::string* translated_source() const {
+ return translated_source_.get();
+ }
+
void SetStatus(
bool valid, const char* log,
ShaderTranslatorInterface* translator);
@@ -98,6 +108,9 @@ class ShaderManager {
// The shader source as passed to glShaderSource.
scoped_ptr<std::string> source_;
+ // The translated shader source.
+ scoped_ptr<std::string> translated_source_;
+
// The shader translation log.
scoped_ptr<std::string> log_info_;
diff --git a/gpu/command_buffer/service/shader_manager_unittest.cc b/gpu/command_buffer/service/shader_manager_unittest.cc
index 23590b78..f927e26 100644
--- a/gpu/command_buffer/service/shader_manager_unittest.cc
+++ b/gpu/command_buffer/service/shader_manager_unittest.cc
@@ -119,8 +119,13 @@ TEST_F(ShaderManagerTest, ShaderInfo) {
EXPECT_TRUE(info1->IsValid());
EXPECT_STREQ(kLog, info1->log_info()->c_str());
// Check we can set its source.
- info1->Update(kClient1Source);
+ info1->UpdateSource(kClient1Source);
EXPECT_STREQ(kClient1Source, info1->source()->c_str());
+ EXPECT_EQ(NULL, info1->translated_source());
+ // Check we can set its translated source.
+ info1->UpdateTranslatedSource(kClient1Source);
+ EXPECT_STREQ(kClient1Source,
+ info1->translated_source()->c_str());
}
TEST_F(ShaderManagerTest, GetInfo) {