perf(ui): gate per-pixel clip compares behind a flags bit (#50)
uiResolveScreenPixel ran four float compares against hdr.clipRectPx for
every pixel of every UI dispatch, even though the clip rect is the
full-surface default {0,0,1e9,1e9} in the overwhelmingly common case.
Reserve the high bit of the header flags word (UI_FLAG_CLIP) and have
FillHeader set it only when the clip rect is narrower than the surface
(extracted into the unit-testable UIRenderer::ClipFlags). The shader
gates the compares on the bit; the branch is push-constant-uniform so it
never diverges. When the rect covers the surface the skipped compares
could never reject an in-surface pixel, so output is pixel-identical.
Mirrored on the WebGPU/WGSL path (dom-webgpu.js) for parity. Adds the
UIClipFlag CPU test covering the gate decision.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
c58b68ec40
commit
65c19ea84a
6 changed files with 192 additions and 9 deletions
|
|
@ -256,12 +256,17 @@ struct UIDispatchHeader {
|
|||
@group(1) @binding(0) var outTex : texture_storage_2d<rgba8unorm, write>;
|
||||
@group(1) @binding(1) var prevTex : texture_2d<f32>;
|
||||
|
||||
// Renderer-reserved high flag bit (mirrors ui-shared.glsl::UI_FLAG_CLIP).
|
||||
const UI_FLAG_CLIP : u32 = 0x80000000u;
|
||||
|
||||
fn uiResolvePixel(coord: vec2<u32>) -> bool {
|
||||
if (coord.x >= hdr.surfaceW || coord.y >= hdr.surfaceH) { return false; }
|
||||
let fx = f32(coord.x); let fy = f32(coord.y);
|
||||
if (fx < hdr.clipX || fy < hdr.clipY) { return false; }
|
||||
if (fx >= hdr.clipX + hdr.clipW) { return false; }
|
||||
if (fy >= hdr.clipY + hdr.clipH) { return false; }
|
||||
if ((hdr.flags & UI_FLAG_CLIP) != 0u) {
|
||||
let fx = f32(coord.x); let fy = f32(coord.y);
|
||||
if (fx < hdr.clipX || fy < hdr.clipY) { return false; }
|
||||
if (fx >= hdr.clipX + hdr.clipW) { return false; }
|
||||
if (fy >= hdr.clipY + hdr.clipH) { return false; }
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue