picard_core/
lib.rs

1#![allow(non_camel_case_types)]
2
3
4use buffer::ShaderBuffer;
5use thiserror::Error;
6//use dvle::DvleData;
7
8//pub mod alloc;
9//pub mod stuff;
10pub mod buffer;
11//pub mod dvle;
12mod utils;
13//mod maestro;
14const MAX_OPDESC: usize = 128;
15/*
16
17pub struct ShaderAssembler {
18    g_output_buf: Vec<u32>,
19    g_total_dvle_count: u32,
20    g_op_desc_count: u32,
21    g_op_desc_table: [u32; MAX_OPDESC],
22    dvle_table_iter: Vec<DvleData>
23}
24
25impl ShaderAssembler {
26    pub fn new() -> Self {
27        Self {
28            g_output_buf: Vec::new(),
29            g_total_dvle_count: 0,
30            g_op_desc_count: 0,
31            g_op_desc_table: [0; MAX_OPDESC],
32            dvle_table_iter: Vec::new()
33        }
34    }
35
36    /// Assembles a shader into a ShaderBuffer
37    pub fn assemble_shader(&mut self, shader: &str) -> Result<ShaderBuffer, PicassoError> {
38        let mut buf = ShaderBuffer::new();
39
40        let prog_size = self.g_output_buf.len() as u32;
41        let dvlp_size = 10*4 + prog_size*4 + self.g_op_desc_count*8;
42
43        // write DVLB header
44        buf.write_u32(0x424C5644)?; // DVLB
45        buf.write_u32(self.g_total_dvle_count)?; // Number of DVLEs
46
47        // Calculate and write DVLE offsets
48        let mut cur_off = 2*4 + self.g_total_dvle_count*4 + dvlp_size;
49        for dvle in &self.dvle_table_iter {
50            if dvle.no_dvle {
51                continue;
52            }
53
54            buf.write_u32(cur_off)?;
55            cur_off += 16*4;
56            cur_off += dvle.constant_count*20;
57            cur_off += dvle.output_count*8;
58            cur_off += dvle.uniform_count*8;
59            cur_off += dvle.symbol_size as u32;
60            cur_off  = (cur_off + 3) &! 3; // Word alignment
61        }
62
63        // Write DVLP header
64        buf.write_u32(0x504C5644)?; // DVLP
65        buf.write_u32(0)?; // version
66        buf.write_u32(10*4)?; // offset to shader binary blob
67        buf.write_u32(prog_size)?; // size of shader binary blob
68        buf.write_u32(10*4 + prog_size*4)?; // offset to opdesc table
69        buf.write_u32(self.g_op_desc_count)?; // number of opdescs
70        buf.write_u32(dvlp_size)?; // offset to symtable (TODO)
71        buf.write_u32(0)?; // ????
72        buf.write_u32(0)?; // ????
73        buf.write_u32(0)?; // ????
74
75        // Write program
76        for it in &self.g_output_buf {
77            buf.write_u32(*it)?; // TODO: CHECK THIS FOR CORRECTNESS
78        }
79
80        for i in 0..self.g_op_desc_count as usize { // ??? this is writing a DWORD (u64) but the array is of WORD (u32)
81            buf.write_u64(self.g_op_desc_table[i] as u64)?; 
82        }
83
84        for dvle in &self.dvle_table_iter {
85            buf.write_u32(0x454C5644)?; // DVLE
86            buf.write_u16(0x1002)?; // maybe version?
87            buf.write_u8(if dvle.is_geo_shader {1} else {0})?; // Shader type
88            buf.write_u8(if dvle.is_merge {1} else {0})?;
89            buf.write_u32(dvle.entry_start as u32)?; // offset to main
90            buf.write_u32(dvle.entry_end as u32)?; // offset to end of main
91            buf.write_u16(dvle.input_mask)?;
92            buf.write_u16(dvle.output_mask)?;
93            buf.write_u8(dvle.geo_shader_type)?;
94            buf.write_u8(dvle.geo_shader_fixed_start)?;
95            buf.write_u8(dvle.geo_shader_variable_num)?;
96            buf.write_u8(dvle.geo_shader_fixed_num)?;
97            buf.write_u32(cur_off)?; // offset to constant table
98            buf.write_u32(dvle.constant_count)?; // size of constant table
99            cur_off += dvle.constant_count*5*4;
100            buf.write_u32(cur_off)?; // offset to label table (TODO)
101            buf.write_u32(0)?; // size of label table (TODO)
102            buf.write_u32(cur_off)?; // offset to output table
103            buf.write_u32(dvle.output_count)?; // size of output table
104            cur_off += dvle.output_count*8;
105            buf.write_u32(cur_off)?; // offset to uniform table
106            buf.write_u32(dvle.uniform_count)?; // size of uniform table
107            cur_off += dvle.uniform_count*8;
108            buf.write_u32(cur_off)?; // offset to symbol table
109            buf.write_u32(dvle.symbol_size as u32)?; // size of symbol table
110
111            // Sort uniforms by position
112            //dvle.u
113
114            //TODO: CONTINUE
115        }
116        
117        Ok(buf)
118    }
119
120    /// Assembles multiple shaders into a ShaderBuffer
121    pub fn assemble_shaders(&mut self, shaders: Vec<&str>) -> Result<ShaderBuffer, PicassoError> {
122        Err(PicassoError::UnknownError)
123    }
124}*/
125
126
127#[derive(Debug, Error)]
128pub enum PicassoError {
129    /// Remove me when the port is done
130    #[error("Unknown Error")]
131    UnknownError,
132
133    #[error("I/O Error")]
134    IoError(#[from] std::io::Error),
135
136    #[error("Missing parameter")]
137    MissingParam,
138
139    #[error("Invalid instruction")]
140    InvalidInstruction,
141
142    #[error("Instruction outside block")]
143    InstructionOutsideBlock,
144}