Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/compiler_tests/EXT_YUV_target_test.cpp
1693 views
1
//
2
// Copyright 2017 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
// EXT_YUV_target.cpp:
7
// Test for EXT_YUV_target implementation.
8
//
9
10
#include "tests/test_utils/ShaderExtensionTest.h"
11
12
using EXTYUVTargetTest = sh::ShaderExtensionTest;
13
14
namespace
15
{
16
const char EXTYTPragma[] = "#extension GL_EXT_YUV_target : require\n";
17
18
const char ESSL300_SimpleShader[] =
19
"precision mediump float;\n"
20
"uniform __samplerExternal2DY2YEXT uSampler;\n"
21
"out vec4 fragColor;\n"
22
"void main() { \n"
23
" fragColor = vec4(1.0);\n"
24
"}\n";
25
26
// Shader that samples the texture and writes to FragColor.
27
const char ESSL300_FragColorShader[] =
28
"precision mediump float;\n"
29
"uniform __samplerExternal2DY2YEXT uSampler;\n"
30
"layout(yuv) out vec4 fragColor;\n"
31
"void main() { \n"
32
" fragColor = texture(uSampler, vec2(0.0));\n"
33
"}\n";
34
35
// Shader that specifies yuv layout qualifier multiple times.
36
const char ESSL300_YUVQualifierMultipleTimesShader[] =
37
"precision mediump float;\n"
38
"layout(yuv, yuv, yuv) out vec4 fragColor;\n"
39
"void main() { \n"
40
"}\n";
41
42
// Shader that specifies yuv layout qualifier for not output fails to compile.
43
const char ESSL300_YUVQualifierFailureShader1[] =
44
"precision mediump float;\n"
45
"layout(yuv) in vec4 fragColor;\n"
46
"void main() { \n"
47
"}\n";
48
49
const char ESSL300_YUVQualifierFailureShader2[] =
50
"precision mediump float;\n"
51
"layout(yuv) uniform;\n"
52
"layout(yuv) uniform Transform {\n"
53
" mat4 M1;\n"
54
"}\n"
55
"void main() { \n"
56
"}\n";
57
58
// Shader that specifies yuv layout qualifier with location fails to compile.
59
const char ESSL300_LocationAndYUVFailureShader[] =
60
"precision mediump float;\n"
61
"layout(location = 0, yuv) out vec4 fragColor;\n"
62
"void main() { \n"
63
"}\n";
64
65
// Shader that specifies yuv layout qualifier with multiple color outputs fails to compile.
66
const char ESSL300_MultipleColorAndYUVOutputsFailureShader1[] =
67
"precision mediump float;\n"
68
"layout(yuv) out vec4 fragColor;\n"
69
"layout out vec4 fragColor1;\n"
70
"void main() { \n"
71
"}\n";
72
73
const char ESSL300_MultipleColorAndYUVOutputsFailureShader2[] =
74
"precision mediump float;\n"
75
"layout(yuv) out vec4 fragColor;\n"
76
"layout(location = 1) out vec4 fragColor1;\n"
77
"void main() { \n"
78
"}\n";
79
80
// Shader that specifies yuv layout qualifier with depth output fails to compile.
81
const char ESSL300_DepthAndYUVOutputsFailureShader[] =
82
"precision mediump float;\n"
83
"layout(yuv) out vec4 fragColor;\n"
84
"void main() { \n"
85
" gl_FragDepth = 1.0f;\n"
86
"}\n";
87
88
// Shader that specifies yuv layout qualifier with multiple outputs fails to compile.
89
const char ESSL300_MultipleYUVOutputsFailureShader[] =
90
"precision mediump float;\n"
91
"layout(yuv) out vec4 fragColor;\n"
92
"layout(yuv) out vec4 fragColor1;\n"
93
"void main() { \n"
94
"}\n";
95
96
// Shader that specifies yuvCscStandartEXT type and associated values.
97
const char ESSL300_YuvCscStandardEXTShader[] =
98
R"(precision mediump float;
99
yuvCscStandardEXT;
100
yuvCscStandardEXT conv;
101
yuvCscStandardEXT conv1 = itu_601;
102
yuvCscStandardEXT conv2 = itu_601_full_range;
103
yuvCscStandardEXT conv3 = itu_709;
104
const yuvCscStandardEXT conv4 = itu_709;
105
106
uniform int u;
107
out vec4 my_color;
108
109
yuvCscStandardEXT conv_standard()
110
{
111
switch(u)
112
{
113
case 1:
114
return conv1;
115
case 2:
116
return conv2;
117
case 3:
118
return conv3;
119
default:
120
return conv;
121
}
122
}
123
bool is_itu_601(inout yuvCscStandardEXT csc)
124
{
125
csc = itu_601;
126
return csc == itu_601;
127
}
128
bool is_itu_709(yuvCscStandardEXT csc)
129
{
130
return csc == itu_709;
131
}
132
void main()
133
{
134
yuvCscStandardEXT conv = conv_standard();
135
bool csc_check1 = is_itu_601(conv);
136
bool csc_check2 = is_itu_709(itu_709);
137
if (csc_check1 && csc_check2) {
138
my_color = vec4(0, 1, 0, 1);
139
}
140
})";
141
142
// Shader that specifies yuvCscStandartEXT type constructor fails to compile.
143
const char ESSL300_YuvCscStandartdEXTConstructFailureShader1[] =
144
"precision mediump float;\n"
145
"yuvCscStandardEXT conv = yuvCscStandardEXT();\n"
146
"void main() { \n"
147
"}\n";
148
149
const char ESSL300_YuvCscStandartdEXTConstructFailureShader2[] =
150
"precision mediump float;\n"
151
"yuvCscStandardEXT conv = yuvCscStandardEXT(itu_601);\n"
152
"void main() { \n"
153
"}\n";
154
155
// Shader that specifies yuvCscStandartEXT type conversion fails to compile.
156
const char ESSL300_YuvCscStandartdEXTConversionFailureShader1[] =
157
"precision mediump float;\n"
158
"yuvCscStandardEXT conv = false;\n"
159
"void main() { \n"
160
"}\n";
161
162
const char ESSL300_YuvCscStandartdEXTConversionFailureShader2[] =
163
"precision mediump float;\n"
164
"yuvCscStandardEXT conv = 0;\n"
165
"void main() { \n"
166
"}\n";
167
168
const char ESSL300_YuvCscStandartdEXTConversionFailureShader3[] =
169
"precision mediump float;\n"
170
"yuvCscStandardEXT conv = 2.0f;\n"
171
"void main() { \n"
172
"}\n";
173
174
const char ESSL300_YuvCscStandartdEXTConversionFailureShader4[] =
175
"precision mediump float;\n"
176
"yuvCscStandardEXT conv = itu_601 | itu_709;\n"
177
"void main() { \n"
178
"}\n";
179
180
const char ESSL300_YuvCscStandartdEXTConversionFailureShader5[] =
181
"precision mediump float;\n"
182
"yuvCscStandardEXT conv = itu_601 & 3.0f;\n"
183
"void main() { \n"
184
"}\n";
185
186
// Shader that specifies yuvCscStandartEXT type qualifiers fails to compile.
187
const char ESSL300_YuvCscStandartdEXTQualifiersFailureShader1[] =
188
"precision mediump float;\n"
189
"in yuvCscStandardEXT conv = itu_601;\n"
190
"void main() { \n"
191
"}\n";
192
193
const char ESSL300_YuvCscStandartdEXTQualifiersFailureShader2[] =
194
"precision mediump float;\n"
195
"out yuvCscStandardEXT conv = itu_601;\n"
196
"void main() { \n"
197
"}\n";
198
199
const char ESSL300_YuvCscStandartdEXTQualifiersFailureShader3[] =
200
"precision mediump float;\n"
201
"uniform yuvCscStandardEXT conv = itu_601;\n"
202
"void main() { \n"
203
"}\n";
204
205
// Shader that specifies yuv_to_rgb() and rgb_to_yuv() built-in functions.
206
const char ESSL300_BuiltInFunctionsShader[] =
207
R"(precision mediump float;
208
yuvCscStandardEXT conv = itu_601;
209
210
out vec4 my_color;
211
212
void main()
213
{
214
vec3 yuv = rgb_2_yuv(vec3(0.0f), conv);
215
vec3 rgb = yuv_2_rgb(yuv, itu_601);
216
my_color = vec4(rgb, 1.0);
217
})";
218
219
const char ESSL300_OverloadRgb2Yuv[] =
220
R"(precision mediump float;
221
float rgb_2_yuv(float x) { return x + 1.0; }
222
223
in float i;
224
out float o;
225
226
void main()
227
{
228
o = rgb_2_yuv(i);
229
})";
230
231
const char ESSL300_OverloadYuv2Rgb[] =
232
R"(precision mediump float;
233
float yuv_2_rgb(float x) { return x + 1.0; }
234
235
in float i;
236
out float o;
237
238
void main()
239
{
240
o = yuv_2_rgb(i);
241
})";
242
243
// Extension flag is required to compile properly. Expect failure when it is
244
// not present.
245
TEST_P(EXTYUVTargetTest, CompileFailsWithoutExtension)
246
{
247
mResources.EXT_YUV_target = 0;
248
InitializeCompiler();
249
EXPECT_FALSE(TestShaderCompile(EXTYTPragma));
250
}
251
252
// Extension directive is required to compile properly. Expect failure when
253
// it is not present.
254
TEST_P(EXTYUVTargetTest, CompileFailsWithExtensionWithoutPragma)
255
{
256
mResources.EXT_YUV_target = 1;
257
InitializeCompiler();
258
EXPECT_FALSE(TestShaderCompile(""));
259
}
260
261
// With extension flag and extension directive, compiling succeeds.
262
// Also test that the extension directive state is reset correctly.
263
TEST_P(EXTYUVTargetTest, CompileSucceedsWithExtensionAndPragma)
264
{
265
mResources.EXT_YUV_target = 1;
266
InitializeCompiler();
267
EXPECT_TRUE(TestShaderCompile(EXTYTPragma));
268
// Test reset functionality.
269
EXPECT_FALSE(TestShaderCompile(""));
270
EXPECT_TRUE(TestShaderCompile(EXTYTPragma));
271
}
272
273
INSTANTIATE_TEST_SUITE_P(CorrectVariantsWithExtensionAndPragma,
274
EXTYUVTargetTest,
275
Combine(Values(SH_GLES3_SPEC),
276
Values(sh::ESSLVersion300),
277
Values(ESSL300_SimpleShader, ESSL300_FragColorShader)));
278
279
class EXTYUVTargetCompileSuccessTest : public EXTYUVTargetTest
280
{};
281
282
TEST_P(EXTYUVTargetCompileSuccessTest, CompileSucceeds)
283
{
284
// Expect compile success.
285
mResources.EXT_YUV_target = 1;
286
InitializeCompiler();
287
EXPECT_TRUE(TestShaderCompile(EXTYTPragma));
288
}
289
290
INSTANTIATE_TEST_SUITE_P(CorrectESSL300Shaders,
291
EXTYUVTargetCompileSuccessTest,
292
Combine(Values(SH_GLES3_SPEC),
293
Values(sh::ESSLVersion300),
294
Values(ESSL300_FragColorShader,
295
ESSL300_YUVQualifierMultipleTimesShader,
296
ESSL300_YuvCscStandardEXTShader,
297
ESSL300_BuiltInFunctionsShader)));
298
299
class EXTYUVTargetCompileFailureTest : public EXTYUVTargetTest
300
{};
301
302
TEST_P(EXTYUVTargetCompileFailureTest, CompileFails)
303
{
304
// Expect compile failure due to shader error, with shader having correct pragma.
305
mResources.EXT_YUV_target = 1;
306
InitializeCompiler();
307
EXPECT_FALSE(TestShaderCompile(EXTYTPragma));
308
}
309
310
INSTANTIATE_TEST_SUITE_P(IncorrectESSL300Shaders,
311
EXTYUVTargetCompileFailureTest,
312
Combine(Values(SH_GLES3_SPEC),
313
Values(sh::ESSLVersion300),
314
Values(ESSL300_YUVQualifierFailureShader1,
315
ESSL300_YUVQualifierFailureShader2,
316
ESSL300_LocationAndYUVFailureShader,
317
ESSL300_MultipleColorAndYUVOutputsFailureShader1,
318
ESSL300_MultipleColorAndYUVOutputsFailureShader2,
319
ESSL300_DepthAndYUVOutputsFailureShader,
320
ESSL300_MultipleYUVOutputsFailureShader,
321
ESSL300_YuvCscStandartdEXTConstructFailureShader1,
322
ESSL300_YuvCscStandartdEXTConstructFailureShader2,
323
ESSL300_YuvCscStandartdEXTConversionFailureShader1,
324
ESSL300_YuvCscStandartdEXTConversionFailureShader2,
325
ESSL300_YuvCscStandartdEXTConversionFailureShader3,
326
ESSL300_YuvCscStandartdEXTConversionFailureShader4,
327
ESSL300_YuvCscStandartdEXTConversionFailureShader5,
328
ESSL300_YuvCscStandartdEXTQualifiersFailureShader1,
329
ESSL300_YuvCscStandartdEXTQualifiersFailureShader2,
330
ESSL300_YuvCscStandartdEXTQualifiersFailureShader3)));
331
332
class EXTYUVNotEnabledTest : public EXTYUVTargetTest
333
{};
334
335
TEST_P(EXTYUVNotEnabledTest, CanOverloadConversions)
336
{
337
// Expect compile success with a shader that overloads functions in the EXT_YUV_target
338
// extension.
339
mResources.EXT_YUV_target = 0;
340
InitializeCompiler();
341
EXPECT_TRUE(TestShaderCompile(""));
342
}
343
344
INSTANTIATE_TEST_SUITE_P(CoreESSL300Shaders,
345
EXTYUVNotEnabledTest,
346
Combine(Values(SH_GLES3_SPEC),
347
Values(sh::ESSLVersion300),
348
Values(ESSL300_OverloadRgb2Yuv, ESSL300_OverloadYuv2Rgb)));
349
350
} // namespace
351
352