#![allow(clippy::cast_possible_truncation)]
#![allow(clippy::cast_sign_loss)]
#![allow(clippy::cast_precision_loss)]
#![allow(clippy::cast_possible_wrap)]
#![allow(clippy::missing_errors_doc)]
#![allow(clippy::missing_panics_doc)]
pub mod buffer;
pub mod device;
pub mod ops;
pub mod shader;
pub mod accelerator;
pub mod backend;
pub mod cache;
pub mod compiler;
pub mod compute;
pub mod kernels;
pub mod memory;
pub mod queue;
pub mod sync;
pub mod histogram;
pub mod motion_detect;
pub mod pipeline;
pub mod texture;
pub mod video_process;
pub mod compute_pass;
pub mod kernel;
pub mod shader_params;
pub mod compute_dispatch;
pub mod memory_pool;
pub mod shader_cache;
pub mod gpu_buffer;
pub mod gpu_fence;
pub mod render_pass;
pub mod command_buffer;
pub mod resource_manager;
pub mod sync_primitive;
pub mod descriptor_set;
pub mod gpu_stats;
pub mod viewport;
pub mod gpu_profiler;
pub mod sampler;
pub mod vertex_buffer;
pub mod fence_pool;
pub mod gpu_timer;
pub mod upload_queue;
pub mod buffer_copy;
pub mod occupancy;
pub mod workgroup;
pub mod buffer_pool;
pub mod compute_kernels;
pub mod pipeline_stages;
pub mod motion_estimation;
pub mod multi_gpu;
pub mod compute_shader;
pub mod histogram_equalization;
pub mod async_compute;
pub mod barrier_manager;
pub mod blend_kernel;
pub mod color_convert_kernel;
pub mod compute_graph;
pub mod double_buffer;
pub mod film_grain;
pub mod gpu_cpu_verify;
pub mod indirect_dispatch;
pub mod kernel_scheduler;
pub mod mipmap_gen;
pub mod optical_flow;
pub mod perspective_transform;
pub mod pipeline_cache;
pub mod readback;
pub mod scale_kernel;
pub mod texture_atlas;
pub mod texture_cache;
pub mod tone_curve;
use std::sync::Arc;
use thiserror::Error;
pub use accelerator::{AcceleratorBuilder, CpuAccelerator, GpuAccelerator, WgpuAccelerator};
pub use buffer::{BufferType, GpuBuffer};
pub use device::{GpuDevice, GpuDeviceInfo};
pub use ops::quality_metrics::{
compute_ms_ssim, compute_psnr, compute_ssim, MsSsimResult, PsnrResult, SsimResult,
};
pub use ops::{
ChromaOps, ChromaSubsampling, ColorSpaceConversion, FilterOperation, ScaleOperation,
TransformOperation, YcbcrCoefficients,
};
pub use backend::{Backend, BackendCapabilities, BackendType, CpuBackend, VulkanBackend};
pub use cache::{CacheStats, PipelineCache, ShaderCache};
pub use compiler::{
CompilationError, CompilationOptions, OptimizationLevel, ShaderCompiler, ShaderPreprocessor,
};
pub use compute::{
ComputeExecutor, ComputePassBuilder, ComputePipelineHandle, ComputePipelineManager,
DispatchHelper,
};
pub use kernels::{
ColorConversionKernel, ConvolutionKernel, FilterKernel, ReduceKernel, ReduceOp, ResizeFilter,
ResizeKernel, TransformKernel, TransformType,
};
pub use memory::{ManagedBuffer, MemoryAllocator, MemoryPool, MemoryStats};
pub use queue::{
AsyncSubmission, BatchSubmitter, CommandBufferBuilder, CommandQueue, QueueManager, QueueType,
};
pub use sync::{Barrier, Event, Fence, Semaphore};
pub use workgroup::{DeviceLimits, WorkgroupAutoTuner};
pub use memory_pool::{CompactionPlan, DefragResult, MigrationEntry};
pub use buffer_pool::SubAllocator;
pub use compute_pass::{BatchedComputePass, DispatchCommand};
pub use histogram::{ChannelHistogram, ImageHistogram};
pub use motion_detect::{MotionAnalysis, MotionDetector, MotionRegion, Sensitivity};
pub use pipeline::{
BarrierBatcher, BarrierKind, BarrierStrategy, BufferBarrier, FlushRecord, GpuPipeline,
PipelineMetrics, PipelineNode, PipelineStage,
};
pub use texture::{TextureDescriptor, TextureFormat, TexturePool};
pub use video_process::{FrameProcessConfig, FrameProcessResult, VideoFrameProcessor};
pub use compute_shader::{ComputeShaderSimulator, ShaderKernel, ThreadGroupContext};
pub use histogram_equalization::{ClaheConfig, EqualizationStats, HistogramEqualizer};
#[derive(Debug, Error)]
pub enum GpuError {
#[error("Failed to initialize GPU device: {0}")]
DeviceInit(String),
#[error("No suitable GPU adapter found")]
NoAdapter,
#[error("Failed to request GPU device: {0}")]
DeviceRequest(String),
#[error("Failed to create GPU buffer: {0}")]
BufferCreation(String),
#[error("Failed to compile shader: {0}")]
ShaderCompilation(String),
#[error("Failed to create compute pipeline: {0}")]
PipelineCreation(String),
#[error("Failed to submit GPU commands: {0}")]
CommandSubmission(String),
#[error("Failed to map GPU buffer: {0}")]
BufferMapping(String),
#[error("Invalid image dimensions: {width}x{height}")]
InvalidDimensions { width: u32, height: u32 },
#[error("Invalid buffer size: expected {expected}, got {actual}")]
InvalidBufferSize { expected: usize, actual: usize },
#[error("Operation not supported: {0}")]
NotSupported(String),
#[error("Internal GPU error: {0}")]
Internal(String),
}
pub type Result<T> = std::result::Result<T, GpuError>;
pub struct GpuContext {
device: Arc<GpuDevice>,
}
impl GpuContext {
pub fn new() -> Result<Self> {
let device = GpuDevice::new(None)?;
Ok(Self {
device: Arc::new(device),
})
}
pub fn with_device(device_index: usize) -> Result<Self> {
let device = GpuDevice::new(Some(device_index))?;
Ok(Self {
device: Arc::new(device),
})
}
pub fn list_devices() -> Result<Vec<GpuDeviceInfo>> {
GpuDevice::list_devices()
}
#[must_use]
pub fn device_info(&self) -> &GpuDeviceInfo {
self.device.info()
}
pub fn rgb_to_yuv(&self, input: &[u8], output: &mut [u8]) -> Result<()> {
if input.len() != output.len() {
return Err(GpuError::InvalidBufferSize {
expected: input.len(),
actual: output.len(),
});
}
if input.len() % 4 != 0 {
return Err(GpuError::InvalidBufferSize {
expected: (input.len() / 4) * 4,
actual: input.len(),
});
}
let width = ((input.len() / 4) as f32).sqrt() as u32;
let height = width;
ops::ColorSpaceConversion::rgb_to_yuv(
&self.device,
input,
output,
width,
height,
ops::ColorSpace::BT601,
)
}
pub fn yuv_to_rgb(&self, input: &[u8], output: &mut [u8]) -> Result<()> {
if input.len() != output.len() {
return Err(GpuError::InvalidBufferSize {
expected: input.len(),
actual: output.len(),
});
}
if input.len() % 4 != 0 {
return Err(GpuError::InvalidBufferSize {
expected: (input.len() / 4) * 4,
actual: input.len(),
});
}
let width = ((input.len() / 4) as f32).sqrt() as u32;
let height = width;
ops::ColorSpaceConversion::yuv_to_rgb(
&self.device,
input,
output,
width,
height,
ops::ColorSpace::BT601,
)
}
pub fn scale_bilinear(
&self,
input: &[u8],
src_width: u32,
src_height: u32,
output: &mut [u8],
dst_width: u32,
dst_height: u32,
) -> Result<()> {
ops::ScaleOperation::scale(
&self.device,
input,
src_width,
src_height,
output,
dst_width,
dst_height,
ops::ScaleFilter::Bilinear,
)
}
pub fn scale_bicubic(
&self,
input: &[u8],
src_width: u32,
src_height: u32,
output: &mut [u8],
dst_width: u32,
dst_height: u32,
) -> Result<()> {
ops::ScaleOperation::scale(
&self.device,
input,
src_width,
src_height,
output,
dst_width,
dst_height,
ops::ScaleFilter::Bicubic,
)
}
pub fn scale_lanczos(
&self,
input: &[u8],
src_width: u32,
src_height: u32,
output: &mut [u8],
dst_width: u32,
dst_height: u32,
) -> Result<()> {
ops::ScaleOperation::scale(
&self.device,
input,
src_width,
src_height,
output,
dst_width,
dst_height,
ops::ScaleFilter::Lanczos3,
)
}
#[allow(clippy::too_many_arguments)]
pub fn gaussian_blur(
&self,
input: &[u8],
output: &mut [u8],
width: u32,
height: u32,
sigma: f32,
) -> Result<()> {
ops::FilterOperation::gaussian_blur(&self.device, input, output, width, height, sigma)
}
#[allow(clippy::too_many_arguments)]
pub fn sharpen(
&self,
input: &[u8],
output: &mut [u8],
width: u32,
height: u32,
amount: f32,
) -> Result<()> {
ops::FilterOperation::sharpen(&self.device, input, output, width, height, amount)
}
pub fn edge_detect(
&self,
input: &[u8],
output: &mut [u8],
width: u32,
height: u32,
) -> Result<()> {
ops::FilterOperation::edge_detect(&self.device, input, output, width, height)
}
pub fn dct_2d(&self, input: &[f32], output: &mut [f32], width: u32, height: u32) -> Result<()> {
ops::TransformOperation::dct_2d(&self.device, input, output, width, height)
}
pub fn idct_2d(
&self,
input: &[f32],
output: &mut [f32],
width: u32,
height: u32,
) -> Result<()> {
ops::TransformOperation::idct_2d(&self.device, input, output, width, height)
}
pub fn wait(&self) {
self.device.wait();
}
}