1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // ShaderExtensionTest.cpp:
7 //   Utilities for testing that GLSL extension pragma and changing the extension flag in compiler
8 //   resources has the correct effect.
9 //
10 
11 #include "GLSLANG/ShaderLang.h"
12 #include "angle_gl.h"
13 #include "gtest/gtest.h"
14 
15 using testing::Combine;
16 using testing::make_tuple;
17 using testing::Values;
18 
19 namespace sh
20 {
21 
22 const char ESSLVersion100[] = "#version 100\n";
23 const char ESSLVersion300[] = "#version 300 es\n";
24 const char ESSLVersion310[] = "#version 310 es\n";
25 
26 class ShaderExtensionTest
27     : public testing::TestWithParam<testing::tuple<ShShaderSpec, const char *, const char *>>
28 {
29   protected:
SetUp()30     void SetUp() override
31     {
32         sh::InitBuiltInResources(&mResources);
33         mCompiler = nullptr;
34     }
35 
TearDown()36     void TearDown() override { DestroyCompiler(); }
DestroyCompiler()37     void DestroyCompiler()
38     {
39         if (mCompiler)
40         {
41             sh::Destruct(mCompiler);
42             mCompiler = nullptr;
43         }
44     }
45 
InitializeCompiler()46     void InitializeCompiler()
47     {
48         DestroyCompiler();
49         mCompiler = sh::ConstructCompiler(GL_FRAGMENT_SHADER, testing::get<0>(GetParam()),
50                                           SH_GLSL_COMPATIBILITY_OUTPUT, &mResources);
51         ASSERT_TRUE(mCompiler != nullptr) << "Compiler could not be constructed.";
52     }
53 
TestShaderCompile(const char * pragma)54     testing::AssertionResult TestShaderCompile(const char *pragma)
55     {
56         return TestShaderCompile(testing::get<1>(GetParam()),  // Version.
57                                  pragma,
58                                  testing::get<2>(GetParam())  // Shader.
59         );
60     }
61 
TestShaderCompile(const char * version,const char * pragma,const char * shader)62     testing::AssertionResult TestShaderCompile(const char *version,
63                                                const char *pragma,
64                                                const char *shader)
65     {
66         const char *shaderStrings[] = {version, pragma, shader};
67         bool success                = sh::Compile(mCompiler, shaderStrings, 3, 0);
68         if (success)
69         {
70             return ::testing::AssertionSuccess() << "Compilation success";
71         }
72         return ::testing::AssertionFailure() << sh::GetInfoLog(mCompiler);
73     }
74 
75   protected:
76     ShBuiltInResources mResources;
77     ShHandle mCompiler;
78 };
79 
80 }  // namespace sh
81