-
Notifications
You must be signed in to change notification settings - Fork 60
Expand file tree
/
Copy pathCanvasAPI.tsx
More file actions
101 lines (90 loc) · 3.01 KB
/
CanvasAPI.tsx
File metadata and controls
101 lines (90 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { Button, View } from "react-native";
import type { CanvasRef } from "react-native-webgpu";
import { Canvas } from "react-native-webgpu";
import { useRef } from "react";
import { redFragWGSL, triangleVertWGSL } from "../Triangle/triangle";
export const CanvasAPI = () => {
const ref = useRef<CanvasRef>(null);
return (
<View style={{ flex: 1 }}>
<Button
onPress={() =>
(async () => {
const context = ref.current?.getContext("webgpu");
if (!context) {
throw new Error("No context");
}
const adapter = await navigator.gpu.requestAdapter();
if (!adapter) {
throw new Error("No adapter");
}
const device = await adapter.requestDevice();
const presentationFormat = navigator.gpu.getPreferredCanvasFormat();
const { canvas } = context;
if (!context) {
throw new Error("No context");
}
context.configure({
device,
format: presentationFormat,
alphaMode: "premultiplied",
});
const sampleCount = 4;
const pipeline = device.createRenderPipeline({
layout: "auto",
vertex: {
module: device.createShaderModule({
code: triangleVertWGSL,
}),
},
fragment: {
module: device.createShaderModule({
code: redFragWGSL,
}),
targets: [
{
format: presentationFormat,
},
],
},
primitive: {
topology: "triangle-list",
},
multisample: {
count: sampleCount,
},
});
const texture = device.createTexture({
size: [canvas.width, canvas.height],
sampleCount,
format: presentationFormat,
usage: GPUTextureUsage.RENDER_ATTACHMENT,
});
const view = texture.createView();
const commandEncoder = device.createCommandEncoder();
const renderPassDescriptor: GPURenderPassDescriptor = {
colorAttachments: [
{
view,
resolveTarget: context.getCurrentTexture().createView(),
clearValue: [0, 0, 0, 1],
loadOp: "clear",
storeOp: "discard",
},
],
};
const passEncoder =
commandEncoder.beginRenderPass(renderPassDescriptor);
passEncoder.setPipeline(pipeline);
passEncoder.draw(3);
passEncoder.end();
device.queue.submit([commandEncoder.finish()]);
context.present();
})()
}
title="check surface"
/>
<Canvas style={{ flex: 1 }} ref={ref} />
</View>
);
};