package opengl_backend import bk ".." import gl "vendor:OpenGL" to_gl_topology :: proc(topology: bk.Topology) -> u32 { switch topology { case .Triangle_List: return gl.TRIANGLES case .Triangle_Strip: return gl.TRIANGLE_STRIP case .Line_List: return gl.LINES case .Point_List: return gl.POINTS } return gl.TRIANGLES } to_gl_cull_face :: proc(mode: bk.Cull_Mode) -> u32 { switch mode { case .Front: return gl.FRONT case .Back: return gl.BACK case .Front_And_Back: return gl.FRONT_AND_BACK case .None: return gl.BACK } return gl.BACK } to_gl_front_face :: proc(face: bk.Front_Face) -> u32 { switch face { case .Counter_Clockwise: return gl.CCW case .Clockwise: return gl.CW } return gl.CCW } vertex_format_parts :: proc(format: bk.Vertex_Format) -> (size: i32, typ: u32) { switch format { case .Float2: return 2, gl.FLOAT case .Float3: return 3, gl.FLOAT case .Float4: return 4, gl.FLOAT } return 4, gl.FLOAT } to_gl_filter :: proc(filter: bk.Filter) -> i32 { switch filter { case .Nearest: return gl.NEAREST case .Linear: return gl.LINEAR } return gl.LINEAR } to_gl_address_mode :: proc(mode: bk.Address_Mode) -> i32 { switch mode { case .Repeat: return gl.REPEAT case .Clamp_To_Edge: return gl.CLAMP_TO_EDGE case .Clamp_To_Border: return gl.CLAMP_TO_BORDER } return gl.CLAMP_TO_EDGE } to_gl_blend_factor :: proc(factor: bk.Blend_Factor) -> u32 { switch factor { case .Zero: return gl.ZERO case .One: return gl.ONE case .Src_Alpha: return gl.SRC_ALPHA case .One_Minus_Src_Alpha: return gl.ONE_MINUS_SRC_ALPHA } return gl.ONE } to_gl_compare_func :: proc(op: bk.Compare_Op) -> i32 { switch op { case .Never: return gl.NEVER case .Less: return gl.LESS case .Less_Or_Equal: return gl.LEQUAL case .Equal: return gl.EQUAL case .Greater_Or_Equal: return gl.GEQUAL case .Greater: return gl.GREATER case .Not_Equal: return gl.NOTEQUAL case .Always: return gl.ALWAYS } return gl.ALWAYS } to_gl_stencil_op :: proc(op: bk.Stencil_Op) -> i32 { switch op { case .Keep: return gl.KEEP case .Zero: return gl.ZERO case .Replace: return gl.REPLACE case .Increment_Clamp: return gl.INCR case .Decrement_Clamp: return gl.DECR case .Invert: return gl.INVERT } return gl.KEEP } format_pixel_size :: proc(format: bk.Format) -> u32 { switch format { case .R8G8B8A8_SRGB, .R8G8B8A8_UNORM, .B8G8R8A8_SRGB: return 4 case .D32_SFLOAT: return 4 case .D32_SFLOAT_S8_UINT, .D24_UNORM_S8_UINT: return 4 case .Undefined: return 0 } return 0 } gl_format_info :: proc(format: bk.Format) -> (internal, external, typ: u32, ok: bool) { switch format { case .R8G8B8A8_SRGB: return gl.SRGB8_ALPHA8, gl.RGBA, gl.UNSIGNED_BYTE, true case .R8G8B8A8_UNORM: return gl.RGBA8, gl.RGBA, gl.UNSIGNED_BYTE, true case .B8G8R8A8_SRGB: return gl.SRGB8_ALPHA8, gl.BGRA, gl.UNSIGNED_BYTE, true case .D32_SFLOAT: return gl.DEPTH_COMPONENT32F, gl.DEPTH_COMPONENT, gl.FLOAT, true case .D24_UNORM_S8_UINT: return gl.DEPTH24_STENCIL8, gl.DEPTH_STENCIL, gl.UNSIGNED_INT_24_8, true case .D32_SFLOAT_S8_UINT: return gl.DEPTH32F_STENCIL8, gl.DEPTH_STENCIL, gl.FLOAT_32_UNSIGNED_INT_24_8_REV, true case .Undefined: return 0, 0, 0, false } return 0, 0, 0, false } descriptor_binding_point :: proc(group, binding: u32) -> u32 { return group * OPENGL_BINDINGS_PER_GROUP + binding }