pub mod backend;
pub mod engine;
pub mod entropy;
pub mod error;
pub mod format;
pub mod gdeflate;
pub mod lz77;
pub mod scorer;
pub mod vectorize;
use std::sync::atomic::AtomicBool;
use std::sync::{Arc, OnceLock};
use crush_core::error::Result;
use crush_core::plugin::{CompressionAlgorithm, PluginMetadata, COMPRESSION_ALGORITHMS};
use linkme::distributed_slice;
pub use backend::{discover_gpu, GpuInfo, GpuVendor};
pub const PLUGIN_MAGIC: [u8; 4] = [0x43, 0x52, 0x01, 0x03];
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum BackendPreference {
#[default]
Auto,
Cuda,
Wgpu,
}
#[derive(Debug, Clone, Default)]
pub struct GpuPluginConfig {
pub force_cpu: bool,
pub device_index: Option<u32>,
pub backend: BackendPreference,
}
static GPU_PLUGIN_CONFIG: OnceLock<GpuPluginConfig> = OnceLock::new();
pub fn configure(config: GpuPluginConfig) {
let _ = GPU_PLUGIN_CONFIG.set(config);
}
pub fn get_config() -> &'static GpuPluginConfig {
static DEFAULT_CONFIG: GpuPluginConfig = GpuPluginConfig {
force_cpu: false,
device_index: None,
backend: BackendPreference::Auto,
};
GPU_PLUGIN_CONFIG.get().unwrap_or(&DEFAULT_CONFIG)
}
struct GpuDeflatePlugin;
impl CompressionAlgorithm for GpuDeflatePlugin {
fn name(&self) -> &'static str {
"gpu-deflate"
}
fn metadata(&self) -> PluginMetadata {
PluginMetadata {
name: "gpu-deflate",
version: env!("CARGO_PKG_VERSION"),
magic_number: PLUGIN_MAGIC,
throughput: 2000.0,
compression_ratio: 0.65,
description:
"GPU-accelerated tile-based compression with 32-way parallel decompression",
}
}
fn compress(&self, input: &[u8], cancel_flag: Arc<AtomicBool>) -> Result<Vec<u8>> {
let config = engine::EngineConfig::default();
engine::compress(input, &config, &cancel_flag)
}
fn decompress(&self, input: &[u8], cancel_flag: Arc<AtomicBool>) -> Result<Vec<u8>> {
let plugin_cfg = get_config();
let config = engine::EngineConfig {
force_cpu: plugin_cfg.force_cpu,
..engine::EngineConfig::default()
};
engine::decompress(input, &config, &cancel_flag)
}
fn detect(&self, file_header: &[u8]) -> bool {
file_header.len() >= 4 && file_header[0..4] == format::CGPU_MAGIC
}
}
#[distributed_slice(COMPRESSION_ALGORITHMS)]
static GPU_DEFLATE_PLUGIN: &dyn CompressionAlgorithm = &GpuDeflatePlugin;