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:
parent
5c5d2f85bb
commit
3243132a3f
1 changed files with 8 additions and 20 deletions
28
src/shpk.rs
28
src/shpk.rs
|
@ -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()?;
|
||||||
|
|
Loading…
Add table
Reference in a new issue