1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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
}