surface.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  1. // SPDX-FileCopyrightText: 2014 Citra Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <climits>
  5. #include <utility>
  6. #include "common/assert.h"
  7. #include "common/common_types.h"
  8. #include "common/logging/log.h"
  9. #include "video_core/gpu.h"
  10. #include "video_core/textures/texture.h"
  11. namespace VideoCore::Surface {
  12. enum class PixelFormat {
  13. A8B8G8R8_UNORM,
  14. A8B8G8R8_SNORM,
  15. A8B8G8R8_SINT,
  16. A8B8G8R8_UINT,
  17. R5G6B5_UNORM,
  18. B5G6R5_UNORM,
  19. A1R5G5B5_UNORM,
  20. A2B10G10R10_UNORM,
  21. A2B10G10R10_UINT,
  22. A2R10G10B10_UNORM,
  23. A1B5G5R5_UNORM,
  24. A5B5G5R1_UNORM,
  25. R8_UNORM,
  26. R8_SNORM,
  27. R8_SINT,
  28. R8_UINT,
  29. R16G16B16A16_FLOAT,
  30. R16G16B16A16_UNORM,
  31. R16G16B16A16_SNORM,
  32. R16G16B16A16_SINT,
  33. R16G16B16A16_UINT,
  34. B10G11R11_FLOAT,
  35. R32G32B32A32_UINT,
  36. BC1_RGBA_UNORM,
  37. BC2_UNORM,
  38. BC3_UNORM,
  39. BC4_UNORM,
  40. BC4_SNORM,
  41. BC5_UNORM,
  42. BC5_SNORM,
  43. BC7_UNORM,
  44. BC6H_UFLOAT,
  45. BC6H_SFLOAT,
  46. ASTC_2D_4X4_UNORM,
  47. B8G8R8A8_UNORM,
  48. R32G32B32A32_FLOAT,
  49. R32G32B32A32_SINT,
  50. R32G32_FLOAT,
  51. R32G32_SINT,
  52. R32_FLOAT,
  53. R16_FLOAT,
  54. R16_UNORM,
  55. R16_SNORM,
  56. R16_UINT,
  57. R16_SINT,
  58. R16G16_UNORM,
  59. R16G16_FLOAT,
  60. R16G16_UINT,
  61. R16G16_SINT,
  62. R16G16_SNORM,
  63. R32G32B32_FLOAT,
  64. A8B8G8R8_SRGB,
  65. R8G8_UNORM,
  66. R8G8_SNORM,
  67. R8G8_SINT,
  68. R8G8_UINT,
  69. R32G32_UINT,
  70. R16G16B16X16_FLOAT,
  71. R32_UINT,
  72. R32_SINT,
  73. ASTC_2D_8X8_UNORM,
  74. ASTC_2D_8X5_UNORM,
  75. ASTC_2D_5X4_UNORM,
  76. B8G8R8A8_SRGB,
  77. BC1_RGBA_SRGB,
  78. BC2_SRGB,
  79. BC3_SRGB,
  80. BC7_SRGB,
  81. A4B4G4R4_UNORM,
  82. G4R4_UNORM,
  83. ASTC_2D_4X4_SRGB,
  84. ASTC_2D_8X8_SRGB,
  85. ASTC_2D_8X5_SRGB,
  86. ASTC_2D_5X4_SRGB,
  87. ASTC_2D_5X5_UNORM,
  88. ASTC_2D_5X5_SRGB,
  89. ASTC_2D_10X8_UNORM,
  90. ASTC_2D_10X8_SRGB,
  91. ASTC_2D_6X6_UNORM,
  92. ASTC_2D_6X6_SRGB,
  93. ASTC_2D_10X6_UNORM,
  94. ASTC_2D_10X6_SRGB,
  95. ASTC_2D_10X5_UNORM,
  96. ASTC_2D_10X5_SRGB,
  97. ASTC_2D_10X10_UNORM,
  98. ASTC_2D_10X10_SRGB,
  99. ASTC_2D_12X10_UNORM,
  100. ASTC_2D_12X10_SRGB,
  101. ASTC_2D_12X12_UNORM,
  102. ASTC_2D_12X12_SRGB,
  103. ASTC_2D_8X6_UNORM,
  104. ASTC_2D_8X6_SRGB,
  105. ASTC_2D_6X5_UNORM,
  106. ASTC_2D_6X5_SRGB,
  107. E5B9G9R9_FLOAT,
  108. MaxColorFormat,
  109. // Depth formats
  110. D32_FLOAT = MaxColorFormat,
  111. D16_UNORM,
  112. X8_D24_UNORM,
  113. MaxDepthFormat,
  114. // Stencil formats
  115. S8_UINT = MaxDepthFormat,
  116. MaxStencilFormat,
  117. // DepthStencil formats
  118. D24_UNORM_S8_UINT = MaxStencilFormat,
  119. S8_UINT_D24_UNORM,
  120. D32_FLOAT_S8_UINT,
  121. MaxDepthStencilFormat,
  122. Max = MaxDepthStencilFormat,
  123. Invalid = 255,
  124. };
  125. constexpr std::size_t MaxPixelFormat = static_cast<std::size_t>(PixelFormat::Max);
  126. enum class SurfaceType {
  127. ColorTexture = 0,
  128. Depth = 1,
  129. Stencil = 2,
  130. DepthStencil = 3,
  131. Invalid = 4,
  132. };
  133. enum class SurfaceTarget {
  134. Texture1D,
  135. TextureBuffer,
  136. Texture2D,
  137. Texture3D,
  138. Texture1DArray,
  139. Texture2DArray,
  140. TextureCubemap,
  141. TextureCubeArray,
  142. };
  143. constexpr std::array<u8, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{
  144. 1, // A8B8G8R8_UNORM
  145. 1, // A8B8G8R8_SNORM
  146. 1, // A8B8G8R8_SINT
  147. 1, // A8B8G8R8_UINT
  148. 1, // R5G6B5_UNORM
  149. 1, // B5G6R5_UNORM
  150. 1, // A1R5G5B5_UNORM
  151. 1, // A2B10G10R10_UNORM
  152. 1, // A2B10G10R10_UINT
  153. 1, // A2R10G10B10_UNORM
  154. 1, // A1B5G5R5_UNORM
  155. 1, // A5B5G5R1_UNORM
  156. 1, // R8_UNORM
  157. 1, // R8_SNORM
  158. 1, // R8_SINT
  159. 1, // R8_UINT
  160. 1, // R16G16B16A16_FLOAT
  161. 1, // R16G16B16A16_UNORM
  162. 1, // R16G16B16A16_SNORM
  163. 1, // R16G16B16A16_SINT
  164. 1, // R16G16B16A16_UINT
  165. 1, // B10G11R11_FLOAT
  166. 1, // R32G32B32A32_UINT
  167. 4, // BC1_RGBA_UNORM
  168. 4, // BC2_UNORM
  169. 4, // BC3_UNORM
  170. 4, // BC4_UNORM
  171. 4, // BC4_SNORM
  172. 4, // BC5_UNORM
  173. 4, // BC5_SNORM
  174. 4, // BC7_UNORM
  175. 4, // BC6H_UFLOAT
  176. 4, // BC6H_SFLOAT
  177. 4, // ASTC_2D_4X4_UNORM
  178. 1, // B8G8R8A8_UNORM
  179. 1, // R32G32B32A32_FLOAT
  180. 1, // R32G32B32A32_SINT
  181. 1, // R32G32_FLOAT
  182. 1, // R32G32_SINT
  183. 1, // R32_FLOAT
  184. 1, // R16_FLOAT
  185. 1, // R16_UNORM
  186. 1, // R16_SNORM
  187. 1, // R16_UINT
  188. 1, // R16_SINT
  189. 1, // R16G16_UNORM
  190. 1, // R16G16_FLOAT
  191. 1, // R16G16_UINT
  192. 1, // R16G16_SINT
  193. 1, // R16G16_SNORM
  194. 1, // R32G32B32_FLOAT
  195. 1, // A8B8G8R8_SRGB
  196. 1, // R8G8_UNORM
  197. 1, // R8G8_SNORM
  198. 1, // R8G8_SINT
  199. 1, // R8G8_UINT
  200. 1, // R32G32_UINT
  201. 1, // R16G16B16X16_FLOAT
  202. 1, // R32_UINT
  203. 1, // R32_SINT
  204. 8, // ASTC_2D_8X8_UNORM
  205. 8, // ASTC_2D_8X5_UNORM
  206. 5, // ASTC_2D_5X4_UNORM
  207. 1, // B8G8R8A8_SRGB
  208. 4, // BC1_RGBA_SRGB
  209. 4, // BC2_SRGB
  210. 4, // BC3_SRGB
  211. 4, // BC7_SRGB
  212. 1, // A4B4G4R4_UNORM
  213. 1, // G4R4_UNORM
  214. 4, // ASTC_2D_4X4_SRGB
  215. 8, // ASTC_2D_8X8_SRGB
  216. 8, // ASTC_2D_8X5_SRGB
  217. 5, // ASTC_2D_5X4_SRGB
  218. 5, // ASTC_2D_5X5_UNORM
  219. 5, // ASTC_2D_5X5_SRGB
  220. 10, // ASTC_2D_10X8_UNORM
  221. 10, // ASTC_2D_10X8_SRGB
  222. 6, // ASTC_2D_6X6_UNORM
  223. 6, // ASTC_2D_6X6_SRGB
  224. 10, // ASTC_2D_10X6_UNORM
  225. 10, // ASTC_2D_10X6_SRGB
  226. 10, // ASTC_2D_10X5_UNORM
  227. 10, // ASTC_2D_10X5_SRGB
  228. 10, // ASTC_2D_10X10_UNORM
  229. 10, // ASTC_2D_10X10_SRGB
  230. 12, // ASTC_2D_12X10_UNORM
  231. 12, // ASTC_2D_12X10_SRGB
  232. 12, // ASTC_2D_12X12_UNORM
  233. 12, // ASTC_2D_12X12_SRGB
  234. 8, // ASTC_2D_8X6_UNORM
  235. 8, // ASTC_2D_8X6_SRGB
  236. 6, // ASTC_2D_6X5_UNORM
  237. 6, // ASTC_2D_6X5_SRGB
  238. 1, // E5B9G9R9_FLOAT
  239. 1, // D32_FLOAT
  240. 1, // D16_UNORM
  241. 1, // X8_D24_UNORM
  242. 1, // S8_UINT
  243. 1, // D24_UNORM_S8_UINT
  244. 1, // S8_UINT_D24_UNORM
  245. 1, // D32_FLOAT_S8_UINT
  246. }};
  247. constexpr u32 DefaultBlockWidth(PixelFormat format) {
  248. ASSERT(static_cast<std::size_t>(format) < BLOCK_WIDTH_TABLE.size());
  249. return BLOCK_WIDTH_TABLE[static_cast<std::size_t>(format)];
  250. }
  251. constexpr std::array<u8, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{
  252. 1, // A8B8G8R8_UNORM
  253. 1, // A8B8G8R8_SNORM
  254. 1, // A8B8G8R8_SINT
  255. 1, // A8B8G8R8_UINT
  256. 1, // R5G6B5_UNORM
  257. 1, // B5G6R5_UNORM
  258. 1, // A1R5G5B5_UNORM
  259. 1, // A2B10G10R10_UNORM
  260. 1, // A2B10G10R10_UINT
  261. 1, // A2R10G10B10_UNORM
  262. 1, // A1B5G5R5_UNORM
  263. 1, // A5B5G5R1_UNORM
  264. 1, // R8_UNORM
  265. 1, // R8_SNORM
  266. 1, // R8_SINT
  267. 1, // R8_UINT
  268. 1, // R16G16B16A16_FLOAT
  269. 1, // R16G16B16A16_UNORM
  270. 1, // R16G16B16A16_SNORM
  271. 1, // R16G16B16A16_SINT
  272. 1, // R16G16B16A16_UINT
  273. 1, // B10G11R11_FLOAT
  274. 1, // R32G32B32A32_UINT
  275. 4, // BC1_RGBA_UNORM
  276. 4, // BC2_UNORM
  277. 4, // BC3_UNORM
  278. 4, // BC4_UNORM
  279. 4, // BC4_SNORM
  280. 4, // BC5_UNORM
  281. 4, // BC5_SNORM
  282. 4, // BC7_UNORM
  283. 4, // BC6H_UFLOAT
  284. 4, // BC6H_SFLOAT
  285. 4, // ASTC_2D_4X4_UNORM
  286. 1, // B8G8R8A8_UNORM
  287. 1, // R32G32B32A32_FLOAT
  288. 1, // R32G32B32A32_SINT
  289. 1, // R32G32_FLOAT
  290. 1, // R32G32_SINT
  291. 1, // R32_FLOAT
  292. 1, // R16_FLOAT
  293. 1, // R16_UNORM
  294. 1, // R16_SNORM
  295. 1, // R16_UINT
  296. 1, // R16_SINT
  297. 1, // R16G16_UNORM
  298. 1, // R16G16_FLOAT
  299. 1, // R16G16_UINT
  300. 1, // R16G16_SINT
  301. 1, // R16G16_SNORM
  302. 1, // R32G32B32_FLOAT
  303. 1, // A8B8G8R8_SRGB
  304. 1, // R8G8_UNORM
  305. 1, // R8G8_SNORM
  306. 1, // R8G8_SINT
  307. 1, // R8G8_UINT
  308. 1, // R32G32_UINT
  309. 1, // R16G16B16X16_FLOAT
  310. 1, // R32_UINT
  311. 1, // R32_SINT
  312. 8, // ASTC_2D_8X8_UNORM
  313. 5, // ASTC_2D_8X5_UNORM
  314. 4, // ASTC_2D_5X4_UNORM
  315. 1, // B8G8R8A8_SRGB
  316. 4, // BC1_RGBA_SRGB
  317. 4, // BC2_SRGB
  318. 4, // BC3_SRGB
  319. 4, // BC7_SRGB
  320. 1, // A4B4G4R4_UNORM
  321. 1, // G4R4_UNORM
  322. 4, // ASTC_2D_4X4_SRGB
  323. 8, // ASTC_2D_8X8_SRGB
  324. 5, // ASTC_2D_8X5_SRGB
  325. 4, // ASTC_2D_5X4_SRGB
  326. 5, // ASTC_2D_5X5_UNORM
  327. 5, // ASTC_2D_5X5_SRGB
  328. 8, // ASTC_2D_10X8_UNORM
  329. 8, // ASTC_2D_10X8_SRGB
  330. 6, // ASTC_2D_6X6_UNORM
  331. 6, // ASTC_2D_6X6_SRGB
  332. 6, // ASTC_2D_10X6_UNORM
  333. 6, // ASTC_2D_10X6_SRGB
  334. 5, // ASTC_2D_10X5_UNORM
  335. 5, // ASTC_2D_10X5_SRGB
  336. 10, // ASTC_2D_10X10_UNORM
  337. 10, // ASTC_2D_10X10_SRGB
  338. 10, // ASTC_2D_12X10_UNORM
  339. 10, // ASTC_2D_12X10_SRGB
  340. 12, // ASTC_2D_12X12_UNORM
  341. 12, // ASTC_2D_12X12_SRGB
  342. 6, // ASTC_2D_8X6_UNORM
  343. 6, // ASTC_2D_8X6_SRGB
  344. 5, // ASTC_2D_6X5_UNORM
  345. 5, // ASTC_2D_6X5_SRGB
  346. 1, // E5B9G9R9_FLOAT
  347. 1, // D32_FLOAT
  348. 1, // D16_UNORM
  349. 1, // X8_D24_UNORM
  350. 1, // S8_UINT
  351. 1, // D24_UNORM_S8_UINT
  352. 1, // S8_UINT_D24_UNORM
  353. 1, // D32_FLOAT_S8_UINT
  354. }};
  355. constexpr u32 DefaultBlockHeight(PixelFormat format) {
  356. ASSERT(static_cast<std::size_t>(format) < BLOCK_HEIGHT_TABLE.size());
  357. return BLOCK_HEIGHT_TABLE[static_cast<std::size_t>(format)];
  358. }
  359. constexpr std::array<u8, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{
  360. 32, // A8B8G8R8_UNORM
  361. 32, // A8B8G8R8_SNORM
  362. 32, // A8B8G8R8_SINT
  363. 32, // A8B8G8R8_UINT
  364. 16, // R5G6B5_UNORM
  365. 16, // B5G6R5_UNORM
  366. 16, // A1R5G5B5_UNORM
  367. 32, // A2B10G10R10_UNORM
  368. 32, // A2B10G10R10_UINT
  369. 32, // A2R10G10B10_UNORM
  370. 16, // A1B5G5R5_UNORM
  371. 16, // A5B5G5R1_UNORM
  372. 8, // R8_UNORM
  373. 8, // R8_SNORM
  374. 8, // R8_SINT
  375. 8, // R8_UINT
  376. 64, // R16G16B16A16_FLOAT
  377. 64, // R16G16B16A16_UNORM
  378. 64, // R16G16B16A16_SNORM
  379. 64, // R16G16B16A16_SINT
  380. 64, // R16G16B16A16_UINT
  381. 32, // B10G11R11_FLOAT
  382. 128, // R32G32B32A32_UINT
  383. 64, // BC1_RGBA_UNORM
  384. 128, // BC2_UNORM
  385. 128, // BC3_UNORM
  386. 64, // BC4_UNORM
  387. 64, // BC4_SNORM
  388. 128, // BC5_UNORM
  389. 128, // BC5_SNORM
  390. 128, // BC7_UNORM
  391. 128, // BC6H_UFLOAT
  392. 128, // BC6H_SFLOAT
  393. 128, // ASTC_2D_4X4_UNORM
  394. 32, // B8G8R8A8_UNORM
  395. 128, // R32G32B32A32_FLOAT
  396. 128, // R32G32B32A32_SINT
  397. 64, // R32G32_FLOAT
  398. 64, // R32G32_SINT
  399. 32, // R32_FLOAT
  400. 16, // R16_FLOAT
  401. 16, // R16_UNORM
  402. 16, // R16_SNORM
  403. 16, // R16_UINT
  404. 16, // R16_SINT
  405. 32, // R16G16_UNORM
  406. 32, // R16G16_FLOAT
  407. 32, // R16G16_UINT
  408. 32, // R16G16_SINT
  409. 32, // R16G16_SNORM
  410. 96, // R32G32B32_FLOAT
  411. 32, // A8B8G8R8_SRGB
  412. 16, // R8G8_UNORM
  413. 16, // R8G8_SNORM
  414. 16, // R8G8_SINT
  415. 16, // R8G8_UINT
  416. 64, // R32G32_UINT
  417. 64, // R16G16B16X16_FLOAT
  418. 32, // R32_UINT
  419. 32, // R32_SINT
  420. 128, // ASTC_2D_8X8_UNORM
  421. 128, // ASTC_2D_8X5_UNORM
  422. 128, // ASTC_2D_5X4_UNORM
  423. 32, // B8G8R8A8_SRGB
  424. 64, // BC1_RGBA_SRGB
  425. 128, // BC2_SRGB
  426. 128, // BC3_SRGB
  427. 128, // BC7_UNORM
  428. 16, // A4B4G4R4_UNORM
  429. 8, // G4R4_UNORM
  430. 128, // ASTC_2D_4X4_SRGB
  431. 128, // ASTC_2D_8X8_SRGB
  432. 128, // ASTC_2D_8X5_SRGB
  433. 128, // ASTC_2D_5X4_SRGB
  434. 128, // ASTC_2D_5X5_UNORM
  435. 128, // ASTC_2D_5X5_SRGB
  436. 128, // ASTC_2D_10X8_UNORM
  437. 128, // ASTC_2D_10X8_SRGB
  438. 128, // ASTC_2D_6X6_UNORM
  439. 128, // ASTC_2D_6X6_SRGB
  440. 128, // ASTC_2D_10X6_UNORM
  441. 128, // ASTC_2D_10X6_SRGB
  442. 128, // ASTC_2D_10X5_UNORM
  443. 128, // ASTC_2D_10X5_SRGB
  444. 128, // ASTC_2D_10X10_UNORM
  445. 128, // ASTC_2D_10X10_SRGB
  446. 128, // ASTC_2D_12X10_UNORM
  447. 128, // ASTC_2D_12X10_SRGB
  448. 128, // ASTC_2D_12X12_UNORM
  449. 128, // ASTC_2D_12X12_SRGB
  450. 128, // ASTC_2D_8X6_UNORM
  451. 128, // ASTC_2D_8X6_SRGB
  452. 128, // ASTC_2D_6X5_UNORM
  453. 128, // ASTC_2D_6X5_SRGB
  454. 32, // E5B9G9R9_FLOAT
  455. 32, // D32_FLOAT
  456. 16, // D16_UNORM
  457. 32, // X8_D24_UNORM
  458. 8, // S8_UINT
  459. 32, // D24_UNORM_S8_UINT
  460. 32, // S8_UINT_D24_UNORM
  461. 64, // D32_FLOAT_S8_UINT
  462. }};
  463. constexpr u32 BitsPerBlock(PixelFormat format) {
  464. ASSERT(static_cast<std::size_t>(format) < BITS_PER_BLOCK_TABLE.size());
  465. return BITS_PER_BLOCK_TABLE[static_cast<std::size_t>(format)];
  466. }
  467. /// Returns the sizer in bytes of the specified pixel format
  468. constexpr u32 BytesPerBlock(PixelFormat pixel_format) {
  469. return BitsPerBlock(pixel_format) / CHAR_BIT;
  470. }
  471. SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type);
  472. bool SurfaceTargetIsLayered(SurfaceTarget target);
  473. bool SurfaceTargetIsArray(SurfaceTarget target);
  474. PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format);
  475. PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format);
  476. PixelFormat PixelFormatFromGPUPixelFormat(Service::android::PixelFormat format);
  477. SurfaceType GetFormatType(PixelFormat pixel_format);
  478. bool IsPixelFormatASTC(PixelFormat format);
  479. bool IsPixelFormatBCn(PixelFormat format);
  480. bool IsPixelFormatSRGB(PixelFormat format);
  481. bool IsPixelFormatInteger(PixelFormat format);
  482. bool IsPixelFormatSignedInteger(PixelFormat format);
  483. size_t PixelComponentSizeBitsInteger(PixelFormat format);
  484. std::pair<u32, u32> GetASTCBlockSize(PixelFormat format);
  485. u64 EstimatedDecompressedSize(u64 base_size, PixelFormat format);
  486. } // namespace VideoCore::Surface