Skip to main content

oximedia_gpu/ops/
mod.rs

1//! GPU compute operations
2
3pub 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
29/// Common utilities for GPU operations
30pub(crate) mod utils {
31    use crate::buffer::BufferType;
32    use crate::{GpuBuffer, GpuDevice, GpuError, Result};
33
34    /// Create a staging buffer and upload data
35    #[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    /// Create a storage buffer
41    pub fn create_storage_buffer(device: &GpuDevice, size: u64) -> Result<GpuBuffer> {
42        GpuBuffer::new(device, size, BufferType::Storage)
43    }
44
45    /// Create a uniform buffer with data
46    pub fn create_uniform_buffer(device: &GpuDevice, data: &[u8]) -> Result<GpuBuffer> {
47        GpuBuffer::with_data(device, data, BufferType::Uniform)
48    }
49
50    /// Create a read-back buffer
51    pub fn create_readback_buffer(device: &GpuDevice, size: u64) -> Result<GpuBuffer> {
52        GpuBuffer::new(device, size, BufferType::ReadBack)
53    }
54
55    /// Calculate workgroup dispatch dimensions
56    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    /// Validate image dimensions
67    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    /// Validate buffer size for image data
78    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}