Harbor

branch main
showing the latest snapshot on main
gl_convert.odin 3.3 KB · Plain text
backend/opengl/gl_convert.odin 0644 Raw
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
}