surface.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374
  1. // SPDX-FileCopyrightText: 2014 Citra Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "common/common_types.h"
  4. #include "common/math_util.h"
  5. #include "video_core/surface.h"
  6. namespace VideoCore::Surface {
  7. SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type) {
  8. switch (texture_type) {
  9. case Tegra::Texture::TextureType::Texture1D:
  10. return SurfaceTarget::Texture1D;
  11. case Tegra::Texture::TextureType::Texture1DBuffer:
  12. return SurfaceTarget::TextureBuffer;
  13. case Tegra::Texture::TextureType::Texture2D:
  14. case Tegra::Texture::TextureType::Texture2DNoMipmap:
  15. return SurfaceTarget::Texture2D;
  16. case Tegra::Texture::TextureType::Texture3D:
  17. return SurfaceTarget::Texture3D;
  18. case Tegra::Texture::TextureType::TextureCubemap:
  19. return SurfaceTarget::TextureCubemap;
  20. case Tegra::Texture::TextureType::TextureCubeArray:
  21. return SurfaceTarget::TextureCubeArray;
  22. case Tegra::Texture::TextureType::Texture1DArray:
  23. return SurfaceTarget::Texture1DArray;
  24. case Tegra::Texture::TextureType::Texture2DArray:
  25. return SurfaceTarget::Texture2DArray;
  26. default:
  27. LOG_CRITICAL(HW_GPU, "Unimplemented texture_type={}", texture_type);
  28. ASSERT(false);
  29. return SurfaceTarget::Texture2D;
  30. }
  31. }
  32. bool SurfaceTargetIsLayered(SurfaceTarget target) {
  33. switch (target) {
  34. case SurfaceTarget::Texture1D:
  35. case SurfaceTarget::TextureBuffer:
  36. case SurfaceTarget::Texture2D:
  37. case SurfaceTarget::Texture3D:
  38. return false;
  39. case SurfaceTarget::Texture1DArray:
  40. case SurfaceTarget::Texture2DArray:
  41. case SurfaceTarget::TextureCubemap:
  42. case SurfaceTarget::TextureCubeArray:
  43. return true;
  44. default:
  45. LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", target);
  46. ASSERT(false);
  47. return false;
  48. }
  49. }
  50. bool SurfaceTargetIsArray(SurfaceTarget target) {
  51. switch (target) {
  52. case SurfaceTarget::Texture1D:
  53. case SurfaceTarget::TextureBuffer:
  54. case SurfaceTarget::Texture2D:
  55. case SurfaceTarget::Texture3D:
  56. case SurfaceTarget::TextureCubemap:
  57. return false;
  58. case SurfaceTarget::Texture1DArray:
  59. case SurfaceTarget::Texture2DArray:
  60. case SurfaceTarget::TextureCubeArray:
  61. return true;
  62. default:
  63. LOG_CRITICAL(HW_GPU, "Unimplemented surface_target={}", target);
  64. ASSERT(false);
  65. return false;
  66. }
  67. }
  68. PixelFormat PixelFormatFromDepthFormat(Tegra::DepthFormat format) {
  69. switch (format) {
  70. case Tegra::DepthFormat::S8_UINT_Z24_UNORM:
  71. return PixelFormat::S8_UINT_D24_UNORM;
  72. case Tegra::DepthFormat::D24S8_UNORM:
  73. return PixelFormat::D24_UNORM_S8_UINT;
  74. case Tegra::DepthFormat::D32_FLOAT:
  75. return PixelFormat::D32_FLOAT;
  76. case Tegra::DepthFormat::D16_UNORM:
  77. return PixelFormat::D16_UNORM;
  78. case Tegra::DepthFormat::S8_UINT:
  79. return PixelFormat::S8_UINT;
  80. case Tegra::DepthFormat::D32_FLOAT_S8X24_UINT:
  81. return PixelFormat::D32_FLOAT_S8_UINT;
  82. default:
  83. UNIMPLEMENTED_MSG("Unimplemented format={}", format);
  84. return PixelFormat::S8_UINT_D24_UNORM;
  85. }
  86. }
  87. PixelFormat PixelFormatFromRenderTargetFormat(Tegra::RenderTargetFormat format) {
  88. switch (format) {
  89. case Tegra::RenderTargetFormat::R32B32G32A32_FLOAT:
  90. return PixelFormat::R32G32B32A32_FLOAT;
  91. case Tegra::RenderTargetFormat::R32G32B32A32_SINT:
  92. return PixelFormat::R32G32B32A32_SINT;
  93. case Tegra::RenderTargetFormat::R32G32B32A32_UINT:
  94. return PixelFormat::R32G32B32A32_UINT;
  95. case Tegra::RenderTargetFormat::R16G16B16A16_UNORM:
  96. return PixelFormat::R16G16B16A16_UNORM;
  97. case Tegra::RenderTargetFormat::R16G16B16A16_SNORM:
  98. return PixelFormat::R16G16B16A16_SNORM;
  99. case Tegra::RenderTargetFormat::R16G16B16A16_SINT:
  100. return PixelFormat::R16G16B16A16_SINT;
  101. case Tegra::RenderTargetFormat::R16G16B16A16_UINT:
  102. return PixelFormat::R16G16B16A16_UINT;
  103. case Tegra::RenderTargetFormat::R16G16B16A16_FLOAT:
  104. return PixelFormat::R16G16B16A16_FLOAT;
  105. case Tegra::RenderTargetFormat::R32G32_FLOAT:
  106. return PixelFormat::R32G32_FLOAT;
  107. case Tegra::RenderTargetFormat::R32G32_SINT:
  108. return PixelFormat::R32G32_SINT;
  109. case Tegra::RenderTargetFormat::R32G32_UINT:
  110. return PixelFormat::R32G32_UINT;
  111. case Tegra::RenderTargetFormat::R16G16B16X16_FLOAT:
  112. return PixelFormat::R16G16B16X16_FLOAT;
  113. case Tegra::RenderTargetFormat::B8G8R8A8_UNORM:
  114. return PixelFormat::B8G8R8A8_UNORM;
  115. case Tegra::RenderTargetFormat::B8G8R8A8_SRGB:
  116. return PixelFormat::B8G8R8A8_SRGB;
  117. case Tegra::RenderTargetFormat::A2B10G10R10_UNORM:
  118. return PixelFormat::A2B10G10R10_UNORM;
  119. case Tegra::RenderTargetFormat::A2B10G10R10_UINT:
  120. return PixelFormat::A2B10G10R10_UINT;
  121. case Tegra::RenderTargetFormat::A8B8G8R8_UNORM:
  122. return PixelFormat::A8B8G8R8_UNORM;
  123. case Tegra::RenderTargetFormat::A8B8G8R8_SRGB:
  124. return PixelFormat::A8B8G8R8_SRGB;
  125. case Tegra::RenderTargetFormat::A8B8G8R8_SNORM:
  126. return PixelFormat::A8B8G8R8_SNORM;
  127. case Tegra::RenderTargetFormat::A8B8G8R8_SINT:
  128. return PixelFormat::A8B8G8R8_SINT;
  129. case Tegra::RenderTargetFormat::A8B8G8R8_UINT:
  130. return PixelFormat::A8B8G8R8_UINT;
  131. case Tegra::RenderTargetFormat::R16G16_UNORM:
  132. return PixelFormat::R16G16_UNORM;
  133. case Tegra::RenderTargetFormat::R16G16_SNORM:
  134. return PixelFormat::R16G16_SNORM;
  135. case Tegra::RenderTargetFormat::R16G16_SINT:
  136. return PixelFormat::R16G16_SINT;
  137. case Tegra::RenderTargetFormat::R16G16_UINT:
  138. return PixelFormat::R16G16_UINT;
  139. case Tegra::RenderTargetFormat::R16G16_FLOAT:
  140. return PixelFormat::R16G16_FLOAT;
  141. case Tegra::RenderTargetFormat::B10G11R11_FLOAT:
  142. return PixelFormat::B10G11R11_FLOAT;
  143. case Tegra::RenderTargetFormat::R32_SINT:
  144. return PixelFormat::R32_SINT;
  145. case Tegra::RenderTargetFormat::R32_UINT:
  146. return PixelFormat::R32_UINT;
  147. case Tegra::RenderTargetFormat::R32_FLOAT:
  148. return PixelFormat::R32_FLOAT;
  149. case Tegra::RenderTargetFormat::R5G6B5_UNORM:
  150. return PixelFormat::R5G6B5_UNORM;
  151. case Tegra::RenderTargetFormat::A1R5G5B5_UNORM:
  152. return PixelFormat::A1R5G5B5_UNORM;
  153. case Tegra::RenderTargetFormat::R8G8_UNORM:
  154. return PixelFormat::R8G8_UNORM;
  155. case Tegra::RenderTargetFormat::R8G8_SNORM:
  156. return PixelFormat::R8G8_SNORM;
  157. case Tegra::RenderTargetFormat::R8G8_SINT:
  158. return PixelFormat::R8G8_SINT;
  159. case Tegra::RenderTargetFormat::R8G8_UINT:
  160. return PixelFormat::R8G8_UINT;
  161. case Tegra::RenderTargetFormat::R16_UNORM:
  162. return PixelFormat::R16_UNORM;
  163. case Tegra::RenderTargetFormat::R16_SNORM:
  164. return PixelFormat::R16_SNORM;
  165. case Tegra::RenderTargetFormat::R16_SINT:
  166. return PixelFormat::R16_SINT;
  167. case Tegra::RenderTargetFormat::R16_UINT:
  168. return PixelFormat::R16_UINT;
  169. case Tegra::RenderTargetFormat::R16_FLOAT:
  170. return PixelFormat::R16_FLOAT;
  171. case Tegra::RenderTargetFormat::R8_UNORM:
  172. return PixelFormat::R8_UNORM;
  173. case Tegra::RenderTargetFormat::R8_SNORM:
  174. return PixelFormat::R8_SNORM;
  175. case Tegra::RenderTargetFormat::R8_SINT:
  176. return PixelFormat::R8_SINT;
  177. case Tegra::RenderTargetFormat::R8_UINT:
  178. return PixelFormat::R8_UINT;
  179. default:
  180. UNIMPLEMENTED_MSG("Unimplemented format={}", format);
  181. return PixelFormat::A8B8G8R8_UNORM;
  182. }
  183. }
  184. PixelFormat PixelFormatFromGPUPixelFormat(Service::android::PixelFormat format) {
  185. switch (format) {
  186. case Service::android::PixelFormat::Rgba8888:
  187. return PixelFormat::A8B8G8R8_UNORM;
  188. case Service::android::PixelFormat::Rgb565:
  189. return PixelFormat::R5G6B5_UNORM;
  190. case Service::android::PixelFormat::Bgra8888:
  191. return PixelFormat::B8G8R8A8_UNORM;
  192. default:
  193. UNIMPLEMENTED_MSG("Unimplemented format={}", format);
  194. return PixelFormat::A8B8G8R8_UNORM;
  195. }
  196. }
  197. SurfaceType GetFormatType(PixelFormat pixel_format) {
  198. if (static_cast<std::size_t>(pixel_format) <
  199. static_cast<std::size_t>(PixelFormat::MaxColorFormat)) {
  200. return SurfaceType::ColorTexture;
  201. }
  202. if (static_cast<std::size_t>(pixel_format) <
  203. static_cast<std::size_t>(PixelFormat::MaxDepthFormat)) {
  204. return SurfaceType::Depth;
  205. }
  206. if (static_cast<std::size_t>(pixel_format) <
  207. static_cast<std::size_t>(PixelFormat::MaxStencilFormat)) {
  208. return SurfaceType::Stencil;
  209. }
  210. if (static_cast<std::size_t>(pixel_format) <
  211. static_cast<std::size_t>(PixelFormat::MaxDepthStencilFormat)) {
  212. return SurfaceType::DepthStencil;
  213. }
  214. // TODO(Subv): Implement the other formats
  215. ASSERT(false);
  216. return SurfaceType::Invalid;
  217. }
  218. bool IsPixelFormatASTC(PixelFormat format) {
  219. switch (format) {
  220. case PixelFormat::ASTC_2D_4X4_UNORM:
  221. case PixelFormat::ASTC_2D_5X4_UNORM:
  222. case PixelFormat::ASTC_2D_5X5_UNORM:
  223. case PixelFormat::ASTC_2D_8X8_UNORM:
  224. case PixelFormat::ASTC_2D_8X5_UNORM:
  225. case PixelFormat::ASTC_2D_4X4_SRGB:
  226. case PixelFormat::ASTC_2D_5X4_SRGB:
  227. case PixelFormat::ASTC_2D_5X5_SRGB:
  228. case PixelFormat::ASTC_2D_8X8_SRGB:
  229. case PixelFormat::ASTC_2D_8X5_SRGB:
  230. case PixelFormat::ASTC_2D_10X8_UNORM:
  231. case PixelFormat::ASTC_2D_10X8_SRGB:
  232. case PixelFormat::ASTC_2D_6X6_UNORM:
  233. case PixelFormat::ASTC_2D_6X6_SRGB:
  234. case PixelFormat::ASTC_2D_10X6_UNORM:
  235. case PixelFormat::ASTC_2D_10X10_UNORM:
  236. case PixelFormat::ASTC_2D_10X10_SRGB:
  237. case PixelFormat::ASTC_2D_12X12_UNORM:
  238. case PixelFormat::ASTC_2D_12X12_SRGB:
  239. case PixelFormat::ASTC_2D_8X6_UNORM:
  240. case PixelFormat::ASTC_2D_8X6_SRGB:
  241. case PixelFormat::ASTC_2D_6X5_UNORM:
  242. case PixelFormat::ASTC_2D_6X5_SRGB:
  243. return true;
  244. default:
  245. return false;
  246. }
  247. }
  248. bool IsPixelFormatSRGB(PixelFormat format) {
  249. switch (format) {
  250. case PixelFormat::A8B8G8R8_SRGB:
  251. case PixelFormat::B8G8R8A8_SRGB:
  252. case PixelFormat::BC1_RGBA_SRGB:
  253. case PixelFormat::BC2_SRGB:
  254. case PixelFormat::BC3_SRGB:
  255. case PixelFormat::BC7_SRGB:
  256. case PixelFormat::ASTC_2D_4X4_SRGB:
  257. case PixelFormat::ASTC_2D_8X8_SRGB:
  258. case PixelFormat::ASTC_2D_8X5_SRGB:
  259. case PixelFormat::ASTC_2D_5X4_SRGB:
  260. case PixelFormat::ASTC_2D_5X5_SRGB:
  261. case PixelFormat::ASTC_2D_10X8_SRGB:
  262. case PixelFormat::ASTC_2D_6X6_SRGB:
  263. case PixelFormat::ASTC_2D_10X10_SRGB:
  264. case PixelFormat::ASTC_2D_12X12_SRGB:
  265. case PixelFormat::ASTC_2D_8X6_SRGB:
  266. case PixelFormat::ASTC_2D_6X5_SRGB:
  267. return true;
  268. default:
  269. return false;
  270. }
  271. }
  272. bool IsPixelFormatInteger(PixelFormat format) {
  273. switch (format) {
  274. case PixelFormat::A8B8G8R8_SINT:
  275. case PixelFormat::A8B8G8R8_UINT:
  276. case PixelFormat::A2B10G10R10_UINT:
  277. case PixelFormat::R8_SINT:
  278. case PixelFormat::R8_UINT:
  279. case PixelFormat::R16G16B16A16_SINT:
  280. case PixelFormat::R16G16B16A16_UINT:
  281. case PixelFormat::R32G32B32A32_UINT:
  282. case PixelFormat::R32G32B32A32_SINT:
  283. case PixelFormat::R32G32_SINT:
  284. case PixelFormat::R16_UINT:
  285. case PixelFormat::R16_SINT:
  286. case PixelFormat::R16G16_UINT:
  287. case PixelFormat::R16G16_SINT:
  288. case PixelFormat::R8G8_SINT:
  289. case PixelFormat::R8G8_UINT:
  290. case PixelFormat::R32G32_UINT:
  291. case PixelFormat::R32_UINT:
  292. case PixelFormat::R32_SINT:
  293. return true;
  294. default:
  295. return false;
  296. }
  297. }
  298. bool IsPixelFormatSignedInteger(PixelFormat format) {
  299. switch (format) {
  300. case PixelFormat::A8B8G8R8_SINT:
  301. case PixelFormat::R8_SINT:
  302. case PixelFormat::R16G16B16A16_SINT:
  303. case PixelFormat::R32G32B32A32_SINT:
  304. case PixelFormat::R32G32_SINT:
  305. case PixelFormat::R16_SINT:
  306. case PixelFormat::R16G16_SINT:
  307. case PixelFormat::R8G8_SINT:
  308. case PixelFormat::R32_SINT:
  309. return true;
  310. default:
  311. return false;
  312. }
  313. }
  314. size_t PixelComponentSizeBitsInteger(PixelFormat format) {
  315. switch (format) {
  316. case PixelFormat::A8B8G8R8_SINT:
  317. case PixelFormat::A8B8G8R8_UINT:
  318. case PixelFormat::R8_SINT:
  319. case PixelFormat::R8_UINT:
  320. case PixelFormat::R8G8_SINT:
  321. case PixelFormat::R8G8_UINT:
  322. return 8;
  323. case PixelFormat::A2B10G10R10_UINT:
  324. return 10;
  325. case PixelFormat::R16G16B16A16_SINT:
  326. case PixelFormat::R16G16B16A16_UINT:
  327. case PixelFormat::R16_UINT:
  328. case PixelFormat::R16_SINT:
  329. case PixelFormat::R16G16_UINT:
  330. case PixelFormat::R16G16_SINT:
  331. return 16;
  332. case PixelFormat::R32G32B32A32_UINT:
  333. case PixelFormat::R32G32B32A32_SINT:
  334. case PixelFormat::R32G32_SINT:
  335. case PixelFormat::R32G32_UINT:
  336. case PixelFormat::R32_UINT:
  337. case PixelFormat::R32_SINT:
  338. return 32;
  339. default:
  340. return 0;
  341. }
  342. }
  343. std::pair<u32, u32> GetASTCBlockSize(PixelFormat format) {
  344. return {DefaultBlockWidth(format), DefaultBlockHeight(format)};
  345. }
  346. u64 EstimatedDecompressedSize(u64 base_size, PixelFormat format) {
  347. constexpr u64 RGBA8_PIXEL_SIZE = 4;
  348. const u64 base_block_size = static_cast<u64>(DefaultBlockWidth(format)) *
  349. static_cast<u64>(DefaultBlockHeight(format)) * RGBA8_PIXEL_SIZE;
  350. return (base_size * base_block_size) / BytesPerBlock(format);
  351. }
  352. } // namespace VideoCore::Surface