mirror of
https://github.com/panda3d/panda3d.git
synced 2025-09-30 08:44:19 -04:00
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:
parent
df77bacf06
commit
3b7b9cd18c
@ -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);
|
||||
"""
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user