• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2024 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 // WGSLOutput_test.cpp:
7 //   Tests for corect WGSL translations.
8 //
9 
10 #include <regex>
11 #include "GLSLANG/ShaderLang.h"
12 #include "angle_gl.h"
13 #include "gtest/gtest.h"
14 #include "tests/test_utils/compiler_test.h"
15 
16 using namespace sh;
17 
18 class WGSLVertexOutputTest : public MatchOutputCodeTest
19 {
20   public:
WGSLVertexOutputTest()21     WGSLVertexOutputTest() : MatchOutputCodeTest(GL_VERTEX_SHADER, SH_WGSL_OUTPUT)
22     {
23         ShCompileOptions defaultCompileOptions = {};
24         defaultCompileOptions.validateAST      = true;
25         setDefaultCompileOptions(defaultCompileOptions);
26     }
27 };
28 
29 class WGSLOutputTest : public MatchOutputCodeTest
30 {
31   public:
WGSLOutputTest()32     WGSLOutputTest() : MatchOutputCodeTest(GL_FRAGMENT_SHADER, SH_WGSL_OUTPUT)
33     {
34         ShCompileOptions defaultCompileOptions = {};
35         defaultCompileOptions.validateAST      = true;
36         setDefaultCompileOptions(defaultCompileOptions);
37     }
38 };
39 
TEST_F(WGSLOutputTest,BasicTranslation)40 TEST_F(WGSLOutputTest, BasicTranslation)
41 {
42     const std::string &shaderString =
43         R"(#version 300 es
44         precision highp float;
45 
46         out vec4 outColor;
47 
48         struct Foo {
49             float x;
50             float y;
51         };
52 
53         void doFoo(Foo foo, float zw);
54 
55         void doFoo(Foo foo, float zw)
56         {
57             foo.x = foo.y;
58             outColor = vec4(foo.x, foo.y, zw, zw);
59         }
60 
61         Foo returnFoo(Foo foo) {
62           return foo;
63         }
64 
65         float returnFloat(float x) {
66           return x;
67         }
68 
69         void main()
70         {
71             Foo foo;
72             foo.x = 2.0;
73             foo.y = 2.0;
74             doFoo(returnFoo(foo), returnFloat(3.0));
75         })";
76     const std::string &outputString =
77         R"(
78 FAKE_DECLARATION;
79 
80 FAKE_DECLARATION;
81 
82 fn _udoFoo(FAKE_FUNCTION_PARAMETER, FAKE_FUNCTION_PARAMETER);
83 
84 fn _udoFoo(FAKE_FUNCTION_PARAMETER, FAKE_FUNCTION_PARAMETER)
85 {
86   ;
87   ;
88 }
89 
90 fn _ureturnFoo(FAKE_FUNCTION_PARAMETER) -> _uFoo
91 {
92   ;
93 }
94 
95 fn _ureturnFloat(FAKE_FUNCTION_PARAMETER) -> f32
96 {
97   ;
98 }
99 
100 fn _umain()
101 {
102   FAKE_DECLARATION;
103   ;
104   ;
105   ;
106 }
107 )";
108     compile(shaderString);
109     EXPECT_TRUE(foundInCode(outputString.c_str()));
110 }
111