Shader-program reloading

This commit is contained in:
2026-02-01 10:01:54 +01:00
parent b6a32ebe7f
commit abe245294d

View File

@@ -1,5 +1,6 @@
package renderer package renderer
import "core:fmt"
import os "core:os/os2" import os "core:os/os2"
Shader :: struct { Shader :: struct {
@@ -9,7 +10,7 @@ Shader :: struct {
} }
Shader_Program :: struct { Shader_Program :: struct {
vertex_shader, fragment_shader: Shader, vertex_shader, fragment_shader: ^Shader,
backend: Shader_Program_Backend, backend: Shader_Program_Backend,
} }
@@ -20,6 +21,7 @@ Shader_Type :: enum {
} }
create_shader :: proc(renderer: ^Renderer, type: Shader_Type, path: string) -> (Shader, bool) { create_shader :: proc(renderer: ^Renderer, type: Shader_Type, path: string) -> (Shader, bool) {
fmt.printfln("Creating shader")
bytes, error := os.read_entire_file_from_path(path, context.allocator) bytes, error := os.read_entire_file_from_path(path, context.allocator)
if error != nil { if error != nil {
return {}, false return {}, false
@@ -36,6 +38,7 @@ create_shader :: proc(renderer: ^Renderer, type: Shader_Type, path: string) -> (
return {}, false return {}, false
} }
s.backend = shader_opengl s.backend = shader_opengl
fmt.printfln("Backend id: %v", s.backend)
} }
else { else {
#assert(false) #assert(false)
@@ -57,8 +60,8 @@ create_shader_program :: proc(renderer: ^Renderer, vertex_shader, fragment_shade
assert(fragment_shader != nil) assert(fragment_shader != nil)
p: Shader_Program p: Shader_Program
p.vertex_shader = vertex_shader^ p.vertex_shader = vertex_shader
p.fragment_shader = fragment_shader^ p.fragment_shader = fragment_shader
when RENDER_BACKEND_OPENGL { when RENDER_BACKEND_OPENGL {
program_opengl, ok := opengl_create_shader_program(renderer, vertex_shader, fragment_shader) program_opengl, ok := opengl_create_shader_program(renderer, vertex_shader, fragment_shader)
@@ -80,4 +83,42 @@ delete_shader_program :: proc(renderer: ^Renderer, shader_program: ^Shader_Progr
when RENDER_BACKEND_OPENGL { when RENDER_BACKEND_OPENGL {
opengl_delete_shader_program(renderer, shader_program) opengl_delete_shader_program(renderer, shader_program)
} }
} }
reload_shader_program :: proc(renderer: ^Renderer, p: ^Shader_Program) -> bool {
assert(renderer != nil)
assert(p != nil)
assert(p.vertex_shader != nil)
assert(p.fragment_shader != nil)
new_vs, vs_ok := create_shader(renderer, p.vertex_shader.type, p.vertex_shader.path)
if !vs_ok {
fmt.printfln("Failed to reload vertex shader")
return false
}
new_fs, fs_ok := create_shader(renderer, p.fragment_shader.type, p.fragment_shader.path)
if !fs_ok {
fmt.printfln("Failed to reload fragment shader")
delete_shader(renderer, &new_vs)
return false
}
new_program, program_ok := create_shader_program(renderer, &new_vs, &new_fs)
if !program_ok {
fmt.printfln("Failed to relink shader program")
delete_shader(renderer, &new_vs)
delete_shader(renderer, &new_fs)
return false
}
delete_shader_program(renderer, p)
delete_shader(renderer, p.vertex_shader)
delete_shader(renderer, p.fragment_shader)
p.backend = new_program.backend
p.vertex_shader^ = new_vs
p.fragment_shader^ = new_fs
return true
}