summaryrefslogtreecommitdiffstats
path: root/gpu
diff options
context:
space:
mode:
authorgman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-20 21:38:27 +0000
committergman@chromium.org <gman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-10-20 21:38:27 +0000
commitbc51875961a1e943f224a4c5e46da106b39f1c46 (patch)
tree7f21e0f624a38dda99e087000e325d1a07273784 /gpu
parent987c09d491df35db519eb3f5dc398d51b179f7d5 (diff)
downloadchromium_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.cc12
-rw-r--r--gpu/command_buffer/service/feature_info.h6
-rw-r--r--gpu/command_buffer/service/feature_info_unittest.cc18
-rw-r--r--gpu/command_buffer/service/gles2_cmd_decoder.cc7
-rw-r--r--gpu/command_buffer/service/shader_translator.cc4
-rw-r--r--gpu/command_buffer/service/shader_translator.h7
-rw-r--r--gpu/command_buffer/service/shader_translator_unittest.cc6
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);