A game framework written with osu! in mind.
at master 228 lines 9.0 kB view raw
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}