# HG changeset patch # User Leonard Ritter # Date 1647543448 -3600 # Thu Mar 17 19:57:28 2022 +0100 # Node ID 6879f2c78cd6c01cc455ec8584ccde6f20065292 # Parent ea8156aa78ce49016b30a275ce7656d40c922505 * scopes project support diff --git a/_project.sc b/_project.sc new file mode 100644 --- /dev/null +++ b/_project.sc @@ -0,0 +1,2 @@ + +import .lib.tukan.use diff --git a/lib/tukan/ResourceGroup.sc b/lib/tukan/ResourceGroup.sc --- a/lib/tukan/ResourceGroup.sc +++ b/lib/tukan/ResourceGroup.sc @@ -26,6 +26,79 @@ ################################################################################ +struct IndirectCompute + let NUM_CMD_BUFFERS = 1 + + command-buffer : GL.Buffer + program : GL.Program + + # shaderfunc returns sizex sizey sizez + inline __typecall (cls shaderfunc) + let self = (super-type.__typecall cls) + setup-ssbo self.command-buffer buf-compute-cmd NUM_CMD_BUFFERS + call + attach-shaders self.program + compute = + fn setup-draw-arrays-command () + local_size 1 1 1 + buf-draw-cmd.command = + DispatchIndirectCommand (shaderfunc) + ; + self + + inline setup (self setupfunc) + GL.UseProgram self.program + bind-ssbo self.command-buffer buf-compute-cmd none 0 + static-if (none? setupfunc) + else + setupfunc; + GL.DispatchCompute 1 1 1 + GL.MemoryBarrier GL.COMMAND_BARRIER_BIT + + inline execute (self) + GL.BindBuffer GL.DISPATCH_INDIRECT_BUFFER self.command-buffer + GL.DispatchComputeIndirect 0 + #GL.MemoryBarrier GL.SHADER_STORAGE_BARRIER_BIT + +################################################################################ + +struct IndirectDrawArrays + let NUM_CMD_BUFFERS = 1 + + command-buffer : GL.Buffer + program : GL.Program + + # shaderfunc returns count, instancecount, first, baseinstance + inline __typecall (cls shaderfunc) + let self = (super-type.__typecall cls) + setup-ssbo self.command-buffer buf-draw-cmd NUM_CMD_BUFFERS + call + attach-shaders self.program + compute = + fn setup-draw-arrays-command () + local_size 1 1 1 + buf-draw-cmd.command = + DrawArraysIndirectCommand (shaderfunc) + ; + self + + + inline setup (self setupfunc) + GL.UseProgram self.program + bind-ssbo self.command-buffer buf-draw-cmd none 0 + static-if (none? setupfunc) + else + setupfunc; + GL.DispatchCompute 1 1 1 + GL.MemoryBarrier GL.COMMAND_BARRIER_BIT + + inline execute (self mode) + #GL.MemoryBarrier (GL.ALL_BARRIER_BITS as u32) + GL.BindBuffer GL.DRAW_INDIRECT_BUFFER self.command-buffer + GL.DrawArraysIndirect mode null + +################################################################################ + # prototype for initialization from usage type ResourceGroup @@ -98,6 +171,7 @@ ; run-stage; +################################################################################ type+ ResourceGroup inline static-array (self T size func) @@ -117,68 +191,8 @@ inline compute-program (self func ...) program self (compute = func) ... - # shaderfunc returns sizex sizey sizez - # provides a setup and execute function - inline indirect-compute-setup (self shaderfunc) - let NUM_CMD_BUFFERS = 1 - let buf = - 'static self GL.Buffer - inline () - let buf = (GL.Buffer) - setup-ssbo buf buf-compute-cmd NUM_CMD_BUFFERS - buf - let pg = - compute-program self - fn setup-compute-command () - local_size 1 1 1 - buf-compute-cmd.command = - DispatchIndirectCommand (shaderfunc) - ; - _ - inline (setupfunc) - GL.UseProgram pg - bind-ssbo buf buf-compute-cmd none 0 - static-if (none? setupfunc) - else - setupfunc; - GL.DispatchCompute 1 1 1 - GL.MemoryBarrier GL.COMMAND_BARRIER_BIT - inline () - GL.BindBuffer GL.DISPATCH_INDIRECT_BUFFER buf - GL.DispatchComputeIndirect 0 - GL.MemoryBarrier GL.SHADER_STORAGE_BARRIER_BIT - # shaderfunc returns count, instancecount, first, baseinstance - # provides a setup and execute function - inline indirect-draw-arrays-setup (self shaderfunc) - let NUM_CMD_BUFFERS = 1 - let buf = - 'static self GL.Buffer - inline () - let buf = (GL.Buffer) - setup-ssbo buf buf-draw-cmd NUM_CMD_BUFFERS - buf - let pg = - compute-program self - fn setup-draw-arrays-command () - local_size 1 1 1 - buf-draw-cmd.command = - DrawArraysIndirectCommand (shaderfunc) - ; - _ - inline (setupfunc) - GL.UseProgram pg - bind-ssbo buf buf-draw-cmd none 0 - static-if (none? setupfunc) - else - setupfunc; - GL.DispatchCompute 1 1 1 - GL.MemoryBarrier GL.COMMAND_BARRIER_BIT - inline (mode) - GL.MemoryBarrier (GL.ALL_BARRIER_BITS as u32) - GL.BindBuffer GL.DRAW_INDIRECT_BUFFER buf - GL.DrawArraysIndirect mode null do - let ResourceGroup + let ResourceGroup IndirectDrawArrays IndirectCompute locals; diff --git a/testing/test_cascade_dmc.sc b/testing/test_cascade_dmc.sc --- a/testing/test_cascade_dmc.sc +++ b/testing/test_cascade_dmc.sc @@ -1588,7 +1588,7 @@ fn per-frame-setup (size pg-test frame) let rg = 'force-unwrap rg - from (methodsof rg) let static program compute-program indirect-draw-arrays-setup + from (methodsof rg) let static program compute-program GL.BindTextureUnit 0 fb-scene-color GL.Uniform smp-screen 0 @@ -1690,20 +1690,22 @@ if ((frame % 60) == 0) print-in-count; - vvv bind setup-draw-arrays exec-draw-arrays - indirect-draw-arrays-setup - inline () - _ - deref vertex-in.count - 1 - 0 - 0 + let ida = + static IndirectDrawArrays + inline () + IndirectDrawArrays + inline () + _ + deref vertex-in.count + 1 + 0 + 0 GL.BindBufferRange GL.SHADER_STORAGE_BUFFER BINDING_BUF_VERTEX_IN vertex_buffer \ 0:i64 (i64 vertex_buffer_sz) - setup-draw-arrays; + 'setup ida do GL.BindFramebuffer GL.FRAMEBUFFER fb-scene @@ -1726,7 +1728,7 @@ GL.BindTextureUnit 1 world GL.Uniform smp-world 1 GL.BindVertexArray vao-empty - exec-draw-arrays GL.TRIANGLES + 'execute ida GL.TRIANGLES GL.Disable GL.DEPTH_TEST GL.Disable GL.CULL_FACE diff --git a/testing/test_subjective.sc b/testing/test_subjective.sc --- a/testing/test_subjective.sc +++ b/testing/test_subjective.sc @@ -4,7 +4,6 @@ using import Option using import itertools -import ..lib.tukan.use using import tukan.VertexPainter using import tukan.GLMain using import tukan.gl diff --git a/testing/unique_cube_bit_patterns.sc b/testing/unique_cube_bit_patterns.sc new file mode 100644 --- /dev/null +++ b/testing/unique_cube_bit_patterns.sc @@ -0,0 +1,138 @@ +using import Set + +inline MASK (s...) + | + va-map + inline (i) + (va@ i s...) << (i * 3) + va-range 8 +inline UNPACK_MASK (m) + va-map + inline (i) + ((m >> (i * 3)) & 7) + va-range 8 + +let IDENTITY_MASK = (MASK 0 1 2 3 4 5 6 7) + +inline remap (x m) + let x im = (unpack x) + tupleof + | + va-map + inline (i) + ((x >> i) & 1) << ((m >> (i * 3)) & 7) + va-range 8 + MASK + va-map + inline (i) + i := ((im >> (i * 3)) & 7) + (m >> (i * 3)) & 7 + va-range 8 + +fn rotate_cube_axis (i) + remap i (MASK 0 4 1 5 2 6 3 7) + +fn swap_yz (i) + remap i (MASK 0 1 4 5 2 3 6 7) + +fn flip_z (i) + remap i (MASK 4 5 6 7 0 1 2 3) +fn flip_y (i) + remap i (MASK 2 3 0 1 6 7 4 5) +fn flip_x (i) + remap i (MASK 1 0 3 2 5 4 7 6) + +inline mintuple (a b...) + va-lfold a + inline (k v s) + ? ((v @ 0) < (s @ 0)) v s + b... + +fn canonical_flip (i) + ix := (flip_x i) + iy := (flip_y i) + ixy := (flip_y ix) + iz := (flip_z i) + ixz := (flip_x iz) + iyz := (flip_y iz) + ixyz := (flip_y ixz) + mintuple i ix iy ixy iz ixz iyz ixyz + +inline canonicalize (i k) + # sign flip + let ni = (i ^ 0b11111111) + let f? = ((bitcount ni) < (bitcount i)) + let i = (? f? ni i) + i := (tupleof i IDENTITY_MASK) + # axis rotation + yzx := (canonical_flip (rotate_cube_axis i)) + zxy := (canonical_flip (rotate_cube_axis yzx)) + xzy := (canonical_flip (swap_yz i)) + yxz := (canonical_flip (swap_yz yzx)) + zyx := (canonical_flip (swap_yz zxy)) + let i = (mintuple i xzy yzx yxz zxy zyx) + _ i f? + +local patterns : (Set i32) +local masks : (Set i32) + +# + 0 1 2 3 4 5 6 7 + 0 1 4 5 2 3 6 7 + 0 2 4 6 1 3 5 7 + 0 4 1 5 2 6 3 7 + 1 0 5 4 3 2 7 6 + 1 3 0 2 5 7 4 6 + 1 3 5 7 0 2 4 6 + 1 5 0 4 3 7 2 6 + 2 0 3 1 6 4 7 5 + 2 0 6 4 3 1 7 5 + 2 3 6 7 0 1 4 5 + 2 6 3 7 0 4 1 5 + 3 1 2 0 7 5 6 4 + 3 1 7 5 2 0 6 4 + 3 2 7 6 1 0 5 4 + 3 7 2 6 1 5 0 4 + 4 0 5 1 6 2 7 3 + 4 5 0 1 6 7 2 3 + 4 6 0 2 5 7 1 3 + 4 6 5 7 0 2 1 3 + 5 1 4 0 7 3 6 2 + 5 4 1 0 7 6 3 2 + 5 7 1 3 4 6 0 2 + 5 7 4 6 1 3 0 2 + 6 2 7 3 4 0 5 1 + 6 4 2 0 7 5 3 1 + 6 4 7 5 2 0 3 1 + 6 7 2 3 4 5 0 1 + 7 3 6 2 5 1 4 0 + 7 5 3 1 6 4 2 0 + 7 5 6 4 3 1 2 0 + 7 6 3 2 5 4 1 0 + +for i in (range 256) + i0 := i + let im f? = (canonicalize i 0) + let i m = (unpack im) + #if (not ((i @ 0) in patterns)) + i1 := ((remap (tupleof i0 IDENTITY_MASK) m) @ 0) + i1 := i1 ^ (? f? 255 0) + assert (i == i1) + print (bin i) (bin i1) (UNPACK_MASK m) + #assert ((remap (tupleof i0 IDENTITY_MASK) m) @ 0 == i) + 'insert patterns i + 'insert masks m + + ; + +print (countof patterns) "unique patterns" +print (countof masks) "unique permutation maps" +for m in masks + let k0 k1 k2 k3 = (UNPACK_MASK m) + print (UNPACK_MASK m) + let m2 = ((m & 0xfff) | (((MASK k3 k2 k1 k0 0 0 0 0) ^ 0xfff) << 12)) + assert (m == m2) + + + +; \ No newline at end of file diff --git a/testing/unique_tet_bit_patterns.sc b/testing/unique_tet_bit_patterns.sc new file mode 100644 --- /dev/null +++ b/testing/unique_tet_bit_patterns.sc @@ -0,0 +1,147 @@ +using import Set +using import itertools + +inline MASK (s...) + | + va-map + inline (i) + (va@ i s...) << (i * 2) + va-range 4 +inline UNPACK_MASK (m) + va-map + inline (i) + ((m >> (i * 2)) & 3) + va-range 4 + +let IDENTITY_MASK = (MASK 0 1 2 3) + +inline remap (x m) + let x im = (unpack x) + tupleof + | + va-map + inline (i) + ((x >> i) & 1) << ((m >> (i * 2)) & 3) + va-range 4 + MASK + va-map + inline (i) + i := ((im >> (i * 2)) & 3) + (m >> (i * 2)) & 3 + va-range 4 + +inline canonicalize (i k) + # sign flip + let ni = (i ^ 0b1111) + let f? = ((bitcount ni) < (bitcount i)) + let i = (? f? ni i) + i := (tupleof i IDENTITY_MASK) + # permutations + vvv bind i + fold (i) for x in (permutate-range 4) + j := (remap i (MASK (unpack x))) + ? ((j @ 0) < (i @ 0)) j i + _ i f? + +local patterns : (Set i32) +local masks : (Set i32) + +for i in (range 16) + i0 := i + let im f? = (canonicalize i 0) + let i m = (unpack im) + #if (not ((i @ 0) in patterns)) + i1 := ((remap (tupleof i0 IDENTITY_MASK) m) @ 0) + i1 := i1 ^ (? f? 15 0) + assert (i == i1) + print (bin i) (bin i1) (UNPACK_MASK m) + #assert ((remap (tupleof i0 IDENTITY_MASK) m) @ 0 == i) + 'insert patterns i + 'insert masks m + + ; + +print (countof patterns) "unique patterns" +for p in patterns + print (bin p) +print (countof masks) "unique permutation maps" +for m in masks + #let k0 k1 k2 k3 = (UNPACK_MASK m) + print (UNPACK_MASK m) + #let m2 = ((m & 0xfff) | (((MASK k3 k2 k1 k0 0 0 0 0) ^ 0xfff) << 12)) + #assert (m == m2) + +fn edge (i) + g := (i >> 1) + 1 + c := i & 1 + m := c * ((g & 1) + 1) + #m := (((i >> 1) & 1) ^ 1) + 1 + return m (g ^ m) + +fn edge2 (i) + g := (i % 3) + 1 + c := (i // 3) + m := c * ((g & 1) + 1) + #m := (((i >> 1) & 1) ^ 1) + 1 + return m (g ^ m) + +# + 000 01 + 001 01 + 010 10 + 011 10 + 100 01 + 101 01 + +fn edgegroup (a b) + g := a ^ b + m := (g & 1) + 1 + c := ((a != 0) & (b != 0)) as i32 + i := (g << 1) - 2 + c + G := (i >> 1) + 1 + C := i & 1 + _ a b (a ^ m) (b ^ m) ":" g G m i c C + +for i in (range 6) + print i ":" (edge2 i) + +print + edgegroup 0 1 +print + edgegroup 2 3 +print + edgegroup 0 2 +print + edgegroup 1 3 +print + edgegroup 0 3 +print + edgegroup 2 1 + +# + 0 1 + 0 2 + + +# + 1 0 2 3 + 0 1 2 3 + 0 2 1 3 + 0 2 3 1 + 2 0 3 1 + 2 0 1 3 + 2 3 1 0 + 1 3 0 2 + 3 2 0 1 + + +0 1 : 0 1 +2 3 : 2 3 +0 2 : 0 2 +1 3 : 1 3 +0 3 : 0 3 +2 1 : 1 2 + + + +; \ No newline at end of file