j2k_cuda_runtime/
build_flags.rs1use crate::driver::CuResult;
2#[cfg(j2k_cuda_oxide_enabled)]
3use crate::error::CudaError;
4use std::{os::raw::c_uint, sync::OnceLock};
5
6pub(crate) const CUDA_SUCCESS: CuResult = 0;
7
8pub(crate) const PINNED_POOLED_I16_UPLOAD_MAX_BYTES: usize = 4 * 1024 * 1024;
9
10pub(crate) const DWT97_ROW_LIFT_MAX_WIDTH: i32 = 1024;
11
12pub(crate) const DWT97_ROW_LIFT_COOP_THREADS_X: c_uint = 128;
13
14pub(crate) const DWT97_ROW_LIFT_COOP_ROWS_PER_BLOCK: c_uint = 4;
15
16pub(crate) const CUDA_IDWT_TRACE_ENV_VAR: &str = "J2K_CUDA_IDWT_TRACE";
17
18#[cfg(j2k_cuda_oxide_enabled)]
19pub(crate) const REQUIRE_CUDA_OXIDE_BUILD_ENV_VAR: &str = "J2K_REQUIRE_CUDA_OXIDE_BUILD";
20
21pub(crate) const DWT97_FUSED_COLUMN_QUANTIZE_DISABLE_ENV_VAR: &str =
22 "J2K_CUDA_DISABLE_DWT97_FUSED_COLUMN_QUANTIZE";
23
24pub(crate) static CUDA_STAGE_TIMINGS_DISABLED: OnceLock<bool> = OnceLock::new();
25
26pub(crate) static DWT97_FUSED_COLUMN_QUANTIZE_DISABLED: OnceLock<bool> = OnceLock::new();
27
28pub(crate) fn cuda_stage_timings_disabled() -> bool {
29 *CUDA_STAGE_TIMINGS_DISABLED
30 .get_or_init(|| std::env::var_os("J2K_CUDA_DISABLE_STAGE_TIMINGS").is_some())
31}
32
33pub(crate) fn dwt97_fused_column_quantize_disabled() -> bool {
34 *DWT97_FUSED_COLUMN_QUANTIZE_DISABLED
35 .get_or_init(|| std::env::var_os(DWT97_FUSED_COLUMN_QUANTIZE_DISABLE_ENV_VAR).is_some())
36}
37
38#[cfg(j2k_cuda_oxide_enabled)]
39fn ensure_cuda_oxide_ptx_built(built: bool, display_name: &str) -> Result<(), CudaError> {
40 if built {
41 Ok(())
42 } else {
43 Err(CudaError::InvalidArgument {
44 message: format!(
45 "{display_name} PTX was not built; set {REQUIRE_CUDA_OXIDE_BUILD_ENV_VAR} on a Linux cuda-oxide host to require it"
46 ),
47 })
48 }
49}
50
51macro_rules! cuda_oxide_ptx_guard {
52 (feature = $feature:literal, $ensure_fn:ident, $built_const:ident, $display_name:literal, $built_cfg:meta) => {
53 #[cfg(feature = $feature)]
54 pub(crate) fn $ensure_fn() -> Result<(), CudaError> {
55 ensure_cuda_oxide_ptx_built($built_const, $display_name)
56 }
57
58 #[cfg(feature = $feature)]
59 pub(crate) const $built_const: bool = cfg!($built_cfg);
60 };
61}
62
63cuda_oxide_ptx_guard!(
64 feature = "cuda-oxide-copy-u8",
65 ensure_cuda_oxide_copy_u8_ptx_built,
66 CUDA_OXIDE_COPY_U8_PTX_BUILT,
67 "cuda-oxide CopyU8",
68 j2k_cuda_oxide_copy_u8_built
69);
70cuda_oxide_ptx_guard!(
71 feature = "cuda-oxide-j2k-encode",
72 ensure_cuda_oxide_j2k_encode_ptx_built,
73 CUDA_OXIDE_J2K_ENCODE_PTX_BUILT,
74 "cuda-oxide J2K encode",
75 j2k_cuda_oxide_j2k_encode_built
76);
77cuda_oxide_ptx_guard!(
78 feature = "cuda-oxide-j2k-decode-store",
79 ensure_cuda_oxide_j2k_decode_store_ptx_built,
80 CUDA_OXIDE_J2K_DECODE_STORE_PTX_BUILT,
81 "cuda-oxide J2K decode store",
82 j2k_cuda_oxide_j2k_decode_store_built
83);
84cuda_oxide_ptx_guard!(
85 feature = "cuda-oxide-j2k-classic-decode",
86 ensure_cuda_oxide_j2k_classic_decode_ptx_built,
87 CUDA_OXIDE_J2K_CLASSIC_DECODE_PTX_BUILT,
88 "cuda-oxide classic J2K decode",
89 j2k_cuda_oxide_j2k_classic_decode_built
90);
91cuda_oxide_ptx_guard!(
92 feature = "cuda-oxide-j2k-dequantize",
93 ensure_cuda_oxide_j2k_dequantize_ptx_built,
94 CUDA_OXIDE_J2K_DEQUANTIZE_PTX_BUILT,
95 "cuda-oxide J2K dequantize",
96 j2k_cuda_oxide_j2k_dequantize_built
97);
98cuda_oxide_ptx_guard!(
99 feature = "cuda-oxide-j2k-idwt",
100 ensure_cuda_oxide_j2k_idwt_ptx_built,
101 CUDA_OXIDE_J2K_IDWT_PTX_BUILT,
102 "cuda-oxide J2K IDWT",
103 j2k_cuda_oxide_j2k_idwt_built
104);
105cuda_oxide_ptx_guard!(
106 feature = "cuda-oxide-j2k-ml",
107 ensure_cuda_oxide_j2k_ml_ptx_built,
108 CUDA_OXIDE_J2K_ML_PTX_BUILT,
109 "cuda-oxide j2k-ml",
110 j2k_cuda_oxide_j2k_ml_built
111);
112cuda_oxide_ptx_guard!(
113 feature = "cuda-oxide-transcode",
114 ensure_cuda_oxide_transcode_ptx_built,
115 CUDA_OXIDE_TRANSCODE_PTX_BUILT,
116 "cuda-oxide transcode",
117 j2k_cuda_oxide_transcode_built
118);
119cuda_oxide_ptx_guard!(
120 feature = "cuda-oxide-htj2k-decode",
121 ensure_cuda_oxide_htj2k_decode_ptx_built,
122 CUDA_OXIDE_HTJ2K_DECODE_PTX_BUILT,
123 "cuda-oxide HTJ2K decode",
124 j2k_cuda_oxide_htj2k_decode_built
125);
126cuda_oxide_ptx_guard!(
127 feature = "cuda-oxide-htj2k-encode",
128 ensure_cuda_oxide_htj2k_encode_ptx_built,
129 CUDA_OXIDE_HTJ2K_ENCODE_PTX_BUILT,
130 "cuda-oxide HTJ2K encode",
131 j2k_cuda_oxide_htj2k_encode_built
132);
133cuda_oxide_ptx_guard!(
134 feature = "cuda-oxide-jpeg-decode",
135 ensure_cuda_oxide_jpeg_decode_ptx_built,
136 CUDA_OXIDE_JPEG_DECODE_PTX_BUILT,
137 "cuda-oxide JPEG decode",
138 j2k_cuda_oxide_jpeg_decode_built
139);
140cuda_oxide_ptx_guard!(
141 feature = "cuda-oxide-jpeg-encode",
142 ensure_cuda_oxide_jpeg_encode_ptx_built,
143 CUDA_OXIDE_JPEG_ENCODE_PTX_BUILT,
144 "cuda-oxide JPEG encode",
145 j2k_cuda_oxide_jpeg_encode_built
146);
147
148#[must_use]
152pub fn transcode_kernels_built() -> bool {
153 #[cfg(feature = "cuda-oxide-transcode")]
154 {
155 CUDA_OXIDE_TRANSCODE_PTX_BUILT
156 }
157 #[cfg(not(feature = "cuda-oxide-transcode"))]
158 {
159 false
160 }
161}