Skip to content

Commit

Permalink
[backdrop_dyn] Handle upstream pipeline failure
Browse files Browse the repository at this point in the history
Following #537 it is possible for the flatten stage to fail and flag
a failure. In some cases this can cause invalid / corrupt bounding box
data to propagate downstream, leading to a hang in the per-tile
backdrop calculation loop.

Triggering this is highly subtle, so I don't have a test case as part of
vello scenes that can reliably reproduce this. Regardless, it makes
sense to check for the upstream failures and terminate the work in
general.
  • Loading branch information
armansito committed Apr 20, 2024
1 parent 6c1e8b8 commit 7b5c0fe
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 8 deletions.
17 changes: 16 additions & 1 deletion shader/backdrop_dyn.wgsl
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,20 @@

// Prefix sum for dynamically allocated backdrops

#import bump
#import config
#import tile

@group(0) @binding(0)
var<uniform> config: Config;

@group(0) @binding(1)
var<storage> paths: array<Path>;
var<storage, read_write> bump: BumpAllocators;

@group(0) @binding(2)
var<storage> paths: array<Path>;

@group(0) @binding(3)
var<storage, read_write> tiles: array<Tile>;

let WG_SIZE = 256u;
Expand All @@ -26,6 +30,14 @@ fn main(
@builtin(global_invocation_id) global_id: vec3<u32>,
@builtin(local_invocation_id) local_id: vec3<u32>,
) {
// Abort if any of the prior stages failed.
if local_id.x == 0u {
sh_row_count[0] = atomicLoad(&bump.failed);
}
let failed = workgroupUniformLoad(&sh_row_count[0]);
if failed != 0u {
return;
}
let drawobj_ix = global_id.x;
var row_count = 0u;
if drawobj_ix < config.n_drawobj {
Expand All @@ -34,6 +46,9 @@ fn main(
sh_row_width[local_id.x] = path.bbox.z - path.bbox.x;
row_count = path.bbox.w - path.bbox.y;
sh_offset[local_id.x] = path.tiles;
} else {
// Explicitly zero the row width, just in case.
sh_row_width[local_id.x] = 0u;
}
sh_row_count[local_id.x] = row_count;

Expand Down
11 changes: 6 additions & 5 deletions src/cpu_shader/backdrop.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
// Copyright 2023 the Vello Authors
// SPDX-License-Identifier: Apache-2.0 OR MIT OR Unlicense

use vello_encoding::{ConfigUniform, Path, Tile};
use vello_encoding::{BumpAllocators, ConfigUniform, Path, Tile};

use crate::cpu_dispatch::CpuBinding;

fn backdrop_main(config: &ConfigUniform, paths: &[Path], tiles: &mut [Tile]) {
fn backdrop_main(config: &ConfigUniform, _: &BumpAllocators, paths: &[Path], tiles: &mut [Tile]) {
for drawobj_ix in 0..config.layout.n_draw_objects {
let path = paths[drawobj_ix as usize];
let width = path.bbox[2] - path.bbox[0];
Expand All @@ -24,7 +24,8 @@ fn backdrop_main(config: &ConfigUniform, paths: &[Path], tiles: &mut [Tile]) {

pub fn backdrop(_n_wg: u32, resources: &[CpuBinding]) {
let config = resources[0].as_typed();
let paths = resources[1].as_slice();
let mut tiles = resources[2].as_slice_mut();
backdrop_main(&config, &paths, &mut tiles);
let bump = resources[1].as_typed();
let paths = resources[2].as_slice();
let mut tiles = resources[3].as_slice_mut();
backdrop_main(&config, &bump, &paths, &mut tiles);
}
2 changes: 1 addition & 1 deletion src/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -357,7 +357,7 @@ impl Render {
recording.dispatch(
shaders.backdrop,
wg_counts.backdrop,
[config_buf, path_buf, tile_buf],
[config_buf, bump_buf, path_buf, tile_buf],
);
recording.dispatch(
shaders.coarse,
Expand Down
2 changes: 1 addition & 1 deletion src/shaders.rs
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ pub fn full_shaders(
);
let backdrop = add_shader!(
backdrop_dyn,
[Uniform, BufReadOnly, Buffer],
[Uniform, Buffer, BufReadOnly, Buffer],
&empty,
CpuShaderType::Present(cpu_shader::backdrop)
);
Expand Down

0 comments on commit 7b5c0fe

Please sign in to comment.