diff options
Diffstat (limited to 'src/video_core/surface.h')
| -rw-r--r-- | src/video_core/surface.h | 225 |
1 files changed, 155 insertions, 70 deletions
diff --git a/src/video_core/surface.h b/src/video_core/surface.h index b783e4b27..83f31c12c 100644 --- a/src/video_core/surface.h +++ b/src/video_core/surface.h | |||
| @@ -114,6 +114,7 @@ enum class SurfaceType { | |||
| 114 | 114 | ||
| 115 | enum class SurfaceTarget { | 115 | enum class SurfaceTarget { |
| 116 | Texture1D, | 116 | Texture1D, |
| 117 | TextureBuffer, | ||
| 117 | Texture2D, | 118 | Texture2D, |
| 118 | Texture3D, | 119 | Texture3D, |
| 119 | Texture1DArray, | 120 | Texture1DArray, |
| @@ -122,71 +123,71 @@ enum class SurfaceTarget { | |||
| 122 | TextureCubeArray, | 123 | TextureCubeArray, |
| 123 | }; | 124 | }; |
| 124 | 125 | ||
| 125 | constexpr std::array<u32, MaxPixelFormat> compression_factor_table = {{ | 126 | constexpr std::array<u32, MaxPixelFormat> compression_factor_shift_table = {{ |
| 126 | 1, // ABGR8U | 127 | 0, // ABGR8U |
| 127 | 1, // ABGR8S | 128 | 0, // ABGR8S |
| 128 | 1, // ABGR8UI | 129 | 0, // ABGR8UI |
| 129 | 1, // B5G6R5U | 130 | 0, // B5G6R5U |
| 130 | 1, // A2B10G10R10U | 131 | 0, // A2B10G10R10U |
| 131 | 1, // A1B5G5R5U | 132 | 0, // A1B5G5R5U |
| 132 | 1, // R8U | 133 | 0, // R8U |
| 133 | 1, // R8UI | 134 | 0, // R8UI |
| 134 | 1, // RGBA16F | 135 | 0, // RGBA16F |
| 135 | 1, // RGBA16U | 136 | 0, // RGBA16U |
| 136 | 1, // RGBA16UI | 137 | 0, // RGBA16UI |
| 137 | 1, // R11FG11FB10F | 138 | 0, // R11FG11FB10F |
| 138 | 1, // RGBA32UI | 139 | 0, // RGBA32UI |
| 139 | 4, // DXT1 | 140 | 2, // DXT1 |
| 140 | 4, // DXT23 | 141 | 2, // DXT23 |
| 141 | 4, // DXT45 | 142 | 2, // DXT45 |
| 142 | 4, // DXN1 | 143 | 2, // DXN1 |
| 143 | 4, // DXN2UNORM | 144 | 2, // DXN2UNORM |
| 144 | 4, // DXN2SNORM | 145 | 2, // DXN2SNORM |
| 145 | 4, // BC7U | 146 | 2, // BC7U |
| 146 | 4, // BC6H_UF16 | 147 | 2, // BC6H_UF16 |
| 147 | 4, // BC6H_SF16 | 148 | 2, // BC6H_SF16 |
| 148 | 4, // ASTC_2D_4X4 | 149 | 2, // ASTC_2D_4X4 |
| 149 | 1, // BGRA8 | 150 | 0, // BGRA8 |
| 150 | 1, // RGBA32F | 151 | 0, // RGBA32F |
| 151 | 1, // RG32F | 152 | 0, // RG32F |
| 152 | 1, // R32F | 153 | 0, // R32F |
| 153 | 1, // R16F | 154 | 0, // R16F |
| 154 | 1, // R16U | 155 | 0, // R16U |
| 155 | 1, // R16S | 156 | 0, // R16S |
| 156 | 1, // R16UI | 157 | 0, // R16UI |
| 157 | 1, // R16I | 158 | 0, // R16I |
| 158 | 1, // RG16 | 159 | 0, // RG16 |
| 159 | 1, // RG16F | 160 | 0, // RG16F |
| 160 | 1, // RG16UI | 161 | 0, // RG16UI |
| 161 | 1, // RG16I | 162 | 0, // RG16I |
| 162 | 1, // RG16S | 163 | 0, // RG16S |
| 163 | 1, // RGB32F | 164 | 0, // RGB32F |
| 164 | 1, // RGBA8_SRGB | 165 | 0, // RGBA8_SRGB |
| 165 | 1, // RG8U | 166 | 0, // RG8U |
| 166 | 1, // RG8S | 167 | 0, // RG8S |
| 167 | 1, // RG32UI | 168 | 0, // RG32UI |
| 168 | 1, // R32UI | 169 | 0, // R32UI |
| 169 | 4, // ASTC_2D_8X8 | 170 | 2, // ASTC_2D_8X8 |
| 170 | 4, // ASTC_2D_8X5 | 171 | 2, // ASTC_2D_8X5 |
| 171 | 4, // ASTC_2D_5X4 | 172 | 2, // ASTC_2D_5X4 |
| 172 | 1, // BGRA8_SRGB | 173 | 0, // BGRA8_SRGB |
| 173 | 4, // DXT1_SRGB | 174 | 2, // DXT1_SRGB |
| 174 | 4, // DXT23_SRGB | 175 | 2, // DXT23_SRGB |
| 175 | 4, // DXT45_SRGB | 176 | 2, // DXT45_SRGB |
| 176 | 4, // BC7U_SRGB | 177 | 2, // BC7U_SRGB |
| 177 | 4, // ASTC_2D_4X4_SRGB | 178 | 2, // ASTC_2D_4X4_SRGB |
| 178 | 4, // ASTC_2D_8X8_SRGB | 179 | 2, // ASTC_2D_8X8_SRGB |
| 179 | 4, // ASTC_2D_8X5_SRGB | 180 | 2, // ASTC_2D_8X5_SRGB |
| 180 | 4, // ASTC_2D_5X4_SRGB | 181 | 2, // ASTC_2D_5X4_SRGB |
| 181 | 4, // ASTC_2D_5X5 | 182 | 2, // ASTC_2D_5X5 |
| 182 | 4, // ASTC_2D_5X5_SRGB | 183 | 2, // ASTC_2D_5X5_SRGB |
| 183 | 4, // ASTC_2D_10X8 | 184 | 2, // ASTC_2D_10X8 |
| 184 | 4, // ASTC_2D_10X8_SRGB | 185 | 2, // ASTC_2D_10X8_SRGB |
| 185 | 1, // Z32F | 186 | 0, // Z32F |
| 186 | 1, // Z16 | 187 | 0, // Z16 |
| 187 | 1, // Z24S8 | 188 | 0, // Z24S8 |
| 188 | 1, // S8Z24 | 189 | 0, // S8Z24 |
| 189 | 1, // Z32FS8 | 190 | 0, // Z32FS8 |
| 190 | }}; | 191 | }}; |
| 191 | 192 | ||
| 192 | /** | 193 | /** |
| @@ -195,12 +196,14 @@ constexpr std::array<u32, MaxPixelFormat> compression_factor_table = {{ | |||
| 195 | * compressed image. This is used for maintaining proper surface sizes for compressed | 196 | * compressed image. This is used for maintaining proper surface sizes for compressed |
| 196 | * texture formats. | 197 | * texture formats. |
| 197 | */ | 198 | */ |
| 198 | static constexpr u32 GetCompressionFactor(PixelFormat format) { | 199 | inline constexpr u32 GetCompressionFactorShift(PixelFormat format) { |
| 199 | if (format == PixelFormat::Invalid) | 200 | DEBUG_ASSERT(format != PixelFormat::Invalid); |
| 200 | return 0; | 201 | DEBUG_ASSERT(static_cast<std::size_t>(format) < compression_factor_shift_table.size()); |
| 202 | return compression_factor_shift_table[static_cast<std::size_t>(format)]; | ||
| 203 | } | ||
| 201 | 204 | ||
| 202 | ASSERT(static_cast<std::size_t>(format) < compression_factor_table.size()); | 205 | inline constexpr u32 GetCompressionFactor(PixelFormat format) { |
| 203 | return compression_factor_table[static_cast<std::size_t>(format)]; | 206 | return 1U << GetCompressionFactorShift(format); |
| 204 | } | 207 | } |
| 205 | 208 | ||
| 206 | constexpr std::array<u32, MaxPixelFormat> block_width_table = {{ | 209 | constexpr std::array<u32, MaxPixelFormat> block_width_table = {{ |
| @@ -436,6 +439,88 @@ static constexpr u32 GetBytesPerPixel(PixelFormat pixel_format) { | |||
| 436 | return GetFormatBpp(pixel_format) / CHAR_BIT; | 439 | return GetFormatBpp(pixel_format) / CHAR_BIT; |
| 437 | } | 440 | } |
| 438 | 441 | ||
| 442 | enum class SurfaceCompression { | ||
| 443 | None, // Not compressed | ||
| 444 | Compressed, // Texture is compressed | ||
| 445 | Converted, // Texture is converted before upload or after download | ||
| 446 | Rearranged, // Texture is swizzled before upload or after download | ||
| 447 | }; | ||
| 448 | |||
| 449 | constexpr std::array<SurfaceCompression, MaxPixelFormat> compression_type_table = {{ | ||
| 450 | SurfaceCompression::None, // ABGR8U | ||
| 451 | SurfaceCompression::None, // ABGR8S | ||
| 452 | SurfaceCompression::None, // ABGR8UI | ||
| 453 | SurfaceCompression::None, // B5G6R5U | ||
| 454 | SurfaceCompression::None, // A2B10G10R10U | ||
| 455 | SurfaceCompression::None, // A1B5G5R5U | ||
| 456 | SurfaceCompression::None, // R8U | ||
| 457 | SurfaceCompression::None, // R8UI | ||
| 458 | SurfaceCompression::None, // RGBA16F | ||
| 459 | SurfaceCompression::None, // RGBA16U | ||
| 460 | SurfaceCompression::None, // RGBA16UI | ||
| 461 | SurfaceCompression::None, // R11FG11FB10F | ||
| 462 | SurfaceCompression::None, // RGBA32UI | ||
| 463 | SurfaceCompression::Compressed, // DXT1 | ||
| 464 | SurfaceCompression::Compressed, // DXT23 | ||
| 465 | SurfaceCompression::Compressed, // DXT45 | ||
| 466 | SurfaceCompression::Compressed, // DXN1 | ||
| 467 | SurfaceCompression::Compressed, // DXN2UNORM | ||
| 468 | SurfaceCompression::Compressed, // DXN2SNORM | ||
| 469 | SurfaceCompression::Compressed, // BC7U | ||
| 470 | SurfaceCompression::Compressed, // BC6H_UF16 | ||
| 471 | SurfaceCompression::Compressed, // BC6H_SF16 | ||
| 472 | SurfaceCompression::Converted, // ASTC_2D_4X4 | ||
| 473 | SurfaceCompression::None, // BGRA8 | ||
| 474 | SurfaceCompression::None, // RGBA32F | ||
| 475 | SurfaceCompression::None, // RG32F | ||
| 476 | SurfaceCompression::None, // R32F | ||
| 477 | SurfaceCompression::None, // R16F | ||
| 478 | SurfaceCompression::None, // R16U | ||
| 479 | SurfaceCompression::None, // R16S | ||
| 480 | SurfaceCompression::None, // R16UI | ||
| 481 | SurfaceCompression::None, // R16I | ||
| 482 | SurfaceCompression::None, // RG16 | ||
| 483 | SurfaceCompression::None, // RG16F | ||
| 484 | SurfaceCompression::None, // RG16UI | ||
| 485 | SurfaceCompression::None, // RG16I | ||
| 486 | SurfaceCompression::None, // RG16S | ||
| 487 | SurfaceCompression::None, // RGB32F | ||
| 488 | SurfaceCompression::None, // RGBA8_SRGB | ||
| 489 | SurfaceCompression::None, // RG8U | ||
| 490 | SurfaceCompression::None, // RG8S | ||
| 491 | SurfaceCompression::None, // RG32UI | ||
| 492 | SurfaceCompression::None, // R32UI | ||
| 493 | SurfaceCompression::Converted, // ASTC_2D_8X8 | ||
| 494 | SurfaceCompression::Converted, // ASTC_2D_8X5 | ||
| 495 | SurfaceCompression::Converted, // ASTC_2D_5X4 | ||
| 496 | SurfaceCompression::None, // BGRA8_SRGB | ||
| 497 | SurfaceCompression::Compressed, // DXT1_SRGB | ||
| 498 | SurfaceCompression::Compressed, // DXT23_SRGB | ||
| 499 | SurfaceCompression::Compressed, // DXT45_SRGB | ||
| 500 | SurfaceCompression::Compressed, // BC7U_SRGB | ||
| 501 | SurfaceCompression::Converted, // ASTC_2D_4X4_SRGB | ||
| 502 | SurfaceCompression::Converted, // ASTC_2D_8X8_SRGB | ||
| 503 | SurfaceCompression::Converted, // ASTC_2D_8X5_SRGB | ||
| 504 | SurfaceCompression::Converted, // ASTC_2D_5X4_SRGB | ||
| 505 | SurfaceCompression::Converted, // ASTC_2D_5X5 | ||
| 506 | SurfaceCompression::Converted, // ASTC_2D_5X5_SRGB | ||
| 507 | SurfaceCompression::Converted, // ASTC_2D_10X8 | ||
| 508 | SurfaceCompression::Converted, // ASTC_2D_10X8_SRGB | ||
| 509 | SurfaceCompression::None, // Z32F | ||
| 510 | SurfaceCompression::None, // Z16 | ||
| 511 | SurfaceCompression::None, // Z24S8 | ||
| 512 | SurfaceCompression::Rearranged, // S8Z24 | ||
| 513 | SurfaceCompression::None, // Z32FS8 | ||
| 514 | }}; | ||
| 515 | |||
| 516 | constexpr SurfaceCompression GetFormatCompressionType(PixelFormat format) { | ||
| 517 | if (format == PixelFormat::Invalid) { | ||
| 518 | return SurfaceCompression::None; | ||
| 519 | } | ||
| 520 | DEBUG_ASSERT(static_cast<std::size_t>(format) < compression_type_table.size()); | ||
| 521 | return compression_type_table[static_cast<std::size_t>(format)]; | ||
| 522 | } | ||
| 523 | |||
| 439 | SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type); | 524 | SurfaceTarget SurfaceTargetFromTextureType(Tegra::Texture::TextureType texture_type); |
| 440 | 525 | ||
| 441 | bool SurfaceTargetIsLayered(SurfaceTarget target); | 526 | bool SurfaceTargetIsLayered(SurfaceTarget target); |