-
Notifications
You must be signed in to change notification settings - Fork 136
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
See #680 for details. This test will currently pass, but only because the behaviour is incorrect. This adds a warning for when this bug would apply, for users
- Loading branch information
Showing
3 changed files
with
94 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, ¶ms).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); | ||
} |