summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLLLL Colonq <llll@colonq>2025-02-16 01:54:13 -0500
committerLLLL Colonq <llll@colonq>2025-02-16 01:54:13 -0500
commit097c060deed5abe914631c0b0ec3a23d17eb3d56 (patch)
treefc12eb853c735e9f9225a49785fa86a5b107696f
parent94fa96fe2091ee9f758b79b4c1a5d2c5ca60d1ac (diff)
Better error handling during shader compilation
-rw-r--r--src/assets/shaders/scale/frag.glsl5
-rw-r--r--src/shader.rs37
2 files changed, 26 insertions, 16 deletions
diff --git a/src/assets/shaders/scale/frag.glsl b/src/assets/shaders/scale/frag.glsl
index 2cd3c60..5fce547 100644
--- a/src/assets/shaders/scale/frag.glsl
+++ b/src/assets/shaders/scale/frag.glsl
@@ -6,8 +6,7 @@ uniform sampler2D texture_data;
in vec2 vertex_texcoord;
out vec4 frag_color;
-void main()
-{
+void main() {
vec4 texel = texture(texture_data, vertex_texcoord);
frag_color = texel;
-} \ No newline at end of file
+}
diff --git a/src/shader.rs b/src/shader.rs
index 408380d..d260881 100644
--- a/src/shader.rs
+++ b/src/shader.rs
@@ -14,32 +14,29 @@ pub struct Shader {
}
impl Shader {
- pub fn new_nolib(ctx: &context::Context, vsrc: &str, fsrc: &str) -> Self {
+ pub fn new_helper(ctx: &context::Context, vsrc: &str, fsrc: &str) -> Result<Self, String> {
unsafe {
- let program = ctx.gl.create_program()
- .expect("cannot create shader program");
+ let program = ctx.gl.create_program()?;
- let vert = ctx.gl.create_shader(glow::VERTEX_SHADER)
- .expect("cannot create shader");
+ let vert = ctx.gl.create_shader(glow::VERTEX_SHADER)?;
ctx.gl.shader_source(vert, &vsrc);
ctx.gl.compile_shader(vert);
if !ctx.gl.get_shader_compile_status(vert) {
- panic!(
+ return Err(format!(
"failed to compile vertex shader:\n{}",
ctx.gl.get_shader_info_log(vert)
- );
+ ));
}
ctx.gl.attach_shader(program, vert);
- let frag = ctx.gl.create_shader(glow::FRAGMENT_SHADER)
- .expect("cannot create shader");
+ let frag = ctx.gl.create_shader(glow::FRAGMENT_SHADER)?;
ctx.gl.shader_source(frag, &fsrc);
ctx.gl.compile_shader(frag);
if !ctx.gl.get_shader_compile_status(frag) {
- panic!(
+ return Err(format!(
"failed to compile fragment shader:\n{}",
ctx.gl.get_shader_info_log(frag)
- );
+ ));
}
ctx.gl.attach_shader(program, frag);
@@ -78,19 +75,33 @@ impl Shader {
}
}
- Self {
+ Ok(Self {
program,
uniforms: std::rc::Rc::new(uniforms),
- }
+ })
}
}
+ pub fn new_nolib(ctx: &context::Context, vsrc: &str, fsrc: &str) -> Self {
+ Self::new_helper(ctx, vsrc, fsrc).expect("failed to load shader")
+ }
+
pub fn new(ctx: &context::Context, vsrcstr: &str, fsrcstr: &str) -> Self {
let vsrc = format!("{}\n{}\n", COMMON_VERT, vsrcstr);
let fsrc = format!("{}\n{}\n", COMMON_FRAG, fsrcstr);
Self::new_nolib(ctx, &vsrc, &fsrc)
}
+ pub fn delete(&mut self, ctx: &context::Context) {
+ unsafe { ctx.gl.delete_program(self.program); }
+ }
+
+ pub fn replace(&mut self, ctx: &context::Context, vsrc: &str, fsrc: &str) -> Result<(), String> {
+ self.delete(ctx);
+ *self = Self::new_helper(ctx, vsrc, fsrc)?;
+ Ok(())
+ }
+
pub fn set_i32(&self, ctx: &context::Context, name: &str, val: i32) {
if let Some(loc) = self.uniforms.get(name) {
unsafe { ctx.gl.uniform_1_i32(Some(loc), val) }