blob: ec72ef76889d63dd4eba66afced12bcd155e3ade [file] [log] [blame]
Ryan Harrisondbc13af2022-02-21 15:19:07 +00001// Copyright 2021 The Tint Authors.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "gmock/gmock.h"
16#include "src/tint/ast/stage_attribute.h"
Ryan Harrisondbc13af2022-02-21 15:19:07 +000017#include "src/tint/ast/variable_decl_statement.h"
18#include "src/tint/ast/workgroup_attribute.h"
19#include "src/tint/writer/glsl/test_helper.h"
20
21using ::testing::HasSubstr;
22
Ben Clayton0ce9ab02022-05-05 20:23:40 +000023using namespace tint::number_suffixes; // NOLINT
24
dan sinclair5d590592022-04-07 14:40:24 +000025namespace tint::writer::glsl {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000026namespace {
27
28using GlslGeneratorImplTest_Function = TestHelper;
29
30TEST_F(GlslGeneratorImplTest_Function, Emit_Function) {
Ben Clayton783b1692022-08-02 17:03:35 +000031 Func("my_func", utils::Empty, ty.void_(),
32 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +000033 Return(),
34 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000035
dan sinclair41e4d9a2022-05-01 14:40:55 +000036 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000037
dan sinclair41e4d9a2022-05-01 14:40:55 +000038 gen.increment_indent();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000039
dan sinclair8a435a22023-04-12 11:59:24 +000040 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +000041 EXPECT_EQ(gen.result(), R"( #version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +000042
43 void my_func() {
44 return;
45 }
46
47)");
48}
49
50TEST_F(GlslGeneratorImplTest_Function, Emit_Function_Name_Collision) {
Ben Clayton783b1692022-08-02 17:03:35 +000051 Func("centroid", utils::Empty, ty.void_(),
52 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +000053 Return(),
54 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000055
dan sinclair41e4d9a2022-05-01 14:40:55 +000056 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000057
dan sinclair41e4d9a2022-05-01 14:40:55 +000058 gen.increment_indent();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000059
dan sinclair8a435a22023-04-12 11:59:24 +000060 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +000061 EXPECT_THAT(gen.result(), HasSubstr(R"( void tint_symbol() {
Ryan Harrisondbc13af2022-02-21 15:19:07 +000062 return;
63 })"));
64}
65
66TEST_F(GlslGeneratorImplTest_Function, Emit_Function_WithParams) {
Ben Clayton7164b972022-06-15 10:02:37 +000067 Func("my_func",
Ben Clayton783b1692022-08-02 17:03:35 +000068 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +000069 Param("a", ty.f32()),
70 Param("b", ty.i32()),
71 },
72 ty.void_(),
Ben Clayton783b1692022-08-02 17:03:35 +000073 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +000074 Return(),
75 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000076
dan sinclair41e4d9a2022-05-01 14:40:55 +000077 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000078
dan sinclair41e4d9a2022-05-01 14:40:55 +000079 gen.increment_indent();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000080
dan sinclair8a435a22023-04-12 11:59:24 +000081 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +000082 EXPECT_EQ(gen.result(), R"( #version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +000083
84 void my_func(float a, int b) {
85 return;
86 }
87
88)");
89}
90
dan sinclair41e4d9a2022-05-01 14:40:55 +000091TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_NoReturn_Void) {
Ben Clayton783b1692022-08-02 17:03:35 +000092 Func("func", utils::Empty, ty.void_(), utils::Empty /* no explicit return */,
93 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +000094 Stage(ast::PipelineStage::kFragment),
95 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +000096
dan sinclair41e4d9a2022-05-01 14:40:55 +000097 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +000098
dan sinclair8a435a22023-04-12 11:59:24 +000099 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000100 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000101precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000102
103void func() {
104 return;
105}
106)");
107}
108
109TEST_F(GlslGeneratorImplTest_Function, PtrParameter) {
dan sinclair41e4d9a2022-05-01 14:40:55 +0000110 // fn f(foo : ptr<function, f32>) -> f32 {
111 // return *foo;
112 // }
dan sinclair2a651632023-02-19 04:03:55 +0000113 Func("f", utils::Vector{Param("foo", ty.pointer<f32>(builtin::AddressSpace::kFunction))},
114 ty.f32(), utils::Vector{Return(Deref("foo"))});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000115
dan sinclair41e4d9a2022-05-01 14:40:55 +0000116 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000117
dan sinclair8a435a22023-04-12 11:59:24 +0000118 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000119 EXPECT_THAT(gen.result(), HasSubstr(R"(float f(inout float foo) {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000120 return foo;
121}
122)"));
123}
124
dan sinclair41e4d9a2022-05-01 14:40:55 +0000125TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_WithInOutVars) {
126 // fn frag_main(@location(0) foo : f32) -> @location(1) f32 {
127 // return foo;
128 // }
Ben Clayton7164b972022-06-15 10:02:37 +0000129 Func("frag_main",
Ben Clayton783b1692022-08-02 17:03:35 +0000130 utils::Vector{
dan sinclairf9eeed62022-09-07 22:25:24 +0000131 Param("foo", ty.f32(), utils::Vector{Location(0_a)}),
Ben Clayton7164b972022-06-15 10:02:37 +0000132 },
133 ty.f32(),
Ben Clayton783b1692022-08-02 17:03:35 +0000134 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000135 Return("foo"),
136 },
Ben Clayton783b1692022-08-02 17:03:35 +0000137 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000138 Stage(ast::PipelineStage::kFragment),
139 },
Ben Clayton783b1692022-08-02 17:03:35 +0000140 utils::Vector{
dan sinclairf9eeed62022-09-07 22:25:24 +0000141 Location(1_a),
Ben Clayton7164b972022-06-15 10:02:37 +0000142 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000143
dan sinclair41e4d9a2022-05-01 14:40:55 +0000144 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000145
dan sinclair8a435a22023-04-12 11:59:24 +0000146 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000147 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000148precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000149
150layout(location = 0) in float foo_1;
151layout(location = 1) out float value;
152float frag_main(float foo) {
153 return foo;
154}
155
156void main() {
157 float inner_result = frag_main(foo_1);
158 value = inner_result;
159 return;
160}
161)");
162}
163
dan sinclair41e4d9a2022-05-01 14:40:55 +0000164TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_WithInOut_Builtins) {
165 // fn frag_main(@position(0) coord : vec4<f32>) -> @frag_depth f32 {
166 // return coord.x;
167 // }
Ben Clayton783b1692022-08-02 17:03:35 +0000168 auto* coord_in =
dan sinclair63925792023-02-17 21:56:35 +0000169 Param("coord", ty.vec4<f32>(), utils::Vector{Builtin(builtin::BuiltinValue::kPosition)});
Ben Clayton7164b972022-06-15 10:02:37 +0000170 Func("frag_main",
Ben Clayton783b1692022-08-02 17:03:35 +0000171 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000172 coord_in,
173 },
174 ty.f32(),
Ben Clayton783b1692022-08-02 17:03:35 +0000175 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000176 Return(MemberAccessor("coord", "x")),
177 },
Ben Clayton783b1692022-08-02 17:03:35 +0000178 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000179 Stage(ast::PipelineStage::kFragment),
180 },
Ben Clayton783b1692022-08-02 17:03:35 +0000181 utils::Vector{
dan sinclair63925792023-02-17 21:56:35 +0000182 Builtin(builtin::BuiltinValue::kFragDepth),
Ben Clayton7164b972022-06-15 10:02:37 +0000183 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000184
dan sinclair41e4d9a2022-05-01 14:40:55 +0000185 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000186
dan sinclair8a435a22023-04-12 11:59:24 +0000187 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000188 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000189precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000190
191float frag_main(vec4 coord) {
192 return coord.x;
193}
194
195void main() {
196 float inner_result = frag_main(gl_FragCoord);
197 gl_FragDepth = inner_result;
198 return;
199}
200)");
201}
202
dan sinclair41e4d9a2022-05-01 14:40:55 +0000203TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_SharedStruct_DifferentStages) {
204 // struct Interface {
205 // @builtin(position) pos : vec4<f32>;
206 // @location(1) col1 : f32;
207 // @location(2) col2 : f32;
208 // };
209 // fn vert_main() -> Interface {
210 // return Interface(vec4<f32>(), 0.4, 0.6);
211 // }
212 // fn frag_main(inputs : Interface) {
213 // const r = inputs.col1;
214 // const g = inputs.col2;
215 // const p = inputs.pos;
216 // }
217 auto* interface_struct = Structure(
Ben Clayton783b1692022-08-02 17:03:35 +0000218 "Interface",
219 utils::Vector{
dan sinclair63925792023-02-17 21:56:35 +0000220 Member("pos", ty.vec4<f32>(), utils::Vector{Builtin(builtin::BuiltinValue::kPosition)}),
dan sinclairf9eeed62022-09-07 22:25:24 +0000221 Member("col1", ty.f32(), utils::Vector{Location(1_a)}),
222 Member("col2", ty.f32(), utils::Vector{Location(2_a)}),
Ben Clayton783b1692022-08-02 17:03:35 +0000223 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000224
Ben Clayton783b1692022-08-02 17:03:35 +0000225 Func("vert_main", utils::Empty, ty.Of(interface_struct),
Ben Clayton01ac21c2023-02-07 16:14:25 +0000226 utils::Vector{Return(
227 Call(ty.Of(interface_struct), Call(ty.vec4<f32>()), Expr(0.5_f), Expr(0.25_f)))},
Ben Clayton783b1692022-08-02 17:03:35 +0000228 utils::Vector{Stage(ast::PipelineStage::kVertex)});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000229
Ben Clayton783b1692022-08-02 17:03:35 +0000230 Func("frag_main", utils::Vector{Param("inputs", ty.Of(interface_struct))}, ty.void_(),
231 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000232 Decl(Let("r", ty.f32(), MemberAccessor("inputs", "col1"))),
233 Decl(Let("g", ty.f32(), MemberAccessor("inputs", "col2"))),
234 Decl(Let("p", ty.vec4<f32>(), MemberAccessor("inputs", "pos"))),
235 },
Ben Clayton783b1692022-08-02 17:03:35 +0000236 utils::Vector{Stage(ast::PipelineStage::kFragment)});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000237
dan sinclair41e4d9a2022-05-01 14:40:55 +0000238 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000239
dan sinclair8a435a22023-04-12 11:59:24 +0000240 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000241 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000242precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000243
244layout(location = 1) out float col1_1;
245layout(location = 2) out float col2_1;
246layout(location = 1) in float col1_2;
247layout(location = 2) in float col2_2;
248struct Interface {
249 vec4 pos;
250 float col1;
251 float col2;
252};
253
254Interface vert_main() {
Ben Clayton25b7e982022-06-01 01:11:59 +0000255 Interface tint_symbol = Interface(vec4(0.0f), 0.5f, 0.25f);
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000256 return tint_symbol;
257}
258
259void main() {
Stephen White790e4c22022-04-22 21:25:02 +0000260 gl_PointSize = 1.0;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000261 Interface inner_result = vert_main();
262 gl_Position = inner_result.pos;
263 col1_1 = inner_result.col1;
264 col2_1 = inner_result.col2;
265 gl_Position.y = -(gl_Position.y);
266 gl_Position.z = ((2.0f * gl_Position.z) - gl_Position.w);
267 return;
268}
269void frag_main(Interface inputs) {
270 float r = inputs.col1;
271 float g = inputs.col2;
272 vec4 p = inputs.pos;
273}
274
275void main_1() {
276 Interface tint_symbol_1 = Interface(gl_FragCoord, col1_2, col2_2);
277 frag_main(tint_symbol_1);
278 return;
279}
280)");
281}
282
283#if 0
284TEST_F(GlslGeneratorImplTest_Function,
285 Emit_Attribute_EntryPoint_SharedStruct_HelperFunction) {
286 // struct VertexOutput {
287 // @builtin(position) pos : vec4<f32>;
288 // };
289 // fn foo(x : f32) -> VertexOutput {
290 // return VertexOutput(vec4<f32>(x, x, x, 1.0));
291 // }
292 // fn vert_main1() -> VertexOutput {
293 // return foo(0.5);
294 // }
295 // fn vert_main2() -> VertexOutput {
296 // return foo(0.25);
297 // }
298 auto* vertex_output_struct = Structure(
299 "VertexOutput",
dan sinclair63925792023-02-17 21:56:35 +0000300 {Member("pos", ty.vec4<f32>(), {Builtin(builtin::BuiltinValue::kPosition)})});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000301
Ben Clayton783b1692022-08-02 17:03:35 +0000302 Func("foo", utils::Vector{Param("x", ty.f32())}, ty.Of(vertex_output_struct),
Ben Clayton01ac21c2023-02-07 16:14:25 +0000303 {Return(Call(ty.Of(vertex_output_struct),
304 Call(ty.vec4<f32>(), "x", "x", "x", Expr(1_f))))},
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000305 {});
306
Ben Clayton783b1692022-08-02 17:03:35 +0000307 Func("vert_main1", utils::Empty, ty.Of(vertex_output_struct),
Ben Clayton01ac21c2023-02-07 16:14:25 +0000308 {Return(Call(ty.Of(vertex_output_struct),
Ben Clayton0a3cda92022-05-10 17:30:15 +0000309 Expr(Call("foo", Expr(0.5_f)))))},
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000310 {Stage(ast::PipelineStage::kVertex)});
311
Ben Clayton783b1692022-08-02 17:03:35 +0000312 Func("vert_main2", utils::Empty, ty.Of(vertex_output_struct),
Ben Clayton01ac21c2023-02-07 16:14:25 +0000313 {Return(Call(ty.Of(vertex_output_struct),
Ben Clayton0a3cda92022-05-10 17:30:15 +0000314 Expr(Call("foo", Expr(0.25_f)))))},
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000315 {Stage(ast::PipelineStage::kVertex)});
316
317 GeneratorImpl& gen = SanitizeAndBuild();
318
dan sinclair8a435a22023-04-12 11:59:24 +0000319 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000320 EXPECT_EQ(gen.result(), R"(struct VertexOutput {
321 float4 pos;
322};
323
324VertexOutput foo(float x) {
325 const VertexOutput tint_symbol_4 = {float4(x, x, x, 1.0f)};
326 return tint_symbol_4;
327}
328
329struct tint_symbol {
330 float4 pos : SV_Position;
331};
332
333tint_symbol vert_main1() {
334 const VertexOutput tint_symbol_1 = {foo(0.5f)};
335 const tint_symbol tint_symbol_5 = {tint_symbol_1.pos};
336 return tint_symbol_5;
337}
338
339struct tint_symbol_2 {
340 float4 pos : SV_Position;
341};
342
343tint_symbol_2 vert_main2() {
344 const VertexOutput tint_symbol_3 = {foo(0.25f)};
345 const tint_symbol_2 tint_symbol_6 = {tint_symbol_3.pos};
346 return tint_symbol_6;
347}
348)");
349}
350#endif
351
352TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_With_Uniform) {
Ben Clayton783b1692022-08-02 17:03:35 +0000353 auto* ubo_ty = Structure("UBO", utils::Vector{Member("coord", ty.vec4<f32>())});
dan sinclairf9b831c2022-08-29 21:13:00 +0000354 auto* ubo =
dan sinclair2a651632023-02-19 04:03:55 +0000355 GlobalVar("ubo", ty.Of(ubo_ty), builtin::AddressSpace::kUniform, Binding(0_a), Group(1_a));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000356
dan sinclair41e4d9a2022-05-01 14:40:55 +0000357 Func("sub_func",
Ben Clayton783b1692022-08-02 17:03:35 +0000358 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000359 Param("param", ty.f32()),
360 },
361 ty.f32(),
Ben Clayton783b1692022-08-02 17:03:35 +0000362 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000363 Return(MemberAccessor(MemberAccessor(ubo, "coord"), "x")),
364 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000365
Ben Clayton58794ae2022-08-19 17:28:53 +0000366 auto* var = Var("v", ty.f32(), Call("sub_func", 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000367
Ben Clayton783b1692022-08-02 17:03:35 +0000368 Func("frag_main", utils::Empty, ty.void_(),
369 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000370 Decl(var),
371 Return(),
372 },
Ben Clayton783b1692022-08-02 17:03:35 +0000373 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000374 Stage(ast::PipelineStage::kFragment),
375 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000376
dan sinclair41e4d9a2022-05-01 14:40:55 +0000377 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000378
dan sinclair8a435a22023-04-12 11:59:24 +0000379 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000380 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000381precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000382
383struct UBO {
384 vec4 coord;
385};
386
Stephen White05d8b022022-09-13 19:48:51 +0000387layout(binding = 0, std140) uniform UBO_ubo {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000388 vec4 coord;
389} ubo;
390
391float sub_func(float param) {
392 return ubo.coord.x;
393}
394
395void frag_main() {
396 float v = sub_func(1.0f);
397 return;
398}
399)");
400}
401
dan sinclair41e4d9a2022-05-01 14:40:55 +0000402TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_With_UniformStruct) {
Ben Clayton783b1692022-08-02 17:03:35 +0000403 auto* s = Structure("Uniforms", utils::Vector{Member("coord", ty.vec4<f32>())});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000404
dan sinclair2a651632023-02-19 04:03:55 +0000405 GlobalVar("uniforms", ty.Of(s), builtin::AddressSpace::kUniform, Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000406
Ben Clayton58794ae2022-08-19 17:28:53 +0000407 auto* var = Var("v", ty.f32(), MemberAccessor(MemberAccessor("uniforms", "coord"), "x"));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000408
Ben Clayton783b1692022-08-02 17:03:35 +0000409 Func("frag_main", utils::Empty, ty.void_(),
410 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000411 Decl(var),
412 Return(),
413 },
Ben Clayton783b1692022-08-02 17:03:35 +0000414 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000415 Stage(ast::PipelineStage::kFragment),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000416 });
417
dan sinclair41e4d9a2022-05-01 14:40:55 +0000418 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000419
dan sinclair8a435a22023-04-12 11:59:24 +0000420 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000421 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000422precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000423
424struct Uniforms {
425 vec4 coord;
426};
427
Stephen White05d8b022022-09-13 19:48:51 +0000428layout(binding = 0, std140) uniform Uniforms_ubo {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000429 vec4 coord;
430} uniforms;
431
432void frag_main() {
433 float v = uniforms.coord.x;
434 return;
435}
436)");
437}
438
dan sinclair41e4d9a2022-05-01 14:40:55 +0000439TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_With_RW_StorageBuffer_Read) {
Ben Clayton783b1692022-08-02 17:03:35 +0000440 auto* s = Structure("Data", utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000441 Member("a", ty.i32()),
442 Member("b", ty.f32()),
443 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000444
dan sinclair2a651632023-02-19 04:03:55 +0000445 GlobalVar("coord", ty.Of(s), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
dan sinclair18b21582023-01-21 19:56:49 +0000446 Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000447
Ben Clayton58794ae2022-08-19 17:28:53 +0000448 auto* var = Var("v", ty.f32(), MemberAccessor("coord", "b"));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000449
Ben Clayton783b1692022-08-02 17:03:35 +0000450 Func("frag_main", utils::Empty, ty.void_(),
451 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000452 Decl(var),
453 Return(),
454 },
Ben Clayton783b1692022-08-02 17:03:35 +0000455 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000456 Stage(ast::PipelineStage::kFragment),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000457 });
458
dan sinclair41e4d9a2022-05-01 14:40:55 +0000459 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000460
dan sinclair8a435a22023-04-12 11:59:24 +0000461 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000462 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000463precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000464
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000465struct Data {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000466 int a;
467 float b;
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000468};
469
470layout(binding = 0, std430) buffer coord_block_ssbo {
471 Data inner;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000472} coord;
Stephen White863d9ed2022-09-02 19:19:10 +0000473
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000474void frag_main() {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000475 float v = coord.inner.b;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000476 return;
477}
478
479void main() {
480 frag_main();
481 return;
482}
483)");
484}
485
dan sinclair41e4d9a2022-05-01 14:40:55 +0000486TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_With_RO_StorageBuffer_Read) {
Ben Clayton783b1692022-08-02 17:03:35 +0000487 auto* s = Structure("Data", utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000488 Member("a", ty.i32()),
489 Member("b", ty.f32()),
490 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000491
dan sinclair2a651632023-02-19 04:03:55 +0000492 GlobalVar("coord", ty.Of(s), builtin::AddressSpace::kStorage, builtin::Access::kRead,
493 Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000494
Ben Clayton58794ae2022-08-19 17:28:53 +0000495 auto* var = Var("v", ty.f32(), MemberAccessor("coord", "b"));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000496
Ben Clayton783b1692022-08-02 17:03:35 +0000497 Func("frag_main", utils::Empty, ty.void_(),
498 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000499 Decl(var),
500 Return(),
501 },
Ben Clayton783b1692022-08-02 17:03:35 +0000502 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000503 Stage(ast::PipelineStage::kFragment),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000504 });
505
dan sinclair41e4d9a2022-05-01 14:40:55 +0000506 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000507
dan sinclair8a435a22023-04-12 11:59:24 +0000508 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000509 EXPECT_EQ(gen.result(),
510 R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000511precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000512
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000513struct Data {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000514 int a;
515 float b;
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000516};
517
518layout(binding = 0, std430) buffer coord_block_ssbo {
519 Data inner;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000520} coord;
Stephen White863d9ed2022-09-02 19:19:10 +0000521
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000522void frag_main() {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000523 float v = coord.inner.b;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000524 return;
525}
526
527void main() {
528 frag_main();
529 return;
530}
531)");
532}
533
dan sinclair41e4d9a2022-05-01 14:40:55 +0000534TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_With_WO_StorageBuffer_Store) {
Ben Clayton783b1692022-08-02 17:03:35 +0000535 auto* s = Structure("Data", utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000536 Member("a", ty.i32()),
537 Member("b", ty.f32()),
538 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000539
dan sinclair2a651632023-02-19 04:03:55 +0000540 GlobalVar("coord", ty.Of(s), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
dan sinclair18b21582023-01-21 19:56:49 +0000541 Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000542
Ben Clayton783b1692022-08-02 17:03:35 +0000543 Func("frag_main", utils::Empty, ty.void_(),
544 utils::Vector{
Ben Clayton0a3cda92022-05-10 17:30:15 +0000545 Assign(MemberAccessor("coord", "b"), Expr(2_f)),
dan sinclair41e4d9a2022-05-01 14:40:55 +0000546 Return(),
547 },
Ben Clayton783b1692022-08-02 17:03:35 +0000548 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000549 Stage(ast::PipelineStage::kFragment),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000550 });
551
dan sinclair41e4d9a2022-05-01 14:40:55 +0000552 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000553
dan sinclair8a435a22023-04-12 11:59:24 +0000554 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000555 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000556precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000557
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000558struct Data {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000559 int a;
560 float b;
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000561};
562
563layout(binding = 0, std430) buffer coord_block_ssbo {
564 Data inner;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000565} coord;
Stephen White863d9ed2022-09-02 19:19:10 +0000566
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000567void frag_main() {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000568 coord.inner.b = 2.0f;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000569 return;
570}
571
572void main() {
573 frag_main();
574 return;
575}
576)");
577}
578
dan sinclair41e4d9a2022-05-01 14:40:55 +0000579TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_With_StorageBuffer_Store) {
Ben Clayton783b1692022-08-02 17:03:35 +0000580 auto* s = Structure("Data", utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000581 Member("a", ty.i32()),
582 Member("b", ty.f32()),
583 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000584
dan sinclair2a651632023-02-19 04:03:55 +0000585 GlobalVar("coord", ty.Of(s), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
dan sinclair18b21582023-01-21 19:56:49 +0000586 Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000587
Ben Clayton783b1692022-08-02 17:03:35 +0000588 Func("frag_main", utils::Empty, ty.void_(),
589 utils::Vector{
Ben Clayton0a3cda92022-05-10 17:30:15 +0000590 Assign(MemberAccessor("coord", "b"), Expr(2_f)),
dan sinclair41e4d9a2022-05-01 14:40:55 +0000591 Return(),
592 },
Ben Clayton783b1692022-08-02 17:03:35 +0000593 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000594 Stage(ast::PipelineStage::kFragment),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000595 });
596
dan sinclair41e4d9a2022-05-01 14:40:55 +0000597 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000598
dan sinclair8a435a22023-04-12 11:59:24 +0000599 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000600 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000601precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000602
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000603struct Data {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000604 int a;
605 float b;
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000606};
607
608layout(binding = 0, std430) buffer coord_block_ssbo {
609 Data inner;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000610} coord;
Stephen White863d9ed2022-09-02 19:19:10 +0000611
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000612void frag_main() {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000613 coord.inner.b = 2.0f;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000614 return;
615}
616
617void main() {
618 frag_main();
619 return;
620}
621)");
622}
623
dan sinclair41e4d9a2022-05-01 14:40:55 +0000624TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_Called_By_EntryPoint_With_Uniform) {
Ben Clayton783b1692022-08-02 17:03:35 +0000625 auto* s = Structure("S", utils::Vector{Member("x", ty.f32())});
dan sinclair2a651632023-02-19 04:03:55 +0000626 GlobalVar("coord", ty.Of(s), builtin::AddressSpace::kUniform, Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000627
Ben Clayton783b1692022-08-02 17:03:35 +0000628 Func("sub_func", utils::Vector{Param("param", ty.f32())}, ty.f32(),
629 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000630 Return(MemberAccessor("coord", "x")),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000631 });
632
Ben Clayton58794ae2022-08-19 17:28:53 +0000633 auto* var = Var("v", ty.f32(), Call("sub_func", 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000634
Ben Clayton783b1692022-08-02 17:03:35 +0000635 Func("frag_main", utils::Empty, ty.void_(),
636 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000637 Decl(var),
638 Return(),
639 },
Ben Clayton783b1692022-08-02 17:03:35 +0000640 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000641 Stage(ast::PipelineStage::kFragment),
642 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000643
dan sinclair41e4d9a2022-05-01 14:40:55 +0000644 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000645
dan sinclair8a435a22023-04-12 11:59:24 +0000646 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000647 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000648precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000649
650struct S {
651 float x;
652};
653
Stephen White05d8b022022-09-13 19:48:51 +0000654layout(binding = 0, std140) uniform S_ubo {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000655 float x;
656} coord;
657
658float sub_func(float param) {
659 return coord.x;
660}
661
662void frag_main() {
663 float v = sub_func(1.0f);
664 return;
665}
666)");
667}
668
dan sinclair41e4d9a2022-05-01 14:40:55 +0000669TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_Called_By_EntryPoint_With_StorageBuffer) {
Ben Clayton783b1692022-08-02 17:03:35 +0000670 auto* s = Structure("S", utils::Vector{Member("x", ty.f32())});
dan sinclair2a651632023-02-19 04:03:55 +0000671 GlobalVar("coord", ty.Of(s), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
dan sinclair18b21582023-01-21 19:56:49 +0000672 Binding(0_a), Group(1_a));
dan sinclair41e4d9a2022-05-01 14:40:55 +0000673
Ben Clayton783b1692022-08-02 17:03:35 +0000674 Func("sub_func", utils::Vector{Param("param", ty.f32())}, ty.f32(),
675 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000676 Return(MemberAccessor("coord", "x")),
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000677 });
678
Ben Clayton58794ae2022-08-19 17:28:53 +0000679 auto* var = Var("v", ty.f32(), Call("sub_func", 1_f));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000680
Ben Clayton783b1692022-08-02 17:03:35 +0000681 Func("frag_main", utils::Empty, ty.void_(),
682 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000683 Decl(var),
684 Return(),
685 },
Ben Clayton783b1692022-08-02 17:03:35 +0000686 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000687 Stage(ast::PipelineStage::kFragment),
688 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000689
dan sinclair41e4d9a2022-05-01 14:40:55 +0000690 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000691
dan sinclair8a435a22023-04-12 11:59:24 +0000692 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000693 EXPECT_EQ(gen.result(),
694 R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000695precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000696
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000697struct S {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000698 float x;
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000699};
700
701layout(binding = 0, std430) buffer coord_block_ssbo {
702 S inner;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000703} coord;
Stephen White863d9ed2022-09-02 19:19:10 +0000704
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000705float sub_func(float param) {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000706 return coord.inner.x;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000707}
708
709void frag_main() {
710 float v = sub_func(1.0f);
711 return;
712}
713
714void main() {
715 frag_main();
716 return;
717}
718)");
719}
720
dan sinclair41e4d9a2022-05-01 14:40:55 +0000721TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_WithNameCollision) {
Ben Clayton783b1692022-08-02 17:03:35 +0000722 Func("centroid", utils::Empty, ty.void_(), {},
723 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000724 Stage(ast::PipelineStage::kFragment),
725 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000726
dan sinclair41e4d9a2022-05-01 14:40:55 +0000727 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000728
dan sinclair8a435a22023-04-12 11:59:24 +0000729 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000730 EXPECT_EQ(gen.result(), R"(#version 310 es
Ben Claytonf1f56b22023-03-09 19:58:23 +0000731precision highp float;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000732
733void tint_symbol() {
734}
735
736void main() {
737 tint_symbol();
738 return;
739}
740)");
741}
742
743TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_Compute) {
Ben Clayton783b1692022-08-02 17:03:35 +0000744 Func("main", utils::Empty, ty.void_(),
745 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000746 Return(),
747 },
Ben Clayton783b1692022-08-02 17:03:35 +0000748 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000749 Stage(ast::PipelineStage::kCompute),
750 WorkgroupSize(1_i),
751 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000752
dan sinclair41e4d9a2022-05-01 14:40:55 +0000753 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000754
dan sinclair8a435a22023-04-12 11:59:24 +0000755 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000756 EXPECT_EQ(gen.result(), R"(#version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000757
758layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
759void main() {
760 return;
761}
762)");
763}
764
dan sinclair41e4d9a2022-05-01 14:40:55 +0000765TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_Compute_WithWorkgroup_Literal) {
Ben Clayton783b1692022-08-02 17:03:35 +0000766 Func("main", utils::Empty, ty.void_(), {},
767 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000768 Stage(ast::PipelineStage::kCompute),
Ben Clayton0ce9ab02022-05-05 20:23:40 +0000769 WorkgroupSize(2_i, 4_i, 6_i),
dan sinclair41e4d9a2022-05-01 14:40:55 +0000770 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000771
dan sinclair41e4d9a2022-05-01 14:40:55 +0000772 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000773
dan sinclair8a435a22023-04-12 11:59:24 +0000774 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000775 EXPECT_EQ(gen.result(), R"(#version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000776
777layout(local_size_x = 2, local_size_y = 4, local_size_z = 6) in;
778void main() {
779 return;
780}
781)");
782}
783
Ben Clayton19576e92022-06-28 12:44:16 +0000784TEST_F(GlslGeneratorImplTest_Function, Emit_Attribute_EntryPoint_Compute_WithWorkgroup_Const) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000785 GlobalConst("width", ty.i32(), Call<i32>(2_i));
786 GlobalConst("height", ty.i32(), Call<i32>(3_i));
787 GlobalConst("depth", ty.i32(), Call<i32>(4_i));
Ben Clayton783b1692022-08-02 17:03:35 +0000788 Func("main", utils::Empty, ty.void_(), {},
789 utils::Vector{
Ben Clayton19576e92022-06-28 12:44:16 +0000790 Stage(ast::PipelineStage::kCompute),
791 WorkgroupSize("width", "height", "depth"),
792 });
793
794 GeneratorImpl& gen = Build();
795
dan sinclair8a435a22023-04-12 11:59:24 +0000796 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
Ben Clayton19576e92022-06-28 12:44:16 +0000797 EXPECT_EQ(gen.result(), R"(#version 310 es
798
799layout(local_size_x = 2, local_size_y = 3, local_size_z = 4) in;
800void main() {
801 return;
802}
803)");
804}
805
Ben Clayton490d9882022-09-21 21:05:45 +0000806TEST_F(GlslGeneratorImplTest_Function,
807 Emit_Attribute_EntryPoint_Compute_WithWorkgroup_OverridableConst) {
Ben Clayton01ac21c2023-02-07 16:14:25 +0000808 Override("width", ty.i32(), Call<i32>(2_i), Id(7_u));
809 Override("height", ty.i32(), Call<i32>(3_i), Id(8_u));
810 Override("depth", ty.i32(), Call<i32>(4_i), Id(9_u));
Ben Clayton490d9882022-09-21 21:05:45 +0000811 Func("main", utils::Empty, ty.void_(), {},
812 utils::Vector{
813 Stage(ast::PipelineStage::kCompute),
814 WorkgroupSize("width", "height", "depth"),
815 });
816
817 GeneratorImpl& gen = Build();
818
dan sinclair8a435a22023-04-12 11:59:24 +0000819 EXPECT_FALSE(gen.Generate()) << gen.Diagnostics();
Ben Clayton490d9882022-09-21 21:05:45 +0000820 EXPECT_EQ(
dan sinclair8a435a22023-04-12 11:59:24 +0000821 gen.Diagnostics().str(),
Ben Claytonf10a5792022-10-13 13:47:39 +0000822 R"(error: override-expressions should have been removed with the SubstituteOverride transform)");
Ben Clayton490d9882022-09-21 21:05:45 +0000823}
824
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000825TEST_F(GlslGeneratorImplTest_Function, Emit_Function_WithArrayParams) {
Ben Clayton783b1692022-08-02 17:03:35 +0000826 Func("my_func", utils::Vector{Param("a", ty.array<f32, 5>())}, ty.void_(),
827 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000828 Return(),
829 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000830
dan sinclair41e4d9a2022-05-01 14:40:55 +0000831 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000832
dan sinclair8a435a22023-04-12 11:59:24 +0000833 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000834 EXPECT_EQ(gen.result(), R"(#version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000835
836void my_func(float a[5]) {
837 return;
838}
839
840)");
841}
842
843TEST_F(GlslGeneratorImplTest_Function, Emit_Function_WithArrayReturn) {
Ben Clayton783b1692022-08-02 17:03:35 +0000844 Func("my_func", utils::Empty, ty.array<f32, 5>(),
845 utils::Vector{
Ben Clayton01ac21c2023-02-07 16:14:25 +0000846 Return(Call(ty.array<f32, 5>())),
dan sinclair41e4d9a2022-05-01 14:40:55 +0000847 });
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000848
dan sinclair41e4d9a2022-05-01 14:40:55 +0000849 GeneratorImpl& gen = Build();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000850
dan sinclair8a435a22023-04-12 11:59:24 +0000851 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000852 EXPECT_EQ(gen.result(), R"(#version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000853
854float[5] my_func() {
855 return float[5](0.0f, 0.0f, 0.0f, 0.0f, 0.0f);
856}
857
858)");
859}
860
861// https://crbug.com/tint/297
dan sinclair41e4d9a2022-05-01 14:40:55 +0000862TEST_F(GlslGeneratorImplTest_Function, Emit_Multiple_EntryPoint_With_Same_ModuleVar) {
863 // struct Data {
864 // d : f32;
865 // };
866 // @binding(0) @group(0) var<storage> data : Data;
867 //
dan sinclairb29892b2022-06-07 13:55:34 +0000868 // @compute @workgroup_size(1)
dan sinclair41e4d9a2022-05-01 14:40:55 +0000869 // fn a() {
870 // var v = data.d;
871 // return;
872 // }
873 //
dan sinclairb29892b2022-06-07 13:55:34 +0000874 // @compute @workgroup_size(1)
dan sinclair41e4d9a2022-05-01 14:40:55 +0000875 // fn b() {
876 // var v = data.d;
877 // return;
878 // }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000879
Ben Clayton783b1692022-08-02 17:03:35 +0000880 auto* s = Structure("Data", utils::Vector{Member("d", ty.f32())});
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000881
dan sinclair2a651632023-02-19 04:03:55 +0000882 GlobalVar("data", ty.Of(s), builtin::AddressSpace::kStorage, builtin::Access::kReadWrite,
dan sinclair61c16eb2023-01-21 23:44:38 +0000883 Binding(0_a), Group(0_a));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000884
dan sinclair41e4d9a2022-05-01 14:40:55 +0000885 {
Ben Clayton58794ae2022-08-19 17:28:53 +0000886 auto* var = Var("v", ty.f32(), MemberAccessor("data", "d"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000887
Ben Clayton783b1692022-08-02 17:03:35 +0000888 Func("a", utils::Empty, ty.void_(),
889 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000890 Decl(var),
891 Return(),
892 },
Ben Clayton783b1692022-08-02 17:03:35 +0000893 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000894 Stage(ast::PipelineStage::kCompute),
895 WorkgroupSize(1_i),
896 });
dan sinclair41e4d9a2022-05-01 14:40:55 +0000897 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000898
dan sinclair41e4d9a2022-05-01 14:40:55 +0000899 {
Ben Clayton58794ae2022-08-19 17:28:53 +0000900 auto* var = Var("v", ty.f32(), MemberAccessor("data", "d"));
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000901
Ben Clayton783b1692022-08-02 17:03:35 +0000902 Func("b", utils::Empty, ty.void_(),
903 utils::Vector{
dan sinclair41e4d9a2022-05-01 14:40:55 +0000904 Decl(var),
905 Return(),
906 },
Ben Clayton783b1692022-08-02 17:03:35 +0000907 utils::Vector{
Ben Clayton7164b972022-06-15 10:02:37 +0000908 Stage(ast::PipelineStage::kCompute),
909 WorkgroupSize(1_i),
910 });
dan sinclair41e4d9a2022-05-01 14:40:55 +0000911 }
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000912
dan sinclair41e4d9a2022-05-01 14:40:55 +0000913 GeneratorImpl& gen = SanitizeAndBuild();
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000914
dan sinclair8a435a22023-04-12 11:59:24 +0000915 ASSERT_TRUE(gen.Generate()) << gen.Diagnostics();
dan sinclair41e4d9a2022-05-01 14:40:55 +0000916 EXPECT_EQ(gen.result(), R"(#version 310 es
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000917
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000918struct Data {
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000919 float d;
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000920};
921
922layout(binding = 0, std430) buffer data_block_ssbo {
923 Data inner;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000924} data;
Stephen White863d9ed2022-09-02 19:19:10 +0000925
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000926void a() {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000927 float v = data.inner.d;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000928 return;
929}
930
931layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
932void main() {
933 a();
934 return;
935}
936void b() {
Zhaoming Jiang6ab5d3c2022-11-02 02:25:38 +0000937 float v = data.inner.d;
Ryan Harrisondbc13af2022-02-21 15:19:07 +0000938 return;
939}
940
941layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in;
942void main_1() {
943 b();
944 return;
945}
946)");
947}
948
949} // namespace
dan sinclair5d590592022-04-07 14:40:24 +0000950} // namespace tint::writer::glsl