| 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
|
|
|
|
|