Skip to main content

ReferenceRenderer

Struct ReferenceRenderer 

Source
pub struct ReferenceRenderer { /* private fields */ }
Expand description

Deterministic software reference used by contract tests. It is intentionally simple: sprites are solid, half-open rectangles in logical pixel space.

Implementations§

Source§

impl ReferenceRenderer

Source

pub fn new(target: TargetDescriptor) -> Result<Self, RenderError>

Creates a bounded renderer-neutral reference target.

§Errors

Returns a target error when the descriptor is invalid.

Examples found in repository?
examples/corpus.rs (line 23)
12fn main() -> Result<(), Box<dyn std::error::Error>> {
13    println!("{{\"schema_version\":1,\"cases\":[");
14    let cases = [
15        ("overlap-square", synthetic_scene(16, 16)?, 50_000_u64),
16        ("unaligned-wide", synthetic_scene(31, 17)?, 50_000),
17        ("structural-fog-ui", structural_scene(48, 48)?, 75_000),
18        ("high-density-1024", dense_scene(128, 128)?, 250_000),
19    ];
20    for (index, (name, scene, maximum_cpu_micros)) in cases.into_iter().enumerate() {
21        let viewport = scene.viewport();
22        let started = Instant::now();
23        let frame = ReferenceRenderer::new(offscreen_target(viewport.width, viewport.height))?
24            .render(RenderRequest {
25                scene: &scene,
26                resources: synthetic_provider()?,
27            })?;
28        let elapsed_micros = u64::try_from(started.elapsed().as_micros()).unwrap_or(u64::MAX);
29        if elapsed_micros > maximum_cpu_micros {
30            return Err(format!(
31                "scenario {name} exceeded CPU budget: {elapsed_micros} > {maximum_cpu_micros} microseconds"
32            )
33            .into());
34        }
35        let semantic = frame
36            .semantic_ids
37            .iter()
38            .flat_map(|value| value.to_le_bytes())
39            .collect::<Vec<_>>();
40        let depth = frame
41            .depth
42            .iter()
43            .flat_map(|value| value.to_le_bytes())
44            .collect::<Vec<_>>();
45        println!(
46            "{}{{\"name\":\"{}\",\"width\":{},\"height\":{},\"clock_millis\":{},\"maximum_rgba_channel_difference\":1,\"performance\":{{\"maximum_cpu_micros\":{},\"sprite_count\":{},\"resource_requests\":{},\"uploaded_bytes\":{},\"vertex_count\":{},\"vertex_allocation_bytes\":{},\"target_allocation_bytes\":{}}},\"digests\":{{\"rgba8\":\"{}\",\"semantic_u32le\":\"{}\",\"depth_i16le\":\"{}\",\"coverage_u8\":\"{}\"}}}}",
47            if index == 0 { "" } else { "," },
48            name,
49            viewport.width,
50            viewport.height,
51            scene.clock_millis(),
52            maximum_cpu_micros,
53            scene.sprites().len(),
54            frame.metrics.resource_requests,
55            frame.metrics.uploaded_bytes,
56            frame.metrics.vertex_count,
57            frame.metrics.vertex_allocation_bytes,
58            frame.metrics.target_allocation_bytes,
59            digest(&frame.rgba8),
60            digest(&semantic),
61            digest(&depth),
62            digest(&frame.coverage),
63        );
64    }
65    println!("]}}");
66    Ok(())
67}

Trait Implementations§

Source§

impl Renderer for ReferenceRenderer

Source§

fn target(&self) -> TargetDescriptor

Source§

fn resize(&mut self, width: u32, height: u32) -> Result<(), RenderError>

Changes logical target dimensions without changing target ownership. Read more
Source§

fn render( &mut self, request: RenderRequest<'_>, ) -> Result<FrameOutput, RenderError>

Renders exactly one immutable scene revision. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.