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
 # 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);
     """