1
Fork 0
mirror of https://github.com/redstrate/Physis.git synced 2025-04-20 11:47:46 +00:00

Fix shader package reading

I had broken something when making shader parameters work, now it's
unbroken, and it's able to read bytecode again.
This commit is contained in:
Joshua Goins 2023-10-13 14:52:07 -04:00
parent 5c5d2f85bb
commit 3243132a3f

View file

@ -32,7 +32,6 @@ struct ShaderParameterReference {
#[derive(Debug)] #[derive(Debug)]
#[allow(unused)] #[allow(unused)]
struct ShaderHeader { struct ShaderHeader {
#[br(dbg)]
data_offset: i32, data_offset: i32,
data_length: i32, data_length: i32,
@ -41,7 +40,6 @@ struct ShaderHeader {
num_resource: i16, num_resource: i16,
#[br(count = num_scalar)] #[br(count = num_scalar)]
#[br(dbg)]
scalar_parameters: Vec<ShaderParameterReference>, scalar_parameters: Vec<ShaderParameterReference>,
#[br(count = num_resource)] #[br(count = num_resource)]
resource_parameters: Vec<ShaderParameterReference>, resource_parameters: Vec<ShaderParameterReference>,
@ -64,20 +62,16 @@ struct SHPKHeader {
shader_data_offset: i32, shader_data_offset: i32,
parameter_list_offset: i32, parameter_list_offset: i32,
vertex_shader_count: i32, vertex_shader_count: i32,
#[br(dbg)]
pixel_shader_count: i32, pixel_shader_count: i32,
#[br(pad_before = 4)] #[br(pad_before = 4)]
#[br(dbg)]
c1: i32, c1: i32,
// 8 bytes... // 8 bytes...
#[br(dbg)]
scalar_parameter_count: i32, scalar_parameter_count: i32,
resource_parameter_count: i32, resource_parameter_count: i32,
#[br(pad_before = 24)] #[br(pad_before = 24)]
#[br(dbg)]
#[br(count = vertex_shader_count)] #[br(count = vertex_shader_count)]
vertex_shader_headers: Vec<ShaderHeader>, vertex_shader_headers: Vec<ShaderHeader>,
#[br(count = pixel_shader_count)] #[br(count = pixel_shader_count)]
@ -96,29 +90,23 @@ pub struct ShaderPackage {
impl ShaderPackage { impl ShaderPackage {
pub fn from_existing(buffer: &MemoryBuffer) -> Option<ShaderPackage> { pub fn from_existing(buffer: &MemoryBuffer) -> Option<ShaderPackage> {
let mut cursor = Cursor::new(buffer); let mut cursor = Cursor::new(buffer);
let header = SHPKHeader::read(&mut cursor).unwrap(); let shpk_header = SHPKHeader::read(&mut cursor).unwrap();
println!("{:#?}", header);
println!("before parameter cursor: {}", cursor.position());
// shader parameters // shader parameters
cursor.seek(SeekFrom::Current((header.c1 as u64 * 0x08) as i64)).ok()?; cursor.seek(SeekFrom::Current((shpk_header.c1 as u64 * 0x08) as i64)).ok()?;
println!("cursor: {}", cursor.position());
for _ in 0..header.scalar_parameter_count { for _ in 0..shpk_header.scalar_parameter_count {
let header = ParameterHeader::read_le(&mut cursor); let header = ParameterHeader::read_le(&mut cursor);
println!("{:#?}", header);
} }
for _ in 0..header.resource_parameter_count { for _ in 0..shpk_header.resource_parameter_count {
let header = ParameterHeader::read_le(&mut cursor); let header = ParameterHeader::read_le(&mut cursor);
println!("{:#?}", header);
} }
// shader bytecode // shader bytecode
let mut vertex_shaders: Vec<Shader> = Vec::new(); let mut vertex_shaders: Vec<Shader> = Vec::new();
for header in header.vertex_shader_headers { for header in shpk_header.vertex_shader_headers {
cursor.seek(SeekFrom::Start(header.data_offset as u64)).ok()?; cursor.seek(SeekFrom::Start((shpk_header.shader_data_offset + header.data_offset + 8) as u64)).ok()?;
let mut bytecode = vec![0u8; header.data_length as usize]; let mut bytecode = vec![0u8; header.data_length as usize];
cursor.read_exact(bytecode.as_mut_slice()).ok()?; cursor.read_exact(bytecode.as_mut_slice()).ok()?;
@ -129,8 +117,8 @@ impl ShaderPackage {
} }
let mut pixel_shaders: Vec<Shader> = Vec::new(); let mut pixel_shaders: Vec<Shader> = Vec::new();
for header in header.pixel_shader_headers { for header in shpk_header.pixel_shader_headers {
cursor.seek(SeekFrom::Start(header.data_offset as u64)).ok()?; cursor.seek(SeekFrom::Start((shpk_header.shader_data_offset + header.data_offset) as u64)).ok()?;
let mut bytecode = vec![0u8; header.data_length as usize]; let mut bytecode = vec![0u8; header.data_length as usize];
cursor.read_exact(bytecode.as_mut_slice()).ok()?; cursor.read_exact(bytecode.as_mut_slice()).ok()?;