react-native-wgpu 0.1.5 → 0.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +43 -42
  2. package/android/cpp/AndroidPlatformContext.h +2 -1
  3. package/cpp/jsi/RNFJSIConverter.h +10 -0
  4. package/cpp/rnwgpu/SurfaceRegistry.h +1 -2
  5. package/cpp/rnwgpu/api/Canvas.h +3 -3
  6. package/cpp/rnwgpu/api/GPUBuffer.h +1 -1
  7. package/ios/WebGPUView.mm +14 -1
  8. package/lib/commonjs/Canvas.js.map +1 -1
  9. package/lib/commonjs/utils.js +2 -2
  10. package/lib/commonjs/utils.js.map +1 -1
  11. package/lib/module/Canvas.js.map +1 -1
  12. package/lib/module/utils.js +2 -2
  13. package/lib/module/utils.js.map +1 -1
  14. package/lib/typescript/lib/commonjs/utils.d.ts +1 -1
  15. package/lib/typescript/lib/commonjs/utils.d.ts.map +1 -1
  16. package/lib/typescript/lib/module/utils.d.ts +1 -1
  17. package/lib/typescript/lib/module/utils.d.ts.map +1 -1
  18. package/lib/typescript/src/Canvas.d.ts +3 -2
  19. package/lib/typescript/src/Canvas.d.ts.map +1 -1
  20. package/lib/typescript/src/__tests__/ArrayBuffer.spec.d.ts +2 -0
  21. package/lib/typescript/src/__tests__/ArrayBuffer.spec.d.ts.map +1 -0
  22. package/lib/typescript/src/__tests__/Buffer.spec.d.ts +2 -0
  23. package/lib/typescript/src/__tests__/Buffer.spec.d.ts.map +1 -0
  24. package/lib/typescript/src/__tests__/ComputeShader.spec.d.ts +2 -0
  25. package/lib/typescript/src/__tests__/ComputeShader.spec.d.ts.map +1 -0
  26. package/lib/typescript/src/__tests__/Constants.spec.d.ts +2 -0
  27. package/lib/typescript/src/__tests__/Constants.spec.d.ts.map +1 -0
  28. package/lib/typescript/src/__tests__/Device.spec.d.ts +2 -0
  29. package/lib/typescript/src/__tests__/Device.spec.d.ts.map +1 -0
  30. package/lib/typescript/src/__tests__/ExternalTexture.spec.d.ts +2 -0
  31. package/lib/typescript/src/__tests__/ExternalTexture.spec.d.ts.map +1 -0
  32. package/lib/typescript/src/__tests__/GPU.spec.d.ts +2 -0
  33. package/lib/typescript/src/__tests__/GPU.spec.d.ts.map +1 -0
  34. package/lib/typescript/src/__tests__/ImageData.spec.d.ts +2 -0
  35. package/lib/typescript/src/__tests__/ImageData.spec.d.ts.map +1 -0
  36. package/lib/typescript/src/__tests__/Shaders.spec.d.ts +2 -0
  37. package/lib/typescript/src/__tests__/Shaders.spec.d.ts.map +1 -0
  38. package/lib/typescript/src/__tests__/Texture.spec.d.ts +2 -0
  39. package/lib/typescript/src/__tests__/Texture.spec.d.ts.map +1 -0
  40. package/lib/typescript/src/__tests__/components/DrawingContext.d.ts +12 -0
  41. package/lib/typescript/src/__tests__/components/DrawingContext.d.ts.map +1 -0
  42. package/lib/typescript/src/__tests__/components/Wireframe/Shaders.d.ts +3 -0
  43. package/lib/typescript/src/__tests__/components/Wireframe/Shaders.d.ts.map +1 -0
  44. package/lib/typescript/src/__tests__/components/Wireframe/models.d.ts +29 -0
  45. package/lib/typescript/src/__tests__/components/Wireframe/models.d.ts.map +1 -0
  46. package/lib/typescript/src/__tests__/components/Wireframe/utils.d.ts +5 -0
  47. package/lib/typescript/src/__tests__/components/Wireframe/utils.d.ts.map +1 -0
  48. package/lib/typescript/src/__tests__/components/cube.d.ts +7 -0
  49. package/lib/typescript/src/__tests__/components/cube.d.ts.map +1 -0
  50. package/lib/typescript/src/__tests__/components/meshes/mesh.d.ts +22 -0
  51. package/lib/typescript/src/__tests__/components/meshes/mesh.d.ts.map +1 -0
  52. package/lib/typescript/src/__tests__/components/meshes/sphere.d.ts +12 -0
  53. package/lib/typescript/src/__tests__/components/meshes/sphere.d.ts.map +1 -0
  54. package/lib/typescript/src/__tests__/components/meshes/stanfordDragon.d.ts +7 -0
  55. package/lib/typescript/src/__tests__/components/meshes/stanfordDragon.d.ts.map +1 -0
  56. package/lib/typescript/src/__tests__/components/meshes/stanfordDragonData.d.ts +6 -0
  57. package/lib/typescript/src/__tests__/components/meshes/stanfordDragonData.d.ts.map +1 -0
  58. package/lib/typescript/src/__tests__/components/meshes/teapot.d.ts +6 -0
  59. package/lib/typescript/src/__tests__/components/meshes/teapot.d.ts.map +1 -0
  60. package/lib/typescript/src/__tests__/components/meshes/utils.d.ts +10 -0
  61. package/lib/typescript/src/__tests__/components/meshes/utils.d.ts.map +1 -0
  62. package/lib/typescript/src/__tests__/components/triangle.d.ts +3 -0
  63. package/lib/typescript/src/__tests__/components/triangle.d.ts.map +1 -0
  64. package/lib/typescript/src/__tests__/config.d.ts +3 -0
  65. package/lib/typescript/src/__tests__/config.d.ts.map +1 -0
  66. package/lib/typescript/src/__tests__/demos/ABuffer.spec.d.ts +2 -0
  67. package/lib/typescript/src/__tests__/demos/ABuffer.spec.d.ts.map +1 -0
  68. package/lib/typescript/src/__tests__/demos/Blur.spec.d.ts +2 -0
  69. package/lib/typescript/src/__tests__/demos/Blur.spec.d.ts.map +1 -0
  70. package/lib/typescript/src/__tests__/demos/Cube.spec.d.ts +2 -0
  71. package/lib/typescript/src/__tests__/demos/Cube.spec.d.ts.map +1 -0
  72. package/lib/typescript/src/__tests__/demos/FractalCube.spec.d.ts +2 -0
  73. package/lib/typescript/src/__tests__/demos/FractalCube.spec.d.ts.map +1 -0
  74. package/lib/typescript/src/__tests__/demos/OcclusionQuery.spec.d.ts +2 -0
  75. package/lib/typescript/src/__tests__/demos/OcclusionQuery.spec.d.ts.map +1 -0
  76. package/lib/typescript/src/__tests__/demos/RenderBundles.spec.d.ts +2 -0
  77. package/lib/typescript/src/__tests__/demos/RenderBundles.spec.d.ts.map +1 -0
  78. package/lib/typescript/src/__tests__/demos/Triangle.spec.d.ts +2 -0
  79. package/lib/typescript/src/__tests__/demos/Triangle.spec.d.ts.map +1 -0
  80. package/lib/typescript/src/__tests__/demos/Wireframe.spec.d.ts +2 -0
  81. package/lib/typescript/src/__tests__/demos/Wireframe.spec.d.ts.map +1 -0
  82. package/lib/typescript/src/__tests__/globalSetup.d.ts +10 -0
  83. package/lib/typescript/src/__tests__/globalSetup.d.ts.map +1 -0
  84. package/lib/typescript/src/__tests__/globalTeardown.d.ts +3 -0
  85. package/lib/typescript/src/__tests__/globalTeardown.d.ts.map +1 -0
  86. package/lib/typescript/src/__tests__/setup.d.ts +62 -0
  87. package/lib/typescript/src/__tests__/setup.d.ts.map +1 -0
  88. package/lib/typescript/src/utils.d.ts +2 -1
  89. package/lib/typescript/src/utils.d.ts.map +1 -1
  90. package/libs/android/arm64-v8a/libwebgpu_dawn.so +0 -0
  91. package/libs/android/armeabi-v7a/libwebgpu_dawn.so +0 -0
  92. package/libs/android/x86/libwebgpu_dawn.so +0 -0
  93. package/libs/android/x86_64/libwebgpu_dawn.so +0 -0
  94. package/libs/{ios/libwebgpu_dawn.xcframework/ios-arm64 → apple/arm64_iphoneos}/libwebgpu_dawn.a +0 -0
  95. package/libs/{ios → apple}/arm64_iphonesimulator/libwebgpu_dawn.a +0 -0
  96. package/libs/{ios → apple}/arm64_xros/libwebgpu_dawn.a +0 -0
  97. package/libs/{ios → apple}/arm64_xrsimulator/libwebgpu_dawn.a +0 -0
  98. package/libs/{ios → apple}/libwebgpu_dawn.a +0 -0
  99. package/libs/{ios/arm64_iphoneos → apple/libwebgpu_dawn.xcframework/ios-arm64}/libwebgpu_dawn.a +0 -0
  100. package/libs/{ios → apple}/libwebgpu_dawn.xcframework/ios-arm64_x86_64-simulator/libwebgpu_dawn.a +0 -0
  101. package/libs/apple/libwebgpu_dawn_macosx.xcframework/Info.plist +28 -0
  102. package/libs/apple/libwebgpu_dawn_macosx.xcframework/macos-arm64_x86_64/libwebgpu_dawn.a +0 -0
  103. package/libs/{ios/libwebgpu_dawn_visionos.xcframework/xros-arm64_x86_64-simulator → apple}/libwebgpu_dawn_visionos.a +0 -0
  104. package/libs/{ios → apple}/libwebgpu_dawn_visionos.xcframework/Info.plist +2 -2
  105. package/libs/{ios/arm64_xros/libwebgpu_dawn_visionos.a → apple/libwebgpu_dawn_visionos.xcframework/xros-arm64/libwebgpu_dawn.a} +0 -0
  106. package/libs/{ios → apple/libwebgpu_dawn_visionos.xcframework/xros-arm64_x86_64-simulator}/libwebgpu_dawn_visionos.a +0 -0
  107. package/libs/apple/universal_macosx/libwebgpu_dawn.a +0 -0
  108. package/libs/{ios → apple}/x86_64_iphonesimulator/libwebgpu_dawn.a +0 -0
  109. package/libs/{ios → apple}/x86_64_xrsimulator/libwebgpu_dawn.a +0 -0
  110. package/package.json +23 -22
  111. package/react-native-wgpu.podspec +2 -2
  112. package/src/Canvas.tsx +4 -2
  113. package/src/__tests__/ArrayBuffer.spec.ts +76 -0
  114. package/src/__tests__/Buffer.spec.ts +357 -0
  115. package/src/__tests__/ComputeShader.spec.ts +375 -0
  116. package/src/__tests__/Constants.spec.ts +91 -0
  117. package/src/__tests__/Device.spec.ts +35 -0
  118. package/src/__tests__/ExternalTexture.spec.ts +284 -0
  119. package/src/__tests__/GPU.spec.ts +229 -0
  120. package/src/__tests__/ImageData.spec.ts +26 -0
  121. package/src/__tests__/Shaders.spec.ts +232 -0
  122. package/src/__tests__/Texture.spec.ts +191 -0
  123. package/src/__tests__/assets/Di-3d.png +0 -0
  124. package/src/__tests__/components/DrawingContext.ts +11 -0
  125. package/src/__tests__/components/Wireframe/Shaders.ts +138 -0
  126. package/src/__tests__/components/Wireframe/models.ts +113 -0
  127. package/src/__tests__/components/Wireframe/utils.ts +22 -0
  128. package/src/__tests__/components/cube.ts +51 -0
  129. package/src/__tests__/components/meshes/mesh.ts +96 -0
  130. package/src/__tests__/components/meshes/sphere.ts +103 -0
  131. package/src/__tests__/components/meshes/stanfordDragon.ts +44 -0
  132. package/src/__tests__/components/meshes/stanfordDragonData.ts +5 -0
  133. package/src/__tests__/components/meshes/teapot.ts +13 -0
  134. package/src/__tests__/components/meshes/utils.ts +235 -0
  135. package/src/__tests__/components/triangle.ts +17 -0
  136. package/src/__tests__/config.ts +2 -0
  137. package/src/__tests__/demos/ABuffer.spec.ts +885 -0
  138. package/src/__tests__/demos/Blur.spec.ts +397 -0
  139. package/src/__tests__/demos/Cube.spec.ts +925 -0
  140. package/src/__tests__/demos/FractalCube.spec.ts +239 -0
  141. package/src/__tests__/demos/OcclusionQuery.spec.ts +376 -0
  142. package/src/__tests__/demos/RenderBundles.spec.ts +579 -0
  143. package/src/__tests__/demos/Triangle.spec.ts +248 -0
  144. package/src/__tests__/demos/Wireframe.spec.ts +190 -0
  145. package/src/__tests__/globalSetup.ts +54 -0
  146. package/src/__tests__/globalTeardown.ts +11 -0
  147. package/src/__tests__/setup.ts +409 -0
  148. package/src/__tests__/snapshots/abuffer.png +0 -0
  149. package/src/__tests__/snapshots/asteroid.png +0 -0
  150. package/src/__tests__/snapshots/blur.png +0 -0
  151. package/src/__tests__/snapshots/buffer.png +0 -0
  152. package/src/__tests__/snapshots/constant-triangle.png +0 -0
  153. package/src/__tests__/snapshots/cube.png +0 -0
  154. package/src/__tests__/snapshots/f.png +0 -0
  155. package/src/__tests__/snapshots/f2.png +0 -0
  156. package/src/__tests__/snapshots/fractal-cubes.png +0 -0
  157. package/src/__tests__/snapshots/instanced-cubes.png +0 -0
  158. package/src/__tests__/snapshots/occlusion-query.png +0 -0
  159. package/src/__tests__/snapshots/ref.png +0 -0
  160. package/src/__tests__/snapshots/texture.png +0 -0
  161. package/src/__tests__/snapshots/textured-cube.png +0 -0
  162. package/src/__tests__/snapshots/triangle-msaa.png +0 -0
  163. package/src/__tests__/snapshots/triangle.png +0 -0
  164. package/src/__tests__/snapshots/two-cube.png +0 -0
  165. package/src/utils.ts +3 -1
  166. package/android/gradle.properties +0 -5
  167. package/libs/ios/libwebgpu_dawn_visionos.xcframework/xros-arm64/libwebgpu_dawn_visionos.a +0 -0
  168. package/libs/{ios → apple}/libwebgpu_dawn.xcframework/Info.plist +5 -5
@@ -0,0 +1,357 @@
1
+ import { checkImage, client, encodeImage } from "./setup";
2
+
3
+ describe("Buffer", () => {
4
+ it("Label", async () => {
5
+ const result = await client.eval(
6
+ ({ device, assets: { cubeVertexArray } }) => {
7
+ const buffer1 = device.createBuffer({
8
+ size: cubeVertexArray.byteLength,
9
+ usage: GPUBufferUsage.VERTEX,
10
+ mappedAtCreation: true,
11
+ });
12
+ const buffer2 = device.createBuffer({
13
+ size: cubeVertexArray.byteLength,
14
+ usage: GPUBufferUsage.VERTEX,
15
+ mappedAtCreation: true,
16
+ label: "verticesBuffer",
17
+ });
18
+ return [buffer1.label, buffer2.label];
19
+ },
20
+ );
21
+ expect(result).toEqual(["", "verticesBuffer"]);
22
+ });
23
+ it("metadata", async () => {
24
+ const result = await client.eval(
25
+ ({ device, assets: { cubeVertexArray } }) => {
26
+ const buffer = device.createBuffer({
27
+ size: cubeVertexArray.byteLength,
28
+ usage: GPUBufferUsage.VERTEX,
29
+ mappedAtCreation: true,
30
+ });
31
+ return [buffer.label, buffer.size, buffer.usage, buffer.mapState];
32
+ },
33
+ );
34
+ expect(result).toEqual(["", 1440, 32, "mapped"]);
35
+ });
36
+ it("metadata (1)", async () => {
37
+ const result = await client.eval(
38
+ ({ device, assets: { cubeVertexArray } }) => {
39
+ const buffer = device.createBuffer({
40
+ size: cubeVertexArray.byteLength,
41
+ usage: GPUBufferUsage.VERTEX,
42
+ mappedAtCreation: false,
43
+ });
44
+ return [buffer.label, buffer.size, buffer.usage, buffer.mapState];
45
+ },
46
+ );
47
+ expect(result).toEqual(["", 1440, 32, "unmapped"]);
48
+ });
49
+ it("upload data (1)", async () => {
50
+ const result = await client.eval(
51
+ ({ device, assets: { cubeVertexArray } }) => {
52
+ const verticesBuffer = device.createBuffer({
53
+ size: cubeVertexArray.byteLength,
54
+ usage: GPUBufferUsage.VERTEX,
55
+ mappedAtCreation: true,
56
+ label: "verticesBuffer",
57
+ });
58
+ new Float32Array(verticesBuffer.getMappedRange()).set(cubeVertexArray);
59
+ verticesBuffer.unmap();
60
+ return !!verticesBuffer;
61
+ },
62
+ );
63
+ expect(result).toBe(true);
64
+ });
65
+
66
+ it("upload data (2)", async () => {
67
+ const result = await client.eval(
68
+ ({ device, assets: { cubeVertexArray } }) => {
69
+ const verticesBuffer = device.createBuffer({
70
+ size: cubeVertexArray.byteLength,
71
+ usage: GPUBufferUsage.VERTEX,
72
+ mappedAtCreation: true,
73
+ label: "verticesBuffer",
74
+ });
75
+ new Float32Array(
76
+ verticesBuffer.getMappedRange(0, cubeVertexArray.byteLength),
77
+ ).set(cubeVertexArray);
78
+ verticesBuffer.unmap();
79
+ return !!verticesBuffer;
80
+ },
81
+ );
82
+ expect(result).toBe(true);
83
+ });
84
+ it("writes into a buffer (1)", async () => {
85
+ const result = await client.eval(({ device }) => {
86
+ const bufferSize = 4 * 4; // 4 32-bit floats
87
+ const sourceBuffer = device.createBuffer({
88
+ size: bufferSize,
89
+ usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
90
+ });
91
+
92
+ // Create data to upload
93
+ const data = new Float32Array([1.0, 2.0, 3.0, 4.0]);
94
+
95
+ // Write data to the source buffer
96
+ device.queue.writeBuffer(sourceBuffer, 0, data);
97
+ return true;
98
+ });
99
+ expect(result).toBe(true);
100
+ });
101
+ it("read/write buffer (1)", async () => {
102
+ const result = await client.eval(({ device }) => {
103
+ const data = new Uint32Array([1.0, 2.0, 3.0, 4.0]);
104
+ // Create a GPU buffer and store data
105
+ const gpuBuffer = device.createBuffer({
106
+ size: data.byteLength,
107
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
108
+ mappedAtCreation: false,
109
+ });
110
+
111
+ // Copy data to the GPU buffer
112
+ device.queue.writeBuffer(gpuBuffer, 0, data);
113
+
114
+ return gpuBuffer.mapAsync(GPUMapMode.READ).then(() => {
115
+ const arrayBuffer = gpuBuffer.getMappedRange();
116
+ const readData = new Uint32Array(arrayBuffer);
117
+ const r = Array.from(readData);
118
+ gpuBuffer.unmap();
119
+ return r;
120
+ });
121
+ });
122
+ expect(result).toEqual([1, 2, 3, 4]);
123
+ });
124
+ it("read/write buffer (2)", async () => {
125
+ const result = await client.eval(({ device }) => {
126
+ const data = new Uint32Array([1.0, 2.0, 3.0, 4.0]);
127
+ // Create a GPU buffer and store data
128
+ const gpuBuffer = device.createBuffer({
129
+ size: data.byteLength,
130
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
131
+ mappedAtCreation: false,
132
+ });
133
+
134
+ // Copy data to the GPU buffer
135
+ device.queue.writeBuffer(gpuBuffer, 0, data.buffer, 0, data.byteLength);
136
+
137
+ return gpuBuffer
138
+ .mapAsync(GPUMapMode.READ, 0, data.byteLength)
139
+ .then(() => {
140
+ const arrayBuffer = gpuBuffer.getMappedRange(0, data.byteLength);
141
+ const readData = new Uint32Array(arrayBuffer);
142
+ const r = Array.from(readData);
143
+ gpuBuffer.unmap();
144
+ return r;
145
+ });
146
+ });
147
+ expect(result).toEqual([1, 2, 3, 4]);
148
+ });
149
+ it("read/write buffer (3)", async () => {
150
+ const result = await client.eval(({ device }) => {
151
+ const data = new Uint32Array([1.0, 2.0, 3.0, 4.0]);
152
+ // Create a GPU buffer and store data
153
+ const gpuBuffer = device.createBuffer({
154
+ size: data.byteLength,
155
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
156
+ mappedAtCreation: false,
157
+ });
158
+
159
+ // Copy data to the GPU buffer
160
+ device.queue.writeBuffer(gpuBuffer, 0, data.buffer, 0, data.byteLength);
161
+
162
+ return gpuBuffer
163
+ .mapAsync(GPUMapMode.READ, 0, data.byteLength)
164
+ .then(() => {
165
+ const arrayBuffer = gpuBuffer.getMappedRange(0, data.byteLength);
166
+ const readData = new Float32Array(arrayBuffer);
167
+ const r = Array.from(readData);
168
+ gpuBuffer.unmap();
169
+ return r;
170
+ });
171
+ });
172
+ const ref = new Uint32Array([1.0, 2.0, 3.0, 4.0]);
173
+ expect(result).toEqual(Array.from(new Float32Array(ref.buffer)));
174
+ });
175
+ it("writes into a buffer (2)", async () => {
176
+ const result = await client.eval(({ device }) => {
177
+ const bufferSize = 4 * 4; // 4 32-bit floats
178
+ const sourceBuffer = device.createBuffer({
179
+ size: bufferSize,
180
+ usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
181
+ });
182
+
183
+ // Create a buffer for reading
184
+ const readBuffer = device.createBuffer({
185
+ size: bufferSize,
186
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
187
+ });
188
+
189
+ // Create data to upload
190
+ const data = new Float32Array([1.0, 2.0, 3.0, 4.0]);
191
+
192
+ // Write data to the source buffer
193
+ device.queue.writeBuffer(sourceBuffer, 0, data);
194
+
195
+ // Copy data from source buffer to read buffer
196
+ const encoder = device.createCommandEncoder();
197
+ encoder.copyBufferToBuffer(sourceBuffer, 0, readBuffer, 0, bufferSize);
198
+ device.queue.submit([encoder.finish()]);
199
+ // Map the read buffer for reading
200
+ return readBuffer.mapAsync(GPUMapMode.READ).then(() => {
201
+ const readData = new Float32Array(readBuffer.getMappedRange());
202
+ return Array.from(readData);
203
+ });
204
+ });
205
+ expect(result).toEqual([1, 2, 3, 4]);
206
+ });
207
+ it("writes into a buffer (3)", async () => {
208
+ const result = await client.eval(({ device }) => {
209
+ const bufferSize = 4 * 4; // 4 32-bit floats
210
+ const sourceBuffer = device.createBuffer({
211
+ size: bufferSize,
212
+ usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST,
213
+ });
214
+
215
+ // Create a buffer for reading
216
+ const readBuffer = device.createBuffer({
217
+ size: bufferSize,
218
+ usage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ,
219
+ });
220
+
221
+ // Create data to upload
222
+ const data = new Float32Array([1.0, 2.0, 3.0, 4.0]);
223
+
224
+ // Write data to the source buffer
225
+ device.queue.writeBuffer(sourceBuffer, 0, data);
226
+
227
+ // Copy data from source buffer to read buffer
228
+ const encoder = device.createCommandEncoder();
229
+ encoder.copyBufferToBuffer(sourceBuffer, 0, readBuffer, 0, bufferSize);
230
+ device.queue.submit([encoder.finish()]);
231
+ // Map the read buffer for reading
232
+ return readBuffer.mapAsync(GPUMapMode.READ).then(() => {
233
+ //const readData = new Float32Array(readBuffer.getMappedRange());
234
+ readBuffer.unmap();
235
+ // // Create a buffer for writing
236
+ const writeBuffer = device.createBuffer({
237
+ size: bufferSize,
238
+ usage: GPUBufferUsage.COPY_SRC | GPUBufferUsage.MAP_WRITE,
239
+ });
240
+ // Map the write buffer for writing
241
+ return writeBuffer.mapAsync(GPUMapMode.WRITE).then(() => {
242
+ const writeData = new Float32Array(writeBuffer.getMappedRange());
243
+ writeData.set([5.0, 6.0, 7.0, 8.0]);
244
+ writeBuffer.unmap();
245
+ // // Copy data from write buffer to source buffer
246
+ const encoder2 = device.createCommandEncoder();
247
+ encoder2.copyBufferToBuffer(
248
+ writeBuffer,
249
+ 0,
250
+ sourceBuffer,
251
+ 0,
252
+ bufferSize,
253
+ );
254
+ device.queue.submit([encoder2.finish()]);
255
+ // // Copy data from source buffer to read buffer
256
+ const encoder3 = device.createCommandEncoder();
257
+ encoder3.copyBufferToBuffer(
258
+ sourceBuffer,
259
+ 0,
260
+ readBuffer,
261
+ 0,
262
+ bufferSize,
263
+ );
264
+ device.queue.submit([encoder3.finish()]);
265
+ // Map the read buffer for final reading
266
+ return readBuffer.mapAsync(GPUMapMode.READ).then(() => {
267
+ const finalReadData = new Float32Array(readBuffer.getMappedRange());
268
+ const res = Array.from(finalReadData);
269
+ readBuffer.unmap();
270
+ return res;
271
+ });
272
+ });
273
+ });
274
+ });
275
+ expect(result).toEqual([5, 6, 7, 8]);
276
+ });
277
+ it("Builds the reference result", async () => {
278
+ const data = await client.eval(() => {
279
+ const pixels = new Uint8Array(256 * 256 * 4);
280
+ pixels.fill(255);
281
+ let i = 0;
282
+ for (let x = 0; x < 256 * 4; x++) {
283
+ for (let y = 0; y < 256 * 4; y++) {
284
+ pixels[i++] = (x * y) % 255;
285
+ }
286
+ }
287
+ return Array.from(pixels);
288
+ });
289
+ const png = encodeImage({
290
+ data,
291
+ width: 256,
292
+ height: 256,
293
+ format: "rgba8unorm",
294
+ });
295
+ checkImage(png, "snapshots/buffer.png");
296
+ });
297
+ it("Builds the reference result (2)", async () => {
298
+ const data = new Uint8Array(256 * 256 * 4);
299
+ data.fill(255);
300
+ let i = 0;
301
+ for (let x = 0; x < 256 * 4; x++) {
302
+ for (let y = 0; y < 256 * 4; y++) {
303
+ data[i++] = (x * y) % 255;
304
+ }
305
+ }
306
+ const result = await client.eval(
307
+ ({ pixels }) => {
308
+ return Array.from(pixels);
309
+ },
310
+ { pixels: Array.from(data) },
311
+ );
312
+ const png = encodeImage({
313
+ data: result,
314
+ width: 256,
315
+ height: 256,
316
+ format: "rgba8unorm",
317
+ });
318
+ checkImage(png, "snapshots/buffer.png");
319
+ });
320
+ it("writes an image into a buffer and reads it back", async () => {
321
+ const imageData = await client.eval(({ device }) => {
322
+ const data = new Uint8Array(256 * 256 * 4);
323
+ data.fill(255);
324
+ let i = 0;
325
+ for (let x = 0; x < 256 * 4; x++) {
326
+ for (let y = 0; y < 256 * 4; y++) {
327
+ data[i++] = (x * y) % 255;
328
+ }
329
+ }
330
+ const gpuBuffer = device.createBuffer({
331
+ size: 256 * 256 * 4,
332
+ usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
333
+ mappedAtCreation: false,
334
+ });
335
+
336
+ // Copy data to the GPU buffer
337
+ device.queue.writeBuffer(gpuBuffer, 0, data.buffer, 0, data.byteLength);
338
+
339
+ return gpuBuffer
340
+ .mapAsync(GPUMapMode.READ, 0, data.byteLength)
341
+ .then(() => {
342
+ const arrayBuffer = gpuBuffer.getMappedRange(0, data.byteLength);
343
+ const readData = new Uint8Array(arrayBuffer);
344
+ const r = Array.from(readData);
345
+ gpuBuffer.unmap();
346
+ return r;
347
+ });
348
+ });
349
+ const png = encodeImage({
350
+ data: imageData,
351
+ width: 256,
352
+ height: 256,
353
+ format: "rgba8unorm",
354
+ });
355
+ checkImage(png, "snapshots/buffer.png");
356
+ });
357
+ });