#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub(super) enum FloatRenderPath {
None,
PboF16Nchw,
PboF32Nhwc,
ZeroCopyF16Nchw,
}
pub(super) fn classify_float_render(
src: edgefirst_tensor::PixelFormat,
dst: edgefirst_tensor::PixelFormat,
dtype: edgefirst_tensor::DType,
dst_mem: edgefirst_tensor::TensorMemory,
support: crate::RenderDtypeSupport,
) -> FloatRenderPath {
use edgefirst_tensor::{DType, PixelFormat::*, TensorMemory};
match (src, dst, dtype, dst_mem) {
(Rgba, PlanarRgb, DType::F16, TensorMemory::Pbo) if support.f16 => {
FloatRenderPath::PboF16Nchw
}
(Rgba, PlanarRgb, DType::F16, TensorMemory::Dma) if support.f16 => {
FloatRenderPath::ZeroCopyF16Nchw
}
(Rgba, Rgb, DType::F32, TensorMemory::Pbo) if support.f32 => FloatRenderPath::PboF32Nhwc,
_ => FloatRenderPath::None,
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::{classify_float_render, FloatRenderPath};
use crate::RenderDtypeSupport;
use edgefirst_tensor::{DType, PixelFormat, TensorMemory};
const YES: RenderDtypeSupport = RenderDtypeSupport {
f32: true,
f16: true,
};
const NO: RenderDtypeSupport = RenderDtypeSupport {
f32: false,
f16: false,
};
#[test]
fn pbo_f16_when_supported() {
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::PlanarRgb,
DType::F16,
TensorMemory::Pbo,
YES
),
FloatRenderPath::PboF16Nchw
);
}
#[test]
fn dma_f16_when_supported() {
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::PlanarRgb,
DType::F16,
TensorMemory::Dma,
YES
),
FloatRenderPath::ZeroCopyF16Nchw
);
}
#[test]
fn pbo_f32_when_supported() {
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::Rgb,
DType::F32,
TensorMemory::Pbo,
YES
),
FloatRenderPath::PboF32Nhwc
);
}
#[test]
fn no_path_when_capability_absent() {
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::PlanarRgb,
DType::F16,
TensorMemory::Pbo,
NO
),
FloatRenderPath::None
);
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::Rgb,
DType::F32,
TensorMemory::Pbo,
NO
),
FloatRenderPath::None
);
}
#[test]
fn no_path_for_unhandled_tuples() {
assert_eq!(
classify_float_render(
PixelFormat::Bgra,
PixelFormat::PlanarRgb,
DType::F16,
TensorMemory::Pbo,
YES
),
FloatRenderPath::None
);
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::PlanarRgb,
DType::U8,
TensorMemory::Pbo,
YES
),
FloatRenderPath::None
);
assert_eq!(
classify_float_render(
PixelFormat::Rgba,
PixelFormat::PlanarRgb,
DType::F16,
TensorMemory::Mem,
YES
),
FloatRenderPath::None
);
}
}