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