Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/shaderc
Path: blob/main/glslc/test/option_flimit.py
1560 views
1
# Copyright 2016 The Shaderc Authors. All rights reserved.
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
import expect
16
from environment import File, Directory
17
from glslc_test_framework import inside_glslc_testsuite
18
from placeholder import FileShader
19
20
21
def shader_source_with_tex_offset(offset):
22
"""Returns a vertex shader using a texture access with the given offset."""
23
24
return """#version 450
25
layout (binding=0) uniform sampler1D tex;
26
void main() { vec4 x = textureOffset(tex, 1.0, """ + str(offset) + "); }"
27
28
29
def shader_with_tex_offset(offset):
30
"""Returns a vertex FileShader using a texture access with the given offset."""
31
32
return FileShader(shader_source_with_tex_offset(offset), ".vert")
33
34
@inside_glslc_testsuite('OptionFLimit')
35
class TestFLimitNoEqual(expect.ErrorMessage):
36
"""Tests -flimit without equal."""
37
38
glslc_args = ['-flimit']
39
expected_error = ["glslc: error: unknown argument: '-flimit'\n"]
40
41
42
@inside_glslc_testsuite('OptionFLimit')
43
class TestFLimitJustEqual(expect.ValidObjectFile):
44
"""Tests -flimit= with no argument."""
45
46
shader = shader_with_tex_offset(0);
47
glslc_args = ['-c', shader, '-flimit=']
48
49
50
@inside_glslc_testsuite('OptionFLimit')
51
class TestFLimitJustEqualMaxOffset(expect.ValidObjectFile):
52
"""Tests -flimit= with no argument. The shader uses max offset."""
53
54
shader = shader_with_tex_offset(7);
55
glslc_args = ['-c', shader, '-flimit=']
56
57
58
@inside_glslc_testsuite('OptionFLimit')
59
class TestFLimitJustEqualMinOffset(expect.ValidObjectFile):
60
"""Tests -flimit= with no argument. The shader uses min offset."""
61
62
shader = shader_with_tex_offset(-8);
63
glslc_args = ['-c', shader, '-flimit=']
64
65
66
@inside_glslc_testsuite('OptionFLimit')
67
class TestFLimitJustEqualBelowMinOffset(expect.ErrorMessageSubstr):
68
"""Tests -flimit= with no argument. The shader uses below min default offset."""
69
70
shader = shader_with_tex_offset(-9);
71
glslc_args = ['-c', shader, '-flimit=']
72
expected_error_substr = ["'texel offset' : value is out of range"]
73
74
75
@inside_glslc_testsuite('OptionFLimit')
76
class TestFLimitLowerThanDefaultMinOffset(expect.ValidObjectFile):
77
"""Tests -flimit= with lower than default argument. The shader uses below min offset."""
78
79
shader = shader_with_tex_offset(-9);
80
glslc_args = ['-c', shader, '-flimit= MinProgramTexelOffset -9 ']
81
82
83
@inside_glslc_testsuite('OptionFLimit')
84
class TestFLimitIgnoredLangFeatureSettingSample(expect.ValidObjectFile):
85
"""Tests -flimit= an ignored option."""
86
87
shader = FileShader("#version 150\nvoid main() { while(true); }", '.vert')
88
glslc_args = ['-c', shader, '-flimit=whileLoops 0']
89
90
91
@inside_glslc_testsuite('OptionFLimit')
92
class TestFLimitLowerThanDefaultMinOffset(expect.ValidObjectFile):
93
"""Tests -flimit= with lower than default argument. The shader uses that offset."""
94
95
shader = shader_with_tex_offset(-9);
96
glslc_args = ['-c', shader, '-flimit= MinProgramTexelOffset -9 ']
97
98
99
@inside_glslc_testsuite('OptionFLimitFile')
100
class TestFLimitFileNoArg(expect.ErrorMessage):
101
"""Tests -flimit-file without an argument"""
102
103
shader = shader_with_tex_offset(-9);
104
glslc_args = ['-c', shader, '-flimit-file']
105
expected_error = "glslc: error: argument to '-flimit-file' is missing\n"
106
107
108
@inside_glslc_testsuite('OptionFLimitFile')
109
class TestFLimitFileMissingFile(expect.ErrorMessageSubstr):
110
"""Tests -flimit-file without an argument"""
111
112
shader = shader_with_tex_offset(-9);
113
glslc_args = ['-c', shader, '-flimit-file', 'i do not exist']
114
expected_error_substr = "glslc: error: cannot open input file: 'i do not exist'";
115
116
117
@inside_glslc_testsuite('OptionFLimitFile')
118
class TestFLimitFileSetsLowerMinTexelOffset(expect.ValidObjectFile):
119
"""Tests -flimit-file with lower than default argument. The shader uses that offset."""
120
121
limits_file = File('limits.txt', 'MinProgramTexelOffset -9')
122
shader = File('shader.vert', shader_source_with_tex_offset(-9));
123
environment = Directory('.', [limits_file, shader])
124
glslc_args = ['-c', shader.name, '-flimit-file', limits_file.name]
125
126
127
@inside_glslc_testsuite('OptionFLimitFile')
128
class TestFLimitFileInvalidContents(expect.ErrorMessage):
129
"""Tests -flimit-file bad file contents."""
130
131
limits_file = File('limits.txt', 'thisIsBad')
132
shader = File('shader.vert', shader_source_with_tex_offset(-9));
133
environment = Directory('.', [limits_file, shader])
134
glslc_args = ['-c', shader.name, '-flimit-file', limits_file.name]
135
expected_error = 'glslc: error: -flimit-file error: invalid resource limit: thisIsBad\n'
136
137
## Mesh shading
138
139
def mesh_shader_with_params(kwargs):
140
"""Returns a mesh shader as a FileShader, with given parameters"""
141
import sys
142
143
source = """#version 450
144
#extension {} : enable
145
layout(local_size_x={}) in;
146
layout(local_size_y={}) in;
147
layout(local_size_z={}) in;
148
layout(triangles) out;
149
layout(max_vertices={}) out;
150
layout(max_primitives={}) out;
151
layout(triangles) out;
152
void main() {{ }}
153
""".format(kwargs['extension'],kwargs['x'],kwargs['y'],kwargs['z'],kwargs['max_vert'],kwargs['max_prim'])
154
return FileShader(source,".mesh")
155
156
def task_shader_with_params(kwargs):
157
"""Returns a task shader as a FileShader, with given parameters"""
158
import sys
159
160
source = """#version 450
161
#extension {} : enable
162
layout(local_size_x={}) in;
163
layout(local_size_y={}) in;
164
layout(local_size_z={}) in;
165
void main() {{ }}
166
""".format(kwargs['extension'],kwargs['x'],kwargs['y'],kwargs['z'])
167
return FileShader(source,".task")
168
169
170
def meshDefaults(nv_or_ext,show=False):
171
result = dict({
172
# See Glslang's glslang/ResourceLimits/ResourceLimits.cpp
173
'nv': { 'extension': 'GL_NV_mesh_shader', 'x': 32, 'y': 1, 'z': 1, 'max_vert': 256, 'max_prim': 512 },
174
'ext': { 'extension': 'GL_EXT_mesh_shader', 'x': 128, 'y': 128, 'z': 128, 'max_vert': 256, 'max_prim': 256 }
175
})[nv_or_ext]
176
if show:
177
import sys
178
print(result,file=sys.stderr)
179
return result
180
181
## GL_NV_mesh_shader
182
183
@inside_glslc_testsuite('OptionFLimit_Mesh')
184
class TestFLimitMeshShader_NV_X_ok(expect.ValidObjectFile):
185
shader = mesh_shader_with_params(meshDefaults('nv'))
186
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeX_NV 32']
187
188
@inside_glslc_testsuite('OptionFLimit_Mesh')
189
class TestFLimitMeshShader_NV_X_bad(expect.ErrorMessageSubstr):
190
shader = mesh_shader_with_params(meshDefaults('nv'))
191
expected_error_substr = "'local_size' : too large, see gl_MaxMeshWorkGroupSizeNV"
192
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeX_NV 31']
193
194
@inside_glslc_testsuite('OptionFLimit_Mesh')
195
class TestFLimitMeshShader_NV_Y_ok(expect.ValidObjectFile):
196
shader = mesh_shader_with_params(meshDefaults('nv'))
197
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeY_NV 1']
198
199
@inside_glslc_testsuite('OptionFLimit_Mesh')
200
class TestFLimitMeshShader_NV_Y_bad(expect.ErrorMessageSubstr):
201
d = meshDefaults('nv')
202
d['y'] = 3
203
shader = mesh_shader_with_params(d)
204
expected_error_substr = "'local_size' : too large, see gl_MaxMeshWorkGroupSizeNV"
205
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeY_NV 2']
206
207
@inside_glslc_testsuite('OptionFLimit_Mesh')
208
class TestFLimitMeshShader_NV_Z_ok(expect.ValidObjectFile):
209
shader = mesh_shader_with_params(meshDefaults('nv'))
210
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeZ_NV 1']
211
212
@inside_glslc_testsuite('OptionFLimit_Mesh')
213
class TestFLimitMeshShader_NV_Z_bad(expect.ErrorMessageSubstr):
214
d = meshDefaults('nv')
215
d['z'] = 3
216
shader = mesh_shader_with_params(d)
217
expected_error_substr = "'local_size' : too large, see gl_MaxMeshWorkGroupSizeNV"
218
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeZ_NV 2']
219
220
@inside_glslc_testsuite('OptionFLimit_Mesh')
221
class TestFLimitMeshShader_NV_MaxVert_ok(expect.ValidObjectFile):
222
shader = mesh_shader_with_params(meshDefaults('nv'))
223
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputVerticesNV 256']
224
225
@inside_glslc_testsuite('OptionFLimit_Mesh')
226
class TestFLimitMeshShader_NV_MaxVert_bad(expect.ErrorMessageSubstr):
227
shader = mesh_shader_with_params(meshDefaults('nv'))
228
expected_error_substr = "'max_vertices' : too large, must be less than gl_MaxMeshOutputVerticesNV"
229
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputVerticesNV 255']
230
231
@inside_glslc_testsuite('OptionFLimit_Mesh')
232
class TestFLimitMeshShader_NV_MaxPrim_ok(expect.ValidObjectFile):
233
shader = mesh_shader_with_params(meshDefaults('nv'))
234
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputPrimitivesNV 512']
235
236
@inside_glslc_testsuite('OptionFLimit_Mesh')
237
class TestFLimitMeshShader_NV_MaxPrim_bad(expect.ErrorMessageSubstr):
238
shader = mesh_shader_with_params(meshDefaults('nv'))
239
expected_error_substr = "'max_primitives' : too large, must be less than gl_MaxMeshOutputPrimitivesNV"
240
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputPrimitivesNV 511']
241
242
@inside_glslc_testsuite('OptionFLimit_Task')
243
class TestFLimitTaskShader_NV_X_ok(expect.ValidObjectFile):
244
shader = task_shader_with_params(meshDefaults('nv'))
245
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeX_NV 32']
246
247
@inside_glslc_testsuite('OptionFLimit_Task')
248
class TestFLimitTaskShader_NV_X_bad(expect.ErrorMessageSubstr):
249
shader = task_shader_with_params(meshDefaults('nv'))
250
expected_error_substr = "'local_size' : too large, see gl_MaxTaskWorkGroupSizeNV"
251
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeX_NV 31']
252
253
@inside_glslc_testsuite('OptionFLimit_Task')
254
class TestFLimitTaskShader_NV_Y_ok(expect.ValidObjectFile):
255
shader = task_shader_with_params(meshDefaults('nv'))
256
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeY_NV 1']
257
258
@inside_glslc_testsuite('OptionFLimit_Task')
259
class TestFLimitTaskShader_NV_Y_bad(expect.ErrorMessageSubstr):
260
d = meshDefaults('nv')
261
d['y'] = 3
262
shader = task_shader_with_params(d)
263
expected_error_substr = "'local_size' : too large, see gl_MaxTaskWorkGroupSizeNV"
264
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeY_NV 2']
265
266
@inside_glslc_testsuite('OptionFLimit_Task')
267
class TestFLimitTaskShader_NV_Z_ok(expect.ValidObjectFile):
268
shader = task_shader_with_params(meshDefaults('nv'))
269
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeZ_NV 1']
270
271
@inside_glslc_testsuite('OptionFLimit_Task')
272
class TestFLimitTaskShader_NV_Z_bad(expect.ErrorMessageSubstr):
273
d = meshDefaults('nv')
274
d['z'] = 3
275
shader = task_shader_with_params(d)
276
expected_error_substr = "'local_size' : too large, see gl_MaxTaskWorkGroupSizeNV"
277
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeZ_NV 2']
278
279
# TODO: Test MaxMeshViewCountNV
280
281
282
## GL_EXT_mesh_shader
283
## It requires SPIR-V 1.4
284
285
s14 = '--target-spv=spv1.4'
286
287
@inside_glslc_testsuite('OptionFLimit_Mesh')
288
class TestFLimitMeshShader_EXT_X_ok(expect.ValidObjectFile1_4):
289
shader = mesh_shader_with_params(meshDefaults('ext'))
290
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeX_EXT 128', s14]
291
292
@inside_glslc_testsuite('OptionFLimit_Mesh')
293
class TestFLimitMeshShader_EXT_X_bad(expect.ErrorMessageSubstr):
294
shader = mesh_shader_with_params(meshDefaults('ext'))
295
expected_error_substr = "'local_size' : too large, see gl_MaxMeshWorkGroupSizeEXT"
296
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeX_EXT 127', s14]
297
298
@inside_glslc_testsuite('OptionFLimit_Mesh')
299
class TestFLimitMeshShader_EXT_Y_ok(expect.ValidObjectFile1_4):
300
shader = mesh_shader_with_params(meshDefaults('ext'))
301
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeY_EXT 128', s14]
302
303
@inside_glslc_testsuite('OptionFLimit_Mesh')
304
class TestFLimitMeshShader_EXT_Y_bad(expect.ErrorMessageSubstr):
305
shader = mesh_shader_with_params(meshDefaults('ext'))
306
expected_error_substr = "'local_size' : too large, see gl_MaxMeshWorkGroupSizeEXT"
307
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeY_EXT 127', s14]
308
309
@inside_glslc_testsuite('OptionFLimit_Mesh')
310
class TestFLimitMeshShader_EXT_Z_ok(expect.ValidObjectFile1_4):
311
shader = mesh_shader_with_params(meshDefaults('ext'))
312
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeZ_EXT 128', s14]
313
314
@inside_glslc_testsuite('OptionFLimit_Mesh')
315
class TestFLimitMeshShader_EXT_Z_bad(expect.ErrorMessageSubstr):
316
shader = mesh_shader_with_params(meshDefaults('ext'))
317
expected_error_substr = "'local_size' : too large, see gl_MaxMeshWorkGroupSizeEXT"
318
glslc_args = ['-c', shader, '-flimit= MaxMeshWorkGroupSizeZ_EXT 127', s14]
319
320
@inside_glslc_testsuite('OptionFLimit_Mesh')
321
class TestFLimitMeshShader_EXT_MaxVert_ok(expect.ValidObjectFile1_4):
322
shader = mesh_shader_with_params(meshDefaults('ext'))
323
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputVerticesEXT 256', s14]
324
325
@inside_glslc_testsuite('OptionFLimit_Mesh')
326
class TestFLimitMeshShader_EXT_MaxVert_bad(expect.ErrorMessageSubstr):
327
shader = mesh_shader_with_params(meshDefaults('ext'))
328
expected_error_substr = "'max_vertices' : too large, must be less than gl_MaxMeshOutputVerticesEXT"
329
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputVerticesEXT 255', s14]
330
331
@inside_glslc_testsuite('OptionFLimit_Mesh')
332
class TestFLimitMeshShader_EXT_MaxPrim_ok(expect.ValidObjectFile1_4):
333
shader = mesh_shader_with_params(meshDefaults('ext'))
334
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputPrimitivesEXT 256', s14]
335
336
@inside_glslc_testsuite('OptionFLimit_Mesh')
337
class TestFLimitMeshShader_EXT_MaxPrim_bad(expect.ErrorMessageSubstr):
338
shader = mesh_shader_with_params(meshDefaults('ext'))
339
expected_error_substr = "'max_primitives' : too large, must be less than gl_MaxMeshOutputPrimitivesEXT"
340
glslc_args = ['-c', shader, '-flimit= MaxMeshOutputPrimitivesEXT 255', s14]
341
342
@inside_glslc_testsuite('OptionFLimit_Task')
343
class TestFLimitTaskShader_EXT_X_ok(expect.ValidObjectFile1_4):
344
shader = task_shader_with_params(meshDefaults('ext'))
345
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeX_EXT 128', s14]
346
347
@inside_glslc_testsuite('OptionFLimit_Task')
348
class TestFLimitTaskShader_EXT_X_bad(expect.ErrorMessageSubstr):
349
shader = task_shader_with_params(meshDefaults('ext'))
350
expected_error_substr = "'local_size' : too large, see gl_MaxTaskWorkGroupSizeEXT"
351
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeX_EXT 127', s14]
352
353
@inside_glslc_testsuite('OptionFLimit_Task')
354
class TestFLimitTaskShader_EXT_Y_ok(expect.ValidObjectFile1_4):
355
shader = task_shader_with_params(meshDefaults('ext'))
356
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeY_EXT 128', s14]
357
358
@inside_glslc_testsuite('OptionFLimit_Task')
359
class TestFLimitTaskShader_EXT_Y_bad(expect.ErrorMessageSubstr):
360
import sys
361
d = meshDefaults('ext',True)
362
print("TaskShader_EXT_Y_bad {}".format(str(d)),file=sys.stderr)
363
shader = task_shader_with_params(meshDefaults('ext',True))
364
expected_error_substr = "'local_size' : too large, see gl_MaxTaskWorkGroupSizeEXT"
365
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeY_EXT 127', s14]
366
367
@inside_glslc_testsuite('OptionFLimit_Task')
368
class TestFLimitTaskShader_EXT_Z_ok(expect.ValidObjectFile1_4):
369
shader = task_shader_with_params(meshDefaults('ext'))
370
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeZ_EXT 128', s14]
371
372
@inside_glslc_testsuite('OptionFLimit_Task')
373
class TestFLimitTaskShader_EXT_Z_bad(expect.ErrorMessageSubstr):
374
shader = task_shader_with_params(meshDefaults('ext'))
375
expected_error_substr = "'local_size' : too large, see gl_MaxTaskWorkGroupSizeEXT"
376
glslc_args = ['-c', shader, '-flimit= MaxTaskWorkGroupSizeZ_EXT 127', s14]
377
378
# TODO: Test MaxMeshViewCountEXT
379
380