Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a failing test and warning for #680 #681

Merged
merged 5 commits into from
Sep 20, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions vello/src/render.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,19 @@ impl Render {
}
let cpu_config =
RenderConfig::new(&layout, params.width, params.height, &params.base_color);
// HACK: The coarse workgroup counts is the number of active bins.
if (cpu_config.workgroup_counts.coarse.0
* cpu_config.workgroup_counts.coarse.1
* cpu_config.workgroup_counts.coarse.2)
> 256
{
log::warn!(
"Trying to paint too large image. {}x{}.\n\
See https://github.com/linebender/vello/issues/680 for details",
params.width,
params.height
);
}
let buffer_sizes = &cpu_config.buffer_sizes;
let wg_counts = &cpu_config.workgroup_counts;

Expand Down
12 changes: 11 additions & 1 deletion vello_tests/src/snapshot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,24 @@ pub fn smoke_snapshot_test_sync(scene: Scene, params: &TestParams) -> Result<Sna
pollster::block_on(snapshot_test(scene, params, SnapshotDirectory::Smoke))
}

/// Run a snapshot test of the given scene.
DJMcNab marked this conversation as resolved.
Show resolved Hide resolved
pub async fn snapshot_test(
scene: Scene,
params: &TestParams,
directory: SnapshotDirectory,
) -> Result<Snapshot> {
let raw_rendered = render_then_debug(&scene, params).await?;
snapshot_test_image(raw_rendered, params, directory)
}

/// Evaluate a snapshot test on the given image.
///
/// This is useful if a post-processing step needs to happen
/// in-between running Vello and the image.
pub fn snapshot_test_image(
raw_rendered: Image,
params: &TestParams,
directory: SnapshotDirectory,
) -> Result<Snapshot> {
let reference_path = snapshot_dir(directory)
.join(&params.name)
.with_extension("png");
Expand Down
67 changes: 67 additions & 0 deletions vello_tests/tests/known_issues.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright 2024 the Vello Authors
// SPDX-License-Identifier: Apache-2.0 OR MIT

//! Reproductions for known bugs, to allow test driven development

use vello::{
kurbo::{Affine, Rect},
peniko::{Color, Format},
Scene,
};
use vello_tests::TestParams;

/// A reproduction of <https://github.com/linebender/vello/issues/680>
fn many_bins(use_cpu: bool) {
let mut scene = Scene::new();
scene.fill(
vello::peniko::Fill::NonZero,
Affine::IDENTITY,
Color::RED,
None,
&Rect::new(-5., -5., 256. * 20., 256. * 20.),
);
let params = TestParams {
use_cpu,
..TestParams::new("many_bins", 256 * 17, 256 * 17)
};
// To view, use VELLO_DEBUG_TEST=many_bins
let image = vello_tests::render_then_debug_sync(&scene, &params).unwrap();
assert_eq!(image.format, Format::Rgba8);
let mut red_count = 0;
let mut black_count = 0;
for pixel in image.data.data().chunks_exact(4) {
let &[r, g, b, a] = pixel else { unreachable!() };
let is_red = r == 255 && g == 0 && b == 0 && a == 255;
let is_black = r == 0 && g == 0 && b == 0 && a == 255;
if !is_red && !is_black {
panic!("{pixel:?}");
}
match (is_red, is_black) {
(true, true) => unreachable!(),
(true, false) => red_count += 1,
(false, true) => black_count += 1,
(false, false) => panic!("Got unexpected pixel {pixel:?}"),
}
}
// When #680 is fixed, this will become:
// let drawn_bins = 17 /* x bins */ * 17 /* y bins*/;

// The current maximum number of bins.
let drawn_bins = 256;
let expected_red_count = drawn_bins * 256 /* tiles per bin */ * 256 /* Pixels per tile */;
assert_eq!(red_count, expected_red_count);
assert!(black_count > 0);
}

#[test]
#[cfg_attr(skip_gpu_tests, ignore)]
fn many_bins_gpu() {
many_bins(false);
}

#[test]
#[cfg_attr(skip_gpu_tests, ignore)]
#[should_panic]
fn many_bins_cpu() {
many_bins(true);
}