Browse Source

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
Sam Edwards 7 years ago
parent
commit
3b7b9cd18c
1 changed files with 25 additions and 12 deletions
  1. 25 12
      tests/display/test_glsl_shader.py

+ 25 - 12
tests/display/test_glsl_shader.py

@@ -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(intmax == 0x7fffffff);
+    assert(zero == 0u);
+    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);
     """
     """