ispc_tex/
bc6h.rs

1use crate::bindings::kernel;
2use crate::RgbaSurface;
3
4#[derive(Debug, Copy, Clone)]
5pub struct EncodeSettings {
6    pub slow_mode: bool,
7    pub fast_mode: bool,
8    pub refine_iterations_1p: u32,
9    pub refine_iterations_2p: u32,
10    pub fast_skip_threshold: u32,
11}
12
13#[inline(always)]
14pub fn calc_output_size(width: u32, height: u32) -> usize {
15    // BC6H uses a fixed block size of 16 bytes (128 bits) and a fixed tile size of 4x4 texels.
16    let block_count = crate::divide_up_by_multiple(width * height, 16) as usize;
17    block_count * 16
18}
19
20pub fn compress_blocks(settings: &EncodeSettings, surface: &RgbaSurface) -> Vec<u8> {
21    let output_size = calc_output_size(surface.width, surface.height);
22    let mut output = vec![0u8; output_size];
23    compress_blocks_into(settings, surface, &mut output);
24    output
25}
26
27pub fn compress_blocks_into(settings: &EncodeSettings, surface: &RgbaSurface, blocks: &mut [u8]) {
28    assert_eq!(
29        blocks.len(),
30        calc_output_size(surface.width, surface.height)
31    );
32    let mut surface = kernel::rgba_surface {
33        width: surface.width as i32,
34        height: surface.height as i32,
35        stride: surface.stride as i32,
36        ptr: surface.data.as_ptr() as *mut u8,
37    };
38    let mut settings = kernel::bc6h_enc_settings {
39        slow_mode: settings.slow_mode,
40        fast_mode: settings.fast_mode,
41        refineIterations_1p: settings.refine_iterations_1p as i32,
42        refineIterations_2p: settings.refine_iterations_2p as i32,
43        fastSkipTreshold: settings.fast_skip_threshold as i32,
44    };
45
46    unsafe {
47        kernel::CompressBlocksBC6H_ispc(&mut surface, blocks.as_mut_ptr(), &mut settings);
48    }
49}
50
51#[inline(always)]
52pub fn very_fast_settings() -> EncodeSettings {
53    EncodeSettings {
54        slow_mode: false,
55        fast_mode: true,
56        fast_skip_threshold: 0,
57        refine_iterations_1p: 0,
58        refine_iterations_2p: 0,
59    }
60}
61
62#[inline(always)]
63pub fn very_settings() -> EncodeSettings {
64    EncodeSettings {
65        slow_mode: false,
66        fast_mode: true,
67        fast_skip_threshold: 2,
68        refine_iterations_1p: 0,
69        refine_iterations_2p: 1,
70    }
71}
72
73#[inline(always)]
74pub fn basic_settings() -> EncodeSettings {
75    EncodeSettings {
76        slow_mode: false,
77        fast_mode: false,
78        fast_skip_threshold: 4,
79        refine_iterations_1p: 2,
80        refine_iterations_2p: 2,
81    }
82}
83
84#[inline(always)]
85pub fn slow_settings() -> EncodeSettings {
86    EncodeSettings {
87        slow_mode: true,
88        fast_mode: false,
89        fast_skip_threshold: 10,
90        refine_iterations_1p: 2,
91        refine_iterations_2p: 2,
92    }
93}
94
95#[inline(always)]
96pub fn very_slow_settings() -> EncodeSettings {
97    EncodeSettings {
98        slow_mode: true,
99        fast_mode: false,
100        fast_skip_threshold: 32,
101        refine_iterations_1p: 2,
102        refine_iterations_2p: 2,
103    }
104}