tests: Enhance GLSL test

- Don't assume GLSL 4.30 is available just because the driver
  supports compute shaders. Drivers before OpenGL 4.3 may still
  offer the extension.

- Use GLSL 1.30 by default, and turn on additional features
  using extensions. Skip any tests requiring extensions that
  aren't supported by the driver.

- Unsigned literal ints should have a 'u' suffix.

- Clean up a few dead Python expressions
This commit is contained in:
Sam Edwards 2018-10-20 17:54:54 -06:00
parent df77bacf06
commit 3b7b9cd18c

View File

@ -10,6 +10,7 @@ from _pytest.outcomes import Failed
# The reset() function serves to prevent the _triggered variable from being
# optimized out in the case that the assertions are being optimized out.
GLSL_COMPUTE_TEMPLATE = """#version {version}
{extensions}
layout(local_size_x = 1, local_size_y = 1) in;
@ -37,7 +38,7 @@ void main() {{
"""
def run_glsl_test(gsg, body, preamble="", inputs={}, version=430):
def run_glsl_test(gsg, body, preamble="", inputs={}, version=130, exts=set()):
""" Runs a GLSL test on the given GSG. The given body is executed in the
main function and should call assert(). The preamble should contain all
of the shader inputs. """
@ -48,11 +49,20 @@ def run_glsl_test(gsg, body, preamble="", inputs={}, version=430):
if not gsg.supports_buffer_texture:
pytest.skip("buffer textures not supported")
exts = exts | {'GL_ARB_compute_shader', 'GL_ARB_shader_image_load_store'}
missing_exts = sorted(ext for ext in exts if not gsg.has_extension(ext))
if missing_exts:
pytest.skip("missing extensions: " + ' '.join(missing_exts))
extensions = ''
for ext in exts:
extensions += '#extension {ext} : require\n'.format(ext=ext)
__tracebackhide__ = True
preamble = preamble.strip()
body = body.rstrip().lstrip('\n')
code = GLSL_COMPUTE_TEMPLATE.format(version=version, preamble=preamble, body=body)
code = GLSL_COMPUTE_TEMPLATE.format(version=version, extensions=extensions, preamble=preamble, body=body)
line_offset = code[:code.find(body)].count('\n') + 1
shader = core.Shader.make_compute(core.Shader.SL_GLSL, code)
assert shader, code
@ -122,7 +132,7 @@ def test_glsl_sampler(gsg):
assert(texelFetch(tex1, 0, 0) == vec4(0, 2 / 255.0, 1, 1));
assert(texelFetch(tex2, ivec2(0, 0), 0) == vec4(1.0, 2.0, -3.14, 0.0));
"""
run_glsl_test(gsg, code, preamble, {'tex1': tex1, 'tex2': tex2}), code
run_glsl_test(gsg, code, preamble, {'tex1': tex1, 'tex2': tex2})
def test_glsl_image(gsg):
@ -142,7 +152,7 @@ def test_glsl_image(gsg):
assert(imageLoad(tex1, 0) == vec4(0, 2 / 255.0, 1, 1));
assert(imageLoad(tex2, ivec2(0, 0)) == vec4(1.0, 2.0, -3.14, 0.0));
"""
run_glsl_test(gsg, code, preamble, {'tex1': tex1, 'tex2': tex2}), code
run_glsl_test(gsg, code, preamble, {'tex1': tex1, 'tex2': tex2})
def test_glsl_ssbo(gsg):
@ -164,7 +174,10 @@ def test_glsl_ssbo(gsg):
assert(value1 == 1234567);
assert(value2 == -1234567);
"""
run_glsl_test(gsg, code, preamble, {'buffer1': buffer1, 'buffer2': buffer2}), code
run_glsl_test(gsg, code, preamble, {'buffer1': buffer1, 'buffer2': buffer2},
exts={'GL_ARB_shader_storage_buffer_object',
'GL_ARB_uniform_buffer_object',
'GL_ARB_shading_language_420pack'})
def test_glsl_int(gsg):
@ -197,8 +210,8 @@ def test_glsl_uint(gsg):
uniform uint intmax;
"""
code = """
assert(zero == 0);
assert(intmax == 0x7fffffff);
assert(zero == 0u);
assert(intmax == 0x7fffffffu);
"""
run_glsl_test(gsg, code, preamble, inputs)
@ -243,7 +256,7 @@ def test_glsl_pta_int(gsg):
assert(pta[2] == 2);
assert(pta[3] == 3);
"""
run_glsl_test(gsg, code, preamble, {'pta': pta}), code
run_glsl_test(gsg, code, preamble, {'pta': pta})
def test_glsl_pta_ivec4(gsg):
@ -256,7 +269,7 @@ def test_glsl_pta_ivec4(gsg):
assert(pta[0] == ivec4(0, 1, 2, 3));
assert(pta[1] == ivec4(4, 5, 6, 7));
"""
run_glsl_test(gsg, code, preamble, {'pta': pta}), code
run_glsl_test(gsg, code, preamble, {'pta': pta})
def test_glsl_pta_mat4(gsg):
@ -278,7 +291,7 @@ def test_glsl_pta_mat4(gsg):
assert(pta[1][2] == vec4(24, 25, 26, 27));
assert(pta[1][3] == vec4(28, 29, 30, 31));
"""
run_glsl_test(gsg, code, preamble, {'pta': pta}), code
run_glsl_test(gsg, code, preamble, {'pta': pta})
def test_glsl_write_extract_image_buffer(gsg):
@ -299,12 +312,12 @@ def test_glsl_write_extract_image_buffer(gsg):
layout(r32i) uniform iimageBuffer tex2;
"""
code = """
assert(imageLoad(tex1, 0).r == 0);
assert(imageLoad(tex1, 0).r == 0u);
assert(imageLoad(tex2, 0).r == 0);
imageStore(tex1, 0, uvec4(123));
imageStore(tex2, 0, ivec4(-456));
memoryBarrier();
assert(imageLoad(tex1, 0).r == 123);
assert(imageLoad(tex1, 0).r == 123u);
assert(imageLoad(tex2, 0).r == -456);
"""