Browse Source

tests: add unit test for writing to and extracting buffer textures

rdb 7 years ago
parent
commit
c5dd683366
1 changed files with 39 additions and 0 deletions
  1. 39 0
      tests/display/test_glsl_shader.py

+ 39 - 0
tests/display/test_glsl_shader.py

@@ -1,4 +1,5 @@
 from panda3d import core
 from panda3d import core
+import struct
 import pytest
 import pytest
 from _pytest.outcomes import Failed
 from _pytest.outcomes import Failed
 
 
@@ -18,6 +19,7 @@ layout(r8ui) uniform writeonly uimageBuffer _triggered;
 
 
 void _reset() {{
 void _reset() {{
     imageStore(_triggered, 0, uvec4(0, 0, 0, 0));
     imageStore(_triggered, 0, uvec4(0, 0, 0, 0));
+    memoryBarrier();
 }}
 }}
 
 
 void _assert(bool cond, int line) {{
 void _assert(bool cond, int line) {{
@@ -275,3 +277,40 @@ def test_glsl_pta_mat4(gsg):
     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}), code
+
+
+def test_glsl_write_extract_image_buffer(gsg):
+    # Tests that we can write to a buffer texture on the GPU, and then extract
+    # the data on the CPU.  We test two textures since there was in the past a
+    # where it would only work correctly for one texture.
+    tex1 = core.Texture("tex1")
+    tex1.set_clear_color(0)
+    tex1.setup_buffer_texture(1, core.Texture.T_unsigned_int, core.Texture.F_r32i,
+                              core.GeomEnums.UH_static)
+    tex2 = core.Texture("tex2")
+    tex2.set_clear_color(0)
+    tex2.setup_buffer_texture(1, core.Texture.T_int, core.Texture.F_r32i,
+                              core.GeomEnums.UH_static)
+
+    preamble = """
+    layout(r32ui) uniform uimageBuffer tex1;
+    layout(r32i) uniform iimageBuffer tex2;
+    """
+    code = """
+    assert(imageLoad(tex1, 0).r == 0);
+    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(tex2, 0).r == -456);
+    """
+
+    run_glsl_test(gsg, code, preamble, {'tex1': tex1, 'tex2': tex2})
+
+    engine = core.GraphicsEngine.get_global_ptr()
+    assert engine.extract_texture_data(tex1, gsg)
+    assert engine.extract_texture_data(tex2, gsg)
+
+    assert struct.unpack('I', tex1.get_ram_image()) == (123,)
+    assert struct.unpack('i', tex2.get_ram_image()) == (-456,)