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}