A game framework written with osu! in mind.
1// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
2// See the LICENCE file in the repository root for full licence text.
3
4using System;
5using osuTK.Graphics.ES30;
6
7namespace osu.Framework.Graphics.OpenGL.Buffers
8{
9 public static class BufferFormatExtensions
10 {
11 public static FramebufferAttachment GetAttachmentType(this RenderbufferInternalFormat format)
12 {
13 switch (format)
14 {
15 case RenderbufferInternalFormat.R8:
16 case RenderbufferInternalFormat.R8Snorm:
17 case RenderbufferInternalFormat.R16f:
18 case RenderbufferInternalFormat.R32f:
19 case RenderbufferInternalFormat.R8ui:
20 case RenderbufferInternalFormat.R8i:
21 case RenderbufferInternalFormat.R16ui:
22 case RenderbufferInternalFormat.R16i:
23 case RenderbufferInternalFormat.R32ui:
24 case RenderbufferInternalFormat.R32i:
25 case RenderbufferInternalFormat.Rg8:
26 case RenderbufferInternalFormat.Rg8Snorm:
27 case RenderbufferInternalFormat.Rg16f:
28 case RenderbufferInternalFormat.Rg32f:
29 case RenderbufferInternalFormat.Rg8ui:
30 case RenderbufferInternalFormat.Rg8i:
31 case RenderbufferInternalFormat.Rg16ui:
32 case RenderbufferInternalFormat.Rg16i:
33 case RenderbufferInternalFormat.Rg32ui:
34 case RenderbufferInternalFormat.Rg32i:
35 case RenderbufferInternalFormat.Rgb8:
36 case RenderbufferInternalFormat.Srgb8:
37 case RenderbufferInternalFormat.Rgb565:
38 case RenderbufferInternalFormat.Rgb8Snorm:
39 case RenderbufferInternalFormat.R11fG11fB10f:
40 case RenderbufferInternalFormat.Rgb9E5:
41 case RenderbufferInternalFormat.Rgb16f:
42 case RenderbufferInternalFormat.Rgb32f:
43 case RenderbufferInternalFormat.Rgb8ui:
44 case RenderbufferInternalFormat.Rgb8i:
45 case RenderbufferInternalFormat.Rgb16ui:
46 case RenderbufferInternalFormat.Rgb16i:
47 case RenderbufferInternalFormat.Rgb32ui:
48 case RenderbufferInternalFormat.Rgb32i:
49 case RenderbufferInternalFormat.Rgba8:
50 case RenderbufferInternalFormat.Srgb8Alpha8:
51 case RenderbufferInternalFormat.Rgba8Snorm:
52 case RenderbufferInternalFormat.Rgb5A1:
53 case RenderbufferInternalFormat.Rgba4:
54 case RenderbufferInternalFormat.Rgb10A2:
55 case RenderbufferInternalFormat.Rgba16f:
56 case RenderbufferInternalFormat.Rgba32f:
57 case RenderbufferInternalFormat.Rgba8i:
58 case RenderbufferInternalFormat.Rgba8ui:
59 case RenderbufferInternalFormat.Rgb10A2ui:
60 case RenderbufferInternalFormat.Rgba16i:
61 case RenderbufferInternalFormat.Rgba16ui:
62 case RenderbufferInternalFormat.Rgba32i:
63 case RenderbufferInternalFormat.Rgba32ui:
64 return FramebufferAttachment.ColorAttachment0;
65
66 case RenderbufferInternalFormat.DepthComponent16:
67 case RenderbufferInternalFormat.DepthComponent24:
68 case RenderbufferInternalFormat.DepthComponent32f:
69 return FramebufferAttachment.DepthAttachment;
70
71 case RenderbufferInternalFormat.StencilIndex8:
72 return FramebufferAttachment.StencilAttachment;
73
74 case RenderbufferInternalFormat.Depth24Stencil8:
75 case RenderbufferInternalFormat.Depth32fStencil8:
76 return FramebufferAttachment.DepthStencilAttachment;
77
78 default:
79 throw new InvalidOperationException($"{format} is not a valid {nameof(RenderbufferInternalFormat)} type.");
80 }
81 }
82
83 public static int GetBytesPerPixel(this RenderbufferInternalFormat format)
84 {
85 // cross-reference: https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml
86 switch (format)
87 {
88 // GL_RED
89 case RenderbufferInternalFormat.R8:
90 case RenderbufferInternalFormat.R8Snorm:
91 return 1;
92
93 case RenderbufferInternalFormat.R16f:
94 return 2;
95
96 case RenderbufferInternalFormat.R32f:
97 return 4;
98
99 // GL_RED_INTEGER
100 case RenderbufferInternalFormat.R8ui:
101 case RenderbufferInternalFormat.R8i:
102 return 1;
103
104 case RenderbufferInternalFormat.R16ui:
105 case RenderbufferInternalFormat.R16i:
106 return 2;
107
108 case RenderbufferInternalFormat.R32ui:
109 case RenderbufferInternalFormat.R32i:
110 return 4;
111
112 // GL_RG
113 case RenderbufferInternalFormat.Rg8:
114 case RenderbufferInternalFormat.Rg8Snorm:
115 return 2;
116
117 case RenderbufferInternalFormat.Rg16f:
118 return 4;
119
120 case RenderbufferInternalFormat.Rg32f:
121 return 8;
122
123 // GL_RG_INTEGER
124 case RenderbufferInternalFormat.Rg8ui:
125 case RenderbufferInternalFormat.Rg8i:
126 return 2;
127
128 case RenderbufferInternalFormat.Rg16ui:
129 case RenderbufferInternalFormat.Rg16i:
130 return 4;
131
132 case RenderbufferInternalFormat.Rg32ui:
133 case RenderbufferInternalFormat.Rg32i:
134 return 8;
135
136 // GL_RGB
137 case RenderbufferInternalFormat.Rgb8:
138 case RenderbufferInternalFormat.Srgb8:
139 return 3;
140
141 case RenderbufferInternalFormat.Rgb565:
142 return 2;
143
144 case RenderbufferInternalFormat.Rgb8Snorm:
145 return 3;
146
147 case RenderbufferInternalFormat.R11fG11fB10f:
148 case RenderbufferInternalFormat.Rgb9E5:
149 return 4;
150
151 case RenderbufferInternalFormat.Rgb16f:
152 return 6;
153
154 case RenderbufferInternalFormat.Rgb32f:
155 return 12;
156
157 // GL_RGB_INTEGER
158 case RenderbufferInternalFormat.Rgb8ui:
159 case RenderbufferInternalFormat.Rgb8i:
160 return 3;
161
162 case RenderbufferInternalFormat.Rgb16ui:
163 case RenderbufferInternalFormat.Rgb16i:
164 return 6;
165
166 case RenderbufferInternalFormat.Rgb32ui:
167 case RenderbufferInternalFormat.Rgb32i:
168 return 12;
169
170 // GL_RGBA
171 case RenderbufferInternalFormat.Rgba8:
172 case RenderbufferInternalFormat.Srgb8Alpha8:
173 case RenderbufferInternalFormat.Rgba8Snorm:
174 return 4;
175
176 case RenderbufferInternalFormat.Rgb5A1:
177 case RenderbufferInternalFormat.Rgba4:
178 return 2;
179
180 case RenderbufferInternalFormat.Rgb10A2:
181 return 4;
182
183 case RenderbufferInternalFormat.Rgba16f:
184 return 8;
185
186 case RenderbufferInternalFormat.Rgba32f:
187 return 16;
188
189 // GL_RGBA_INTEGER
190 case RenderbufferInternalFormat.Rgba8i:
191 case RenderbufferInternalFormat.Rgba8ui:
192 case RenderbufferInternalFormat.Rgb10A2ui:
193 return 4;
194
195 case RenderbufferInternalFormat.Rgba16i:
196 case RenderbufferInternalFormat.Rgba16ui:
197 return 8;
198
199 case RenderbufferInternalFormat.Rgba32i:
200 case RenderbufferInternalFormat.Rgba32ui:
201 return 16;
202
203 // GL_DEPTH_COMPONENT
204 case RenderbufferInternalFormat.DepthComponent16:
205 return 2;
206
207 case RenderbufferInternalFormat.DepthComponent24:
208 return 3;
209
210 case RenderbufferInternalFormat.DepthComponent32f:
211 return 4;
212
213 // GL_DEPTH_STENCIL
214 case RenderbufferInternalFormat.Depth24Stencil8:
215 return 4;
216
217 case RenderbufferInternalFormat.Depth32fStencil8:
218 return 5;
219
220 case RenderbufferInternalFormat.StencilIndex8:
221 return 1;
222
223 default:
224 throw new InvalidOperationException($"{format} is not a valid {nameof(RenderbufferInternalFormat)} type.");
225 }
226 }
227 }
228}