surface.h 16 KB

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