react-native-wgpu 0.2.10 → 0.3.0

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 (248) hide show
  1. package/README.md +155 -69
  2. package/android/CMakeLists.txt +4 -5
  3. package/android/build.gradle +7 -18
  4. package/android/src/main/java/com/webgpu/WebGPUViewPackage.java +34 -10
  5. package/apple/MetalView.mm +0 -19
  6. package/apple/WebGPUModule.h +1 -9
  7. package/apple/WebGPUModule.mm +0 -3
  8. package/apple/WebGPUView.h +0 -3
  9. package/apple/WebGPUView.mm +0 -2
  10. package/cpp/WGPULogger.h +10 -0
  11. package/cpp/dawn/dawn_proc_table.h +1 -1
  12. package/cpp/dawn/webgpu.h +4855 -0
  13. package/cpp/dawn/webgpu_cpp.h +10168 -0
  14. package/cpp/dawn/wire/client/webgpu.h +354 -0
  15. package/cpp/dawn/wire/client/webgpu_cpp.h +10343 -0
  16. package/cpp/dawn/wire/client/webgpu_cpp_print.h +2715 -0
  17. package/cpp/jsi/RNFJSIConverter.h +17 -59
  18. package/cpp/rnwgpu/RNWebGPUManager.cpp +1 -9
  19. package/cpp/rnwgpu/api/GPU.cpp +51 -26
  20. package/cpp/rnwgpu/api/GPU.h +5 -18
  21. package/cpp/rnwgpu/api/GPUAdapter.cpp +75 -54
  22. package/cpp/rnwgpu/api/GPUAdapter.h +6 -6
  23. package/cpp/rnwgpu/api/GPUAdapterInfo.h +0 -1
  24. package/cpp/rnwgpu/api/GPUBindGroup.h +1 -3
  25. package/cpp/rnwgpu/api/GPUBindGroupLayout.h +1 -3
  26. package/cpp/rnwgpu/api/GPUBuffer.cpp +35 -32
  27. package/cpp/rnwgpu/api/GPUBuffer.h +9 -7
  28. package/cpp/rnwgpu/api/GPUCanvasContext.cpp +5 -1
  29. package/cpp/rnwgpu/api/GPUCanvasContext.h +0 -2
  30. package/cpp/rnwgpu/api/GPUCommandBuffer.h +1 -3
  31. package/cpp/rnwgpu/api/GPUCommandEncoder.h +1 -3
  32. package/cpp/rnwgpu/api/GPUCompilationInfo.h +0 -2
  33. package/cpp/rnwgpu/api/GPUCompilationMessage.h +1 -3
  34. package/cpp/rnwgpu/api/GPUComputePassEncoder.h +1 -3
  35. package/cpp/rnwgpu/api/GPUComputePipeline.h +1 -3
  36. package/cpp/rnwgpu/api/GPUDevice.cpp +183 -128
  37. package/cpp/rnwgpu/api/GPUDevice.h +22 -21
  38. package/cpp/rnwgpu/api/GPUDeviceLostInfo.h +1 -3
  39. package/cpp/rnwgpu/api/GPUExternalTexture.h +1 -3
  40. package/cpp/rnwgpu/api/GPUPipelineLayout.h +1 -3
  41. package/cpp/rnwgpu/api/GPUQuerySet.h +1 -3
  42. package/cpp/rnwgpu/api/GPUQueue.cpp +19 -8
  43. package/cpp/rnwgpu/api/GPUQueue.h +7 -6
  44. package/cpp/rnwgpu/api/GPURenderBundle.h +1 -3
  45. package/cpp/rnwgpu/api/GPURenderBundleEncoder.h +1 -3
  46. package/cpp/rnwgpu/api/GPURenderPassEncoder.h +1 -3
  47. package/cpp/rnwgpu/api/GPURenderPipeline.h +1 -3
  48. package/cpp/rnwgpu/api/GPUSampler.h +1 -3
  49. package/cpp/rnwgpu/api/GPUShaderModule.cpp +42 -28
  50. package/cpp/rnwgpu/api/GPUShaderModule.h +6 -6
  51. package/cpp/rnwgpu/api/GPUSupportedLimits.h +1 -3
  52. package/cpp/rnwgpu/api/GPUTexture.h +1 -3
  53. package/cpp/rnwgpu/api/GPUTextureView.h +1 -3
  54. package/cpp/rnwgpu/api/RNWebGPU.h +1 -7
  55. package/cpp/rnwgpu/async/AsyncDispatcher.h +28 -0
  56. package/cpp/rnwgpu/async/AsyncRunner.cpp +215 -0
  57. package/cpp/rnwgpu/async/AsyncRunner.h +53 -0
  58. package/cpp/rnwgpu/async/AsyncTaskHandle.cpp +181 -0
  59. package/cpp/rnwgpu/async/AsyncTaskHandle.h +55 -0
  60. package/cpp/rnwgpu/async/JSIMicrotaskDispatcher.cpp +23 -0
  61. package/cpp/rnwgpu/async/JSIMicrotaskDispatcher.h +22 -0
  62. package/cpp/webgpu/webgpu.h +5 -4827
  63. package/cpp/webgpu/webgpu_cpp.h +5 -10140
  64. package/cpp/{dawn/native/WebGPUBackend.h → webgpu/webgpu_cpp_print.h} +4 -20
  65. package/lib/commonjs/Canvas.js +6 -66
  66. package/lib/commonjs/Canvas.js.map +1 -1
  67. package/lib/commonjs/hooks.js +6 -42
  68. package/lib/commonjs/hooks.js.map +1 -1
  69. package/lib/module/Canvas.js +7 -67
  70. package/lib/module/Canvas.js.map +1 -1
  71. package/lib/module/hooks.js +5 -40
  72. package/lib/module/hooks.js.map +1 -1
  73. package/lib/typescript/lib/commonjs/hooks.d.ts +1 -5
  74. package/lib/typescript/lib/commonjs/hooks.d.ts.map +1 -1
  75. package/lib/typescript/lib/module/Canvas.d.ts.map +1 -1
  76. package/lib/typescript/lib/module/hooks.d.ts +1 -5
  77. package/lib/typescript/lib/module/hooks.d.ts.map +1 -1
  78. package/lib/typescript/src/Canvas.d.ts +0 -1
  79. package/lib/typescript/src/Canvas.d.ts.map +1 -1
  80. package/lib/typescript/src/hooks.d.ts +2 -7
  81. package/lib/typescript/src/hooks.d.ts.map +1 -1
  82. package/libs/android/arm64-v8a/libwebgpu_dawn.so +0 -0
  83. package/libs/android/armeabi-v7a/libwebgpu_dawn.so +0 -0
  84. package/libs/android/x86/libwebgpu_dawn.so +0 -0
  85. package/libs/android/x86_64/libwebgpu_dawn.so +0 -0
  86. package/libs/apple/libwebgpu_dawn.xcframework/Info.plist +5 -35
  87. package/libs/apple/libwebgpu_dawn.xcframework/ios-arm64/libwebgpu_dawn.a +0 -0
  88. package/libs/apple/libwebgpu_dawn.xcframework/ios-arm64_x86_64-simulator/libwebgpu_dawn.a +0 -0
  89. package/libs/apple/libwebgpu_dawn.xcframework/macos-arm64_x86_64/libwebgpu_dawn.a +0 -0
  90. package/package.json +4 -3
  91. package/react-native-wgpu.podspec +12 -16
  92. package/src/Canvas.tsx +8 -69
  93. package/src/hooks.tsx +14 -48
  94. package/android/cpp/platform/ThreadUtils.cpp +0 -41
  95. package/android/src/oldarch/com/webgpu/NativeWebGPUModuleSpec.java +0 -23
  96. package/android/src/oldarch/com/webgpu/WebGPUViewManagerSpec.java +0 -12
  97. package/apple/WebGPUViewManager.mm +0 -24
  98. package/apple/platform/ThreadUtils.cpp +0 -34
  99. package/cpp/dawn/dawn_proc.h +0 -50
  100. package/cpp/dawn/dawn_thread_dispatch_proc.h +0 -47
  101. package/cpp/dawn/native/D3D11Backend.h +0 -77
  102. package/cpp/dawn/native/D3D12Backend.h +0 -68
  103. package/cpp/dawn/native/D3DBackend.h +0 -56
  104. package/cpp/dawn/native/MetalBackend.h +0 -56
  105. package/cpp/dawn/platform/DawnPlatform.h +0 -167
  106. package/cpp/dawn/platform/dawn_platform_export.h +0 -49
  107. package/cpp/platform/ThreadUtils.h +0 -30
  108. package/cpp/rnwgpu/api/AsyncRunner.h +0 -30
  109. package/cpp/threading/CallInvokerDispatcher.h +0 -37
  110. package/cpp/threading/Dispatcher.cpp +0 -55
  111. package/cpp/threading/Dispatcher.h +0 -93
  112. package/cpp/threading/ThreadPool.cpp +0 -88
  113. package/cpp/threading/ThreadPool.h +0 -53
  114. package/cpp/webgpu/webgpu_glfw.h +0 -88
  115. package/lib/typescript/src/__tests__/Alpha.spec.d.ts +0 -2
  116. package/lib/typescript/src/__tests__/Alpha.spec.d.ts.map +0 -1
  117. package/lib/typescript/src/__tests__/ArrayBuffer.spec.d.ts +0 -2
  118. package/lib/typescript/src/__tests__/ArrayBuffer.spec.d.ts.map +0 -1
  119. package/lib/typescript/src/__tests__/Buffer.spec.d.ts +0 -2
  120. package/lib/typescript/src/__tests__/Buffer.spec.d.ts.map +0 -1
  121. package/lib/typescript/src/__tests__/ComputeShader.spec.d.ts +0 -2
  122. package/lib/typescript/src/__tests__/ComputeShader.spec.d.ts.map +0 -1
  123. package/lib/typescript/src/__tests__/Constants.spec.d.ts +0 -2
  124. package/lib/typescript/src/__tests__/Constants.spec.d.ts.map +0 -1
  125. package/lib/typescript/src/__tests__/Device.spec.d.ts +0 -2
  126. package/lib/typescript/src/__tests__/Device.spec.d.ts.map +0 -1
  127. package/lib/typescript/src/__tests__/ErrorScope.spec.d.ts +0 -2
  128. package/lib/typescript/src/__tests__/ErrorScope.spec.d.ts.map +0 -1
  129. package/lib/typescript/src/__tests__/ExternalTexture.spec.d.ts +0 -2
  130. package/lib/typescript/src/__tests__/ExternalTexture.spec.d.ts.map +0 -1
  131. package/lib/typescript/src/__tests__/GPU.spec.d.ts +0 -2
  132. package/lib/typescript/src/__tests__/GPU.spec.d.ts.map +0 -1
  133. package/lib/typescript/src/__tests__/ImageData.spec.d.ts +0 -2
  134. package/lib/typescript/src/__tests__/ImageData.spec.d.ts.map +0 -1
  135. package/lib/typescript/src/__tests__/Shaders.spec.d.ts +0 -2
  136. package/lib/typescript/src/__tests__/Shaders.spec.d.ts.map +0 -1
  137. package/lib/typescript/src/__tests__/Texture.spec.d.ts +0 -2
  138. package/lib/typescript/src/__tests__/Texture.spec.d.ts.map +0 -1
  139. package/lib/typescript/src/__tests__/components/Wireframe/Shaders.d.ts +0 -3
  140. package/lib/typescript/src/__tests__/components/Wireframe/Shaders.d.ts.map +0 -1
  141. package/lib/typescript/src/__tests__/components/Wireframe/models.d.ts +0 -29
  142. package/lib/typescript/src/__tests__/components/Wireframe/models.d.ts.map +0 -1
  143. package/lib/typescript/src/__tests__/components/Wireframe/utils.d.ts +0 -5
  144. package/lib/typescript/src/__tests__/components/Wireframe/utils.d.ts.map +0 -1
  145. package/lib/typescript/src/__tests__/components/cube.d.ts +0 -7
  146. package/lib/typescript/src/__tests__/components/cube.d.ts.map +0 -1
  147. package/lib/typescript/src/__tests__/components/meshes/mesh.d.ts +0 -22
  148. package/lib/typescript/src/__tests__/components/meshes/mesh.d.ts.map +0 -1
  149. package/lib/typescript/src/__tests__/components/meshes/sphere.d.ts +0 -12
  150. package/lib/typescript/src/__tests__/components/meshes/sphere.d.ts.map +0 -1
  151. package/lib/typescript/src/__tests__/components/meshes/stanfordDragon.d.ts +0 -7
  152. package/lib/typescript/src/__tests__/components/meshes/stanfordDragon.d.ts.map +0 -1
  153. package/lib/typescript/src/__tests__/components/meshes/stanfordDragonData.d.ts +0 -6
  154. package/lib/typescript/src/__tests__/components/meshes/stanfordDragonData.d.ts.map +0 -1
  155. package/lib/typescript/src/__tests__/components/meshes/teapot.d.ts +0 -6
  156. package/lib/typescript/src/__tests__/components/meshes/teapot.d.ts.map +0 -1
  157. package/lib/typescript/src/__tests__/components/meshes/utils.d.ts +0 -10
  158. package/lib/typescript/src/__tests__/components/meshes/utils.d.ts.map +0 -1
  159. package/lib/typescript/src/__tests__/components/triangle.d.ts +0 -3
  160. package/lib/typescript/src/__tests__/components/triangle.d.ts.map +0 -1
  161. package/lib/typescript/src/__tests__/config.d.ts +0 -3
  162. package/lib/typescript/src/__tests__/config.d.ts.map +0 -1
  163. package/lib/typescript/src/__tests__/demos/ABuffer.spec.d.ts +0 -2
  164. package/lib/typescript/src/__tests__/demos/ABuffer.spec.d.ts.map +0 -1
  165. package/lib/typescript/src/__tests__/demos/Blur.spec.d.ts +0 -2
  166. package/lib/typescript/src/__tests__/demos/Blur.spec.d.ts.map +0 -1
  167. package/lib/typescript/src/__tests__/demos/Cube.spec.d.ts +0 -2
  168. package/lib/typescript/src/__tests__/demos/Cube.spec.d.ts.map +0 -1
  169. package/lib/typescript/src/__tests__/demos/FractalCube.spec.d.ts +0 -2
  170. package/lib/typescript/src/__tests__/demos/FractalCube.spec.d.ts.map +0 -1
  171. package/lib/typescript/src/__tests__/demos/OcclusionQuery.spec.d.ts +0 -2
  172. package/lib/typescript/src/__tests__/demos/OcclusionQuery.spec.d.ts.map +0 -1
  173. package/lib/typescript/src/__tests__/demos/RenderBundles.spec.d.ts +0 -2
  174. package/lib/typescript/src/__tests__/demos/RenderBundles.spec.d.ts.map +0 -1
  175. package/lib/typescript/src/__tests__/demos/Triangle.spec.d.ts +0 -2
  176. package/lib/typescript/src/__tests__/demos/Triangle.spec.d.ts.map +0 -1
  177. package/lib/typescript/src/__tests__/demos/Wireframe.spec.d.ts +0 -2
  178. package/lib/typescript/src/__tests__/demos/Wireframe.spec.d.ts.map +0 -1
  179. package/lib/typescript/src/__tests__/globalSetup.d.ts +0 -3
  180. package/lib/typescript/src/__tests__/globalSetup.d.ts.map +0 -1
  181. package/lib/typescript/src/__tests__/globalTeardown.d.ts +0 -3
  182. package/lib/typescript/src/__tests__/globalTeardown.d.ts.map +0 -1
  183. package/lib/typescript/src/__tests__/setup.d.ts +0 -63
  184. package/lib/typescript/src/__tests__/setup.d.ts.map +0 -1
  185. package/libs/apple/arm64_iphoneos/libwebgpu_dawn.a +0 -0
  186. package/libs/apple/arm64_iphonesimulator/libwebgpu_dawn.a +0 -0
  187. package/libs/apple/arm64_xros/libwebgpu_dawn.a +0 -0
  188. package/libs/apple/arm64_xrsimulator/libwebgpu_dawn.a +0 -0
  189. package/libs/apple/iphonesimulator/libwebgpu_dawn.a +0 -0
  190. package/libs/apple/libwebgpu_dawn.xcframework/xros-arm64/libwebgpu_dawn.a +0 -0
  191. package/libs/apple/libwebgpu_dawn.xcframework/xros-arm64-simulator/libwebgpu_dawn.a +0 -0
  192. package/libs/apple/universal_macosx/libwebgpu_dawn.a +0 -0
  193. package/libs/apple/x86_64_iphonesimulator/libwebgpu_dawn.a +0 -0
  194. package/libs/dawn.json +0 -4670
  195. package/src/__tests__/Alpha.spec.ts +0 -28
  196. package/src/__tests__/ArrayBuffer.spec.ts +0 -76
  197. package/src/__tests__/Buffer.spec.ts +0 -357
  198. package/src/__tests__/ComputeShader.spec.ts +0 -375
  199. package/src/__tests__/Constants.spec.ts +0 -89
  200. package/src/__tests__/Device.spec.ts +0 -84
  201. package/src/__tests__/ErrorScope.spec.ts +0 -92
  202. package/src/__tests__/ExternalTexture.spec.ts +0 -284
  203. package/src/__tests__/GPU.spec.ts +0 -272
  204. package/src/__tests__/ImageData.spec.ts +0 -26
  205. package/src/__tests__/Shaders.spec.ts +0 -232
  206. package/src/__tests__/Texture.spec.ts +0 -197
  207. package/src/__tests__/assets/Di-3d.png +0 -0
  208. package/src/__tests__/components/Wireframe/Shaders.ts +0 -138
  209. package/src/__tests__/components/Wireframe/models.ts +0 -113
  210. package/src/__tests__/components/Wireframe/utils.ts +0 -22
  211. package/src/__tests__/components/cube.ts +0 -51
  212. package/src/__tests__/components/meshes/mesh.ts +0 -96
  213. package/src/__tests__/components/meshes/sphere.ts +0 -103
  214. package/src/__tests__/components/meshes/stanfordDragon.ts +0 -44
  215. package/src/__tests__/components/meshes/stanfordDragonData.ts +0 -5
  216. package/src/__tests__/components/meshes/teapot.ts +0 -13
  217. package/src/__tests__/components/meshes/utils.ts +0 -235
  218. package/src/__tests__/components/triangle.ts +0 -17
  219. package/src/__tests__/config.ts +0 -2
  220. package/src/__tests__/demos/ABuffer.spec.ts +0 -890
  221. package/src/__tests__/demos/Blur.spec.ts +0 -398
  222. package/src/__tests__/demos/Cube.spec.ts +0 -929
  223. package/src/__tests__/demos/FractalCube.spec.ts +0 -240
  224. package/src/__tests__/demos/OcclusionQuery.spec.ts +0 -376
  225. package/src/__tests__/demos/RenderBundles.spec.ts +0 -580
  226. package/src/__tests__/demos/Triangle.spec.ts +0 -266
  227. package/src/__tests__/demos/Wireframe.spec.ts +0 -188
  228. package/src/__tests__/globalSetup.ts +0 -45
  229. package/src/__tests__/globalTeardown.ts +0 -11
  230. package/src/__tests__/setup.ts +0 -423
  231. package/src/__tests__/snapshots/abuffer.png +0 -0
  232. package/src/__tests__/snapshots/asteroid.png +0 -0
  233. package/src/__tests__/snapshots/blur.png +0 -0
  234. package/src/__tests__/snapshots/buffer.png +0 -0
  235. package/src/__tests__/snapshots/constant-triangle.png +0 -0
  236. package/src/__tests__/snapshots/cube.png +0 -0
  237. package/src/__tests__/snapshots/f.png +0 -0
  238. package/src/__tests__/snapshots/f2.png +0 -0
  239. package/src/__tests__/snapshots/fractal-cubes.png +0 -0
  240. package/src/__tests__/snapshots/instanced-cubes.png +0 -0
  241. package/src/__tests__/snapshots/occlusion-query.png +0 -0
  242. package/src/__tests__/snapshots/ref.png +0 -0
  243. package/src/__tests__/snapshots/semi-opaque-cyan.png +0 -0
  244. package/src/__tests__/snapshots/texture.png +0 -0
  245. package/src/__tests__/snapshots/textured-cube.png +0 -0
  246. package/src/__tests__/snapshots/triangle-msaa.png +0 -0
  247. package/src/__tests__/snapshots/triangle.png +0 -0
  248. package/src/__tests__/snapshots/two-cube.png +0 -0
@@ -1,284 +0,0 @@
1
- import { checkImage, client, encodeImage } from "./setup";
2
-
3
- describe("External Textures", () => {
4
- it("Simple (1)", async () => {
5
- const result = await client.eval(
6
- ({ gpu, device, ctx, canvas, urls: { fTexture } }) => {
7
- const module = device.createShaderModule({
8
- label: "our hardcoded textured quad shaders",
9
- code: /* wgsl */ `
10
- struct OurVertexShaderOutput {
11
- @builtin(position) position: vec4f,
12
- @location(0) texcoord: vec2f,
13
- };
14
-
15
- @vertex fn vs(
16
- @builtin(vertex_index) vertexIndex : u32
17
- ) -> OurVertexShaderOutput {
18
- let pos = array(
19
- // 1st triangle
20
- vec2f( 0.0, 0.0), // center
21
- vec2f( 1.0, 0.0), // right, center
22
- vec2f( 0.0, 1.0), // center, top
23
-
24
- // 2st triangle
25
- vec2f( 0.0, 1.0), // center, top
26
- vec2f( 1.0, 0.0), // right, center
27
- vec2f( 1.0, 1.0), // right, top
28
- );
29
-
30
- var vsOutput: OurVertexShaderOutput;
31
- let xy = pos[vertexIndex];
32
- vsOutput.position = vec4f(xy, 0.0, 1.0);
33
- vsOutput.texcoord = xy;
34
- return vsOutput;
35
- }
36
-
37
- @group(0) @binding(0) var ourSampler: sampler;
38
- @group(0) @binding(1) var ourTexture: texture_2d<f32>;
39
-
40
- @fragment fn fs(fsInput: OurVertexShaderOutput) -> @location(0) vec4f {
41
- return textureSample(ourTexture, ourSampler, fsInput.texcoord);
42
- }
43
- `,
44
- });
45
-
46
- const presentationFormat = gpu.getPreferredCanvasFormat();
47
- const pipeline = device.createRenderPipeline({
48
- label: "hardcoded textured quad pipeline",
49
- layout: "auto",
50
- vertex: {
51
- module,
52
- },
53
- fragment: {
54
- module,
55
- targets: [{ format: presentationFormat }],
56
- },
57
- });
58
-
59
- return fetch(fTexture).then((res) => {
60
- return res.blob().then((blob) => {
61
- return createImageBitmap(blob, {
62
- colorSpaceConversion: "none",
63
- }).then((source) => {
64
- const texture = device.createTexture({
65
- label: fTexture,
66
- format: "rgba8unorm",
67
- size: [source.width, source.height],
68
- usage:
69
- GPUTextureUsage.TEXTURE_BINDING |
70
- GPUTextureUsage.COPY_DST |
71
- GPUTextureUsage.RENDER_ATTACHMENT,
72
- });
73
- device.queue.copyExternalImageToTexture(
74
- { source, flipY: true },
75
- { texture },
76
- { width: source.width, height: source.height },
77
- );
78
- const bindGroups: GPUBindGroup[] = [];
79
- for (let i = 0; i < 8; ++i) {
80
- const sampler = device.createSampler({
81
- addressModeU: i & 1 ? "repeat" : "clamp-to-edge",
82
- addressModeV: i & 2 ? "repeat" : "clamp-to-edge",
83
- magFilter: i & 4 ? "linear" : "nearest",
84
- });
85
-
86
- const bindGroup = device.createBindGroup({
87
- layout: pipeline.getBindGroupLayout(0),
88
- entries: [
89
- { binding: 0, resource: sampler },
90
- { binding: 1, resource: texture.createView() },
91
- ],
92
- });
93
- bindGroups.push(bindGroup);
94
- }
95
-
96
- const renderPassDescriptor: GPURenderPassDescriptor = {
97
- label: "our basic canvas renderPass",
98
- colorAttachments: [
99
- {
100
- view: ctx.getCurrentTexture().createView(), // Assigned later
101
- clearValue: [0.3, 0.3, 0.3, 1],
102
- loadOp: "clear",
103
- storeOp: "store",
104
- },
105
- ],
106
- };
107
-
108
- const settings = {
109
- addressModeU: "repeat",
110
- addressModeV: "repeat",
111
- magFilter: "linear",
112
- };
113
-
114
- function render() {
115
- const ndx =
116
- (settings.addressModeU === "repeat" ? 1 : 0) +
117
- (settings.addressModeV === "repeat" ? 2 : 0) +
118
- (settings.magFilter === "linear" ? 4 : 0);
119
- const bindGroup = bindGroups[ndx];
120
-
121
- const encoder = device.createCommandEncoder({
122
- label: "render quad encoder",
123
- });
124
- const pass = encoder.beginRenderPass(renderPassDescriptor);
125
- pass.setPipeline(pipeline);
126
- pass.setBindGroup(0, bindGroup);
127
- pass.draw(6); // call our vertex shader 6 times
128
- pass.end();
129
-
130
- const commandBuffer = encoder.finish();
131
- device.queue.submit([commandBuffer]);
132
- }
133
- render();
134
- return canvas.getImageData();
135
- });
136
- });
137
- });
138
- },
139
- {},
140
- );
141
- const image = encodeImage(result);
142
- checkImage(image, "snapshots/f.png");
143
- });
144
- it("Simple (2)", async () => {
145
- const result = await client.eval(
146
- ({ gpu, device, ctx, canvas, urls: { fTexture } }) => {
147
- const module = device.createShaderModule({
148
- label: "our hardcoded textured quad shaders",
149
- code: /* wgsl */ `
150
- struct OurVertexShaderOutput {
151
- @builtin(position) position: vec4f,
152
- @location(0) texcoord: vec2f,
153
- };
154
-
155
- @vertex fn vs(
156
- @builtin(vertex_index) vertexIndex : u32
157
- ) -> OurVertexShaderOutput {
158
- let pos = array(
159
- // 1st triangle
160
- vec2f( 0.0, 0.0), // center
161
- vec2f( 1.0, 0.0), // right, center
162
- vec2f( 0.0, 1.0), // center, top
163
-
164
- // 2st triangle
165
- vec2f( 0.0, 1.0), // center, top
166
- vec2f( 1.0, 0.0), // right, center
167
- vec2f( 1.0, 1.0), // right, top
168
- );
169
-
170
- var vsOutput: OurVertexShaderOutput;
171
- let xy = pos[vertexIndex];
172
- vsOutput.position = vec4f(xy, 0.0, 1.0);
173
- vsOutput.texcoord = xy;
174
- return vsOutput;
175
- }
176
-
177
- @group(0) @binding(0) var ourSampler: sampler;
178
- @group(0) @binding(1) var ourTexture: texture_2d<f32>;
179
-
180
- @fragment fn fs(fsInput: OurVertexShaderOutput) -> @location(0) vec4f {
181
- return textureSample(ourTexture, ourSampler, fsInput.texcoord);
182
- }
183
- `,
184
- });
185
-
186
- const presentationFormat = gpu.getPreferredCanvasFormat();
187
- const pipeline = device.createRenderPipeline({
188
- label: "hardcoded textured quad pipeline",
189
- layout: "auto",
190
- vertex: {
191
- module,
192
- },
193
- fragment: {
194
- module,
195
- targets: [{ format: presentationFormat }],
196
- },
197
- });
198
-
199
- return fetch(fTexture).then((res) => {
200
- return res.blob().then((blob) => {
201
- return createImageBitmap(blob, {
202
- colorSpaceConversion: "none",
203
- }).then((source) => {
204
- const texture = device.createTexture({
205
- label: fTexture,
206
- format: "rgba8unorm",
207
- size: [source.width, source.height],
208
- usage:
209
- GPUTextureUsage.TEXTURE_BINDING |
210
- GPUTextureUsage.COPY_DST |
211
- GPUTextureUsage.RENDER_ATTACHMENT,
212
- });
213
- device.queue.copyExternalImageToTexture(
214
- { source },
215
- { texture },
216
- { width: source.width, height: source.height },
217
- );
218
- const bindGroups: GPUBindGroup[] = [];
219
- for (let i = 0; i < 8; ++i) {
220
- const sampler = device.createSampler({
221
- addressModeU: i & 1 ? "repeat" : "clamp-to-edge",
222
- addressModeV: i & 2 ? "repeat" : "clamp-to-edge",
223
- magFilter: i & 4 ? "linear" : "nearest",
224
- });
225
-
226
- const bindGroup = device.createBindGroup({
227
- layout: pipeline.getBindGroupLayout(0),
228
- entries: [
229
- { binding: 0, resource: sampler },
230
- { binding: 1, resource: texture.createView() },
231
- ],
232
- });
233
- bindGroups.push(bindGroup);
234
- }
235
-
236
- const renderPassDescriptor: GPURenderPassDescriptor = {
237
- label: "our basic canvas renderPass",
238
- colorAttachments: [
239
- {
240
- view: ctx.getCurrentTexture().createView(), // Assigned later
241
- clearValue: [0.3, 0.3, 0.3, 1],
242
- loadOp: "clear",
243
- storeOp: "store",
244
- },
245
- ],
246
- };
247
-
248
- const settings = {
249
- addressModeU: "repeat",
250
- addressModeV: "repeat",
251
- magFilter: "linear",
252
- };
253
-
254
- function render() {
255
- const ndx =
256
- (settings.addressModeU === "repeat" ? 1 : 0) +
257
- (settings.addressModeV === "repeat" ? 2 : 0) +
258
- (settings.magFilter === "linear" ? 4 : 0);
259
- const bindGroup = bindGroups[ndx];
260
-
261
- const encoder = device.createCommandEncoder({
262
- label: "render quad encoder",
263
- });
264
- const pass = encoder.beginRenderPass(renderPassDescriptor);
265
- pass.setPipeline(pipeline);
266
- pass.setBindGroup(0, bindGroup);
267
- pass.draw(6); // call our vertex shader 6 times
268
- pass.end();
269
-
270
- const commandBuffer = encoder.finish();
271
- device.queue.submit([commandBuffer]);
272
- }
273
- render();
274
- return canvas.getImageData();
275
- });
276
- });
277
- });
278
- },
279
- {},
280
- );
281
- const image = encodeImage(result);
282
- checkImage(image, "snapshots/f2.png");
283
- });
284
- });
@@ -1,272 +0,0 @@
1
- import { client } from "./setup";
2
-
3
- describe("Adapter", () => {
4
- it("executes a simple function", async () => {
5
- const result = await client.eval(() => 1 + 1);
6
- expect(result).toBe(2);
7
- });
8
- it("executes a simple function from context", async () => {
9
- const result = await client.eval(({ a, b, c }) => a + b + c, {
10
- a: 1,
11
- b: 2,
12
- c: 3,
13
- });
14
- expect(result).toBe(6);
15
- });
16
- it("execute a simple async function (1)", async () => {
17
- const result = await client.eval(
18
- () =>
19
- new Promise<number>((resolve) => setTimeout(() => resolve(1 + 1), 100)),
20
- );
21
- expect(result).toBe(2);
22
- });
23
- it("requestAdapter (1)", async () => {
24
- const result = await client.eval(({ gpu }) => {
25
- return gpu.requestAdapter().then((adapter) => adapter != null);
26
- });
27
- expect(result).toBe(true);
28
- });
29
- it("requestAdapter (2)", async () => {
30
- const result = await client.eval(({ gpu }) => {
31
- return gpu.requestAdapter(undefined).then((adapter) => adapter != null);
32
- });
33
- expect(result).toBe(true);
34
- });
35
- it("requestAdapter (3)", async () => {
36
- const result = await client.eval(({ gpu }) => {
37
- return gpu.requestAdapter(undefined).then((adapter) => adapter != null);
38
- });
39
- expect(result).toBe(true);
40
- });
41
- it("requestAdapter (4)", async () => {
42
- const result = await client.eval(({ gpu }) => {
43
- return gpu.requestAdapter({}).then((adapter) => adapter != null);
44
- });
45
- expect(result).toBe(true);
46
- });
47
- it("requestAdapter (5)", async () => {
48
- const result = await client.eval(({ gpu }) => {
49
- return gpu
50
- .requestAdapter({ powerPreference: "low-power" })
51
- .then((adapter) => adapter != null);
52
- });
53
- expect(result).toBe(true);
54
- });
55
- it("requestAdapter (6)", async () => {
56
- const result = await client.eval(({ gpu }) => {
57
- return gpu.requestAdapter().then((adapter) => {
58
- if (!adapter) {
59
- return null;
60
- }
61
- return {
62
- vendor: adapter.info.vendor,
63
- architecture: adapter.info.architecture,
64
- device: adapter.info.device,
65
- description: adapter.info.description,
66
- };
67
- });
68
- });
69
- expect(result).toBeDefined();
70
- expect(result!.vendor).toBeDefined();
71
- expect(result!.architecture).toBeDefined();
72
- expect(result!.device).toBeDefined();
73
- expect(result!.description).toBeDefined();
74
- });
75
- it("isFallback", async () => {
76
- const result = await client.eval(({ gpu }) => {
77
- return gpu
78
- .requestAdapter()
79
- .then((adapter) => adapter && adapter.info.isFallbackAdapter);
80
- });
81
- expect(result).toBe(false);
82
- });
83
- it("features", async () => {
84
- const result = await client.eval(({ gpu }) => {
85
- return gpu
86
- .requestAdapter()
87
- .then((adapter) => Array.from(adapter!.features));
88
- });
89
- expect(result.includes("depth-clip-control")).toBe(true);
90
- expect(result.includes("rg11b10ufloat-renderable")).toBe(true);
91
- expect(result.includes("texture-compression-etc2")).toBe(true);
92
- });
93
- it("requiredLimits", async () => {
94
- const result = await client.eval(({ gpu }) => {
95
- return gpu.requestAdapter().then((adapter) =>
96
- adapter!
97
- .requestDevice({
98
- requiredLimits: {
99
- maxBufferSize: 1024 * 1024 * 4,
100
- },
101
- })
102
- .then((device) => !!device),
103
- );
104
- });
105
- expect(result).toBe(true);
106
- });
107
- it("request device with timestamp queries", async () => {
108
- const result = await client.eval(({ gpu }) => {
109
- return gpu.requestAdapter().then((adapter) => {
110
- if (adapter!.features.has("timestamp-query")) {
111
- return adapter!
112
- .requestDevice({
113
- requiredFeatures: ["timestamp-query"],
114
- })
115
- .then((device) => device.features.has("timestamp-query"));
116
- }
117
- return true;
118
- });
119
- });
120
- expect(result).toBe(true);
121
- });
122
- it("request device faulty input", async () => {
123
- const result = await client.eval(({ gpu }) => {
124
- return gpu.requestAdapter().then((adapter) =>
125
- adapter!
126
- .requestDevice({
127
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
128
- // @ts-expect-error
129
- requiredFeatures: [["bgra8unorm-storage"]],
130
- requiredLimits: {
131
- maxComputeWorkgroupStorageSize: 16352,
132
- maxComputeWorkgroupsPerDimension: 65535,
133
- maxStorageBufferBindingSize: 268435456,
134
- maxBufferSize: 268435456,
135
- maxComputeWorkgroupSizeX: 512,
136
- maxComputeInvocationsPerWorkgroup: 512,
137
- },
138
- })
139
- .then((device) => !!device),
140
- );
141
- });
142
- expect(result).toBe(true);
143
- });
144
- // it("request device with unknown feature", async () => {
145
- // const result = await client.eval(({ adapter }) => {
146
- // return adapter
147
- // .requestDevice({
148
- // // eslint-disable-next-line @typescript-eslint/ban-ts-comment
149
- // // @ts-expect-error
150
- // requiredFeatures: ["foobar"],
151
- // })
152
- // .catch(() => true);
153
- // });
154
- // expect(result).toBe(true);
155
- // });
156
- it("limits", async () => {
157
- const result = await client.eval(({ gpu }) => {
158
- return gpu.requestAdapter().then((adapter) => {
159
- const {
160
- maxTextureDimension1D,
161
- maxTextureDimension2D,
162
- maxTextureDimension3D,
163
- maxTextureArrayLayers,
164
- maxBindGroups,
165
- maxBindGroupsPlusVertexBuffers,
166
- maxBindingsPerBindGroup,
167
- maxDynamicUniformBuffersPerPipelineLayout,
168
- maxDynamicStorageBuffersPerPipelineLayout,
169
- maxSampledTexturesPerShaderStage,
170
- maxSamplersPerShaderStage,
171
- maxStorageBuffersPerShaderStage,
172
- maxStorageTexturesPerShaderStage,
173
- maxUniformBuffersPerShaderStage,
174
- maxUniformBufferBindingSize,
175
- maxStorageBufferBindingSize,
176
- minUniformBufferOffsetAlignment,
177
- minStorageBufferOffsetAlignment,
178
- maxVertexBuffers,
179
- maxBufferSize,
180
- maxVertexAttributes,
181
- maxVertexBufferArrayStride,
182
- maxInterStageShaderVariables,
183
- maxColorAttachments,
184
- maxColorAttachmentBytesPerSample,
185
- maxComputeWorkgroupStorageSize,
186
- maxComputeInvocationsPerWorkgroup,
187
- maxComputeWorkgroupSizeX,
188
- maxComputeWorkgroupSizeY,
189
- maxComputeWorkgroupSizeZ,
190
- maxComputeWorkgroupsPerDimension,
191
- } = adapter!.limits;
192
- return {
193
- __brand: adapter!.limits.__brand,
194
- maxTextureDimension1D,
195
- maxTextureDimension2D,
196
- maxTextureDimension3D,
197
- maxTextureArrayLayers,
198
- maxBindGroups,
199
- maxBindGroupsPlusVertexBuffers,
200
- maxBindingsPerBindGroup,
201
- maxDynamicUniformBuffersPerPipelineLayout,
202
- maxDynamicStorageBuffersPerPipelineLayout,
203
- maxSampledTexturesPerShaderStage,
204
- maxSamplersPerShaderStage,
205
- maxStorageBuffersPerShaderStage,
206
- maxStorageTexturesPerShaderStage,
207
- maxUniformBuffersPerShaderStage,
208
- maxUniformBufferBindingSize,
209
- maxStorageBufferBindingSize,
210
- minUniformBufferOffsetAlignment,
211
- minStorageBufferOffsetAlignment,
212
- maxVertexBuffers,
213
- maxBufferSize,
214
- maxVertexAttributes,
215
- maxVertexBufferArrayStride,
216
- maxInterStageShaderVariables,
217
- maxColorAttachments,
218
- maxColorAttachmentBytesPerSample,
219
- maxComputeWorkgroupStorageSize,
220
- maxComputeInvocationsPerWorkgroup,
221
- maxComputeWorkgroupSizeX,
222
- maxComputeWorkgroupSizeY,
223
- maxComputeWorkgroupSizeZ,
224
- maxComputeWorkgroupsPerDimension,
225
- };
226
- });
227
- });
228
- if (result.__brand) {
229
- expect(result.__brand).toBe("GPUSupportedLimits");
230
- }
231
- expect(result.maxBindGroups).toBeGreaterThan(0);
232
- expect(result.maxBindGroupsPlusVertexBuffers).toBeGreaterThan(
233
- result.maxBindGroups,
234
- );
235
- expect(result.maxBindingsPerBindGroup).toBeGreaterThan(0);
236
- expect(result.maxBufferSize).toBeGreaterThan(0);
237
- expect(result.maxColorAttachmentBytesPerSample).toBeGreaterThan(0);
238
- expect(result.maxColorAttachments).toBeGreaterThan(0);
239
- expect(result.maxComputeInvocationsPerWorkgroup).toBeGreaterThan(0);
240
- expect(result.maxComputeWorkgroupSizeX).toBeGreaterThan(0);
241
- expect(result.maxComputeWorkgroupSizeY).toBeGreaterThan(0);
242
- expect(result.maxComputeWorkgroupSizeZ).toBeGreaterThan(0);
243
- expect(result.maxComputeWorkgroupStorageSize).toBeGreaterThan(0);
244
- expect(result.maxComputeWorkgroupsPerDimension).toBeGreaterThan(0);
245
-
246
- // For alignment values, check if they're powers of 2
247
- expect(Math.log2(result.minStorageBufferOffsetAlignment) % 1).toBe(0);
248
- expect(Math.log2(result.minUniformBufferOffsetAlignment) % 1).toBe(0);
249
-
250
- // For maximum dimensions, you might want to set a reasonable lower bound
251
- expect(result.maxTextureDimension1D).toBeGreaterThanOrEqual(2048);
252
- expect(result.maxTextureDimension2D).toBeGreaterThanOrEqual(2048);
253
- expect(result.maxTextureDimension3D).toBeGreaterThanOrEqual(256);
254
- });
255
- it("getPreferredCanvasFormat", async () => {
256
- const result = await client.eval(({ gpu }) => {
257
- return gpu.getPreferredCanvasFormat();
258
- });
259
- expect(result).toBe(client.OS === "android" ? "rgba8unorm" : "bgra8unorm");
260
- });
261
- it("wgslLanguageFeatures", async () => {
262
- const result = await client.eval(({ gpu }) => {
263
- return Array.from(gpu.wgslLanguageFeatures);
264
- });
265
- expect(result.includes("readonly_and_readwrite_storage_textures")).toBe(
266
- true,
267
- );
268
- expect(result.includes("packed_4x8_integer_dot_product")).toBe(true);
269
- expect(result.includes("unrestricted_pointer_parameters")).toBe(true);
270
- expect(result.includes("pointer_composite_access")).toBe(true);
271
- });
272
- });
@@ -1,26 +0,0 @@
1
- import path from "path";
2
-
3
- import { checkImage, client, encodeImage, decodeImage } from "./setup";
4
-
5
- describe("Image Bitmap", () => {
6
- it("createImageBitmap (1)", async () => {
7
- const bitmap = await decodeImage(
8
- path.join(__dirname, "./assets/Di-3d.png"),
9
- );
10
- const image = encodeImage(bitmap);
11
- checkImage(image, "snapshots/ref.png");
12
- });
13
- it("createImageBitmap (2)", async () => {
14
- const bitmap = await decodeImage(
15
- path.join(__dirname, "./assets/Di-3d.png"),
16
- );
17
- const result = await client.eval(
18
- ({ bitmap: bmp }) => {
19
- return bmp;
20
- },
21
- { bitmap },
22
- );
23
- const image = encodeImage(result);
24
- checkImage(image, "snapshots/ref.png");
25
- });
26
- });