Spaces:
Running
Running
Revert "cury"
Browse filesThis reverts commit d48f6076bf3429984247d4c9c711751d6172186a.
- index.html +47 -13
index.html
CHANGED
@@ -18,25 +18,51 @@
|
|
18 |
const canvas = document.querySelector('canvas');
|
19 |
const context = canvas.getContext('webgpu');
|
20 |
const presentationFormat = navigator.gpu.getPreferredCanvasFormat();
|
21 |
-
let device
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
async function main() {
|
24 |
const adapter = await navigator.gpu?.requestAdapter();
|
25 |
device = await adapter?.requestDevice();
|
26 |
-
if (!device)
|
|
|
|
|
|
|
27 |
|
28 |
-
context.configure({
|
|
|
|
|
|
|
29 |
|
30 |
const shaderCode = await fetchShaderCode('shaders.wgsl');
|
31 |
-
const module = device.createShaderModule({
|
|
|
|
|
|
|
32 |
|
33 |
const glyphCanvas = generateGlyphTextureAtlas(CANVAS, CTX, CONFIG);
|
34 |
-
document.body.appendChild(glyphCanvas)
|
|
|
35 |
|
36 |
const vertexSize = CONFIG.floatsPerVertex * 4;
|
37 |
const vertexBufferSize = CONFIG.maxGlyphs * CONFIG.vertsPerGlyph * vertexSize;
|
38 |
-
vertexBuffer = device.createBuffer({
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
40 |
|
41 |
const indices = Array.from({ length: CONFIG.maxGlyphs * 6 }, (_, i) => {
|
42 |
const ndx = Math.floor(i / 6) * 4;
|
@@ -46,7 +72,7 @@
|
|
46 |
|
47 |
const { vertexData, numGlyphs, width, height } = generateGlyphVerticesForText('Hello\nworld!\nText in\nWebGPU!', COLORS, glyphCanvas);
|
48 |
device.queue.writeBuffer(vertexBuffer, 0, vertexData);
|
49 |
-
|
50 |
pipeline = device.createRenderPipeline({
|
51 |
label: 'textured quad pipeline',
|
52 |
layout: 'auto',
|
@@ -77,9 +103,17 @@
|
|
77 |
},
|
78 |
});
|
79 |
|
80 |
-
texture = createTextureFromSource(device, glyphCanvas);
|
81 |
-
sampler = device.createSampler({
|
82 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
83 |
|
84 |
const uniformValues = new Float32Array(CONFIG.uniformBufferSize / 4);
|
85 |
const matrix = uniformValues.subarray(0, 16);
|
@@ -158,7 +192,7 @@
|
|
158 |
return { vertexData, numGlyphs: offset / CONFIG.floatsPerVertex, width, height: y1 };
|
159 |
}
|
160 |
|
161 |
-
function createTextureFromSource(device, source) {
|
162 |
const texture = device.createTexture({
|
163 |
format: 'rgba8unorm',
|
164 |
size: [source.width, source.height],
|
@@ -166,7 +200,7 @@
|
|
166 |
});
|
167 |
|
168 |
device.queue.copyExternalImageToTexture(
|
169 |
-
{ source, flipY:
|
170 |
{ texture, premultipliedAlpha: true },
|
171 |
{ width: source.width, height: source.height }
|
172 |
);
|
|
|
18 |
const canvas = document.querySelector('canvas');
|
19 |
const context = canvas.getContext('webgpu');
|
20 |
const presentationFormat = navigator.gpu.getPreferredCanvasFormat();
|
21 |
+
let device;
|
22 |
+
let pipeline;
|
23 |
+
let vertexBuffer;
|
24 |
+
let indexBuffer;
|
25 |
+
let uniformBuffer;
|
26 |
+
let texture;
|
27 |
+
let sampler;
|
28 |
+
let bindGroup;
|
29 |
|
30 |
async function main() {
|
31 |
const adapter = await navigator.gpu?.requestAdapter();
|
32 |
device = await adapter?.requestDevice();
|
33 |
+
if (!device) {
|
34 |
+
alert('need a browser that supports WebGPU');
|
35 |
+
return;
|
36 |
+
}
|
37 |
|
38 |
+
context.configure({
|
39 |
+
device,
|
40 |
+
format: presentationFormat,
|
41 |
+
});
|
42 |
|
43 |
const shaderCode = await fetchShaderCode('shaders.wgsl');
|
44 |
+
const module = device.createShaderModule({
|
45 |
+
label: 'textured quad shaders',
|
46 |
+
code: shaderCode,
|
47 |
+
});
|
48 |
|
49 |
const glyphCanvas = generateGlyphTextureAtlas(CANVAS, CTX, CONFIG);
|
50 |
+
document.body.appendChild(glyphCanvas);
|
51 |
+
glyphCanvas.style.backgroundColor = '#222';
|
52 |
|
53 |
const vertexSize = CONFIG.floatsPerVertex * 4;
|
54 |
const vertexBufferSize = CONFIG.maxGlyphs * CONFIG.vertsPerGlyph * vertexSize;
|
55 |
+
vertexBuffer = device.createBuffer({
|
56 |
+
label: 'vertices',
|
57 |
+
size: vertexBufferSize,
|
58 |
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
59 |
+
});
|
60 |
+
|
61 |
+
indexBuffer = device.createBuffer({
|
62 |
+
label: 'indices',
|
63 |
+
size: CONFIG.maxGlyphs * CONFIG.vertsPerGlyph * 4,
|
64 |
+
usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
|
65 |
+
});
|
66 |
|
67 |
const indices = Array.from({ length: CONFIG.maxGlyphs * 6 }, (_, i) => {
|
68 |
const ndx = Math.floor(i / 6) * 4;
|
|
|
72 |
|
73 |
const { vertexData, numGlyphs, width, height } = generateGlyphVerticesForText('Hello\nworld!\nText in\nWebGPU!', COLORS, glyphCanvas);
|
74 |
device.queue.writeBuffer(vertexBuffer, 0, vertexData);
|
75 |
+
|
76 |
pipeline = device.createRenderPipeline({
|
77 |
label: 'textured quad pipeline',
|
78 |
layout: 'auto',
|
|
|
103 |
},
|
104 |
});
|
105 |
|
106 |
+
texture = createTextureFromSource(device, glyphCanvas, { mips: true });
|
107 |
+
sampler = device.createSampler({
|
108 |
+
minFilter: 'linear',
|
109 |
+
magFilter: 'linear'
|
110 |
+
});
|
111 |
+
|
112 |
+
uniformBuffer = device.createBuffer({
|
113 |
+
label: 'uniforms for quad',
|
114 |
+
size: CONFIG.uniformBufferSize,
|
115 |
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST
|
116 |
+
});
|
117 |
|
118 |
const uniformValues = new Float32Array(CONFIG.uniformBufferSize / 4);
|
119 |
const matrix = uniformValues.subarray(0, 16);
|
|
|
192 |
return { vertexData, numGlyphs: offset / CONFIG.floatsPerVertex, width, height: y1 };
|
193 |
}
|
194 |
|
195 |
+
function createTextureFromSource(device, source, options = {}) {
|
196 |
const texture = device.createTexture({
|
197 |
format: 'rgba8unorm',
|
198 |
size: [source.width, source.height],
|
|
|
200 |
});
|
201 |
|
202 |
device.queue.copyExternalImageToTexture(
|
203 |
+
{ source, flipY: options.flipY },
|
204 |
{ texture, premultipliedAlpha: true },
|
205 |
{ width: source.width, height: source.height }
|
206 |
);
|