Index: gpu/command_buffer/service/shader_translator_unittest.cc |
diff --git a/gpu/command_buffer/service/shader_translator_unittest.cc b/gpu/command_buffer/service/shader_translator_unittest.cc |
index 5f6173818f922b1fccf54e31bf338e68873c5ec4..0c60b44c5a63853badb359d0a7f8618be4249c97 100644 |
--- a/gpu/command_buffer/service/shader_translator_unittest.cc |
+++ b/gpu/command_buffer/service/shader_translator_unittest.cc |
@@ -6,6 +6,7 @@ |
#include "gpu/command_buffer/service/shader_translator.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "ui/gl/gl_version_info.h" |
namespace gpu { |
namespace gles2 { |
@@ -13,6 +14,9 @@ namespace gles2 { |
class ShaderTranslatorTest : public testing::Test { |
public: |
ShaderTranslatorTest() { |
+ shader_output_language_ = |
+ ShaderTranslator::GetShaderOutputLanguageForContext( |
+ gfx::GLVersionInfo("2.0", "", "")); |
} |
~ShaderTranslatorTest() override {} |
@@ -27,14 +31,12 @@ class ShaderTranslatorTest : public testing::Test { |
vertex_translator_ = new ShaderTranslator(); |
fragment_translator_ = new ShaderTranslator(); |
- ASSERT_TRUE(vertex_translator_->Init( |
- GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
- ShaderTranslatorInterface::kGlsl, |
- SH_EMULATE_BUILT_IN_FUNCTIONS)); |
- ASSERT_TRUE(fragment_translator_->Init( |
- GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, |
- ShaderTranslatorInterface::kGlsl, |
- static_cast<ShCompileOptions>(0))); |
+ ASSERT_TRUE(vertex_translator_->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, |
+ &resources, shader_output_language_, |
+ SH_EMULATE_BUILT_IN_FUNCTIONS)); |
+ ASSERT_TRUE(fragment_translator_->Init(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, |
+ &resources, shader_output_language_, |
+ static_cast<ShCompileOptions>(0))); |
} |
void TearDown() override { |
vertex_translator_ = NULL; |
@@ -43,6 +45,7 @@ class ShaderTranslatorTest : public testing::Test { |
scoped_refptr<ShaderTranslator> vertex_translator_; |
scoped_refptr<ShaderTranslator> fragment_translator_; |
+ ShShaderOutput shader_output_language_; |
}; |
TEST_F(ShaderTranslatorTest, ValidVertexShader) { |
@@ -290,19 +293,16 @@ TEST_F(ShaderTranslatorTest, OptionsString) { |
ShBuiltInResources resources; |
ShInitBuiltInResources(&resources); |
- ASSERT_TRUE(translator_1->Init( |
- GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
- ShaderTranslatorInterface::kGlsl, |
- SH_EMULATE_BUILT_IN_FUNCTIONS)); |
- ASSERT_TRUE(translator_2->Init( |
- GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, |
- ShaderTranslatorInterface::kGlsl, |
- static_cast<ShCompileOptions>(0))); |
+ ASSERT_TRUE(translator_1->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
+ SH_GLSL_150_CORE_OUTPUT, |
+ SH_EMULATE_BUILT_IN_FUNCTIONS)); |
+ ASSERT_TRUE(translator_2->Init(GL_FRAGMENT_SHADER, SH_GLES2_SPEC, &resources, |
+ SH_GLSL_150_CORE_OUTPUT, |
+ static_cast<ShCompileOptions>(0))); |
resources.EXT_draw_buffers = 1; |
- ASSERT_TRUE(translator_3->Init( |
- GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
- ShaderTranslatorInterface::kGlsl, |
- SH_EMULATE_BUILT_IN_FUNCTIONS)); |
+ ASSERT_TRUE(translator_3->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
+ SH_GLSL_150_CORE_OUTPUT, |
+ SH_EMULATE_BUILT_IN_FUNCTIONS)); |
std::string options_1( |
translator_1->GetStringForOptionsThatWouldAffectCompilation()); |
@@ -319,6 +319,113 @@ TEST_F(ShaderTranslatorTest, OptionsString) { |
EXPECT_NE(options_3, options_4); |
} |
+class ShaderTranslatorOutputVersionTest |
+ : public testing::TestWithParam<testing::tuple<const char*, const char*>> { |
+}; |
+ |
+TEST_P(ShaderTranslatorOutputVersionTest, HasCorrectOutputGLSLVersion) { |
+ // Test that translating to a shader targeting certain OpenGL context version |
+ // (version string in test param tuple index 0) produces a GLSL shader that |
+ // contains correct version string for that context (version directive |
+ // in test param tuple index 1). |
+ |
+ const char* kShader = |
+ "attribute vec4 vPosition;\n" |
+ "void main() {\n" |
+ " gl_Position = vPosition;\n" |
+ "}"; |
+ |
+ gfx::GLVersionInfo output_context_version(testing::get<0>(GetParam()), "", |
+ ""); |
+ |
+ scoped_refptr<ShaderTranslator> translator = new ShaderTranslator(); |
+ ShBuiltInResources resources; |
+ ShInitBuiltInResources(&resources); |
+ ShCompileOptions compile_options = SH_OBJECT_CODE; |
+ ShShaderOutput shader_output_language = |
+ ShaderTranslator::GetShaderOutputLanguageForContext( |
+ output_context_version); |
+ ASSERT_TRUE(translator->Init(GL_VERTEX_SHADER, SH_GLES2_SPEC, &resources, |
+ shader_output_language, compile_options)); |
+ |
+ std::string translated_source; |
+ int shader_version; |
+ EXPECT_TRUE(translator->Translate(kShader, nullptr, &translated_source, |
+ &shader_version, nullptr, nullptr, nullptr, |
+ nullptr)); |
+ |
+ std::string expected_version_directive = testing::get<1>(GetParam()); |
+ if (expected_version_directive.empty()) { |
+ EXPECT_TRUE(translated_source.find("#version") == std::string::npos) |
+ << "Translation was:\n" << translated_source; |
+ } else { |
+ EXPECT_TRUE(translated_source.find(expected_version_directive) != |
+ std::string::npos) |
+ << "Translation was:\n" << translated_source; |
+ } |
+} |
+ |
+// For some compilers, using make_tuple("a", "bb") would end up |
+// instantiating make_tuple<char[1], char[2]>. This does not work. |
+namespace { |
+testing::tuple<const char*, const char*> make_gl_glsl_tuple( |
+ const char* gl_version, |
+ const char* glsl_version_directive) { |
+ return testing::make_tuple(gl_version, glsl_version_directive); |
+} |
+} |
+ |
+// Test data for the above test. OpenGL specifications specify a |
+// certain version of GLSL to be guaranteed to be supported. Test |
+// that ShaderTranslator produces a GLSL shader with the exact |
+// specified GLSL version for each known OpenGL version. |
+INSTANTIATE_TEST_CASE_P( |
+ KnownOpenGLContexts, |
+ ShaderTranslatorOutputVersionTest, |
+ testing::Values(make_gl_glsl_tuple("4.5", "#version 450\n"), |
+ make_gl_glsl_tuple("4.4", "#version 440\n"), |
+ make_gl_glsl_tuple("4.3", "#version 430\n"), |
+ make_gl_glsl_tuple("4.2", "#version 420\n"), |
+ make_gl_glsl_tuple("4.1", "#version 410\n"), |
+ make_gl_glsl_tuple("4.0", "#version 400\n"), |
+ make_gl_glsl_tuple("3.3", "#version 330\n"), |
+ make_gl_glsl_tuple("3.2", "#version 150\n"), |
+ make_gl_glsl_tuple("3.1", "#version 140\n"), |
+ make_gl_glsl_tuple("3.0", "#version 130\n"))); |
+ |
+// Test data for the above test. Check that early OpenGL contexts get |
+// GLSL compatibility profile shader, e.g. shader has no #version |
+// directive. Also check that future version 3.3+ OpenGL contexts get |
+// similar shader. We do not expect that future 3.3+ specs contain |
+// the "all eariler GLSL versions" clause, since 3.3 did not contain |
+// it either. |
+INSTANTIATE_TEST_CASE_P(OldOrUnknownOpenGLContexts, |
+ ShaderTranslatorOutputVersionTest, |
+ testing::Values(make_gl_glsl_tuple("3.4", ""), |
+ make_gl_glsl_tuple("2.0", ""))); |
+ |
+// Test data for the above test. Cases for the future OpenGL versions. The |
+// code assumes that the future OpenGL specs specify the clause that all |
+// earlier GLSL versions are supported. We select the highest GLSL |
+// version known at the time of writing. |
+INSTANTIATE_TEST_CASE_P( |
+ BackwardsCompatibleFutureOpenGLContexts, |
+ ShaderTranslatorOutputVersionTest, |
+ testing::Values(make_gl_glsl_tuple("5.0", "#version 450\n"), |
+ make_gl_glsl_tuple("4.6", "#version 450\n"))); |
+ |
+// Test data for the above test. Check that for the OpenGL ES output |
+// contexts, the shader is such that GLSL 1.0 is used. The translator |
+// selects GLSL 1.0 by not output any version at the moment, though we |
+// do not know if that would be correct for the future OpenGL ES specs. |
+INSTANTIATE_TEST_CASE_P(OpenGLESContexts, |
+ ShaderTranslatorOutputVersionTest, |
+ testing::Values(make_gl_glsl_tuple("opengl es 2.0", ""), |
+ make_gl_glsl_tuple("opengl es 3.0", ""), |
+ make_gl_glsl_tuple("opengl es 3.1", ""), |
+ make_gl_glsl_tuple("opengl es 3.2", |
+ ""))); |
+ |
} // namespace gles2 |
} // namespace gpu |