Scope the Rgba32Float skip to the effect-chain parity test.

Main now falls back to CPU effects when an adapter cannot render to
Rgba32Float, so the scene, blend and transition parity tests still run
on such adapters. Only gpu_effect_chains_match_cpu_render needs a float
render target, and it is the one test that skips without it. Also revert
the import reorder, which failed cargo fmt --check on edition 2024.
This commit is contained in:
Vikram Bhaskaran
2026-10-15 22:53:52 +11:00
parent 31539f1b84
commit c63d9766e9
+14 -11
View File
@@ -15,12 +15,12 @@ use filmcraft_geom::Vec2;
use filmcraft_media::generators::GeneratorSource;
use filmcraft_media::{DemoScene, Generator, MediaSource, SharedSource};
use filmcraft_project::{
find_effect, ClipId, EffectInstance, ItemId, ItemKind, Label, Mask, MaskMode, MaskPath, MediaClip, MediaRef, ParamValue, Project, SequenceSettings,
TrackItem, TrackKind, Transition, TransitionId,
ClipId, EffectInstance, ItemId, ItemKind, Label, Mask, MaskMode, MaskPath, MediaClip, MediaRef, ParamValue, Project, SequenceSettings, TrackItem,
TrackKind, Transition, TransitionId, find_effect,
};
use filmcraft_render::{render_sequence, RenderOptions, SourceMap};
use filmcraft_testkit::golden::{assert_golden, diff, Rgba8, Tolerance};
use filmcraft_time::{FrameRate, Tick, TimeRange, TICKS_PER_SECOND};
use filmcraft_render::{RenderOptions, SourceMap, render_sequence};
use filmcraft_testkit::golden::{Rgba8, Tolerance, assert_golden, diff};
use filmcraft_time::{FrameRate, TICKS_PER_SECOND, Tick, TimeRange};
const W: u32 = 320;
const H: u32 = 180;
@@ -738,7 +738,10 @@ fn scenes_are_distinct() {
// ---- GPU parity ----
fn device(context: &str) -> Option<(wgpu::Device, wgpu::Queue)> {
/// A device for the GPU parity tests, or `None` (with a `SKIPPED` note) when the machine has no
/// usable adapter. `require_float_target` additionally demands a renderable `Rgba32Float`, which
/// only the effect-chain plan needs; main falls back to CPU effects on adapters without it.
fn device(context: &str, require_float_target: bool) -> Option<(wgpu::Device, wgpu::Queue)> {
let instance = wgpu::Instance::default();
let Some(adapter) = pollster::block_on(instance.request_adapter(&wgpu::RequestAdapterOptions::default())).ok() else {
eprintln!("SKIPPED ({context}): no GPU adapter");
@@ -746,7 +749,7 @@ fn device(context: &str) -> Option<(wgpu::Device, wgpu::Queue)> {
};
let name = adapter.get_info().name;
let renderable = adapter.get_texture_format_features(wgpu::TextureFormat::Rgba32Float).allowed_usages.contains(wgpu::TextureUsages::RENDER_ATTACHMENT);
if !renderable {
if require_float_target && !renderable {
eprintln!("SKIPPED ({context}): adapter {name} cannot render to Rgba32Float");
return None;
}
@@ -761,7 +764,7 @@ fn device(context: &str) -> Option<(wgpu::Device, wgpu::Queue)> {
#[test]
fn gpu_matches_cpu_on_golden_scenes() {
let Some((dev, q)) = device("gpu parity") else {
let Some((dev, q)) = device("gpu parity", false) else {
return;
};
let mut c = filmcraft_gpu::GpuCompositor::new(&dev, &q);
@@ -821,7 +824,7 @@ fn interior_diff(plan: &filmcraft_render::plan::FramePlan, a: &Rgba8, b: &Rgba8)
/// printed too.
#[test]
fn gpu_blend_modes_match_cpu_render() {
let Some((dev, q)) = device("gpu blend parity") else {
let Some((dev, q)) = device("gpu blend parity", false) else {
return;
};
let mut c = filmcraft_gpu::GpuCompositor::new(&dev, &q);
@@ -868,7 +871,7 @@ fn gpu_blend_modes_match_cpu_render() {
/// blend modes: the plan does the same (Screen clips cross-dissolving on V2 over V1).
#[test]
fn gpu_transition_of_blended_clips_matches_cpu_render() {
let Some((dev, q)) = device("gpu blend parity") else {
let Some((dev, q)) = device("gpu blend parity", false) else {
return;
};
let mut b = Builder::new(2);
@@ -943,7 +946,7 @@ fn gpu_effect_chains_match_cpu_render() {
assert!(!fx.ops.is_empty());
}
assert!(layers[4].fx.is_none(), "Emboss is rendered on the CPU");
let Some((dev, q)) = device("gpu effect parity") else {
let Some((dev, q)) = device("gpu effect parity", true) else {
return;
};
let mut c = filmcraft_gpu::GpuCompositor::new(&dev, &q);