@@ -264,6 +264,8 @@ main = do
264264 rotateZResultData :: Float32Array <- freshIdentityMatrix
265265 rotateXData :: Float32Array <- freshIdentityMatrix
266266 rotateXResultData :: Float32Array <- freshIdentityMatrix
267+ rotateYData :: Float32Array <- freshIdentityMatrix
268+ rotateYResultData :: Float32Array <- freshIdentityMatrix
267269 -- 📇 Index Buffer Data
268270 indices :: Uint16Array <- fromArray $ hackyIntConv
269271 [
@@ -375,6 +377,10 @@ main = do
375377 (GPUBufferUsage .storage )
376378 rotateXResultBuffer <- liftEffect $ createBufferF rotateXResultData
377379 (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
380+ rotateYBuffer <- liftEffect $ createBufferF rotateYData
381+ (GPUBufferUsage .storage )
382+ rotateYResultBuffer <- liftEffect $ createBufferF rotateYResultData
383+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
378384 -- 🖍️ Shaders
379385 let
380386 resetDesc = x
@@ -437,7 +443,7 @@ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
437443fn xyt2trig(x: u32, y: u32, time: f32) -> f32 {
438444 const pi = 3.14159;
439445 var o = (x << 1) + y;
440- return sin(((time / 2 .0) * pi) + (f32(2 - ((o + 1) % 3)) * (pi / 2.0)));
446+ return sin(((time / 4 .0) * pi) + (f32(2 - ((o + 1) % 3)) * (pi / 2.0)));
441447}
442448
443449@compute @workgroup_size(2,2)
@@ -450,10 +456,36 @@ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
450456 // 0,1 is sin(a) 1 0
451457 // 1,0 is -sin(a) 2 2
452458 // 1,1 is cos(a) 3 1
453- resultMatrix[global_id.x ][global_id.y ] = xyt2trig(global_id.x, global_id.y, time);
459+ resultMatrix[global_id.y ][global_id.x ] = xyt2trig(global_id.x, global_id.y, time);
454460}"""
455461 }
456462 rotateZModule <- liftEffect $ createShaderModule device rotateZDesc
463+ let
464+ rotateYDesc = x
465+ { code:
466+ """
467+ @group(0) @binding(0) var<storage, read_write> resultMatrix : mat4x4<f32>;
468+ @group(1) @binding(0) var<storage, read> time : f32;
469+ fn xyt2trig(x: u32, y: u32, time: f32) -> f32 {
470+ const pi = 3.14159;
471+ var o = (x << 1) + y;
472+ return sin(((time / 4.0) * pi) + (f32(2 - ((o + 1) % 3)) * (pi / 2.0)));
473+ }
474+
475+ @compute @workgroup_size(2,2)
476+ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
477+ // Guard against out-of-bounds work group sizes
478+ if (global_id.x >= 2u || global_id.y >= 2u) {
479+ return;
480+ }
481+ // 0,0 is cos(a) 0 1
482+ // 0,1 is sin(a) 1 0
483+ // 1,0 is -sin(a) 2 2
484+ // 1,1 is cos(a) 3 1
485+ resultMatrix[global_id.y * 2][global_id.x * 2] = xyt2trig(global_id.x, global_id.y, time);
486+ }"""
487+ }
488+ rotateYModule <- liftEffect $ createShaderModule device rotateYDesc
457489 let
458490 rotateXDesc = x
459491 { code:
@@ -463,7 +495,7 @@ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
463495fn xyt2trig(x: u32, y: u32, time: f32) -> f32 {
464496 const pi = 3.14159;
465497 var o = (x << 1) + y;
466- return sin(((time / 8 .0) * pi) + (f32((o + 1) % 3) * (pi / 2.0)));
498+ return sin(((time / 4 .0) * pi) + (f32((o + 1) % 3) * (pi / 2.0)));
467499}
468500
469501@compute @workgroup_size(2,2)
@@ -476,7 +508,7 @@ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
476508 // 1,2 is -sin(a) 1 2
477509 // 2,1 is sin(a) 2 0
478510 // 2,2 is cos(a) 3 1
479- resultMatrix[global_id.x + 1][global_id.y + 1] = xyt2trig(global_id.x, global_id.y, time);
511+ resultMatrix[global_id.y + 1][global_id.x + 1] = xyt2trig(global_id.x, global_id.y, time);
480512}"""
481513 }
482514 rotateXModule <- liftEffect $ createShaderModule device rotateXDesc
@@ -682,6 +714,24 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
682714 (x { buffer: rotateXResultBuffer } :: GPUBufferBinding )
683715 ]
684716 }
717+ rotateYComputeBindGroup <- liftEffect $ createBindGroup device $ x
718+ { layout: simpleIOComputeBindGroupLayout
719+ , entries:
720+ [ gpuBindGroupEntry 0
721+ (x { buffer: rotateYBuffer } :: GPUBufferBinding )
722+ ]
723+ }
724+ rotateYResultIOComputeBindGroup <- liftEffect $ createBindGroup device $ x
725+ { layout: matrixMultiplicationComputeBindGroupLayout
726+ , entries:
727+ [ gpuBindGroupEntry 0
728+ (x { buffer: rotateYBuffer } :: GPUBufferBinding )
729+ , gpuBindGroupEntry 1
730+ (x { buffer: rotateXResultBuffer } :: GPUBufferBinding )
731+ , gpuBindGroupEntry 2
732+ (x { buffer: rotateYResultBuffer } :: GPUBufferBinding )
733+ ]
734+ }
685735 timeComputeBindGroup <- liftEffect $ createBindGroup device $ x
686736 { layout: timeBindGroupLayout
687737 , entries:
@@ -720,6 +770,10 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
720770 { " module" : rotateZModule
721771 , entryPoint: " main"
722772 }
773+ (rotateYState :: GPUProgrammableStage ) = x
774+ { " module" : rotateYModule
775+ , entryPoint: " main"
776+ }
723777 (rotateXState :: GPUProgrammableStage ) = x
724778 { " module" : rotateXModule
725779 , entryPoint: " main"
@@ -779,6 +833,10 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
779833 { layout: ioPlusTComputeLayout
780834 , compute: rotateZState
781835 }
836+ rotateYPipeline <- liftEffect $ createComputePipeline device $ x
837+ { layout: ioPlusTComputeLayout
838+ , compute: rotateYState
839+ }
782840 rotateXPipeline <- liftEffect $ createComputePipeline device $ x
783841 { layout: ioPlusTComputeLayout
784842 , compute: rotateXState
@@ -892,6 +950,24 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
892950 GPUComputePassEncoder .dispatchWorkgroupsXY rotateXMulPassEncoder 4 4
893951 GPUComputePassEncoder .end rotateXMulPassEncoder
894952 -- -------------------
953+ rotateYPassEncoder <- beginComputePass commandEncoder (x {})
954+ GPUComputePassEncoder .setPipeline rotateYPassEncoder
955+ rotateYPipeline
956+ GPUComputePassEncoder .setBindGroup rotateYPassEncoder 0
957+ rotateYComputeBindGroup
958+ GPUComputePassEncoder .setBindGroup rotateYPassEncoder 1
959+ timeComputeBindGroup
960+ GPUComputePassEncoder .dispatchWorkgroupsXY rotateYPassEncoder 2 2
961+ GPUComputePassEncoder .end rotateYPassEncoder
962+ -- -------------------
963+ rotateYMulPassEncoder <- beginComputePass commandEncoder (x {})
964+ GPUComputePassEncoder .setPipeline rotateYMulPassEncoder
965+ matrixMultiplicationPipeline
966+ GPUComputePassEncoder .setBindGroup rotateYMulPassEncoder 0
967+ rotateYResultIOComputeBindGroup
968+ GPUComputePassEncoder .dispatchWorkgroupsXY rotateYMulPassEncoder 4 4
969+ GPUComputePassEncoder .end rotateYMulPassEncoder
970+ -- -------------------
895971 -- xTransTestPassEncoder <- beginComputePass commandEncoder (x {})
896972 -- GPUComputePassEncoder.setPipeline xTransTestPassEncoder
897973 -- xTransTestPipeline
@@ -900,7 +976,7 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
900976 -- GPUComputePassEncoder.dispatchWorkgroupsX xTransTestPassEncoder 1
901977 -- GPUComputePassEncoder.end xTransTestPassEncoder
902978 --
903- copyBufferToBuffer commandEncoder rotateXResultBuffer 0 uniformBuffer 0
979+ copyBufferToBuffer commandEncoder rotateYResultBuffer 0 uniformBuffer 0
904980 (4 * 16 )
905981 -- 🖌️ Encode drawing commands
906982 let
0 commit comments