surface.cpp 20 KB

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