diff options
| author | 2022-04-13 17:01:57 +0200 | |
|---|---|---|
| committer | 2022-04-14 11:06:27 -0400 | |
| commit | f783883bf89311b51aef76b6b8b07d112369eca7 (patch) | |
| tree | 840182ad79bb2b6025aa79e01adf8a063f8c7ea6 /src | |
| parent | buffer_cache: cap vertex buffer sizes (diff) | |
| download | yuzu-f783883bf89311b51aef76b6b8b07d112369eca7.tar.gz yuzu-f783883bf89311b51aef76b6b8b07d112369eca7.tar.xz yuzu-f783883bf89311b51aef76b6b8b07d112369eca7.zip | |
video_core: implement formats for N64 emulation
Diffstat (limited to 'src')
| -rw-r--r-- | src/video_core/renderer_opengl/gl_texture_cache.cpp | 26 | ||||
| -rw-r--r-- | src/video_core/renderer_opengl/maxwell_to_gl.h | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/maxwell_to_vk.cpp | 2 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 49 | ||||
| -rw-r--r-- | src/video_core/surface.h | 8 | ||||
| -rw-r--r-- | src/video_core/texture_cache/format_lookup_table.cpp | 6 | ||||
| -rw-r--r-- | src/video_core/texture_cache/formatter.h | 4 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 12 |
8 files changed, 102 insertions, 7 deletions
diff --git a/src/video_core/renderer_opengl/gl_texture_cache.cpp b/src/video_core/renderer_opengl/gl_texture_cache.cpp index d12076358..f8c6e5c7e 100644 --- a/src/video_core/renderer_opengl/gl_texture_cache.cpp +++ b/src/video_core/renderer_opengl/gl_texture_cache.cpp | |||
| @@ -182,6 +182,26 @@ GLenum AttachmentType(PixelFormat format) { | |||
| 182 | } | 182 | } |
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | GLint ConvertA5B5G5R1_UNORM(SwizzleSource source) { | ||
| 186 | switch (source) { | ||
| 187 | case SwizzleSource::Zero: | ||
| 188 | return GL_ZERO; | ||
| 189 | case SwizzleSource::R: | ||
| 190 | return GL_ALPHA; | ||
| 191 | case SwizzleSource::G: | ||
| 192 | return GL_BLUE; | ||
| 193 | case SwizzleSource::B: | ||
| 194 | return GL_GREEN; | ||
| 195 | case SwizzleSource::A: | ||
| 196 | return GL_RED; | ||
| 197 | case SwizzleSource::OneInt: | ||
| 198 | case SwizzleSource::OneFloat: | ||
| 199 | return GL_ONE; | ||
| 200 | } | ||
| 201 | UNREACHABLE_MSG("Invalid swizzle source={}", source); | ||
| 202 | return GL_NONE; | ||
| 203 | } | ||
| 204 | |||
| 185 | void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4> swizzle) { | 205 | void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4> swizzle) { |
| 186 | switch (format) { | 206 | switch (format) { |
| 187 | case PixelFormat::D24_UNORM_S8_UINT: | 207 | case PixelFormat::D24_UNORM_S8_UINT: |
| @@ -192,6 +212,12 @@ void ApplySwizzle(GLuint handle, PixelFormat format, std::array<SwizzleSource, 4 | |||
| 192 | TextureMode(format, swizzle[0] == SwizzleSource::R)); | 212 | TextureMode(format, swizzle[0] == SwizzleSource::R)); |
| 193 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); | 213 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); |
| 194 | break; | 214 | break; |
| 215 | case PixelFormat::A5B5G5R1_UNORM: { | ||
| 216 | std::array<GLint, 4> gl_swizzle; | ||
| 217 | std::ranges::transform(swizzle, gl_swizzle.begin(), ConvertA5B5G5R1_UNORM); | ||
| 218 | glTextureParameteriv(handle, GL_TEXTURE_SWIZZLE_RGBA, gl_swizzle.data()); | ||
| 219 | return; | ||
| 220 | } | ||
| 195 | default: | 221 | default: |
| 196 | break; | 222 | break; |
| 197 | } | 223 | } |
diff --git a/src/video_core/renderer_opengl/maxwell_to_gl.h b/src/video_core/renderer_opengl/maxwell_to_gl.h index db5bf1d30..03adf3d4c 100644 --- a/src/video_core/renderer_opengl/maxwell_to_gl.h +++ b/src/video_core/renderer_opengl/maxwell_to_gl.h | |||
| @@ -30,6 +30,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB | |||
| 30 | {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM | 30 | {GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UNORM |
| 31 | {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT | 31 | {GL_RGB10_A2UI, GL_RGBA_INTEGER, GL_UNSIGNED_INT_2_10_10_10_REV}, // A2B10G10R10_UINT |
| 32 | {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM | 32 | {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV}, // A1B5G5R5_UNORM |
| 33 | {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1}, // A5B5G5R1_UNORM | ||
| 33 | {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM | 34 | {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R8_UNORM |
| 34 | {GL_R8_SNORM, GL_RED, GL_BYTE}, // R8_SNORM | 35 | {GL_R8_SNORM, GL_RED, GL_BYTE}, // R8_SNORM |
| 35 | {GL_R8I, GL_RED_INTEGER, GL_BYTE}, // R8_SINT | 36 | {GL_R8I, GL_RED_INTEGER, GL_BYTE}, // R8_SINT |
| @@ -87,6 +88,7 @@ constexpr std::array<FormatTuple, VideoCore::Surface::MaxPixelFormat> FORMAT_TAB | |||
| 87 | {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB | 88 | {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, // BC3_SRGB |
| 88 | {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7_SRGB | 89 | {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM}, // BC7_SRGB |
| 89 | {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // A4B4G4R4_UNORM | 90 | {GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4_REV}, // A4B4G4R4_UNORM |
| 91 | {GL_R8, GL_RED, GL_UNSIGNED_BYTE}, // R4G4_UNORM | ||
| 90 | {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB | 92 | {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR}, // ASTC_2D_4X4_SRGB |
| 91 | {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB | 93 | {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR}, // ASTC_2D_8X8_SRGB |
| 92 | {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB | 94 | {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR}, // ASTC_2D_8X5_SRGB |
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index 1c136c410..a2c6d0e6c 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp | |||
| @@ -127,6 +127,7 @@ struct FormatTuple { | |||
| 127 | {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM | 127 | {VK_FORMAT_A2B10G10R10_UNORM_PACK32, Attachable | Storage}, // A2B10G10R10_UNORM |
| 128 | {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT | 128 | {VK_FORMAT_A2B10G10R10_UINT_PACK32, Attachable | Storage}, // A2B10G10R10_UINT |
| 129 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) | 129 | {VK_FORMAT_A1R5G5B5_UNORM_PACK16, Attachable}, // A1B5G5R5_UNORM (flipped with swizzle) |
| 130 | {VK_FORMAT_R5G5B5A1_UNORM_PACK16}, // A5B5G5R1_UNORM (specially swizzled) | ||
| 130 | {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM | 131 | {VK_FORMAT_R8_UNORM, Attachable | Storage}, // R8_UNORM |
| 131 | {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM | 132 | {VK_FORMAT_R8_SNORM, Attachable | Storage}, // R8_SNORM |
| 132 | {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT | 133 | {VK_FORMAT_R8_SINT, Attachable | Storage}, // R8_SINT |
| @@ -184,6 +185,7 @@ struct FormatTuple { | |||
| 184 | {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB | 185 | {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB |
| 185 | {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB | 186 | {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB |
| 186 | {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM | 187 | {VK_FORMAT_R4G4B4A4_UNORM_PACK16, Attachable}, // A4B4G4R4_UNORM |
| 188 | {VK_FORMAT_R4G4_UNORM_PACK8}, // R4G4_UNORM | ||
| 187 | {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB | 189 | {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB |
| 188 | {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB | 190 | {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB |
| 189 | {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB | 191 | {VK_FORMAT_ASTC_8x5_SRGB_BLOCK}, // ASTC_2D_8X5_SRGB |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index 2c2ccc7c6..49691ce0c 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -438,6 +438,32 @@ constexpr VkBorderColor ConvertBorderColor(const std::array<float, 4>& color) { | |||
| 438 | } | 438 | } |
| 439 | } | 439 | } |
| 440 | 440 | ||
| 441 | [[nodiscard]] SwizzleSource SwapGreenRed(SwizzleSource value) { | ||
| 442 | switch (value) { | ||
| 443 | case SwizzleSource::R: | ||
| 444 | return SwizzleSource::G; | ||
| 445 | case SwizzleSource::G: | ||
| 446 | return SwizzleSource::R; | ||
| 447 | default: | ||
| 448 | return value; | ||
| 449 | } | ||
| 450 | } | ||
| 451 | |||
| 452 | [[nodiscard]] SwizzleSource SwapSpecial(SwizzleSource value) { | ||
| 453 | switch (value) { | ||
| 454 | case SwizzleSource::A: | ||
| 455 | return SwizzleSource::R; | ||
| 456 | case SwizzleSource::R: | ||
| 457 | return SwizzleSource::A; | ||
| 458 | case SwizzleSource::G: | ||
| 459 | return SwizzleSource::B; | ||
| 460 | case SwizzleSource::B: | ||
| 461 | return SwizzleSource::G; | ||
| 462 | default: | ||
| 463 | return value; | ||
| 464 | } | ||
| 465 | } | ||
| 466 | |||
| 441 | void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, | 467 | void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage image, |
| 442 | VkImageAspectFlags aspect_mask, bool is_initialized, | 468 | VkImageAspectFlags aspect_mask, bool is_initialized, |
| 443 | std::span<const VkBufferImageCopy> copies) { | 469 | std::span<const VkBufferImageCopy> copies) { |
| @@ -554,14 +580,25 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im | |||
| 554 | }; | 580 | }; |
| 555 | } | 581 | } |
| 556 | 582 | ||
| 557 | [[nodiscard]] bool IsFormatFlipped(PixelFormat format, bool emulate_bgr565) { | 583 | void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle, |
| 584 | bool emulate_bgr565) { | ||
| 558 | switch (format) { | 585 | switch (format) { |
| 559 | case PixelFormat::A1B5G5R5_UNORM: | 586 | case PixelFormat::A1B5G5R5_UNORM: |
| 560 | return true; | 587 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); |
| 588 | break; | ||
| 561 | case PixelFormat::B5G6R5_UNORM: | 589 | case PixelFormat::B5G6R5_UNORM: |
| 562 | return emulate_bgr565; | 590 | if (emulate_bgr565) { |
| 591 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); | ||
| 592 | } | ||
| 593 | break; | ||
| 594 | case PixelFormat::A5B5G5R1_UNORM: | ||
| 595 | std::ranges::transform(swizzle, swizzle.begin(), SwapSpecial); | ||
| 596 | break; | ||
| 597 | case PixelFormat::R4G4_UNORM: | ||
| 598 | std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed); | ||
| 599 | break; | ||
| 563 | default: | 600 | default: |
| 564 | return false; | 601 | break; |
| 565 | } | 602 | } |
| 566 | } | 603 | } |
| 567 | 604 | ||
| @@ -1496,9 +1533,7 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1496 | }; | 1533 | }; |
| 1497 | if (!info.IsRenderTarget()) { | 1534 | if (!info.IsRenderTarget()) { |
| 1498 | swizzle = info.Swizzle(); | 1535 | swizzle = info.Swizzle(); |
| 1499 | if (IsFormatFlipped(format, device->MustEmulateBGR565())) { | 1536 | TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565()); |
| 1500 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); | ||
| 1501 | } | ||
| 1502 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { | 1537 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { |
| 1503 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); | 1538 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); |
| 1504 | } | 1539 | } |
diff --git a/src/video_core/surface.h b/src/video_core/surface.h index 5704cf16a..86fea61ae 100644 --- a/src/video_core/surface.h +++ b/src/video_core/surface.h | |||
| @@ -25,6 +25,7 @@ enum class PixelFormat { | |||
| 25 | A2B10G10R10_UNORM, | 25 | A2B10G10R10_UNORM, |
| 26 | A2B10G10R10_UINT, | 26 | A2B10G10R10_UINT, |
| 27 | A1B5G5R5_UNORM, | 27 | A1B5G5R5_UNORM, |
| 28 | A5B5G5R1_UNORM, | ||
| 28 | R8_UNORM, | 29 | R8_UNORM, |
| 29 | R8_SNORM, | 30 | R8_SNORM, |
| 30 | R8_SINT, | 31 | R8_SINT, |
| @@ -82,6 +83,7 @@ enum class PixelFormat { | |||
| 82 | BC3_SRGB, | 83 | BC3_SRGB, |
| 83 | BC7_SRGB, | 84 | BC7_SRGB, |
| 84 | A4B4G4R4_UNORM, | 85 | A4B4G4R4_UNORM, |
| 86 | R4G4_UNORM, | ||
| 85 | ASTC_2D_4X4_SRGB, | 87 | ASTC_2D_4X4_SRGB, |
| 86 | ASTC_2D_8X8_SRGB, | 88 | ASTC_2D_8X8_SRGB, |
| 87 | ASTC_2D_8X5_SRGB, | 89 | ASTC_2D_8X5_SRGB, |
| @@ -156,6 +158,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{ | |||
| 156 | 1, // A2B10G10R10_UNORM | 158 | 1, // A2B10G10R10_UNORM |
| 157 | 1, // A2B10G10R10_UINT | 159 | 1, // A2B10G10R10_UINT |
| 158 | 1, // A1B5G5R5_UNORM | 160 | 1, // A1B5G5R5_UNORM |
| 161 | 1, // A5B5G5R1_UNORM | ||
| 159 | 1, // R8_UNORM | 162 | 1, // R8_UNORM |
| 160 | 1, // R8_SNORM | 163 | 1, // R8_SNORM |
| 161 | 1, // R8_SINT | 164 | 1, // R8_SINT |
| @@ -213,6 +216,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_WIDTH_TABLE = {{ | |||
| 213 | 4, // BC3_SRGB | 216 | 4, // BC3_SRGB |
| 214 | 4, // BC7_SRGB | 217 | 4, // BC7_SRGB |
| 215 | 1, // A4B4G4R4_UNORM | 218 | 1, // A4B4G4R4_UNORM |
| 219 | 1, // R4G4_UNORM | ||
| 216 | 4, // ASTC_2D_4X4_SRGB | 220 | 4, // ASTC_2D_4X4_SRGB |
| 217 | 8, // ASTC_2D_8X8_SRGB | 221 | 8, // ASTC_2D_8X8_SRGB |
| 218 | 8, // ASTC_2D_8X5_SRGB | 222 | 8, // ASTC_2D_8X5_SRGB |
| @@ -256,6 +260,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{ | |||
| 256 | 1, // A2B10G10R10_UNORM | 260 | 1, // A2B10G10R10_UNORM |
| 257 | 1, // A2B10G10R10_UINT | 261 | 1, // A2B10G10R10_UINT |
| 258 | 1, // A1B5G5R5_UNORM | 262 | 1, // A1B5G5R5_UNORM |
| 263 | 1, // A5B5G5R1_UNORM | ||
| 259 | 1, // R8_UNORM | 264 | 1, // R8_UNORM |
| 260 | 1, // R8_SNORM | 265 | 1, // R8_SNORM |
| 261 | 1, // R8_SINT | 266 | 1, // R8_SINT |
| @@ -313,6 +318,7 @@ constexpr std::array<u32, MaxPixelFormat> BLOCK_HEIGHT_TABLE = {{ | |||
| 313 | 4, // BC3_SRGB | 318 | 4, // BC3_SRGB |
| 314 | 4, // BC7_SRGB | 319 | 4, // BC7_SRGB |
| 315 | 1, // A4B4G4R4_UNORM | 320 | 1, // A4B4G4R4_UNORM |
| 321 | 1, // R4G4_UNORM | ||
| 316 | 4, // ASTC_2D_4X4_SRGB | 322 | 4, // ASTC_2D_4X4_SRGB |
| 317 | 8, // ASTC_2D_8X8_SRGB | 323 | 8, // ASTC_2D_8X8_SRGB |
| 318 | 5, // ASTC_2D_8X5_SRGB | 324 | 5, // ASTC_2D_8X5_SRGB |
| @@ -356,6 +362,7 @@ constexpr std::array<u32, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{ | |||
| 356 | 32, // A2B10G10R10_UNORM | 362 | 32, // A2B10G10R10_UNORM |
| 357 | 32, // A2B10G10R10_UINT | 363 | 32, // A2B10G10R10_UINT |
| 358 | 16, // A1B5G5R5_UNORM | 364 | 16, // A1B5G5R5_UNORM |
| 365 | 16, // A5B5G5R1_UNORM | ||
| 359 | 8, // R8_UNORM | 366 | 8, // R8_UNORM |
| 360 | 8, // R8_SNORM | 367 | 8, // R8_SNORM |
| 361 | 8, // R8_SINT | 368 | 8, // R8_SINT |
| @@ -413,6 +420,7 @@ constexpr std::array<u32, MaxPixelFormat> BITS_PER_BLOCK_TABLE = {{ | |||
| 413 | 128, // BC3_SRGB | 420 | 128, // BC3_SRGB |
| 414 | 128, // BC7_UNORM | 421 | 128, // BC7_UNORM |
| 415 | 16, // A4B4G4R4_UNORM | 422 | 16, // A4B4G4R4_UNORM |
| 423 | 8, // R4G4_UNORM | ||
| 416 | 128, // ASTC_2D_4X4_SRGB | 424 | 128, // ASTC_2D_4X4_SRGB |
| 417 | 128, // ASTC_2D_8X8_SRGB | 425 | 128, // ASTC_2D_8X8_SRGB |
| 418 | 128, // ASTC_2D_8X5_SRGB | 426 | 128, // ASTC_2D_8X5_SRGB |
diff --git a/src/video_core/texture_cache/format_lookup_table.cpp b/src/video_core/texture_cache/format_lookup_table.cpp index afa807d5d..20e64a7c2 100644 --- a/src/video_core/texture_cache/format_lookup_table.cpp +++ b/src/video_core/texture_cache/format_lookup_table.cpp | |||
| @@ -63,6 +63,10 @@ PixelFormat PixelFormatFromTextureInfo(TextureFormat format, ComponentType red, | |||
| 63 | return PixelFormat::A1B5G5R5_UNORM; | 63 | return PixelFormat::A1B5G5R5_UNORM; |
| 64 | case Hash(TextureFormat::A4B4G4R4, UNORM): | 64 | case Hash(TextureFormat::A4B4G4R4, UNORM): |
| 65 | return PixelFormat::A4B4G4R4_UNORM; | 65 | return PixelFormat::A4B4G4R4_UNORM; |
| 66 | case Hash(TextureFormat::G4R4, UNORM): | ||
| 67 | return PixelFormat::R4G4_UNORM; | ||
| 68 | case Hash(TextureFormat::A5B5G5R1, UNORM): | ||
| 69 | return PixelFormat::A5B5G5R1_UNORM; | ||
| 66 | case Hash(TextureFormat::R8, UNORM): | 70 | case Hash(TextureFormat::R8, UNORM): |
| 67 | return PixelFormat::R8_UNORM; | 71 | return PixelFormat::R8_UNORM; |
| 68 | case Hash(TextureFormat::R8, SNORM): | 72 | case Hash(TextureFormat::R8, SNORM): |
| @@ -143,6 +147,8 @@ PixelFormat PixelFormatFromTextureInfo(TextureFormat format, ComponentType red, | |||
| 143 | return PixelFormat::S8_UINT_D24_UNORM; | 147 | return PixelFormat::S8_UINT_D24_UNORM; |
| 144 | case Hash(TextureFormat::R8G24, UINT, UNORM, UNORM, UNORM, LINEAR): | 148 | case Hash(TextureFormat::R8G24, UINT, UNORM, UNORM, UNORM, LINEAR): |
| 145 | return PixelFormat::S8_UINT_D24_UNORM; | 149 | return PixelFormat::S8_UINT_D24_UNORM; |
| 150 | case Hash(TextureFormat::D24S8, UNORM, UINT, UINT, UINT, LINEAR): | ||
| 151 | return PixelFormat::D24_UNORM_S8_UINT; | ||
| 146 | case Hash(TextureFormat::D32S8, FLOAT, UINT, UNORM, UNORM, LINEAR): | 152 | case Hash(TextureFormat::D32S8, FLOAT, UINT, UNORM, UNORM, LINEAR): |
| 147 | return PixelFormat::D32_FLOAT_S8_UINT; | 153 | return PixelFormat::D32_FLOAT_S8_UINT; |
| 148 | case Hash(TextureFormat::BC1_RGBA, UNORM, LINEAR): | 154 | case Hash(TextureFormat::BC1_RGBA, UNORM, LINEAR): |
diff --git a/src/video_core/texture_cache/formatter.h b/src/video_core/texture_cache/formatter.h index b2c81057b..6f5afc5a9 100644 --- a/src/video_core/texture_cache/formatter.h +++ b/src/video_core/texture_cache/formatter.h | |||
| @@ -38,6 +38,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str | |||
| 38 | return "A2B10G10R10_UINT"; | 38 | return "A2B10G10R10_UINT"; |
| 39 | case PixelFormat::A1B5G5R5_UNORM: | 39 | case PixelFormat::A1B5G5R5_UNORM: |
| 40 | return "A1B5G5R5_UNORM"; | 40 | return "A1B5G5R5_UNORM"; |
| 41 | case PixelFormat::A5B5G5R1_UNORM: | ||
| 42 | return "A5B5G5R1_UNORM"; | ||
| 41 | case PixelFormat::R8_UNORM: | 43 | case PixelFormat::R8_UNORM: |
| 42 | return "R8_UNORM"; | 44 | return "R8_UNORM"; |
| 43 | case PixelFormat::R8_SNORM: | 45 | case PixelFormat::R8_SNORM: |
| @@ -152,6 +154,8 @@ struct fmt::formatter<VideoCore::Surface::PixelFormat> : fmt::formatter<fmt::str | |||
| 152 | return "BC7_SRGB"; | 154 | return "BC7_SRGB"; |
| 153 | case PixelFormat::A4B4G4R4_UNORM: | 155 | case PixelFormat::A4B4G4R4_UNORM: |
| 154 | return "A4B4G4R4_UNORM"; | 156 | return "A4B4G4R4_UNORM"; |
| 157 | case PixelFormat::R4G4_UNORM: | ||
| 158 | return "R4G4_UNORM"; | ||
| 155 | case PixelFormat::ASTC_2D_4X4_SRGB: | 159 | case PixelFormat::ASTC_2D_4X4_SRGB: |
| 156 | return "ASTC_2D_4X4_SRGB"; | 160 | return "ASTC_2D_4X4_SRGB"; |
| 157 | case PixelFormat::ASTC_2D_8X8_SRGB: | 161 | case PixelFormat::ASTC_2D_8X8_SRGB: |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index f3a05ada9..bd05a1f84 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -45,6 +45,12 @@ constexpr std::array B5G6R5_UNORM_PACK16{ | |||
| 45 | VK_FORMAT_R5G6B5_UNORM_PACK16, | 45 | VK_FORMAT_R5G6B5_UNORM_PACK16, |
| 46 | VK_FORMAT_UNDEFINED, | 46 | VK_FORMAT_UNDEFINED, |
| 47 | }; | 47 | }; |
| 48 | |||
| 49 | constexpr std::array R4G4_UNORM_PACK8{ | ||
| 50 | VK_FORMAT_R8_UNORM, | ||
| 51 | VK_FORMAT_UNDEFINED, | ||
| 52 | }; | ||
| 53 | |||
| 48 | } // namespace Alternatives | 54 | } // namespace Alternatives |
| 49 | 55 | ||
| 50 | enum class NvidiaArchitecture { | 56 | enum class NvidiaArchitecture { |
| @@ -95,6 +101,8 @@ constexpr const VkFormat* GetFormatAlternatives(VkFormat format) { | |||
| 95 | return Alternatives::DEPTH16_UNORM_STENCIL8_UINT.data(); | 101 | return Alternatives::DEPTH16_UNORM_STENCIL8_UINT.data(); |
| 96 | case VK_FORMAT_B5G6R5_UNORM_PACK16: | 102 | case VK_FORMAT_B5G6R5_UNORM_PACK16: |
| 97 | return Alternatives::B5G6R5_UNORM_PACK16.data(); | 103 | return Alternatives::B5G6R5_UNORM_PACK16.data(); |
| 104 | case VK_FORMAT_R4G4_UNORM_PACK8: | ||
| 105 | return Alternatives::R4G4_UNORM_PACK8.data(); | ||
| 98 | default: | 106 | default: |
| 99 | return nullptr; | 107 | return nullptr; |
| 100 | } | 108 | } |
| @@ -122,6 +130,8 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica | |||
| 122 | VK_FORMAT_A8B8G8R8_SRGB_PACK32, | 130 | VK_FORMAT_A8B8G8R8_SRGB_PACK32, |
| 123 | VK_FORMAT_R5G6B5_UNORM_PACK16, | 131 | VK_FORMAT_R5G6B5_UNORM_PACK16, |
| 124 | VK_FORMAT_B5G6R5_UNORM_PACK16, | 132 | VK_FORMAT_B5G6R5_UNORM_PACK16, |
| 133 | VK_FORMAT_R5G5B5A1_UNORM_PACK16, | ||
| 134 | VK_FORMAT_B5G5R5A1_UNORM_PACK16, | ||
| 125 | VK_FORMAT_A2B10G10R10_UNORM_PACK32, | 135 | VK_FORMAT_A2B10G10R10_UNORM_PACK32, |
| 126 | VK_FORMAT_A2B10G10R10_UINT_PACK32, | 136 | VK_FORMAT_A2B10G10R10_UINT_PACK32, |
| 127 | VK_FORMAT_A1R5G5B5_UNORM_PACK16, | 137 | VK_FORMAT_A1R5G5B5_UNORM_PACK16, |
| @@ -160,7 +170,9 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica | |||
| 160 | VK_FORMAT_R16G16B16A16_SFLOAT, | 170 | VK_FORMAT_R16G16B16A16_SFLOAT, |
| 161 | VK_FORMAT_B8G8R8A8_UNORM, | 171 | VK_FORMAT_B8G8R8A8_UNORM, |
| 162 | VK_FORMAT_B8G8R8A8_SRGB, | 172 | VK_FORMAT_B8G8R8A8_SRGB, |
| 173 | VK_FORMAT_R4G4_UNORM_PACK8, | ||
| 163 | VK_FORMAT_R4G4B4A4_UNORM_PACK16, | 174 | VK_FORMAT_R4G4B4A4_UNORM_PACK16, |
| 175 | VK_FORMAT_B4G4R4A4_UNORM_PACK16, | ||
| 164 | VK_FORMAT_D32_SFLOAT, | 176 | VK_FORMAT_D32_SFLOAT, |
| 165 | VK_FORMAT_D16_UNORM, | 177 | VK_FORMAT_D16_UNORM, |
| 166 | VK_FORMAT_S8_UINT, | 178 | VK_FORMAT_S8_UINT, |