Skip to content

Commit 11cd010

Browse files
author
Mike Solomon
committed
Adds Y rotation
1 parent 828a4cc commit 11cd010

File tree

1 file changed

+81
-5
lines changed

1 file changed

+81
-5
lines changed

sandbox/Sandbox.purs

Lines changed: 81 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -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>) {
437443
fn 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>) {
463495
fn 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

Comments
 (0)