use crate::uastc::astc_pack::{encode_trits, set_bits, REV2};
#[derive(Clone, Copy, Default)]
pub struct AstcBlockParams {
pub endpoints: [u8; 10],
pub weights: [u8; 32],
}
pub fn pack_cem_12_weight_range2(blk: &AstcBlockParams) -> [u8; 16] {
let mut out = [0u8; 16];
out[0] = 0x42;
out[1] = 0x84;
out[2] = 0x01;
out[3] = 0x00;
out[4] = 0x00;
out[5] = 0x00;
out[6] = 0x00;
out[7] = 0xc0;
let mut bit_pos = 17i32;
let e0: [u8; 5] = blk.endpoints[0..5].try_into().unwrap();
let e1: [u8; 5] = blk.endpoints[5..10].try_into().unwrap();
encode_trits(&mut out, &e0, &mut bit_pos, 4);
encode_trits(&mut out, &e1, &mut bit_pos, 4);
for i in 0..32usize {
let ofs = (126 - i * 2) as u32;
out[(ofs >> 3) as usize] |= REV2[blk.weights[i] as usize] << (ofs & 7);
}
out
}
pub fn pack_cem_12_weight_range0(blk: &AstcBlockParams) -> [u8; 16] {
let mut out = [0u8; 16];
out[0] = 0x41;
out[1] = 0x84;
out[2] = 0x01;
out[11] = 0xc0;
let mut bit_pos = 17i32;
for i in 0..8usize {
set_bits(&mut out, &mut bit_pos, blk.endpoints[i] as u32, 8);
}
for i in 0..32usize {
let ofs = (127 - i) as u32;
out[(ofs >> 3) as usize] |= blk.weights[i] << (ofs & 7);
}
out
}
pub fn pack_cem_4_weight_range2(blk: &AstcBlockParams) -> [u8; 16] {
let mut out = [0u8; 16];
out[0] = 0x42;
out[1] = 0x84;
out[2] = 0x00;
out[3] = 0x00;
out[4] = 0x00;
out[5] = 0x00;
out[6] = 0x00;
out[7] = 0xc0;
let mut bit_pos = 17i32;
for i in 0..4usize {
set_bits(&mut out, &mut bit_pos, blk.endpoints[i] as u32, 8);
}
for i in 0..32usize {
let ofs = (126 - i * 2) as u32;
out[(ofs >> 3) as usize] |= REV2[blk.weights[i] as usize] << (ofs & 7);
}
out
}
pub fn pack_cem_8_weight_range2(blk: &AstcBlockParams) -> [u8; 16] {
let mut out = [0u8; 16];
out[0] = 0x42;
out[1] = 0x00;
out[2] = 0x01;
let mut bit_pos = 17i32;
for i in 0..6usize {
set_bits(&mut out, &mut bit_pos, blk.endpoints[i] as u32, 8);
}
for i in 0..16usize {
let ofs = (126 - i * 2) as u32;
out[(ofs >> 3) as usize] |= REV2[blk.weights[i] as usize] << (ofs & 7);
}
out
}