diff options
author | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-20 21:38:27 +0000 |
---|---|---|
committer | gman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-20 21:38:27 +0000 |
commit | bc51875961a1e943f224a4c5e46da106b39f1c46 (patch) | |
tree | 7f21e0f624a38dda99e087000e325d1a07273784 /gpu | |
parent | 987c09d491df35db519eb3f5dc398d51b179f7d5 (diff) | |
download | chromium_src-bc51875961a1e943f224a4c5e46da106b39f1c46.zip chromium_src-bc51875961a1e943f224a4c5e46da106b39f1c46.tar.gz chromium_src-bc51875961a1e943f224a4c5e46da106b39f1c46.tar.bz2 |
Changes WebGL to rely on the command buffer
for more validation. This change also means
that the shader compiler is put into WebGL
mode for WebGL.
TEST=ran webgl conformance tests.
BUG=none
Review URL: http://codereview.chromium.org/3890004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@63267 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'gpu')
-rw-r--r-- | gpu/command_buffer/service/feature_info.cc | 12 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info.h | 6 | ||||
-rw-r--r-- | gpu/command_buffer/service/feature_info_unittest.cc | 18 | ||||
-rw-r--r-- | gpu/command_buffer/service/gles2_cmd_decoder.cc | 7 | ||||
-rw-r--r-- | gpu/command_buffer/service/shader_translator.cc | 4 | ||||
-rw-r--r-- | gpu/command_buffer/service/shader_translator.h | 7 | ||||
-rw-r--r-- | gpu/command_buffer/service/shader_translator_unittest.cc | 6 |
7 files changed, 52 insertions, 8 deletions
diff --git a/gpu/command_buffer/service/feature_info.cc b/gpu/command_buffer/service/feature_info.cc index fa835ef..3edb49e 100644 --- a/gpu/command_buffer/service/feature_info.cc +++ b/gpu/command_buffer/service/feature_info.cc @@ -95,6 +95,18 @@ void FeatureInfo::AddFeatures(const char* desired_features) { AddExtensionString("GL_CHROMIUM_map_sub"); } + // Only turn this feature on if it is requested. Not by default. + if (desired_features && ext.Desire("GL_CHROMIUM_strict_attribs")) { + AddExtensionString("GL_CHROMIUM_strict_attribs"); + feature_flags_.chromium_strict_attribs = true; + } + + // Only turn this feature on if it is requested. Not by default. + if (desired_features && ext.Desire("GL_CHROMIUM_webglsl")) { + AddExtensionString("GL_CHROMIUM_webglsl"); + feature_flags_.chromium_webglsl = true; + } + // Check if we should allow GL_EXT_texture_compression_dxt1 and // GL_EXT_texture_compression_s3tc. bool enable_dxt1 = false; diff --git a/gpu/command_buffer/service/feature_info.h b/gpu/command_buffer/service/feature_info.h index 7a08ccc..855c514 100644 --- a/gpu/command_buffer/service/feature_info.h +++ b/gpu/command_buffer/service/feature_info.h @@ -20,7 +20,9 @@ class FeatureInfo { oes_standard_derivatives(false), npot_ok(false), enable_texture_float_linear(false), - enable_texture_half_float_linear(false) { + enable_texture_half_float_linear(false), + chromium_strict_attribs(false), + chromium_webglsl(false) { } bool chromium_framebuffer_multisample; @@ -28,6 +30,8 @@ class FeatureInfo { bool npot_ok; bool enable_texture_float_linear; bool enable_texture_half_float_linear; + bool chromium_strict_attribs; + bool chromium_webglsl; }; FeatureInfo(); diff --git a/gpu/command_buffer/service/feature_info_unittest.cc b/gpu/command_buffer/service/feature_info_unittest.cc index 710f92b..b8745f2 100644 --- a/gpu/command_buffer/service/feature_info_unittest.cc +++ b/gpu/command_buffer/service/feature_info_unittest.cc @@ -59,6 +59,8 @@ TEST_F(FeatureInfoTest, Basic) { EXPECT_FALSE(info_.feature_flags().npot_ok); EXPECT_FALSE(info_.feature_flags().enable_texture_float_linear); EXPECT_FALSE(info_.feature_flags().enable_texture_half_float_linear); + EXPECT_FALSE(info_.feature_flags().chromium_strict_attribs); + EXPECT_FALSE(info_.feature_flags().chromium_webglsl); } TEST_F(FeatureInfoTest, InitializeNoExtensions) { @@ -69,6 +71,8 @@ TEST_F(FeatureInfoTest, InitializeNoExtensions) { EXPECT_THAT(info_.extensions(), Not(HasSubstr("GL_EXT_texture_compression_dxt1"))); EXPECT_FALSE(info_.feature_flags().npot_ok); + EXPECT_FALSE(info_.feature_flags().chromium_strict_attribs); + EXPECT_FALSE(info_.feature_flags().chromium_webglsl); EXPECT_FALSE(info_.validators()->compressed_texture_format.IsValid( GL_COMPRESSED_RGB_S3TC_DXT1_EXT)); EXPECT_FALSE(info_.validators()->compressed_texture_format.IsValid( @@ -374,6 +378,20 @@ TEST_F(FeatureInfoTest, InitializeOES_standard_derivatives) { EXPECT_TRUE(info_.feature_flags().oes_standard_derivatives); } +TEST_F(FeatureInfoTest, InitializeCHROMIUM_strict_attribs) { + SetupInitExpectations(""); + info_.Initialize("GL_CHROMIUM_strict_attribs"); + EXPECT_THAT(info_.extensions(), HasSubstr("GL_CHROMIUM_strict_attribs")); + EXPECT_TRUE(info_.feature_flags().chromium_strict_attribs); +} + +TEST_F(FeatureInfoTest, InitializeCHROMIUM_webglsl) { + SetupInitExpectations(""); + info_.Initialize("GL_CHROMIUM_webglsl"); + EXPECT_THAT(info_.extensions(), HasSubstr("GL_CHROMIUM_webglsl")); + EXPECT_TRUE(info_.feature_flags().chromium_webglsl); +} + } // namespace gles2 } // namespace gpu diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 399547d..aafa312 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc @@ -1917,13 +1917,16 @@ bool GLES2DecoderImpl::Initialize(gfx::GLContext* context, resources.OES_standard_derivatives = feature_info_->feature_flags().oes_standard_derivatives ? 1 : 0; vertex_translator_.reset(new ShaderTranslator); - if (!vertex_translator_->Init(SH_VERTEX_SHADER, &resources)) { + ShShaderSpec shader_spec = feature_info_->feature_flags().chromium_webglsl ? + SH_WEBGL_SPEC : SH_GLES2_SPEC; + if (!vertex_translator_->Init(SH_VERTEX_SHADER, shader_spec, &resources)) { LOG(ERROR) << "Could not initialize vertex shader translator."; Destroy(); return false; } fragment_translator_.reset(new ShaderTranslator); - if (!fragment_translator_->Init(SH_FRAGMENT_SHADER, &resources)) { + if (!fragment_translator_->Init( + SH_FRAGMENT_SHADER, shader_spec, &resources)) { LOG(ERROR) << "Could not initialize fragment shader translator."; Destroy(); return false; diff --git a/gpu/command_buffer/service/shader_translator.cc b/gpu/command_buffer/service/shader_translator.cc index e1ebcbd..1b5ab6d 100644 --- a/gpu/command_buffer/service/shader_translator.cc +++ b/gpu/command_buffer/service/shader_translator.cc @@ -73,16 +73,18 @@ ShaderTranslator::~ShaderTranslator() { } bool ShaderTranslator::Init(ShShaderType shader_type, + ShShaderSpec shader_spec, const ShBuiltInResources* resources) { // Make sure Init is called only once. DCHECK(compiler_ == NULL); DCHECK(shader_type == SH_FRAGMENT_SHADER || shader_type == SH_VERTEX_SHADER); + DCHECK(shader_spec == SH_GLES2_SPEC || shader_spec == SH_WEBGL_SPEC); DCHECK(resources != NULL); if (!InitializeShaderTranslator()) return false; - compiler_ = ShConstructCompiler(shader_type, SH_GLES2_SPEC, resources); + compiler_ = ShConstructCompiler(shader_type, shader_spec, resources); return compiler_ != NULL; } diff --git a/gpu/command_buffer/service/shader_translator.h b/gpu/command_buffer/service/shader_translator.h index e2e0620..5054972 100644 --- a/gpu/command_buffer/service/shader_translator.h +++ b/gpu/command_buffer/service/shader_translator.h @@ -23,7 +23,9 @@ class ShaderTranslator { // Initializes the translator. // Must be called once before using the translator object. - bool Init(ShShaderType shader_type, const ShBuiltInResources* resources); + bool Init(ShShaderType shader_type, + ShShaderSpec shader_spec, + const ShBuiltInResources* resources); // Translates the given shader source. // Returns true if translation is successful, false otherwise. bool Translate(const char* shader); @@ -46,13 +48,14 @@ class ShaderTranslator { private: void ClearResults(); - DISALLOW_COPY_AND_ASSIGN(ShaderTranslator); ShHandle compiler_; scoped_array<char> translated_shader_; scoped_array<char> info_log_; VariableMap attrib_map_; VariableMap uniform_map_; + + DISALLOW_COPY_AND_ASSIGN(ShaderTranslator); }; } // namespace gles2 diff --git a/gpu/command_buffer/service/shader_translator_unittest.cc b/gpu/command_buffer/service/shader_translator_unittest.cc index 0e00944..dbd9c60 100644 --- a/gpu/command_buffer/service/shader_translator_unittest.cc +++ b/gpu/command_buffer/service/shader_translator_unittest.cc @@ -21,8 +21,10 @@ class ShaderTranslatorTest : public testing::Test { ShBuiltInResources resources; ShInitBuiltInResources(&resources); - ASSERT_TRUE(vertex_translator_.Init(SH_VERTEX_SHADER, &resources)); - ASSERT_TRUE(fragment_translator_.Init(SH_FRAGMENT_SHADER, &resources)); + ASSERT_TRUE(vertex_translator_.Init( + SH_VERTEX_SHADER, SH_GLES2_SPEC, &resources)); + ASSERT_TRUE(fragment_translator_.Init( + SH_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources)); // Post-init the results must be empty. // Vertex translator results. EXPECT_TRUE(vertex_translator_.translated_shader() == NULL); |