81 lines
1.9 KiB
Odin
81 lines
1.9 KiB
Odin
package renderer
|
|
|
|
import os "core:os/os2"
|
|
|
|
Shader :: struct {
|
|
type: Shader_Type,
|
|
backend: Shader_Backend,
|
|
}
|
|
|
|
Shader_Program :: struct {
|
|
vertex_shader, fragment_shader: Shader,
|
|
backend: Shader_Program_Backend,
|
|
}
|
|
|
|
Shader_Type :: enum {
|
|
Vertex,
|
|
Fragment,
|
|
// ..
|
|
}
|
|
|
|
create_shader :: proc(renderer: ^Renderer, type: Shader_Type, path: string) -> (Shader, bool) {
|
|
bytes, error := os.read_entire_file_from_path(path, context.allocator)
|
|
if error != nil {
|
|
return {}, false
|
|
}
|
|
defer delete(bytes)
|
|
|
|
s: Shader
|
|
s.type = type
|
|
|
|
when RENDER_BACKEND_OPENGL {
|
|
shader_opengl, ok := opengl_create_shader(renderer, type, bytes)
|
|
if !ok {
|
|
return {}, false
|
|
}
|
|
s.backend = shader_opengl
|
|
}
|
|
else {
|
|
#assert(false)
|
|
}
|
|
|
|
return s, true
|
|
}
|
|
|
|
delete_shader :: proc(renderer: ^Renderer, shader: ^Shader) {
|
|
assert(shader != nil)
|
|
|
|
when RENDER_BACKEND_OPENGL {
|
|
opengl_delete_shader(renderer, shader)
|
|
}
|
|
}
|
|
|
|
create_shader_program :: proc(renderer: ^Renderer, vertex_shader, fragment_shader: ^Shader) -> (Shader_Program, bool) {
|
|
assert(vertex_shader != nil)
|
|
assert(fragment_shader != nil)
|
|
|
|
p: Shader_Program
|
|
p.vertex_shader = vertex_shader^
|
|
p.fragment_shader = fragment_shader^
|
|
|
|
when RENDER_BACKEND_OPENGL {
|
|
program_opengl, ok := opengl_create_shader_program(renderer, vertex_shader, fragment_shader)
|
|
if !ok {
|
|
return {}, false
|
|
}
|
|
p.backend = program_opengl
|
|
}
|
|
else {
|
|
#assert(false)
|
|
}
|
|
|
|
return p, true
|
|
}
|
|
|
|
delete_shader_program :: proc(renderer: ^Renderer, shader_program: ^Shader_Program) {
|
|
assert(shader_program != nil)
|
|
|
|
when RENDER_BACKEND_OPENGL {
|
|
opengl_delete_shader_program(renderer, shader_program)
|
|
}
|
|
} |