1pub mod chroma;
4pub mod colorspace;
5pub mod composite;
6pub mod denoise;
7pub mod filter;
8pub mod histogram_eq;
9pub mod quality_metrics;
10pub mod scale;
11pub mod tonemap;
12pub mod transform;
13
14pub use chroma::{ChromaOps, ChromaSubsampling, YcbcrCoefficients};
15pub use colorspace::{ColorSpace, ColorSpaceConversion};
16pub use denoise::{DenoiseAlgorithm, DenoiseKernel, DenoiseOperation};
17pub use filter::{bilateral_filter, box_blur, median_filter, FilterOperation};
18pub use histogram_eq::{EqualizationMode, HistogramEqualizer, HistogramEqualizerConfig};
19pub use quality_metrics::{
20 compute_ms_ssim, compute_psnr, compute_ssim, MsSsimResult, PsnrResult, SsimResult,
21};
22pub use scale::{ScaleFilter, ScaleOperation};
23pub use tonemap::{
24 aces_tonemap, apply_gamma, apply_tonemap_frame, drago_log_tonemap, hable_tonemap,
25 reinhard_tonemap, TonemapAlgorithm, TonemapParams,
26};
27pub use transform::TransformOperation;
28
29pub(crate) mod utils {
31 use crate::buffer::BufferType;
32 use crate::{GpuBuffer, GpuDevice, GpuError, Result};
33
34 #[allow(dead_code)]
36 pub fn create_staging_buffer(device: &GpuDevice, data: &[u8]) -> Result<GpuBuffer> {
37 GpuBuffer::with_data(device, data, BufferType::Staging)
38 }
39
40 pub fn create_storage_buffer(device: &GpuDevice, size: u64) -> Result<GpuBuffer> {
42 GpuBuffer::new(device, size, BufferType::Storage)
43 }
44
45 pub fn create_uniform_buffer(device: &GpuDevice, data: &[u8]) -> Result<GpuBuffer> {
47 GpuBuffer::with_data(device, data, BufferType::Uniform)
48 }
49
50 pub fn create_readback_buffer(device: &GpuDevice, size: u64) -> Result<GpuBuffer> {
52 GpuBuffer::new(device, size, BufferType::ReadBack)
53 }
54
55 pub fn calculate_dispatch_size(
57 width: u32,
58 height: u32,
59 workgroup_size: (u32, u32),
60 ) -> (u32, u32) {
61 let x = width.div_ceil(workgroup_size.0);
62 let y = height.div_ceil(workgroup_size.1);
63 (x, y)
64 }
65
66 pub fn validate_dimensions(width: u32, height: u32) -> Result<()> {
68 if width == 0 || height == 0 {
69 return Err(GpuError::InvalidDimensions { width, height });
70 }
71 if width > 16384 || height > 16384 {
72 return Err(GpuError::InvalidDimensions { width, height });
73 }
74 Ok(())
75 }
76
77 pub fn validate_buffer_size(
79 buffer: &[u8],
80 width: u32,
81 height: u32,
82 channels: u32,
83 ) -> Result<()> {
84 let expected = (width * height * channels) as usize;
85 let actual = buffer.len();
86 if actual < expected {
87 return Err(GpuError::InvalidBufferSize { expected, actual });
88 }
89 Ok(())
90 }
91}