grafix_toolbox/kit/opengl/shader/
object.rs1use super::*;
2
3#[derive(Debug)]
4pub enum ShaderObj {
5 Vertex(Object<ShaderVert>),
6 Fragment(Object<ShaderPix>),
7 Geometry(Object<ShaderGeom>),
8 Compute(Object<ShaderComp>),
9 TessCtrl(Object<ShaderTCtrl>),
10 TessEval(Object<ShaderTEval>),
11}
12impl ShaderObj {
13 pub fn new(name: &str, src: &CString) -> Res<Self> {
14 let obj = match slice((name, 2)) {
15 "vs" => Vertex(Def()),
16 "ps" => Fragment(Def()),
17 "gs" => Geometry(Def()),
18 "cs" => Compute(Def()),
19 "tc" => TessCtrl(Def()),
20 "te" => TessEval(Def()),
21 _ => Err(format!("Shader name {name:?} should start with vs|ps|gs|cs|tc|te according to type"))?,
22 };
23
24 let o = obj.obj();
25 GL!(gl::ShaderSource(o, 1, &src.as_ptr(), ptr::null()));
26 GL!(gl::CompileShader(o));
27 let mut status: i32 = 0;
28 GL!(gl::GetShaderiv(o, gl::COMPILE_STATUS, &mut status));
29 if GLbool::to(status) != gl::TRUE {
30 Err(format!("Error compiling {} shader {name:?}\n\n{}", obj.name(), parsing::print_shader_log(o)))?
31 }
32
33 Ok(obj)
34 }
35 pub fn obj(&self) -> u32 {
36 match self {
37 Vertex(o) => o.obj,
38 Fragment(o) => o.obj,
39 Geometry(o) => o.obj,
40 Compute(o) => o.obj,
41 TessCtrl(o) => o.obj,
42 TessEval(o) => o.obj,
43 }
44 }
45 pub fn valid(name: &str) -> Res<()> {
46 match slice((name, 2)) {
47 "vs" | "ps" | "gs" | "cs" | "tc" | "te" => Ok(()),
48 _ => Err(format!("Shader name '{name}' should start with vs|ps|gs|cs|tc|te according to type")),
49 }
50 }
51 fn name(&self) -> &str {
52 match self {
53 Vertex(_) => "vertex",
54 Fragment(_) => "pixel",
55 Geometry(_) => "geometry",
56 Compute(_) => "compute",
57 TessCtrl(_) => "tess. control",
58 TessEval(_) => "tess. eval",
59 }
60 }
61}
62use ShaderObj::*;