surface.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #pragma once
  5. #include <climits>
  6. #include <utility>
  7. #include "common/assert.h"
  8. #include "common/common_types.h"
  9. #include "common/logging/log.h"
  10. #include "video_core/gpu.h"
  11. #include "video_core/textures/texture.h"
  12. namespace VideoCore::Surface {
  13. enum class PixelFormat {
  14. ABGR8U = 0,
  15. ABGR8S = 1,
  16. ABGR8UI = 2,
  17. B5G6R5U = 3,
  18. A2B10G10R10U = 4,
  19. A1B5G5R5U = 5,
  20. R8U = 6,
  21. R8UI = 7,
  22. RGBA16F = 8,
  23. RGBA16U = 9,
  24. RGBA16UI = 10,
  25. R11FG11FB10F = 11,
  26. RGBA32UI = 12,
  27. DXT1 = 13,
  28. DXT23 = 14,
  29. DXT45 = 15,
  30. DXN1 = 16, // This is also known as BC4
  31. DXN2UNORM = 17,
  32. DXN2SNORM = 18,
  33. BC7U = 19,
  34. BC6H_UF16 = 20,
  35. BC6H_SF16 = 21,
  36. ASTC_2D_4X4 = 22,
  37. BGRA8 = 23,
  38. RGBA32F = 24,
  39. RG32F = 25,
  40. R32F = 26,
  41. R16F = 27,
  42. R16U = 28,
  43. R16S = 29,
  44. R16UI = 30,
  45. R16I = 31,
  46. RG16 = 32,
  47. RG16F = 33,
  48. RG16UI = 34,
  49. RG16I = 35,
  50. RG16S = 36,
  51. RGB32F = 37,
  52. RGBA8_SRGB = 38,
  53. RG8U = 39,
  54. RG8S = 40,
  55. RG32UI = 41,
  56. RGBX16F = 42,
  57. R32UI = 43,
  58. R32I = 44,
  59. ASTC_2D_8X8 = 45,
  60. ASTC_2D_8X5 = 46,
  61. ASTC_2D_5X4 = 47,
  62. BGRA8_SRGB = 48,
  63. DXT1_SRGB = 49,
  64. DXT23_SRGB = 50,
  65. DXT45_SRGB = 51,
  66. BC7U_SRGB = 52,
  67. R4G4B4A4U = 53,
  68. ASTC_2D_4X4_SRGB = 54,
  69. ASTC_2D_8X8_SRGB = 55,
  70. ASTC_2D_8X5_SRGB = 56,
  71. ASTC_2D_5X4_SRGB = 57,
  72. ASTC_2D_5X5 = 58,
  73. ASTC_2D_5X5_SRGB = 59,
  74. ASTC_2D_10X8 = 60,
  75. ASTC_2D_10X8_SRGB = 61,
  76. ASTC_2D_6X6 = 62,
  77. ASTC_2D_6X6_SRGB = 63,
  78. ASTC_2D_10X10 = 64,
  79. ASTC_2D_10X10_SRGB = 65,
  80. ASTC_2D_12X12 = 66,
  81. ASTC_2D_12X12_SRGB = 67,
  82. ASTC_2D_8X6 = 68,
  83. ASTC_2D_8X6_SRGB = 69,
  84. ASTC_2D_6X5 = 70,
  85. ASTC_2D_6X5_SRGB = 71,
  86. E5B9G9R9F = 72,
  87. MaxColorFormat,
  88. // Depth formats
  89. Z32F = 73,
  90. Z16 = 74,
  91. MaxDepthFormat,
  92. // DepthStencil formats
  93. Z24S8 = 75,
  94. S8Z24 = 76,
  95. Z32FS8 = 77,
  96. MaxDepthStencilFormat,
  97. Max = MaxDepthStencilFormat,
  98. Invalid = 255,
  99. };
  100. static constexpr std::size_t MaxPixelFormat = static_cast<std::size_t>(PixelFormat::Max);
  101. enum class SurfaceType {
  102. ColorTexture = 0,
  103. Depth = 1,
  104. DepthStencil = 2,
  105. Invalid = 3,
  106. };
  107. enum class SurfaceTarget {
  108. Texture1D,
  109. TextureBuffer,
  110. Texture2D,
  111. Texture3D,
  112. Texture1DArray,
  113. Texture2DArray,
  114. TextureCubemap,
  115. TextureCubeArray,
  116. };
  117. constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{
  118. 0, // ABGR8U
  119. 0, // ABGR8S
  120. 0, // ABGR8UI
  121. 0, // B5G6R5U
  122. 0, // A2B10G10R10U
  123. 0, // A1B5G5R5U
  124. 0, // R8U
  125. 0, // R8UI
  126. 0, // RGBA16F
  127. 0, // RGBA16U
  128. 0, // RGBA16UI
  129. 0, // R11FG11FB10F
  130. 0, // RGBA32UI
  131. 2, // DXT1
  132. 2, // DXT23
  133. 2, // DXT45
  134. 2, // DXN1
  135. 2, // DXN2UNORM
  136. 2, // DXN2SNORM
  137. 2, // BC7U
  138. 2, // BC6H_UF16
  139. 2, // BC6H_SF16
  140. 2, // ASTC_2D_4X4
  141. 0, // BGRA8
  142. 0, // RGBA32F
  143. 0, // RG32F
  144. 0, // R32F
  145. 0, // R16F
  146. 0, // R16U
  147. 0, // R16S
  148. 0, // R16UI
  149. 0, // R16I
  150. 0, // RG16
  151. 0, // RG16F
  152. 0, // RG16UI
  153. 0, // RG16I
  154. 0, // RG16S
  155. 0, // RGB32F
  156. 0, // RGBA8_SRGB
  157. 0, // RG8U
  158. 0, // RG8S
  159. 0, // RG32UI
  160. 0, // RGBX16F
  161. 0, // R32UI
  162. 0, // R32I
  163. 2, // ASTC_2D_8X8
  164. 2, // ASTC_2D_8X5
  165. 2, // ASTC_2D_5X4
  166. 0, // BGRA8_SRGB
  167. 2, // DXT1_SRGB
  168. 2, // DXT23_SRGB
  169. 2, // DXT45_SRGB
  170. 2, // BC7U_SRGB
  171. 0, // R4G4B4A4U
  172. 2, // ASTC_2D_4X4_SRGB
  173. 2, // ASTC_2D_8X8_SRGB
  174. 2, // ASTC_2D_8X5_SRGB
  175. 2, // ASTC_2D_5X4_SRGB
  176. 2, // ASTC_2D_5X5
  177. 2, // ASTC_2D_5X5_SRGB
  178. 2, // ASTC_2D_10X8
  179. 2, // ASTC_2D_10X8_SRGB
  180. 2, // ASTC_2D_6X6
  181. 2, // ASTC_2D_6X6_SRGB
  182. 2, // ASTC_2D_10X10
  183. 2, // ASTC_2D_10X10_SRGB
  184. 2, // ASTC_2D_12X12
  185. 2, // ASTC_2D_12X12_SRGB
  186. 2, // ASTC_2D_8X6
  187. 2, // ASTC_2D_8X6_SRGB
  188. 2, // ASTC_2D_6X5
  189. 2, // ASTC_2D_6X5_SRGB
  190. 0, // E5B9G9R9F
  191. 0, // Z32F
  192. 0, // Z16
  193. 0, // Z24S8
  194. 0, // S8Z24
  195. 0, // Z32FS8
  196. }};
  197. /**
  198. * Gets the compression factor for the specified PixelFormat. This applies to just the
  199. * "compressed width" and "compressed height", not the overall compression factor of a
  200. * compressed image. This is used for maintaining proper surface sizes for compressed
  201. * texture formats.
  202. */
  203. inline constexpr u32 GetCompressionFactorShift(PixelFormat format) {
  204. DEBUG_ASSERT(format != PixelFormat::Invalid);
  205. DEBUG_ASSERT(static_cast<std::size_t>(format) < compression_factor_shift_table.size());
  206. return compression_factor_shift_table[static_cast<std::size_t>(format)];
  207. }
  208. inline constexpr u32 GetCompressionFactor(PixelFormat format) {
  209. return 1U << GetCompressionFactorShift(format);
  210. }
  211. constexpr std::array<u32, MaxPixelFormat> block_width_table = {{
  212. 1, // ABGR8U
  213. 1, // ABGR8S
  214. 1, // ABGR8UI
  215. 1, // B5G6R5U
  216. 1, // A2B10G10R10U
  217. 1, // A1B5G5R5U
  218. 1, // R8U
  219. 1, // R8UI
  220. 1, // RGBA16F
  221. 1, // RGBA16U
  222. 1, // RGBA16UI
  223. 1, // R11FG11FB10F
  224. 1, // RGBA32UI
  225. 4, // DXT1
  226. 4, // DXT23
  227. 4, // DXT45
  228. 4, // DXN1
  229. 4, // DXN2UNORM
  230. 4, // DXN2SNORM
  231. 4, // BC7U
  232. 4, // BC6H_UF16
  233. 4, // BC6H_SF16
  234. 4, // ASTC_2D_4X4
  235. 1, // BGRA8
  236. 1, // RGBA32F
  237. 1, // RG32F
  238. 1, // R32F
  239. 1, // R16F
  240. 1, // R16U
  241. 1, // R16S
  242. 1, // R16UI
  243. 1, // R16I
  244. 1, // RG16
  245. 1, // RG16F
  246. 1, // RG16UI
  247. 1, // RG16I
  248. 1, // RG16S
  249. 1, // RGB32F
  250. 1, // RGBA8_SRGB
  251. 1, // RG8U
  252. 1, // RG8S
  253. 1, // RG32UI
  254. 1, // RGBX16F
  255. 1, // R32UI
  256. 1, // R32I
  257. 8, // ASTC_2D_8X8
  258. 8, // ASTC_2D_8X5
  259. 5, // ASTC_2D_5X4
  260. 1, // BGRA8_SRGB
  261. 4, // DXT1_SRGB
  262. 4, // DXT23_SRGB
  263. 4, // DXT45_SRGB
  264. 4, // BC7U_SRGB
  265. 1, // R4G4B4A4U
  266. 4, // ASTC_2D_4X4_SRGB
  267. 8, // ASTC_2D_8X8_SRGB
  268. 8, // ASTC_2D_8X5_SRGB
  269. 5, // ASTC_2D_5X4_SRGB
  270. 5, // ASTC_2D_5X5
  271. 5, // ASTC_2D_5X5_SRGB
  272. 10, // ASTC_2D_10X8
  273. 10, // ASTC_2D_10X8_SRGB
  274. 6, // ASTC_2D_6X6
  275. 6, // ASTC_2D_6X6_SRGB
  276. 10, // ASTC_2D_10X10
  277. 10, // ASTC_2D_10X10_SRGB
  278. 12, // ASTC_2D_12X12
  279. 12, // ASTC_2D_12X12_SRGB
  280. 8, // ASTC_2D_8X6
  281. 8, // ASTC_2D_8X6_SRGB
  282. 6, // ASTC_2D_6X5
  283. 6, // ASTC_2D_6X5_SRGB
  284. 1, // E5B9G9R9F
  285. 1, // Z32F
  286. 1, // Z16
  287. 1, // Z24S8
  288. 1, // S8Z24
  289. 1, // Z32FS8
  290. }};
  291. static constexpr u32 GetDefaultBlockWidth(PixelFormat format) {
  292. if (format == PixelFormat::Invalid)
  293. return 0;
  294. ASSERT(static_cast<std::size_t>(format) < block_width_table.size());
  295. return block_width_table[static_cast<std::size_t>(format)];
  296. }
  297. constexpr std::array<u32, MaxPixelFormat> block_height_table = {{
  298. 1, // ABGR8U
  299. 1, // ABGR8S
  300. 1, // ABGR8UI
  301. 1, // B5G6R5U
  302. 1, // A2B10G10R10U
  303. 1, // A1B5G5R5U
  304. 1, // R8U
  305. 1, // R8UI
  306. 1, // RGBA16F
  307. 1, // RGBA16U
  308. 1, // RGBA16UI
  309. 1, // R11FG11FB10F
  310. 1, // RGBA32UI
  311. 4, // DXT1
  312. 4, // DXT23
  313. 4, // DXT45
  314. 4, // DXN1
  315. 4, // DXN2UNORM
  316. 4, // DXN2SNORM
  317. 4, // BC7U
  318. 4, // BC6H_UF16
  319. 4, // BC6H_SF16
  320. 4, // ASTC_2D_4X4
  321. 1, // BGRA8
  322. 1, // RGBA32F
  323. 1, // RG32F
  324. 1, // R32F
  325. 1, // R16F
  326. 1, // R16U
  327. 1, // R16S
  328. 1, // R16UI
  329. 1, // R16I
  330. 1, // RG16
  331. 1, // RG16F
  332. 1, // RG16UI
  333. 1, // RG16I
  334. 1, // RG16S
  335. 1, // RGB32F
  336. 1, // RGBA8_SRGB
  337. 1, // RG8U
  338. 1, // RG8S
  339. 1, // RG32UI
  340. 1, // RGBX16F
  341. 1, // R32UI
  342. 1, // R32I
  343. 8, // ASTC_2D_8X8
  344. 5, // ASTC_2D_8X5
  345. 4, // ASTC_2D_5X4
  346. 1, // BGRA8_SRGB
  347. 4, // DXT1_SRGB
  348. 4, // DXT23_SRGB
  349. 4, // DXT45_SRGB
  350. 4, // BC7U_SRGB
  351. 1, // R4G4B4A4U
  352. 4, // ASTC_2D_4X4_SRGB
  353. 8, // ASTC_2D_8X8_SRGB
  354. 5, // ASTC_2D_8X5_SRGB
  355. 4, // ASTC_2D_5X4_SRGB
  356. 5, // ASTC_2D_5X5
  357. 5, // ASTC_2D_5X5_SRGB
  358. 8, // ASTC_2D_10X8
  359. 8, // ASTC_2D_10X8_SRGB
  360. 6, // ASTC_2D_6X6
  361. 6, // ASTC_2D_6X6_SRGB
  362. 10, // ASTC_2D_10X10
  363. 10, // ASTC_2D_10X10_SRGB
  364. 12, // ASTC_2D_12X12
  365. 12, // ASTC_2D_12X12_SRGB
  366. 6, // ASTC_2D_8X6
  367. 6, // ASTC_2D_8X6_SRGB
  368. 5, // ASTC_2D_6X5
  369. 5, // ASTC_2D_6X5_SRGB
  370. 1, // E5B9G9R9F
  371. 1, // Z32F
  372. 1, // Z16
  373. 1, // Z24S8
  374. 1, // S8Z24
  375. 1, // Z32FS8
  376. }};
  377. static constexpr u32 GetDefaultBlockHeight(PixelFormat format) {
  378. if (format == PixelFormat::Invalid)
  379. return 0;
  380. ASSERT(static_cast<std::size_t>(format) < block_height_table.size());
  381. return block_height_table[static_cast<std::size_t>(format)];
  382. }
  383. constexpr std::array<u32, MaxPixelFormat> bpp_table = {{
  384. 32, // ABGR8U
  385. 32, // ABGR8S
  386. 32, // ABGR8UI
  387. 16, // B5G6R5U
  388. 32, // A2B10G10R10U
  389. 16, // A1B5G5R5U
  390. 8, // R8U
  391. 8, // R8UI
  392. 64, // RGBA16F
  393. 64, // RGBA16U
  394. 64, // RGBA16UI
  395. 32, // R11FG11FB10F
  396. 128, // RGBA32UI
  397. 64, // DXT1
  398. 128, // DXT23
  399. 128, // DXT45
  400. 64, // DXN1
  401. 128, // DXN2UNORM
  402. 128, // DXN2SNORM
  403. 128, // BC7U
  404. 128, // BC6H_UF16
  405. 128, // BC6H_SF16
  406. 128, // ASTC_2D_4X4
  407. 32, // BGRA8
  408. 128, // RGBA32F
  409. 64, // RG32F
  410. 32, // R32F
  411. 16, // R16F
  412. 16, // R16U
  413. 16, // R16S
  414. 16, // R16UI
  415. 16, // R16I
  416. 32, // RG16
  417. 32, // RG16F
  418. 32, // RG16UI
  419. 32, // RG16I
  420. 32, // RG16S
  421. 96, // RGB32F
  422. 32, // RGBA8_SRGB
  423. 16, // RG8U
  424. 16, // RG8S
  425. 64, // RG32UI
  426. 64, // RGBX16F
  427. 32, // R32UI
  428. 32, // R32I
  429. 128, // ASTC_2D_8X8
  430. 128, // ASTC_2D_8X5
  431. 128, // ASTC_2D_5X4
  432. 32, // BGRA8_SRGB
  433. 64, // DXT1_SRGB
  434. 128, // DXT23_SRGB
  435. 128, // DXT45_SRGB
  436. 128, // BC7U
  437. 16, // R4G4B4A4U
  438. 128, // ASTC_2D_4X4_SRGB
  439. 128, // ASTC_2D_8X8_SRGB
  440. 128, // ASTC_2D_8X5_SRGB
  441. 128, // ASTC_2D_5X4_SRGB
  442. 128, // ASTC_2D_5X5
  443. 128, // ASTC_2D_5X5_SRGB
  444. 128, // ASTC_2D_10X8
  445. 128, // ASTC_2D_10X8_SRGB
  446. 128, // ASTC_2D_6X6
  447. 128, // ASTC_2D_6X6_SRGB
  448. 128, // ASTC_2D_10X10
  449. 128, // ASTC_2D_10X10_SRGB
  450. 128, // ASTC_2D_12X12
  451. 128, // ASTC_2D_12X12_SRGB
  452. 128, // ASTC_2D_8X6
  453. 128, // ASTC_2D_8X6_SRGB
  454. 128, // ASTC_2D_6X5
  455. 128, // ASTC_2D_6X5_SRGB
  456. 32, // E5B9G9R9F
  457. 32, // Z32F
  458. 16, // Z16
  459. 32, // Z24S8
  460. 32, // S8Z24
  461. 64, // Z32FS8
  462. }};
  463. static constexpr u32 GetFormatBpp(PixelFormat format) {
  464. if (format == PixelFormat::Invalid)
  465. return 0;
  466. ASSERT(static_cast<std::size_t>(format) < bpp_table.size());
  467. return bpp_table[static_cast<std::size_t>(format)];
  468. }
  469. /// Returns the sizer in bytes of the specified pixel format
  470. static constexpr u32 GetBytesPerPixel(PixelFormat pixel_format) {
  471. if (pixel_format == PixelFormat::Invalid) {
  472. return 0;
  473. }
  474. return GetFormatBpp(pixel_format) / CHAR_BIT;
  475. }
  476. enum class SurfaceCompression {
  477. None, // Not compressed
  478. Compressed, // Texture is compressed
  479. Converted, // Texture is converted before upload or after download
  480. Rearranged, // Texture is swizzled before upload or after download
  481. };
  482. constexpr std::array<SurfaceCompression, MaxPixelFormat> compression_type_table = {{
  483. SurfaceCompression::None, // ABGR8U
  484. SurfaceCompression::None, // ABGR8S
  485. SurfaceCompression::None, // ABGR8UI
  486. SurfaceCompression::None, // B5G6R5U
  487. SurfaceCompression::None, // A2B10G10R10U
  488. SurfaceCompression::None, // A1B5G5R5U
  489. SurfaceCompression::None, // R8U
  490. SurfaceCompression::None, // R8UI
  491. SurfaceCompression::None, // RGBA16F
  492. SurfaceCompression::None, // RGBA16U
  493. SurfaceCompression::None, // RGBA16UI
  494. SurfaceCompression::None, // R11FG11FB10F
  495. SurfaceCompression::None, // RGBA32UI
  496. SurfaceCompression::Compressed, // DXT1
  497. SurfaceCompression::Compressed, // DXT23
  498. SurfaceCompression::Compressed, // DXT45
  499. SurfaceCompression::Compressed, // DXN1
  500. SurfaceCompression::Compressed, // DXN2UNORM
  501. SurfaceCompression::Compressed, // DXN2SNORM
  502. SurfaceCompression::Compressed, // BC7U
  503. SurfaceCompression::Compressed, // BC6H_UF16
  504. SurfaceCompression::Compressed, // BC6H_SF16
  505. SurfaceCompression::Converted, // ASTC_2D_4X4
  506. SurfaceCompression::None, // BGRA8
  507. SurfaceCompression::None, // RGBA32F
  508. SurfaceCompression::None, // RG32F
  509. SurfaceCompression::None, // R32F
  510. SurfaceCompression::None, // R16F
  511. SurfaceCompression::None, // R16U
  512. SurfaceCompression::None, // R16S
  513. SurfaceCompression::None, // R16UI
  514. SurfaceCompression::None, // R16I
  515. SurfaceCompression::None, // RG16
  516. SurfaceCompression::None, // RG16F
  517. SurfaceCompression::None, // RG16UI
  518. SurfaceCompression::None, // RG16I
  519. SurfaceCompression::None, // RG16S
  520. SurfaceCompression::None, // RGB32F
  521. SurfaceCompression::None, // RGBA8_SRGB
  522. SurfaceCompression::None, // RG8U
  523. SurfaceCompression::None, // RG8S
  524. SurfaceCompression::None, // RG32UI
  525. SurfaceCompression::None, // RGBX16F
  526. SurfaceCompression::None, // R32UI
  527. SurfaceCompression::None, // R32I
  528. SurfaceCompression::Converted, // ASTC_2D_8X8
  529. SurfaceCompression::Converted, // ASTC_2D_8X5
  530. SurfaceCompression::Converted, // ASTC_2D_5X4
  531. SurfaceCompression::None, // BGRA8_SRGB
  532. SurfaceCompression::Compressed, // DXT1_SRGB
  533. SurfaceCompression::Compressed, // DXT23_SRGB
  534. SurfaceCompression::Compressed, // DXT45_SRGB
  535. SurfaceCompression::Compressed, // BC7U_SRGB
  536. SurfaceCompression::None, // R4G4B4A4U
  537. SurfaceCompression::Converted, // ASTC_2D_4X4_SRGB
  538. SurfaceCompression::Converted, // ASTC_2D_8X8_SRGB
  539. SurfaceCompression::Converted, // ASTC_2D_8X5_SRGB
  540. SurfaceCompression::Converted, // ASTC_2D_5X4_SRGB
  541. SurfaceCompression::Converted, // ASTC_2D_5X5
  542. SurfaceCompression::Converted, // ASTC_2D_5X5_SRGB
  543. SurfaceCompression::Converted, // ASTC_2D_10X8
  544. SurfaceCompression::Converted, // ASTC_2D_10X8_SRGB
  545. SurfaceCompression::Converted, // ASTC_2D_6X6
  546. SurfaceCompression::Converted, // ASTC_2D_6X6_SRGB
  547. SurfaceCompression::Converted, // ASTC_2D_10X10
  548. SurfaceCompression::Converted, // ASTC_2D_10X10_SRGB
  549. SurfaceCompression::Converted, // ASTC_2D_12X12
  550. SurfaceCompression::Converted, // ASTC_2D_12X12_SRGB
  551. SurfaceCompression::Converted, // ASTC_2D_8X6
  552. SurfaceCompression::Converted, // ASTC_2D_8X6_SRGB
  553. SurfaceCompression::Converted, // ASTC_2D_6X5
  554. SurfaceCompression::Converted, // ASTC_2D_6X5_SRGB
  555. SurfaceCompression::None, // E5B9G9R9F
  556. SurfaceCompression::None, // Z32F
  557. SurfaceCompression::None, // Z16
  558. SurfaceCompression::None, // Z24S8
  559. SurfaceCompression::Rearranged, // S8Z24
  560. SurfaceCompression::None, // Z32FS8
  561. }};
  562. constexpr SurfaceCompression GetFormatCompressionType(PixelFormat format) {
  563. if (format == PixelFormat::Invalid) {
  564. return SurfaceCompression::None;
  565. }
  566. DEBUG_ASSERT(static_cast<std::size_t>(format) < compression_type_table.size());
  567. return compression_type_table[static_cast<std::size_t>(format)];
  568. }
  569. SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type);
  570. bool SurfaceTargetIsLayered(SurfaceTarget target);
  571. bool SurfaceTargetIsArray(SurfaceTarget target);
  572. PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format);
  573. PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format);
  574. PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format);
  575. SurfaceType GetFormatType(PixelFormat pixel_format);
  576. bool IsPixelFormatASTC(PixelFormat format);
  577. bool IsPixelFormatSRGB(PixelFormat format);
  578. std::pair<u32, u32> GetASTCBlockSize(PixelFormat format);
  579. /// Returns true if the specified PixelFormat is a BCn format, e.g. DXT or DXN
  580. bool IsFormatBCn(PixelFormat format);
  581. } // namespace VideoCore::Surface