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 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}