MCPcopy Index your code
hub / github.com/ColmapView/Colmapview.github.io / createCentroidCompareShader

Function createCentroidCompareShader

e2e/webgpu-render.spec.ts:380–436  ·  view source on GitHub ↗
()

Source from the content-addressed store, hash-verified

378 };
379
380 const createCentroidCompareShader = () => `
381struct Params {
382 width: u32,
383 height: u32,
384}
385
386@group(0) @binding(0) var renderedTexture: texture_2d<f32>;
387@group(0) @binding(1) var<storage, read_write> partials: array<vec4<u32>>;
388@group(0) @binding(2) var<uniform> params: Params;
389
390var<workgroup> partialSums: array<vec4<u32>, ${centroidWorkgroupSize}>;
391
392fn addPartial(a: vec4<u32>, b: vec4<u32>) -> vec4<u32> {
393 return vec4<u32>(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w);
394}
395
396@compute @workgroup_size(${centroidWorkgroupSize})
397fn main(
398 @builtin(global_invocation_id) globalId: vec3<u32>,
399 @builtin(local_invocation_id) localId: vec3<u32>,
400 @builtin(workgroup_id) workgroupId: vec3<u32>
401) {
402 let pixelIndex = globalId.x;
403 let pixelCount = params.width * params.height;
404 var partial = vec4<u32>(0u, 0u, 0u, 0u);
405
406 if (pixelIndex < pixelCount) {
407 let x = pixelIndex % params.width;
408 let y = pixelIndex / params.width;
409 let color = textureLoad(renderedTexture, vec2<i32>(i32(x), i32(y)), 0);
410 let red = u32(round(clamp(color.r, 0.0, 1.0) * 255.0));
411 if (red > 0u) {
412 partial = vec4<u32>(red, red * x, red * y, 1u);
413 }
414 }
415
416 partialSums[localId.x] = partial;
417 workgroupBarrier();
418
419 var stride = ${centroidWorkgroupSize / 2}u;
420 loop {
421 if (localId.x < stride) {
422 partialSums[localId.x] = addPartial(partialSums[localId.x], partialSums[localId.x + stride]);
423 }
424 workgroupBarrier();
425
426 if (stride == 1u) {
427 break;
428 }
429 stride = stride / 2u;
430 }
431
432 if (localId.x == 0u) {
433 partials[workgroupId.x] = partialSums[0];
434 }
435}
436`;
437

Callers 1

Calls

no outgoing calls

Tested by

no test coverage detected