Skip to content

Commit cda1475

Browse files
committed
Reuse dynamic entry offsets
1 parent 7dfc15e commit cda1475

1 file changed

Lines changed: 33 additions & 22 deletions

File tree

src/webgpu/p5.RendererWebGPU.js

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ function rendererWebGPU(p5, fn) {
5656
this.uniformBufferPool = [];
5757
this.resettingUniformBuffers = [];
5858

59+
this.dynamicEntryOffsets = new Uint32Array(64);
60+
5961
// Cache for current frame's canvas texture view
6062
this.currentCanvasColorTexture = null;
6163
this.currentCanvasColorTextureView = null;
@@ -664,12 +666,14 @@ function rendererWebGPU(p5, fn) {
664666
}
665667

666668
// Create layouts and bind groups
669+
const groupEntriesArr = [];
667670
for (const [group, entries] of groupEntries) {
668671
const layout = this.device.createBindGroupLayout({ entries });
669672
bindGroupLayouts.set(group, layout);
673+
groupEntriesArr.push([group, entries]);
670674
}
671675

672-
shader._groupEntries = groupEntries;
676+
shader._groupEntries = groupEntriesArr;
673677
shader._bindGroupLayouts = [...bindGroupLayouts.values()];
674678
// Reuse bind groups if they don't change
675679
shader._cachedBindGroup = {};
@@ -1463,9 +1467,6 @@ function rendererWebGPU(p5, fn) {
14631467
passEncoder.setVertexBuffer(location, gpuBuffer, 0);
14641468
}
14651469

1466-
const uniformBuffersForBinding = {};
1467-
const uniformBufferOffsets = {};
1468-
14691470
for (const bufferGroup of currentShader._uniformBufferGroups) {
14701471
if (bufferGroup.dynamic) {
14711472
// Bind uniforms into a part of a big dynamic memory block because
@@ -1480,8 +1481,8 @@ function rendererWebGPU(p5, fn) {
14801481
uniformBufferInfo.offset += Math.ceil(bufferGroup.size / this.uniformBufferAlignment) * this.uniformBufferAlignment;
14811482

14821483
// Make a shallow copy so that we keep track of the last offset for this uniform
1483-
uniformBuffersForBinding[bufferGroup.cacheKey] = uniformBufferInfo;
1484-
uniformBufferOffsets[bufferGroup.cacheKey] = uniformBufferInfo.lastOffset;
1484+
bufferGroup.currentDynamicBuffer = uniformBufferInfo;
1485+
bufferGroup.lastOffset = uniformBufferInfo.lastOffset;
14851486
} else {
14861487
// Bind uniforms to a binding-specific buffer, which may be cached for performance
14871488
let bufferInfo;
@@ -1510,8 +1511,6 @@ function rendererWebGPU(p5, fn) {
15101511
// Cache this buffer and data for next frame
15111512
bufferGroup.currentBuffer = bufferInfo;
15121513
}
1513-
1514-
uniformBuffersForBinding[bufferGroup.cacheKey] = bufferInfo;
15151514
}
15161515
}
15171516
for (const sampler of currentShader.samplers) {
@@ -1523,26 +1522,29 @@ function rendererWebGPU(p5, fn) {
15231522
}
15241523

15251524
// Bind sampler/texture uniforms and uniform buffers
1526-
for (const [group, entries] of currentShader._groupEntries) {
1527-
const dynamicEntryOffsets = [];
1525+
for (const iter of currentShader._groupEntries) {
1526+
const group = iter[0];
1527+
const entries = iter[1];
1528+
let dynamicOffsetIdx = 0;
15281529
const bgEntries = [];
15291530
let bindGroup = currentShader._cachedBindGroup[group];
15301531
for (const entry of entries) {
1532+
const bufferGroup = entry.bufferGroup;
15311533
// Check if this is a uniform buffer binding
1532-
const uniformBufferInfo = entry.bufferGroup &&
1533-
uniformBuffersForBinding[entry.bufferGroup.cacheKey];
1534-
if (uniformBufferInfo && entry.bufferGroup) {
1535-
if (entry.bufferGroup.dynamic) {
1536-
dynamicEntryOffsets.push(uniformBufferOffsets[entry.bufferGroup.cacheKey]);
1534+
const uniformBufferInfo =
1535+
bufferGroup?.currentBuffer || bufferGroup?.currentDynamicBuffer;
1536+
if (uniformBufferInfo) {
1537+
if (bufferGroup.dynamic) {
1538+
this.dynamicEntryOffsets[dynamicOffsetIdx++] = bufferGroup.lastOffset;
15371539
}
15381540
if (!bindGroup) {
15391541
bgEntries.push({
15401542
binding: entry.binding,
1541-
resource: entry.bufferGroup.dynamic
1543+
resource: bufferGroup.dynamic
15421544
? {
15431545
buffer: uniformBufferInfo.uniformBuffer,
15441546
offset: 0,
1545-
size: Math.ceil(entry.bufferGroup.size / this.uniformBufferAlignment) * this.uniformBufferAlignment,
1547+
size: Math.ceil(bufferGroup.size / this.uniformBufferAlignment) * this.uniformBufferAlignment,
15461548
}
15471549
: { buffer: uniformBufferInfo.buffer },
15481550
});
@@ -1565,11 +1567,20 @@ function rendererWebGPU(p5, fn) {
15651567
});
15661568
}
15671569
currentShader._cachedBindGroup[group] = bindGroup;
1568-
passEncoder.setBindGroup(
1569-
group,
1570-
bindGroup,
1571-
dynamicEntryOffsets,
1572-
);
1570+
if (dynamicOffsetIdx === 0) {
1571+
passEncoder.setBindGroup(
1572+
group,
1573+
bindGroup,
1574+
);
1575+
} else {
1576+
passEncoder.setBindGroup(
1577+
group,
1578+
bindGroup,
1579+
this.dynamicEntryOffsets,
1580+
0,
1581+
dynamicOffsetIdx
1582+
);
1583+
}
15731584
}
15741585

15751586
if (currentShader.shaderType === "fill") {

0 commit comments

Comments
 (0)