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 # The reset() function serves to prevent the _triggered variable from being
# optimized out in the case that the assertions are being optimized out. # optimized out in the case that the assertions are being optimized out.
GLSL_COMPUTE_TEMPLATE = """#version {version} GLSL_COMPUTE_TEMPLATE = """#version {version}
{extensions}
layout(local_size_x = 1, local_size_y = 1) in; 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 """ 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 main function and should call assert(). The preamble should contain all
of the shader inputs. """ of the shader inputs. """
@ -48,11 +49,20 @@ def run_glsl_test(gsg, body, preamble="", inputs={}, version=430):
if not gsg.supports_buffer_texture: if not gsg.supports_buffer_texture:
pytest.skip("buffer textures not supported") 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 __tracebackhide__ = True
preamble = preamble.strip() preamble = preamble.strip()
body = body.rstrip().lstrip('\n') 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 line_offset = code[:code.find(body)].count('\n') + 1
shader = core.Shader.make_compute(core.Shader.SL_GLSL, code) shader = core.Shader.make_compute(core.Shader.SL_GLSL, code)
assert shader, 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(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)); 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): 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(tex1, 0) == vec4(0, 2 / 255.0, 1, 1));
assert(imageLoad(tex2, ivec2(0, 0)) == vec4(1.0, 2.0, -3.14, 0.0)); 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): def test_glsl_ssbo(gsg):
@ -164,7 +174,10 @@ def test_glsl_ssbo(gsg):
assert(value1 == 1234567); assert(value1 == 1234567);
assert(value2 == -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): def test_glsl_int(gsg):
@ -197,8 +210,8 @@ def test_glsl_uint(gsg):
uniform uint intmax; uniform uint intmax;
""" """
code = """ code = """
assert(zero == 0); assert(zero == 0u);
assert(intmax == 0x7fffffff); assert(intmax == 0x7fffffffu);
""" """
run_glsl_test(gsg, code, preamble, inputs) run_glsl_test(gsg, code, preamble, inputs)
@ -243,7 +256,7 @@ def test_glsl_pta_int(gsg):
assert(pta[2] == 2); assert(pta[2] == 2);
assert(pta[3] == 3); 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): 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[0] == ivec4(0, 1, 2, 3));
assert(pta[1] == ivec4(4, 5, 6, 7)); 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): 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][2] == vec4(24, 25, 26, 27));
assert(pta[1][3] == vec4(28, 29, 30, 31)); 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): 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; layout(r32i) uniform iimageBuffer tex2;
""" """
code = """ code = """
assert(imageLoad(tex1, 0).r == 0); assert(imageLoad(tex1, 0).r == 0u);
assert(imageLoad(tex2, 0).r == 0); assert(imageLoad(tex2, 0).r == 0);
imageStore(tex1, 0, uvec4(123)); imageStore(tex1, 0, uvec4(123));
imageStore(tex2, 0, ivec4(-456)); imageStore(tex2, 0, ivec4(-456));
memoryBarrier(); memoryBarrier();
assert(imageLoad(tex1, 0).r == 123); assert(imageLoad(tex1, 0).r == 123u);
assert(imageLoad(tex2, 0).r == -456); assert(imageLoad(tex2, 0).r == -456);
""" """