surface.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. // Copyright 2014 Citra Emulator Project
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include "common/common_types.h"
  5. #include "common/math_util.h"
  6. #include "video_core/surface.h"
  7. namespace VideoCore::Surface {
  8. SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type) {
  9. switch (texture_type) {
  10. case Tegra::Texture::TextureType::Texture1D:
  11. return SurfaceTarget::Texture1D;
  12. case Tegra::Texture::TextureType::Texture2D:
  13. case Tegra::Texture::TextureType::Texture2DNoMipmap:
  14. return SurfaceTarget::Texture2D;
  15. case Tegra::Texture::TextureType::Texture3D:
  16. return SurfaceTarget::Texture3D;
  17. case Tegra::Texture::TextureType::TextureCubemap:
  18. return SurfaceTarget::TextureCubemap;
  19. case Tegra::Texture::TextureType::TextureCubeArray:
  20. return SurfaceTarget::TextureCubeArray;
  21. case Tegra::Texture::TextureType::Texture1DArray:
  22. return SurfaceTarget::Texture1DArray;
  23. case Tegra::Texture::TextureType::Texture2DArray:
  24. return SurfaceTarget::Texture2DArray;
  25. default:
  26. LOG_CRITICAL(HW_GPU, "Unimplemented texture_type={}", static_cast<u32>(texture_type));
  27. UNREACHABLE();
  28. return SurfaceTarget::Texture2D;
  29. }
  30. }
  31. bool SurfaceTargetIsLayered(SurfaceTarget target) {
  32. switch (target) {
  33. case SurfaceTarget::Texture1D:
  34. case SurfaceTarget::Texture2D:
  35. case SurfaceTarget::Texture3D:
  36. return false;
  37. case SurfaceTarget::Texture1DArray:
  38. case SurfaceTarget::Texture2DArray:
  39. case SurfaceTarget::TextureCubemap:
  40. case SurfaceTarget::TextureCubeArray:
  41. return true;
  42. default:
  43. LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", static_cast<u32>(target));
  44. UNREACHABLE();
  45. return false;
  46. }
  47. }
  48. PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
  49. switch (format) {
  50. case Tegra::DepthFormat::S8_Z24_UNORM:
  51. return PixelFormat::S8Z24;
  52. case Tegra::DepthFormat::Z24_S8_UNORM:
  53. return PixelFormat::Z24S8;
  54. case Tegra::DepthFormat::Z32_FLOAT:
  55. return PixelFormat::Z32F;
  56. case Tegra::DepthFormat::Z16_UNORM:
  57. return PixelFormat::Z16;
  58. case Tegra::DepthFormat::Z32_S8_X24_FLOAT:
  59. return PixelFormat::Z32FS8;
  60. default:
  61. LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
  62. UNREACHABLE();
  63. }
  64. }
  65. PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) {
  66. switch (format) {
  67. // TODO (Hexagon12): Converting SRGBA to RGBA is a hack and doesn't completely correct the
  68. // gamma.
  69. case Tegra::RenderTargetFormat::RGBA8_SRGB:
  70. return PixelFormat::RGBA8_SRGB;
  71. case Tegra::RenderTargetFormat::RGBA8_UNORM:
  72. return PixelFormat::ABGR8U;
  73. case Tegra::RenderTargetFormat::RGBA8_SNORM:
  74. return PixelFormat::ABGR8S;
  75. case Tegra::RenderTargetFormat::RGBA8_UINT:
  76. return PixelFormat::ABGR8UI;
  77. case Tegra::RenderTargetFormat::BGRA8_SRGB:
  78. return PixelFormat::BGRA8_SRGB;
  79. case Tegra::RenderTargetFormat::BGRA8_UNORM:
  80. return PixelFormat::BGRA8;
  81. case Tegra::RenderTargetFormat::RGB10_A2_UNORM:
  82. return PixelFormat::A2B10G10R10U;
  83. case Tegra::RenderTargetFormat::RGBA16_FLOAT:
  84. return PixelFormat::RGBA16F;
  85. case Tegra::RenderTargetFormat::RGBA16_UNORM:
  86. return PixelFormat::RGBA16U;
  87. case Tegra::RenderTargetFormat::RGBA16_UINT:
  88. return PixelFormat::RGBA16UI;
  89. case Tegra::RenderTargetFormat::RGBA32_FLOAT:
  90. return PixelFormat::RGBA32F;
  91. case Tegra::RenderTargetFormat::RG32_FLOAT:
  92. return PixelFormat::RG32F;
  93. case Tegra::RenderTargetFormat::R11G11B10_FLOAT:
  94. return PixelFormat::R11FG11FB10F;
  95. case Tegra::RenderTargetFormat::B5G6R5_UNORM:
  96. return PixelFormat::B5G6R5U;
  97. case Tegra::RenderTargetFormat::BGR5A1_UNORM:
  98. return PixelFormat::A1B5G5R5U;
  99. case Tegra::RenderTargetFormat::RGBA32_UINT:
  100. return PixelFormat::RGBA32UI;
  101. case Tegra::RenderTargetFormat::R8_UNORM:
  102. return PixelFormat::R8U;
  103. case Tegra::RenderTargetFormat::R8_UINT:
  104. return PixelFormat::R8UI;
  105. case Tegra::RenderTargetFormat::RG16_FLOAT:
  106. return PixelFormat::RG16F;
  107. case Tegra::RenderTargetFormat::RG16_UINT:
  108. return PixelFormat::RG16UI;
  109. case Tegra::RenderTargetFormat::RG16_SINT:
  110. return PixelFormat::RG16I;
  111. case Tegra::RenderTargetFormat::RG16_UNORM:
  112. return PixelFormat::RG16;
  113. case Tegra::RenderTargetFormat::RG16_SNORM:
  114. return PixelFormat::RG16S;
  115. case Tegra::RenderTargetFormat::RG8_UNORM:
  116. return PixelFormat::RG8U;
  117. case Tegra::RenderTargetFormat::RG8_SNORM:
  118. return PixelFormat::RG8S;
  119. case Tegra::RenderTargetFormat::R16_FLOAT:
  120. return PixelFormat::R16F;
  121. case Tegra::RenderTargetFormat::R16_UNORM:
  122. return PixelFormat::R16U;
  123. case Tegra::RenderTargetFormat::R16_SNORM:
  124. return PixelFormat::R16S;
  125. case Tegra::RenderTargetFormat::R16_UINT:
  126. return PixelFormat::R16UI;
  127. case Tegra::RenderTargetFormat::R16_SINT:
  128. return PixelFormat::R16I;
  129. case Tegra::RenderTargetFormat::R32_FLOAT:
  130. return PixelFormat::R32F;
  131. case Tegra::RenderTargetFormat::R32_UINT:
  132. return PixelFormat::R32UI;
  133. case Tegra::RenderTargetFormat::RG32_UINT:
  134. return PixelFormat::RG32UI;
  135. default:
  136. LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
  137. UNREACHABLE();
  138. }
  139. }
  140. PixelFormat PixelFormatFromTextureFormat(Tegra::Texture::TextureFormat format,
  141. Tegra::Texture::ComponentType component_type,
  142. bool is_srgb) {
  143. // TODO(Subv): Properly implement this
  144. switch (format) {
  145. case Tegra::Texture::TextureFormat::A8R8G8B8:
  146. if (is_srgb) {
  147. return PixelFormat::RGBA8_SRGB;
  148. }
  149. switch (component_type) {
  150. case Tegra::Texture::ComponentType::UNORM:
  151. return PixelFormat::ABGR8U;
  152. case Tegra::Texture::ComponentType::SNORM:
  153. return PixelFormat::ABGR8S;
  154. case Tegra::Texture::ComponentType::UINT:
  155. return PixelFormat::ABGR8UI;
  156. }
  157. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  158. UNREACHABLE();
  159. case Tegra::Texture::TextureFormat::B5G6R5:
  160. switch (component_type) {
  161. case Tegra::Texture::ComponentType::UNORM:
  162. return PixelFormat::B5G6R5U;
  163. }
  164. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  165. UNREACHABLE();
  166. case Tegra::Texture::TextureFormat::A2B10G10R10:
  167. switch (component_type) {
  168. case Tegra::Texture::ComponentType::UNORM:
  169. return PixelFormat::A2B10G10R10U;
  170. }
  171. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  172. UNREACHABLE();
  173. case Tegra::Texture::TextureFormat::A1B5G5R5:
  174. switch (component_type) {
  175. case Tegra::Texture::ComponentType::UNORM:
  176. return PixelFormat::A1B5G5R5U;
  177. }
  178. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  179. UNREACHABLE();
  180. case Tegra::Texture::TextureFormat::R8:
  181. switch (component_type) {
  182. case Tegra::Texture::ComponentType::UNORM:
  183. return PixelFormat::R8U;
  184. case Tegra::Texture::ComponentType::UINT:
  185. return PixelFormat::R8UI;
  186. }
  187. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  188. UNREACHABLE();
  189. case Tegra::Texture::TextureFormat::G8R8:
  190. switch (component_type) {
  191. case Tegra::Texture::ComponentType::UNORM:
  192. return PixelFormat::G8R8U;
  193. case Tegra::Texture::ComponentType::SNORM:
  194. return PixelFormat::G8R8S;
  195. }
  196. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  197. UNREACHABLE();
  198. case Tegra::Texture::TextureFormat::R16_G16_B16_A16:
  199. switch (component_type) {
  200. case Tegra::Texture::ComponentType::UNORM:
  201. return PixelFormat::RGBA16U;
  202. case Tegra::Texture::ComponentType::FLOAT:
  203. return PixelFormat::RGBA16F;
  204. }
  205. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  206. UNREACHABLE();
  207. case Tegra::Texture::TextureFormat::BF10GF11RF11:
  208. switch (component_type) {
  209. case Tegra::Texture::ComponentType::FLOAT:
  210. return PixelFormat::R11FG11FB10F;
  211. }
  212. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  213. UNREACHABLE();
  214. case Tegra::Texture::TextureFormat::R32_G32_B32_A32:
  215. switch (component_type) {
  216. case Tegra::Texture::ComponentType::FLOAT:
  217. return PixelFormat::RGBA32F;
  218. case Tegra::Texture::ComponentType::UINT:
  219. return PixelFormat::RGBA32UI;
  220. }
  221. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  222. UNREACHABLE();
  223. case Tegra::Texture::TextureFormat::R32_G32:
  224. switch (component_type) {
  225. case Tegra::Texture::ComponentType::FLOAT:
  226. return PixelFormat::RG32F;
  227. case Tegra::Texture::ComponentType::UINT:
  228. return PixelFormat::RG32UI;
  229. }
  230. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  231. UNREACHABLE();
  232. case Tegra::Texture::TextureFormat::R32_G32_B32:
  233. switch (component_type) {
  234. case Tegra::Texture::ComponentType::FLOAT:
  235. return PixelFormat::RGB32F;
  236. }
  237. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  238. UNREACHABLE();
  239. case Tegra::Texture::TextureFormat::R16:
  240. switch (component_type) {
  241. case Tegra::Texture::ComponentType::FLOAT:
  242. return PixelFormat::R16F;
  243. case Tegra::Texture::ComponentType::UNORM:
  244. return PixelFormat::R16U;
  245. case Tegra::Texture::ComponentType::SNORM:
  246. return PixelFormat::R16S;
  247. case Tegra::Texture::ComponentType::UINT:
  248. return PixelFormat::R16UI;
  249. case Tegra::Texture::ComponentType::SINT:
  250. return PixelFormat::R16I;
  251. }
  252. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  253. UNREACHABLE();
  254. case Tegra::Texture::TextureFormat::R32:
  255. switch (component_type) {
  256. case Tegra::Texture::ComponentType::FLOAT:
  257. return PixelFormat::R32F;
  258. case Tegra::Texture::ComponentType::UINT:
  259. return PixelFormat::R32UI;
  260. }
  261. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  262. UNREACHABLE();
  263. case Tegra::Texture::TextureFormat::ZF32:
  264. return PixelFormat::Z32F;
  265. case Tegra::Texture::TextureFormat::Z16:
  266. return PixelFormat::Z16;
  267. case Tegra::Texture::TextureFormat::Z24S8:
  268. return PixelFormat::Z24S8;
  269. case Tegra::Texture::TextureFormat::DXT1:
  270. return is_srgb ? PixelFormat::DXT1_SRGB : PixelFormat::DXT1;
  271. case Tegra::Texture::TextureFormat::DXT23:
  272. return is_srgb ? PixelFormat::DXT23_SRGB : PixelFormat::DXT23;
  273. case Tegra::Texture::TextureFormat::DXT45:
  274. return is_srgb ? PixelFormat::DXT45_SRGB : PixelFormat::DXT45;
  275. case Tegra::Texture::TextureFormat::DXN1:
  276. return PixelFormat::DXN1;
  277. case Tegra::Texture::TextureFormat::DXN2:
  278. switch (component_type) {
  279. case Tegra::Texture::ComponentType::UNORM:
  280. return PixelFormat::DXN2UNORM;
  281. case Tegra::Texture::ComponentType::SNORM:
  282. return PixelFormat::DXN2SNORM;
  283. }
  284. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  285. UNREACHABLE();
  286. case Tegra::Texture::TextureFormat::BC7U:
  287. return is_srgb ? PixelFormat::BC7U_SRGB : PixelFormat::BC7U;
  288. case Tegra::Texture::TextureFormat::BC6H_UF16:
  289. return PixelFormat::BC6H_UF16;
  290. case Tegra::Texture::TextureFormat::BC6H_SF16:
  291. return PixelFormat::BC6H_SF16;
  292. case Tegra::Texture::TextureFormat::ASTC_2D_4X4:
  293. return is_srgb ? PixelFormat::ASTC_2D_4X4_SRGB : PixelFormat::ASTC_2D_4X4;
  294. case Tegra::Texture::TextureFormat::ASTC_2D_5X4:
  295. return is_srgb ? PixelFormat::ASTC_2D_5X4_SRGB : PixelFormat::ASTC_2D_5X4;
  296. case Tegra::Texture::TextureFormat::ASTC_2D_5X5:
  297. return is_srgb ? PixelFormat::ASTC_2D_5X5_SRGB : PixelFormat::ASTC_2D_5X5;
  298. case Tegra::Texture::TextureFormat::ASTC_2D_8X8:
  299. return is_srgb ? PixelFormat::ASTC_2D_8X8_SRGB : PixelFormat::ASTC_2D_8X8;
  300. case Tegra::Texture::TextureFormat::ASTC_2D_8X5:
  301. return is_srgb ? PixelFormat::ASTC_2D_8X5_SRGB : PixelFormat::ASTC_2D_8X5;
  302. case Tegra::Texture::TextureFormat::ASTC_2D_10X8:
  303. return is_srgb ? PixelFormat::ASTC_2D_10X8_SRGB : PixelFormat::ASTC_2D_10X8;
  304. case Tegra::Texture::TextureFormat::R16_G16:
  305. switch (component_type) {
  306. case Tegra::Texture::ComponentType::FLOAT:
  307. return PixelFormat::RG16F;
  308. case Tegra::Texture::ComponentType::UNORM:
  309. return PixelFormat::RG16;
  310. case Tegra::Texture::ComponentType::SNORM:
  311. return PixelFormat::RG16S;
  312. case Tegra::Texture::ComponentType::UINT:
  313. return PixelFormat::RG16UI;
  314. case Tegra::Texture::ComponentType::SINT:
  315. return PixelFormat::RG16I;
  316. }
  317. LOG_CRITICAL(HW_GPU, "Unimplemented component_type={}", static_cast<u32>(component_type));
  318. UNREACHABLE();
  319. default:
  320. LOG_CRITICAL(HW_GPU, "Unimplemented format={}, component_type={}", static_cast<u32>(format),
  321. static_cast<u32>(component_type));
  322. UNREACHABLE();
  323. }
  324. }
  325. ComponentType ComponentTypeFromTexture(Tegra::Texture::ComponentType type) {
  326. // TODO(Subv): Implement more component types
  327. switch (type) {
  328. case Tegra::Texture::ComponentType::UNORM:
  329. return ComponentType::UNorm;
  330. case Tegra::Texture::ComponentType::FLOAT:
  331. return ComponentType::Float;
  332. case Tegra::Texture::ComponentType::SNORM:
  333. return ComponentType::SNorm;
  334. case Tegra::Texture::ComponentType::UINT:
  335. return ComponentType::UInt;
  336. case Tegra::Texture::ComponentType::SINT:
  337. return ComponentType::SInt;
  338. default:
  339. LOG_CRITICAL(HW_GPU, "Unimplemented component type={}", static_cast<u32>(type));
  340. UNREACHABLE();
  341. }
  342. }
  343. ComponentType ComponentTypeFromRenderTarget(Tegra::RenderTargetFormat format) {
  344. // TODO(Subv): Implement more render targets
  345. switch (format) {
  346. case Tegra::RenderTargetFormat::RGBA8_UNORM:
  347. case Tegra::RenderTargetFormat::RGBA8_SRGB:
  348. case Tegra::RenderTargetFormat::BGRA8_UNORM:
  349. case Tegra::RenderTargetFormat::BGRA8_SRGB:
  350. case Tegra::RenderTargetFormat::RGB10_A2_UNORM:
  351. case Tegra::RenderTargetFormat::R8_UNORM:
  352. case Tegra::RenderTargetFormat::RG16_UNORM:
  353. case Tegra::RenderTargetFormat::R16_UNORM:
  354. case Tegra::RenderTargetFormat::B5G6R5_UNORM:
  355. case Tegra::RenderTargetFormat::BGR5A1_UNORM:
  356. case Tegra::RenderTargetFormat::RG8_UNORM:
  357. case Tegra::RenderTargetFormat::RGBA16_UNORM:
  358. return ComponentType::UNorm;
  359. case Tegra::RenderTargetFormat::RGBA8_SNORM:
  360. case Tegra::RenderTargetFormat::RG16_SNORM:
  361. case Tegra::RenderTargetFormat::R16_SNORM:
  362. case Tegra::RenderTargetFormat::RG8_SNORM:
  363. return ComponentType::SNorm;
  364. case Tegra::RenderTargetFormat::RGBA16_FLOAT:
  365. case Tegra::RenderTargetFormat::R11G11B10_FLOAT:
  366. case Tegra::RenderTargetFormat::RGBA32_FLOAT:
  367. case Tegra::RenderTargetFormat::RG32_FLOAT:
  368. case Tegra::RenderTargetFormat::RG16_FLOAT:
  369. case Tegra::RenderTargetFormat::R16_FLOAT:
  370. case Tegra::RenderTargetFormat::R32_FLOAT:
  371. return ComponentType::Float;
  372. case Tegra::RenderTargetFormat::RGBA32_UINT:
  373. case Tegra::RenderTargetFormat::RGBA16_UINT:
  374. case Tegra::RenderTargetFormat::RG16_UINT:
  375. case Tegra::RenderTargetFormat::R8_UINT:
  376. case Tegra::RenderTargetFormat::R16_UINT:
  377. case Tegra::RenderTargetFormat::RG32_UINT:
  378. case Tegra::RenderTargetFormat::R32_UINT:
  379. case Tegra::RenderTargetFormat::RGBA8_UINT:
  380. return ComponentType::UInt;
  381. case Tegra::RenderTargetFormat::RG16_SINT:
  382. case Tegra::RenderTargetFormat::R16_SINT:
  383. return ComponentType::SInt;
  384. default:
  385. LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
  386. UNREACHABLE();
  387. }
  388. }
  389. PixelFormat PixelFormatFromGPUPixelFormat(Tegra::FramebufferConfig::PixelFormat format) {
  390. switch (format) {
  391. case Tegra::FramebufferConfig::PixelFormat::ABGR8:
  392. return PixelFormat::ABGR8U;
  393. default:
  394. LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
  395. UNREACHABLE();
  396. }
  397. }
  398. ComponentType ComponentTypeFromDepthFormat(Tegra::DepthFormat format) {
  399. switch (format) {
  400. case Tegra::DepthFormat::Z16_UNORM:
  401. case Tegra::DepthFormat::S8_Z24_UNORM:
  402. case Tegra::DepthFormat::Z24_S8_UNORM:
  403. return ComponentType::UNorm;
  404. case Tegra::DepthFormat::Z32_FLOAT:
  405. case Tegra::DepthFormat::Z32_S8_X24_FLOAT:
  406. return ComponentType::Float;
  407. default:
  408. LOG_CRITICAL(HW_GPU, "Unimplemented format={}", static_cast<u32>(format));
  409. UNREACHABLE();
  410. }
  411. }
  412. SurfaceType GetFormatType(PixelFormat pixel_format) {
  413. if (static_cast<std::size_t>(pixel_format) <
  414. static_cast<std::size_t>(PixelFormat::MaxColorFormat)) {
  415. return SurfaceType::ColorTexture;
  416. }
  417. if (static_cast<std::size_t>(pixel_format) <
  418. static_cast<std::size_t>(PixelFormat::MaxDepthFormat)) {
  419. return SurfaceType::Depth;
  420. }
  421. if (static_cast<std::size_t>(pixel_format) <
  422. static_cast<std::size_t>(PixelFormat::MaxDepthStencilFormat)) {
  423. return SurfaceType::DepthStencil;
  424. }
  425. // TODO(Subv): Implement the other formats
  426. ASSERT(false);
  427. return SurfaceType::Invalid;
  428. }
  429. bool IsPixelFormatASTC(PixelFormat format) {
  430. switch (format) {
  431. case PixelFormat::ASTC_2D_4X4:
  432. case PixelFormat::ASTC_2D_5X4:
  433. case PixelFormat::ASTC_2D_5X5:
  434. case PixelFormat::ASTC_2D_8X8:
  435. case PixelFormat::ASTC_2D_8X5:
  436. case PixelFormat::ASTC_2D_4X4_SRGB:
  437. case PixelFormat::ASTC_2D_5X4_SRGB:
  438. case PixelFormat::ASTC_2D_5X5_SRGB:
  439. case PixelFormat::ASTC_2D_8X8_SRGB:
  440. case PixelFormat::ASTC_2D_8X5_SRGB:
  441. case PixelFormat::ASTC_2D_10X8:
  442. case PixelFormat::ASTC_2D_10X8_SRGB:
  443. return true;
  444. default:
  445. return false;
  446. }
  447. }
  448. std::pair<u32, u32> GetASTCBlockSize(PixelFormat format) {
  449. return {GetDefaultBlockWidth(format), GetDefaultBlockHeight(format)};
  450. }
  451. bool IsFormatBCn(PixelFormat format) {
  452. switch (format) {
  453. case PixelFormat::DXT1:
  454. case PixelFormat::DXT23:
  455. case PixelFormat::DXT45:
  456. case PixelFormat::DXN1:
  457. case PixelFormat::DXN2SNORM:
  458. case PixelFormat::DXN2UNORM:
  459. case PixelFormat::BC7U:
  460. case PixelFormat::BC6H_UF16:
  461. case PixelFormat::BC6H_SF16:
  462. case PixelFormat::DXT1_SRGB:
  463. case PixelFormat::DXT23_SRGB:
  464. case PixelFormat::DXT45_SRGB:
  465. case PixelFormat::BC7U_SRGB:
  466. return true;
  467. }
  468. return false;
  469. }
  470. } // namespace VideoCore::Surface