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) } }