use std::sync::Arc;
use crate::memory::CudaDeviceBuffer;
use j2k_codec_math::classic::{
MQ_QE_VALUES, PACKED_MQ_TRANSITION_VALUES, PACKED_SIGN_CONTEXT_LOOKUP, ZERO_CTX_HH_LOOKUP,
ZERO_CTX_HL_LOOKUP, ZERO_CTX_LL_LH_LOOKUP,
};
#[doc(hidden)]
#[derive(Clone, Copy, Debug, PartialEq)]
pub struct CudaClassicCodeBlockJob {
pub payload_offset: u64,
pub payload_len: u32,
pub segment_start: u32,
pub segment_count: u32,
pub width: u32,
pub height: u32,
pub output_stride: u32,
pub output_offset: u32,
pub missing_bitplanes: u32,
pub total_bitplanes: u32,
pub number_of_coding_passes: u32,
pub sub_band_type: u32,
pub style_flags: u32,
pub strict: bool,
pub dequantization_step: f32,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct CudaClassicSegment {
pub data_offset: u32,
pub data_length: u32,
pub start_coding_pass: u32,
pub end_coding_pass: u32,
pub use_arithmetic: bool,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug)]
pub struct CudaClassicDecodeTarget<'a> {
pub coefficients: &'a CudaDeviceBuffer,
pub jobs: &'a [CudaClassicCodeBlockJob],
pub segments: &'a [CudaClassicSegment],
pub output_words: usize,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub(crate) struct CudaClassicKernelJob {
pub(crate) output_ptr: u64,
pub(crate) coded_offset: u32,
pub(crate) coded_len: u32,
pub(crate) segment_offset: u32,
pub(crate) segment_count: u32,
pub(crate) scratch_offset: u32,
pub(crate) width: u32,
pub(crate) height: u32,
pub(crate) output_stride: u32,
pub(crate) output_offset: u32,
pub(crate) missing_msbs: u32,
pub(crate) total_bitplanes: u32,
pub(crate) number_of_coding_passes: u32,
pub(crate) sub_band_type: u32,
pub(crate) style_flags: u32,
pub(crate) strict: u32,
pub(crate) dequantization_step: f32,
}
#[repr(C)]
#[derive(Clone, Copy, Debug)]
pub(crate) struct CudaClassicKernelSegment {
pub(crate) data_offset: u32,
pub(crate) data_length: u32,
pub(crate) start_coding_pass: u32,
pub(crate) end_coding_pass: u32,
pub(crate) use_arithmetic: u32,
}
#[doc(hidden)]
#[repr(C)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct CudaClassicStatus {
pub code: u32,
pub detail: u32,
pub(crate) reserved0: u32,
pub(crate) reserved1: u32,
}
#[doc(hidden)]
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
pub struct CudaClassicDecodeStageTimings {
pub job_upload_us: u128,
pub table_upload_us: u128,
pub kernel_us: u128,
pub status_d2h_us: u128,
}
#[doc(hidden)]
#[derive(Clone, Debug)]
pub struct CudaClassicDecodeTableResources {
pub(crate) inner: Arc<CudaClassicDecodeTableResourceInner>,
}
#[derive(Debug)]
pub(crate) struct CudaClassicDecodeTableResourceInner {
pub(crate) tables: CudaDeviceBuffer,
}
impl CudaClassicDecodeTableResources {
pub(crate) fn is_owned_by(&self, context: &crate::CudaContext) -> bool {
self.inner.tables.is_owned_by(context)
}
}
#[repr(C)]
#[derive(Clone, Copy)]
pub(crate) struct CudaClassicKernelTables {
pub(crate) mq_qe: [u32; 47],
pub(crate) mq_transitions: [u32; 47],
pub(crate) sign_contexts: [u16; 256],
pub(crate) zero_contexts_ll_lh: [u8; 256],
pub(crate) zero_contexts_hl: [u8; 256],
pub(crate) zero_contexts_hh: [u8; 256],
}
pub(super) const CLASSIC_KERNEL_TABLES: CudaClassicKernelTables = CudaClassicKernelTables {
mq_qe: MQ_QE_VALUES,
mq_transitions: PACKED_MQ_TRANSITION_VALUES,
sign_contexts: PACKED_SIGN_CONTEXT_LOOKUP,
zero_contexts_ll_lh: ZERO_CTX_LL_LH_LOOKUP,
zero_contexts_hl: ZERO_CTX_HL_LOOKUP,
zero_contexts_hh: ZERO_CTX_HH_LOOKUP,
};