diff options
author | zmo@google.com <zmo@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-05 00:09:36 +0000 |
---|---|---|
committer | zmo@google.com <zmo@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-10-05 00:09:36 +0000 |
commit | d6a53e4cba5710d51b1cab1f34d9f76a5fcf04c7 (patch) | |
tree | b11e1e89beb1d7a49df291e99b2a0f253d0a61bf /gpu/command_buffer | |
parent | 439d75cecba1d3947b405c07b41e3986091b688b (diff) | |
download | chromium_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/command_buffer')
17 files changed, 177 insertions, 5 deletions
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) { |