💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

219 lines
24 KiB

  1. /*
  2. * Copyright (C) 2023 Christopher J. Howard
  3. *
  4. * This file is part of Antkeeper source code.
  5. *
  6. * Antkeeper source code is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Antkeeper source code is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #ifndef ANTKEEPER_GL_GL_FORMAT_LUT_HPP
  20. #define ANTKEEPER_GL_GL_FORMAT_LUT_HPP
  21. #include <glad/gl.h>
  22. namespace gl {
  23. /// Maps gl::format to OpenGL internal format, base format, and pixel type.
  24. constexpr GLenum gl_format_lut[][3] =
  25. {
  26. {0 , 0 , 0 }, // undefined
  27. {0 , GL_RG , 0 }, // r4g4_unorm_pack8
  28. {GL_RGBA4 , GL_RGBA , GL_UNSIGNED_SHORT_4_4_4_4 }, // r4g4b4a4_unorm_pack16
  29. {GL_RGBA4 , GL_BGRA , GL_UNSIGNED_SHORT_4_4_4_4 }, // b4g4r4a4_unorm_pack16
  30. {GL_RGB565 , GL_RGB , GL_UNSIGNED_SHORT_5_6_5 }, // r5g6b5_unorm_pack16
  31. {GL_RGB565 , GL_BGR , GL_UNSIGNED_SHORT_5_6_5 }, // b5g6r5_unorm_pack16
  32. {GL_RGB5_A1 , GL_RGBA , GL_UNSIGNED_SHORT_5_5_5_1 }, // r5g5b5a1_unorm_pack16
  33. {GL_RGB5_A1 , GL_BGRA , GL_UNSIGNED_SHORT_5_5_5_1 }, // b5g5r5a1_unorm_pack16
  34. {GL_RGB5_A1 , GL_BGRA , GL_UNSIGNED_SHORT_1_5_5_5_REV }, // a1r5g5b5_unorm_pack16
  35. {GL_R8 , GL_RED , GL_UNSIGNED_BYTE }, // r8_unorm
  36. {GL_R8_SNORM , GL_RED , GL_BYTE }, // r8_snorm
  37. {0 , GL_RED , GL_UNSIGNED_BYTE }, // r8_uscaled
  38. {0 , GL_RED , GL_BYTE }, // r8_sscaled
  39. {GL_R8UI , GL_RED_INTEGER , GL_UNSIGNED_BYTE }, // r8_uint
  40. {GL_R8I , GL_RED_INTEGER , GL_BYTE }, // r8_sint
  41. {0 , GL_RED , GL_UNSIGNED_BYTE }, // r8_srgb
  42. {GL_RG8 , GL_RG , GL_UNSIGNED_BYTE }, // r8g8_unorm
  43. {GL_RG8_SNORM , GL_RG , GL_BYTE }, // r8g8_snorm
  44. {0 , GL_RED , GL_UNSIGNED_BYTE }, // r8g8_uscaled
  45. {0 , GL_RED , GL_BYTE }, // r8g8_sscaled
  46. {GL_RG8UI , GL_RG_INTEGER , GL_UNSIGNED_BYTE }, // r8g8_uint
  47. {GL_RG8I , GL_RG_INTEGER , GL_BYTE }, // r8g8_sint
  48. {0 , GL_RG , GL_UNSIGNED_BYTE }, // r8g8_srgb
  49. {GL_RGB8 , GL_RGB , GL_UNSIGNED_BYTE }, // r8g8b8_unorm
  50. {GL_RGB8_SNORM , GL_RGB , GL_BYTE }, // r8g8b8_snorm
  51. {0 , GL_RED , GL_UNSIGNED_BYTE }, // r8g8b8_uscaled
  52. {0 , GL_RED , GL_BYTE }, // r8g8b8_sscaled
  53. {GL_RGB8UI , GL_RGB_INTEGER , GL_UNSIGNED_BYTE }, // r8g8b8_uint
  54. {GL_RGB8I , GL_RGB_INTEGER , GL_BYTE }, // r8g8b8_sint
  55. {GL_SRGB8 , GL_RGB , GL_UNSIGNED_BYTE }, // r8g8b8_srgb
  56. {GL_RGB8 , GL_BGR , GL_UNSIGNED_BYTE }, // b8g8r8_unorm
  57. {GL_RGB8_SNORM , GL_BGR , GL_BYTE }, // b8g8r8_snorm
  58. {0 , GL_BGR , GL_UNSIGNED_BYTE }, // b8g8r8_uscaled
  59. {0 , GL_BGR , GL_BYTE }, // b8g8r8_sscaled
  60. {GL_RGB8UI , GL_BGR_INTEGER , GL_UNSIGNED_BYTE }, // b8g8r8_uint
  61. {GL_RGB8I , GL_BGR_INTEGER , GL_BYTE }, // b8g8r8_sint
  62. {GL_SRGB8 , GL_BGR , GL_UNSIGNED_BYTE }, // b8g8r8_srgb
  63. {GL_RGBA8 , GL_RGBA , GL_UNSIGNED_BYTE }, // r8g8b8a8_unorm
  64. {GL_RGBA8_SNORM , GL_RGBA , GL_BYTE }, // r8g8b8a8_snorm
  65. {0 , GL_RGBA , GL_UNSIGNED_BYTE }, // r8g8b8a8_uscaled
  66. {0 , GL_RGBA , GL_BYTE }, // r8g8b8a8_sscaled
  67. {GL_RGBA8UI , GL_RGBA_INTEGER , GL_UNSIGNED_BYTE }, // r8g8b8a8_uint
  68. {GL_RGBA8I , GL_RGBA_INTEGER , GL_BYTE }, // r8g8b8a8_sint
  69. {GL_SRGB8_ALPHA8 , GL_RGBA , GL_UNSIGNED_BYTE }, // r8g8b8a8_srgb
  70. {GL_RGBA8 , GL_BGRA , GL_UNSIGNED_BYTE }, // b8g8r8a8_unorm
  71. {GL_RGBA8_SNORM , GL_BGRA , GL_BYTE }, // b8g8r8a8_snorm
  72. {0 , GL_BGRA , GL_UNSIGNED_BYTE }, // b8g8r8a8_uscaled
  73. {0 , GL_BGRA , GL_BYTE }, // b8g8r8a8_sscaled
  74. {GL_RGBA8UI , GL_BGRA_INTEGER , GL_UNSIGNED_BYTE }, // b8g8r8a8_uint
  75. {GL_RGBA8I , GL_BGRA_INTEGER , GL_BYTE }, // b8g8r8a8_sint
  76. {GL_SRGB8_ALPHA8 , GL_BGRA , GL_UNSIGNED_BYTE }, // b8g8r8a8_srgb
  77. {GL_RGBA8 , GL_RGBA , GL_UNSIGNED_INT_8_8_8_8_REV }, // a8b8g8r8_unorm_pack32
  78. {GL_RGBA8_SNORM , GL_RGBA , 0 }, // a8b8g8r8_snorm_pack32
  79. {0 , GL_RGBA , GL_UNSIGNED_INT_8_8_8_8_REV }, // a8b8g8r8_uscaled_pack32
  80. {0 , GL_RGBA , 0 }, // a8b8g8r8_sscaled_pack32
  81. {GL_RGBA8UI , GL_RGBA_INTEGER , GL_UNSIGNED_INT_8_8_8_8_REV }, // a8b8g8r8_uint_pack32
  82. {GL_RGBA8I , GL_RGBA_INTEGER , 0 }, // a8b8g8r8_sint_pack32
  83. {GL_SRGB8_ALPHA8 , GL_RGBA , GL_UNSIGNED_INT_8_8_8_8_REV }, // a8b8g8r8_srgb_pack32
  84. {GL_RGB10_A2 , GL_BGRA , GL_UNSIGNED_INT_2_10_10_10_REV }, // a2r10g10b10_unorm_pack32
  85. {0 , GL_BGRA , 0 }, // a2r10g10b10_snorm_pack32
  86. {0 , GL_BGRA , GL_UNSIGNED_INT_2_10_10_10_REV }, // a2r10g10b10_uscaled_pack32
  87. {0 , GL_BGRA , 0 }, // a2r10g10b10_sscaled_pack32
  88. {GL_RGB10_A2UI , GL_BGRA_INTEGER , GL_UNSIGNED_INT_2_10_10_10_REV }, // a2r10g10b10_uint_pack32
  89. {0 , GL_BGRA_INTEGER , 0 }, // a2r10g10b10_sint_pack32
  90. {GL_RGB10_A2 , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV }, // a2b10g10r10_unorm_pack32
  91. {0 , GL_RGBA , 0 }, // a2b10g10r10_snorm_pack32
  92. {0 , GL_RGBA , GL_UNSIGNED_INT_2_10_10_10_REV }, // a2b10g10r10_uscaled_pack32
  93. {0 , GL_RGBA , 0 }, // a2b10g10r10_sscaled_pack32
  94. {GL_RGB10_A2UI , GL_RGBA_INTEGER , GL_UNSIGNED_INT_2_10_10_10_REV }, // a2b10g10r10_uint_pack32
  95. {0 , GL_RGBA_INTEGER , 0 }, // a2b10g10r10_sint_pack32
  96. {GL_R16 , GL_RED , GL_UNSIGNED_SHORT }, // r16_unorm
  97. {GL_R16_SNORM , GL_RED , GL_SHORT }, // r16_snorm
  98. {0 , GL_RED , GL_UNSIGNED_SHORT }, // r16_uscaled
  99. {0 , GL_RED , GL_SHORT }, // r16_sscaled
  100. {GL_R16UI , GL_RED_INTEGER , GL_UNSIGNED_SHORT }, // r16_uint
  101. {GL_R16I , GL_RED_INTEGER , GL_SHORT }, // r16_sint
  102. {GL_R16F , GL_RED , GL_HALF_FLOAT }, // r16_sfloat
  103. {GL_RG16 , GL_RG , GL_UNSIGNED_SHORT }, // r16g16_unorm
  104. {GL_RG16_SNORM , GL_RG , GL_SHORT }, // r16g16_snorm
  105. {0 , GL_RG , GL_UNSIGNED_SHORT }, // r16g16_uscaled
  106. {0 , GL_RG , GL_SHORT }, // r16g16_sscaled
  107. {GL_RG16UI , GL_RG_INTEGER , GL_UNSIGNED_SHORT }, // r16g16_uint
  108. {GL_RG16I , GL_RG_INTEGER , GL_SHORT }, // r16g16_sint
  109. {GL_RG16F , GL_RG , GL_HALF_FLOAT }, // r16g16_sfloat
  110. {GL_RGB16 , GL_RGB , GL_UNSIGNED_SHORT }, // r16g16b16_unorm
  111. {GL_RGB16_SNORM , GL_RGB , GL_SHORT }, // r16g16b16_snorm
  112. {0 , GL_RGB , GL_UNSIGNED_SHORT }, // r16g16b16_uscaled
  113. {0 , GL_RGB , GL_SHORT }, // r16g16b16_sscaled
  114. {GL_RGB16UI , GL_RGB_INTEGER , GL_UNSIGNED_SHORT }, // r16g16b16_uint
  115. {GL_RGB16I , GL_RGB_INTEGER , GL_SHORT }, // r16g16b16_sint
  116. {GL_RGB16F , GL_RGB , GL_HALF_FLOAT }, // r16g16b16_sfloat
  117. {GL_RGBA16 , GL_RGBA , GL_UNSIGNED_SHORT }, // r16g16b16a16_unorm
  118. {GL_RGBA16_SNORM , GL_RGBA , GL_SHORT }, // r16g16b16a16_snorm
  119. {0 , GL_RGBA , GL_UNSIGNED_SHORT }, // r16g16b16a16_uscaled
  120. {0 , GL_RGBA , GL_SHORT }, // r16g16b16a16_sscaled
  121. {GL_RGBA16UI , GL_RGBA_INTEGER , GL_UNSIGNED_SHORT }, // r16g16b16a16_uint
  122. {GL_RGBA16I , GL_RGBA_INTEGER , GL_SHORT }, // r16g16b16a16_sint
  123. {GL_RGBA16F , GL_RGBA , GL_HALF_FLOAT }, // r16g16b16a16_sfloat
  124. {GL_R32UI , GL_RED_INTEGER , GL_UNSIGNED_INT }, // r32_uint
  125. {GL_R32I , GL_RED_INTEGER , GL_INT }, // r32_sint
  126. {GL_R32F , GL_RED , GL_FLOAT }, // r32_sfloat
  127. {GL_RG32UI , GL_RG_INTEGER , GL_UNSIGNED_INT }, // r32g32_uint
  128. {GL_RG32I , GL_RG_INTEGER , GL_INT }, // r32g32_sint
  129. {GL_RG32F , GL_RG , GL_FLOAT }, // r32g32_sfloat
  130. {GL_RGB32UI , GL_RGB_INTEGER , GL_UNSIGNED_INT }, // r32g32b32_uint
  131. {GL_RGB32I , GL_RGB_INTEGER , GL_INT }, // r32g32b32_sint
  132. {GL_RGB32F , GL_RGB , GL_FLOAT }, // r32g32b32_sfloat
  133. {GL_RGBA32UI , GL_RGBA_INTEGER , GL_UNSIGNED_INT }, // r32g32b32a32_uint
  134. {GL_RGBA32I , GL_RGBA_INTEGER , GL_INT }, // r32g32b32a32_sint
  135. {GL_RGBA32F , GL_RGBA , GL_FLOAT }, // r32g32b32a32_sfloat
  136. {0 , GL_RED_INTEGER , 0 }, // r64_uint
  137. {0 , GL_RED_INTEGER , 0 }, // r64_sint
  138. {0 , GL_RED , GL_DOUBLE }, // r64_sfloat
  139. {0 , GL_RG_INTEGER , 0 }, // r64g64_uint
  140. {0 , GL_RG_INTEGER , 0 }, // r64g64_sint
  141. {0 , GL_RG , GL_DOUBLE }, // r64g64_sfloat
  142. {0 , GL_RGB_INTEGER , 0 }, // r64g64b64_uint
  143. {0 , GL_RGB_INTEGER , 0 }, // r64g64b64_sint
  144. {0 , GL_RGB , GL_DOUBLE }, // r64g64b64_sfloat
  145. {0 , GL_RGBA_INTEGER , 0 }, // r64g64b64a64_uint
  146. {0 , GL_RGBA_INTEGER , 0 }, // r64g64b64a64_sint
  147. {0 , GL_RGBA , GL_DOUBLE }, // r64g64b64a64_sfloat
  148. {GL_R11F_G11F_B10F , GL_BGR , GL_UNSIGNED_INT_10F_11F_11F_REV }, // b10g11r11_ufloat_pack32
  149. {GL_RGB9_E5 , GL_BGR , GL_UNSIGNED_INT_5_9_9_9_REV }, // e5b9g9r9_ufloat_pack32
  150. {GL_DEPTH_COMPONENT16 , GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT }, // d16_unorm
  151. {GL_DEPTH_COMPONENT24 , GL_DEPTH_COMPONENT, GL_UNSIGNED_INT }, // x8_d24_unorm_pack32
  152. {GL_DEPTH_COMPONENT32F , GL_DEPTH_COMPONENT, GL_FLOAT }, // d32_sfloat
  153. {GL_STENCIL_INDEX8 , GL_STENCIL_INDEX , GL_UNSIGNED_BYTE }, // s8_uint
  154. {0 , GL_DEPTH_STENCIL , 0 }, // d16_unorm_s8_uint
  155. {GL_DEPTH24_STENCIL8 , GL_DEPTH_STENCIL , GL_UNSIGNED_INT_24_8 }, // d24_unorm_s8_uint
  156. {GL_DEPTH32F_STENCIL8 , GL_DEPTH_STENCIL , GL_FLOAT_32_UNSIGNED_INT_24_8_REV}, // d32_sfloat_s8_uint
  157. {0 , GL_RGB , 0 }, // bc1_rgb_unorm_block,
  158. {0 , GL_RGB , 0 }, // bc1_rgb_srgb_block,
  159. {0 , GL_RGBA , 0 }, // bc1_rgba_unorm_block,
  160. {0 , GL_RGBA , 0 }, // bc1_rgba_srgb_block,
  161. {0 , GL_RGBA , 0 }, // bc2_unorm_block,
  162. {0 , GL_RGBA , 0 }, // bc2_srgb_block,
  163. {0 , GL_RGBA , 0 }, // bc3_unorm_block,
  164. {0 , GL_RGBA , 0 }, // bc3_srgb_block,
  165. {GL_COMPRESSED_RED_RGTC1 , GL_RED , 0 }, // bc4_unorm_block,
  166. {GL_COMPRESSED_SIGNED_RED_RGTC1 , GL_RED , 0 }, // bc4_snorm_block,
  167. {GL_COMPRESSED_RG_RGTC2 , GL_RG , 0 }, // bc5_unorm_block,
  168. {GL_COMPRESSED_SIGNED_RG_RGTC2 , GL_RG , 0 }, // bc5_snorm_block,
  169. {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT , GL_RGB , 0 }, // bc6h_ufloat_block,
  170. {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT , GL_RGB , 0 }, // bc6h_sfloat_block,
  171. {GL_COMPRESSED_RGBA_BPTC_UNORM , GL_RGBA , 0 }, // bc7_unorm_block,
  172. {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM , GL_RGBA , 0 }, // bc7_srgb_block,
  173. {GL_COMPRESSED_RGB8_ETC2 , GL_RGB , 0 }, // etc2_r8g8b8_unorm_block,
  174. {GL_COMPRESSED_SRGB8_ETC2 , GL_RGB , 0 }, // etc2_r8g8b8_srgb_block,
  175. {GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 , GL_RGBA , 0 }, // etc2_r8g8b8a1_unorm_block,
  176. {GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, GL_RGBA , 0 }, // etc2_r8g8b8a1_srgb_block,
  177. {GL_COMPRESSED_RGBA8_ETC2_EAC , GL_RGBA , 0 }, // etc2_r8g8b8a8_unorm_block,
  178. {GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC , GL_RGBA , 0 }, // etc2_r8g8b8a8_srgb_block,
  179. {GL_COMPRESSED_R11_EAC , GL_RED , 0 }, // eac_r11_unorm_block,
  180. {GL_COMPRESSED_SIGNED_R11_EAC , GL_RED , 0 }, // eac_r11_snorm_block,
  181. {GL_COMPRESSED_RG11_EAC , GL_RG , 0 }, // eac_r11g11_unorm_block,
  182. {GL_COMPRESSED_SIGNED_RG11_EAC , GL_RG , 0 }, // eac_r11g11_snorm_block,
  183. {0 , GL_RGBA , 0 }, // astc_4x4_unorm_block,
  184. {0 , GL_RGBA , 0 }, // astc_4x4_srgb_block,
  185. {0 , GL_RGBA , 0 }, // astc_5x4_unorm_block,
  186. {0 , GL_RGBA , 0 }, // astc_5x4_srgb_block,
  187. {0 , GL_RGBA , 0 }, // astc_5x5_unorm_block,
  188. {0 , GL_RGBA , 0 }, // astc_5x5_srgb_block,
  189. {0 , GL_RGBA , 0 }, // astc_6x5_unorm_block,
  190. {0 , GL_RGBA , 0 }, // astc_6x5_srgb_block,
  191. {0 , GL_RGBA , 0 }, // astc_6x6_unorm_block,
  192. {0 , GL_RGBA , 0 }, // astc_6x6_srgb_block,
  193. {0 , GL_RGBA , 0 }, // astc_8x5_unorm_block,
  194. {0 , GL_RGBA , 0 }, // astc_8x5_srgb_block,
  195. {0 , GL_RGBA , 0 }, // astc_8x6_unorm_block,
  196. {0 , GL_RGBA , 0 }, // astc_8x6_srgb_block,
  197. {0 , GL_RGBA , 0 }, // astc_8x8_unorm_block,
  198. {0 , GL_RGBA , 0 }, // astc_8x8_srgb_block,
  199. {0 , GL_RGBA , 0 }, // astc_10x5_unorm_block,
  200. {0 , GL_RGBA , 0 }, // astc_10x5_srgb_block,
  201. {0 , GL_RGBA , 0 }, // astc_10x6_unorm_block,
  202. {0 , GL_RGBA , 0 }, // astc_10x6_srgb_block,
  203. {0 , GL_RGBA , 0 }, // astc_10x8_unorm_block,
  204. {0 , GL_RGBA , 0 }, // astc_10x8_srgb_block,
  205. {0 , GL_RGBA , 0 }, // astc_10x10_unorm_block,
  206. {0 , GL_RGBA , 0 }, // astc_10x10_srgb_block,
  207. {0 , GL_RGBA , 0 }, // astc_12x10_unorm_block,
  208. {0 , GL_RGBA , 0 }, // astc_12x10_srgb_block,
  209. {0 , GL_RGBA , 0 }, // astc_12x12_unorm_block,
  210. {0 , GL_RGBA , 0 } // astc_12x12_srgb_block
  211. };
  212. } // namespace gl
  213. #endif // ANTKEEPER_GL_GL_FORMAT_LUT_HPP