@@ -21,6 +21,7 @@ import Data.UInt (UInt)
21
21
import Effect (Effect )
22
22
import Effect.Aff (error , launchAff_ , throwError )
23
23
import Effect.Class (liftEffect )
24
+
24
25
import Unsafe.Coerce (unsafeCoerce )
25
26
import Web.DOM.Element (setAttribute )
26
27
import Web.DOM.NonElementParentNode (getElementById )
@@ -51,6 +52,7 @@ import Web.GPU.GPUFragmentState (GPUFragmentState)
51
52
import Web.GPU.GPUFrontFace (cw )
52
53
import Web.GPU.GPUIndexFormat (uint16 )
53
54
import Web.GPU.GPULoadOp as GPULoadOp
55
+
54
56
import Web.GPU.GPUPrimitiveState (GPUPrimitiveState )
55
57
import Web.GPU.GPUPrimitiveTopology (triangleList )
56
58
import Web.GPU.GPUProgrammableStage (GPUProgrammableStage )
@@ -288,6 +290,8 @@ main = do
288
290
translateZResultData :: Float32Array <- freshIdentityMatrix
289
291
perspectiveData :: Float32Array <- getPerspectiveMatrix
290
292
perspectiveResultData :: Float32Array <- freshIdentityMatrix
293
+ -- msdelta
294
+ hackyData :: Float32Array <- freshIdentityMatrix
291
295
-- 📇 Index Buffer Data
292
296
indices :: Uint16Array <- fromArray $ hackyIntConv
293
297
[
@@ -389,45 +393,36 @@ main = do
389
393
timeBuffer <- liftEffect $ createBufferF timeData
390
394
(GPUBufferUsage .storage .|. GPUBufferUsage .copyDst)
391
395
scaleBuffer <- liftEffect $ createBufferF scaleData
392
- (GPUBufferUsage .storage)
396
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
393
397
rotateZBuffer <- liftEffect $ createBufferF rotateZData
394
- (GPUBufferUsage .storage)
398
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
395
399
rotateZResultBuffer <- liftEffect $ createBufferF rotateZResultData
396
- (GPUBufferUsage .storage)
400
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
397
401
rotateXBuffer <- liftEffect $ createBufferF rotateXData
398
- (GPUBufferUsage .storage)
402
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
399
403
rotateXResultBuffer <- liftEffect $ createBufferF rotateXResultData
400
- (GPUBufferUsage .storage)
404
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
401
405
rotateYBuffer <- liftEffect $ createBufferF rotateYData
402
- (GPUBufferUsage .storage)
406
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
403
407
rotateYResultBuffer <- liftEffect $ createBufferF rotateYResultData
404
- (GPUBufferUsage .storage)
408
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
405
409
translateZBuffer <- liftEffect $ createBufferF translateZData
406
- (GPUBufferUsage .storage)
410
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
407
411
translateZResultBuffer <- liftEffect $ createBufferF translateZResultData
408
- (GPUBufferUsage .storage)
412
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
409
413
perspectiveBuffer <- liftEffect $ createBufferF perspectiveData
410
- (GPUBufferUsage .storage)
414
+ (GPUBufferUsage .storage .|. GPUBufferUsage .copySrc )
411
415
perspectiveResultBuffer <- liftEffect $ createBufferF perspectiveResultData
412
416
(GPUBufferUsage .storage .|. GPUBufferUsage .copySrc)
417
+ -- msdelta
418
+ hackyBuffer <- liftEffect $ createBufferF hackyData
419
+ (GPUBufferUsage .copyDst .|. GPUBufferUsage .mapRead)
413
420
-- 🖍️ Shaders
414
- let
415
- resetDesc = x
416
- { code:
417
- """
418
- @group(0) @binding(0) var<storage, read_write> resultMatrix : mat4x4<f32>;
419
-
420
- @compute @workgroup_size(4,4)
421
- fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
422
- resultMatrix[global_id.x][global_id.y] = select(0.0, 1.0, global_id.x == global_id.y);
423
- }"""
424
- }
425
- resetModule <- liftEffect $ createShaderModule device resetDesc
426
421
let
427
422
initialScaleDesc = x
428
423
{ code:
429
424
"""
430
- @group(0) @binding(0) var<storage, read_write> resultMatrix : mat4x4 <f32>;
425
+ @group(0) @binding(0) var<storage, read_write> resultMatrix : array <f32>;
431
426
432
427
@compute @workgroup_size(4)
433
428
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
@@ -437,7 +432,7 @@ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
437
432
return;
438
433
}
439
434
440
- resultMatrix[global_id.x][global_id.x] = resultMatrix[ global_id.x][global_id.x] * 0.25;
435
+ resultMatrix[global_id.x*4 + global_id.x] = 0.25;
441
436
}"""
442
437
}
443
438
initialScaleModule <- liftEffect $ createShaderModule device
@@ -446,75 +441,82 @@ fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
446
441
rotateZDesc = x
447
442
{ code:
448
443
"""
449
- @group(0) @binding(0) var<storage, read_write> resultMatrix : mat4x4 <f32>;
444
+ @group(0) @binding(0) var<storage, read_write> resultMatrix : array <f32>;
450
445
@group(1) @binding(0) var<storage, read> time : f32;
451
446
fn xyt2trig(x: u32, y: u32, time: f32) -> f32 {
452
447
const pi = 3.14159;
453
448
var o = (x << 1) + y;
454
449
return sin((time * pi) + (f32(2 - ((o + 1) % 3)) * (pi / 2.0)));
455
450
}
456
451
457
- @compute @workgroup_size(2,2 )
452
+ @compute @workgroup_size(4 )
458
453
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
459
- resultMatrix[global_id.x][global_id.y] = xyt2trig(global_id.x, global_id.y, time);
454
+ var ixx = global_id.x / 2;
455
+ var ixy = global_id.x % 2;
456
+ resultMatrix[ixx*4 + ixy] = xyt2trig(ixx, ixy, time);
460
457
}"""
461
458
}
462
459
rotateZModule <- liftEffect $ createShaderModule device rotateZDesc
463
460
let
464
461
rotateYDesc = x
465
462
{ code:
466
463
"""
467
- @group(0) @binding(0) var<storage, read_write> resultMatrix : mat4x4 <f32>;
464
+ @group(0) @binding(0) var<storage, read_write> resultMatrix : array <f32>;
468
465
@group(1) @binding(0) var<storage, read> time : f32;
469
466
fn xyt2trig(x: u32, y: u32, time: f32) -> f32 {
470
467
const pi = 3.14159;
471
468
var o = (x << 1) + y;
472
469
return sin((time * pi) + (f32(2 - ((o + 1) % 3)) * (pi / 2.0)));
473
470
}
474
471
475
- @compute @workgroup_size(2,2 )
472
+ @compute @workgroup_size(4 )
476
473
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
477
- resultMatrix[global_id.x * 2][global_id.y * 2] = xyt2trig(global_id.x, global_id.y, time);
474
+ var ixx = global_id.x / 2;
475
+ var ixy = global_id.x % 2;
476
+
477
+ resultMatrix[(ixx*8) + (ixy*2)] = xyt2trig(ixx, ixy, time);
478
478
}"""
479
479
}
480
480
rotateYModule <- liftEffect $ createShaderModule device rotateYDesc
481
481
let
482
482
rotateXDesc = x
483
483
{ code:
484
484
"""
485
- @group(0) @binding(0) var<storage, read_write> resultMatrix : mat4x4 <f32>;
485
+ @group(0) @binding(0) var<storage, read_write> resultMatrix : array <f32>;
486
486
@group(1) @binding(0) var<storage, read> time : f32;
487
487
fn xyt2trig(x: u32, y: u32, time: f32) -> f32 {
488
- const pi = 3.14159;
488
+ const pi = 3.14159;
489
489
var o = (x << 1) + y;
490
490
return sin((time * pi) + (f32((o + 1) % 3) * (pi / 2.0)));
491
491
}
492
492
493
- @compute @workgroup_size(2,2 )
493
+ @compute @workgroup_size(4 )
494
494
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
495
495
// Guard against out-of-bounds work group sizes
496
- if (global_id.x >= 2u || global_id.y >= 2u) {
497
- return;
498
- }
499
- resultMatrix[global_id.x + 1][global_id.y + 1] = xyt2trig(global_id.x, global_id.y , time);
496
+ var ixx = global_id.x / 2;
497
+ var ixy = global_id.x % 2;
498
+
499
+ resultMatrix[1 + ((ixx + 1)*4) + ixy ] = xyt2trig(ixx, ixy , time);
500
500
}"""
501
501
}
502
502
rotateXModule <- liftEffect $ createShaderModule device rotateXDesc
503
503
let
504
504
matrixMultiplicationDesc = x
505
505
{ code:
506
506
"""
507
- @group(0) @binding(0) var<storage, read> matrixL : mat4x4 <f32>;
508
- @group(0) @binding(1) var<storage, read> matrixR : mat4x4 <f32>;
509
- @group(0) @binding(2) var<storage, read_write> resultMatrix : mat4x4 <f32>;
510
- @compute @workgroup_size(4,4 )
507
+ @group(0) @binding(0) var<storage, read> matrixL : array <f32>;
508
+ @group(0) @binding(1) var<storage, read> matrixR : array <f32>;
509
+ @group(0) @binding(2) var<storage, read_write> resultMatrix : array <f32>;
510
+ @compute @workgroup_size(16 )
511
511
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
512
512
var result = 0.0;
513
+ var ixx = global_id.x / 4;
514
+ var ixy = global_id.x % 4;
513
515
for (var i = 0u; i < 4u; i = i + 1u) {
514
- result = result + (matrixL[i][global_id.y] * matrixR[global_id.x][ i]);
516
+ result = result + (matrixL[(i * 4 )+ ixy] * matrixR[(ixx * 4) + i]);
515
517
}
516
518
517
- resultMatrix[global_id.x][global_id.y ] = result;
519
+ resultMatrix[ixx*4 + ixy ] = result;
518
520
}"""
519
521
}
520
522
matrixMultiplicationModule <- liftEffect $ createShaderModule device
@@ -762,10 +764,6 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
762
764
}
763
765
-- 🎭 Shader Stages
764
766
let
765
- (resetState :: GPUProgrammableStage ) = x
766
- { " module" : resetModule
767
- , entryPoint: " main"
768
- }
769
767
(initialScaleState :: GPUProgrammableStage ) = x
770
768
{ " module" : initialScaleModule
771
769
, entryPoint: " main"
@@ -821,10 +819,6 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
821
819
, primitive
822
820
, depthStencil
823
821
}
824
- resetPipeline <- liftEffect $ createComputePipeline device $ x
825
- { layout: simpleIOComputeLayout
826
- , compute: resetState
827
- }
828
822
initialScalePipeline <- liftEffect $ createComputePipeline device $ x
829
823
{ layout: simpleIOComputeLayout
830
824
, compute: initialScaleState
@@ -1016,17 +1010,20 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
1016
1010
setBindGroup passEncoder 0 uniformBindGroup
1017
1011
drawIndexedWithInstanceCount passEncoder 36 1
1018
1012
end passEncoder
1019
- -- 💻 Encode compute commands for resetting buffer
1020
- resetPassEncoder <- beginComputePass commandEncoder (x {})
1021
- GPUComputePassEncoder .setPipeline resetPassEncoder resetPipeline
1022
- -- reset the main storage
1023
- GPUComputePassEncoder .setBindGroup resetPassEncoder 0
1024
- scaleBindGroup
1025
- GPUComputePassEncoder .dispatchWorkgroups resetPassEncoder 1
1026
- GPUComputePassEncoder .end resetPassEncoder
1013
+ -- ------
1014
+ copyBufferToBuffer commandEncoder rotateXBuffer 0
1015
+ hackyBuffer
1016
+ 0
1017
+ (4 * 16 )
1027
1018
-- 🙌 finish commandEncoder
1028
1019
toSubmit <- finish commandEncoder
1029
1020
submit queue [ toSubmit ]
1021
+ -- launchAff_ do
1022
+ -- toAffE $ convertPromise <$> mapAsync hackyBuffer GPUMapMode.read
1023
+ -- liftEffect do
1024
+ -- mr <- getMappedRange hackyBuffer
1025
+ -- arr <- (whole mr :: Effect Float32Array) >>= toArray
1026
+ -- logShow arr
1030
1027
let
1031
1028
render = unit # fix \f _ -> do
1032
1029
-- ⏭ Acquire next image from context
@@ -1037,6 +1034,7 @@ fn main(@location(0) inColor: vec3<f32>) -> @location(0) vec4<f32> {
1037
1034
encodeCommands colorTextureView
1038
1035
1039
1036
-- ➿ Refresh canvas
1037
+ -- msdelta
1040
1038
window >>= void <<< requestAnimationFrame (f unit)
1041
1039
1042
1040
liftEffect render
0 commit comments