diff options
| -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 | 10 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.cpp | 8 | ||||
| -rw-r--r-- | src/video_core/vulkan_common/vulkan_device.h | 8 |
4 files changed, 25 insertions, 3 deletions
diff --git a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp index 35bf80ea3..208e88533 100644 --- a/src/video_core/renderer_vulkan/maxwell_to_vk.cpp +++ b/src/video_core/renderer_vulkan/maxwell_to_vk.cpp | |||
| @@ -185,7 +185,7 @@ struct FormatTuple { | |||
| 185 | {VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB | 185 | {VK_FORMAT_BC2_SRGB_BLOCK}, // BC2_SRGB |
| 186 | {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB | 186 | {VK_FORMAT_BC3_SRGB_BLOCK}, // BC3_SRGB |
| 187 | {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB | 187 | {VK_FORMAT_BC7_SRGB_BLOCK}, // BC7_SRGB |
| 188 | {VK_FORMAT_R4G4B4A4_UNORM_PACK16}, // A4B4G4R4_UNORM | 188 | {VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT}, // A4B4G4R4_UNORM |
| 189 | {VK_FORMAT_R4G4_UNORM_PACK8}, // G4R4_UNORM | 189 | {VK_FORMAT_R4G4_UNORM_PACK8}, // G4R4_UNORM |
| 190 | {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB | 190 | {VK_FORMAT_ASTC_4x4_SRGB_BLOCK}, // ASTC_2D_4X4_SRGB |
| 191 | {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB | 191 | {VK_FORMAT_ASTC_8x8_SRGB_BLOCK}, // ASTC_2D_8X8_SRGB |
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp index b3e17c332..285a50ea4 100644 --- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp +++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp | |||
| @@ -600,7 +600,7 @@ void CopyBufferToImage(vk::CommandBuffer cmdbuf, VkBuffer src_buffer, VkImage im | |||
| 600 | } | 600 | } |
| 601 | 601 | ||
| 602 | void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle, | 602 | void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4>& swizzle, |
| 603 | bool emulate_bgr565) { | 603 | bool emulate_bgr565, bool emulate_a4b4g4r4) { |
| 604 | switch (format) { | 604 | switch (format) { |
| 605 | case PixelFormat::A1B5G5R5_UNORM: | 605 | case PixelFormat::A1B5G5R5_UNORM: |
| 606 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); | 606 | std::ranges::transform(swizzle, swizzle.begin(), SwapBlueRed); |
| @@ -616,6 +616,11 @@ void TryTransformSwizzleIfNeeded(PixelFormat format, std::array<SwizzleSource, 4 | |||
| 616 | case PixelFormat::G4R4_UNORM: | 616 | case PixelFormat::G4R4_UNORM: |
| 617 | std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed); | 617 | std::ranges::transform(swizzle, swizzle.begin(), SwapGreenRed); |
| 618 | break; | 618 | break; |
| 619 | case PixelFormat::A4B4G4R4_UNORM: | ||
| 620 | if (emulate_a4b4g4r4) { | ||
| 621 | std::ranges::reverse(swizzle); | ||
| 622 | } | ||
| 623 | break; | ||
| 619 | default: | 624 | default: |
| 620 | break; | 625 | break; |
| 621 | } | 626 | } |
| @@ -1649,7 +1654,8 @@ ImageView::ImageView(TextureCacheRuntime& runtime, const VideoCommon::ImageViewI | |||
| 1649 | }; | 1654 | }; |
| 1650 | if (!info.IsRenderTarget()) { | 1655 | if (!info.IsRenderTarget()) { |
| 1651 | swizzle = info.Swizzle(); | 1656 | swizzle = info.Swizzle(); |
| 1652 | TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565()); | 1657 | TryTransformSwizzleIfNeeded(format, swizzle, device->MustEmulateBGR565(), |
| 1658 | !device->IsExt4444FormatsSupported()); | ||
| 1653 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { | 1659 | if ((aspect_mask & (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) != 0) { |
| 1654 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); | 1660 | std::ranges::transform(swizzle, swizzle.begin(), ConvertGreenRed); |
| 1655 | } | 1661 | } |
diff --git a/src/video_core/vulkan_common/vulkan_device.cpp b/src/video_core/vulkan_common/vulkan_device.cpp index 617417040..a88ff5ca5 100644 --- a/src/video_core/vulkan_common/vulkan_device.cpp +++ b/src/video_core/vulkan_common/vulkan_device.cpp | |||
| @@ -76,6 +76,11 @@ constexpr std::array VK_FORMAT_R32G32B32_SFLOAT{ | |||
| 76 | VK_FORMAT_UNDEFINED, | 76 | VK_FORMAT_UNDEFINED, |
| 77 | }; | 77 | }; |
| 78 | 78 | ||
| 79 | constexpr std::array VK_FORMAT_A4B4G4R4_UNORM_PACK16{ | ||
| 80 | VK_FORMAT_R4G4B4A4_UNORM_PACK16, | ||
| 81 | VK_FORMAT_UNDEFINED, | ||
| 82 | }; | ||
| 83 | |||
| 79 | } // namespace Alternatives | 84 | } // namespace Alternatives |
| 80 | 85 | ||
| 81 | enum class NvidiaArchitecture { | 86 | enum class NvidiaArchitecture { |
| @@ -110,6 +115,8 @@ constexpr const VkFormat* GetFormatAlternatives(VkFormat format) { | |||
| 110 | return Alternatives::R8G8B8_SSCALED.data(); | 115 | return Alternatives::R8G8B8_SSCALED.data(); |
| 111 | case VK_FORMAT_R32G32B32_SFLOAT: | 116 | case VK_FORMAT_R32G32B32_SFLOAT: |
| 112 | return Alternatives::VK_FORMAT_R32G32B32_SFLOAT.data(); | 117 | return Alternatives::VK_FORMAT_R32G32B32_SFLOAT.data(); |
| 118 | case VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT: | ||
| 119 | return Alternatives::VK_FORMAT_A4B4G4R4_UNORM_PACK16.data(); | ||
| 113 | default: | 120 | default: |
| 114 | return nullptr; | 121 | return nullptr; |
| 115 | } | 122 | } |
| @@ -238,6 +245,7 @@ std::unordered_map<VkFormat, VkFormatProperties> GetFormatProperties(vk::Physica | |||
| 238 | VK_FORMAT_R32_SINT, | 245 | VK_FORMAT_R32_SINT, |
| 239 | VK_FORMAT_R32_UINT, | 246 | VK_FORMAT_R32_UINT, |
| 240 | VK_FORMAT_R4G4B4A4_UNORM_PACK16, | 247 | VK_FORMAT_R4G4B4A4_UNORM_PACK16, |
| 248 | VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT, | ||
| 241 | VK_FORMAT_R4G4_UNORM_PACK8, | 249 | VK_FORMAT_R4G4_UNORM_PACK8, |
| 242 | VK_FORMAT_R5G5B5A1_UNORM_PACK16, | 250 | VK_FORMAT_R5G5B5A1_UNORM_PACK16, |
| 243 | VK_FORMAT_R5G6B5_UNORM_PACK16, | 251 | VK_FORMAT_R5G6B5_UNORM_PACK16, |
diff --git a/src/video_core/vulkan_common/vulkan_device.h b/src/video_core/vulkan_common/vulkan_device.h index 488fdd313..6c7fa34e5 100644 --- a/src/video_core/vulkan_common/vulkan_device.h +++ b/src/video_core/vulkan_common/vulkan_device.h | |||
| @@ -45,6 +45,7 @@ VK_DEFINE_HANDLE(VmaAllocator) | |||
| 45 | FEATURE(EXT, ExtendedDynamicState, EXTENDED_DYNAMIC_STATE, extended_dynamic_state) \ | 45 | FEATURE(EXT, ExtendedDynamicState, EXTENDED_DYNAMIC_STATE, extended_dynamic_state) \ |
| 46 | FEATURE(EXT, ExtendedDynamicState2, EXTENDED_DYNAMIC_STATE_2, extended_dynamic_state2) \ | 46 | FEATURE(EXT, ExtendedDynamicState2, EXTENDED_DYNAMIC_STATE_2, extended_dynamic_state2) \ |
| 47 | FEATURE(EXT, ExtendedDynamicState3, EXTENDED_DYNAMIC_STATE_3, extended_dynamic_state3) \ | 47 | FEATURE(EXT, ExtendedDynamicState3, EXTENDED_DYNAMIC_STATE_3, extended_dynamic_state3) \ |
| 48 | FEATURE(EXT, 4444Formats, 4444_FORMATS, format_a4b4g4r4) \ | ||
| 48 | FEATURE(EXT, IndexTypeUint8, INDEX_TYPE_UINT8, index_type_uint8) \ | 49 | FEATURE(EXT, IndexTypeUint8, INDEX_TYPE_UINT8, index_type_uint8) \ |
| 49 | FEATURE(EXT, LineRasterization, LINE_RASTERIZATION, line_rasterization) \ | 50 | FEATURE(EXT, LineRasterization, LINE_RASTERIZATION, line_rasterization) \ |
| 50 | FEATURE(EXT, PrimitiveTopologyListRestart, PRIMITIVE_TOPOLOGY_LIST_RESTART, \ | 51 | FEATURE(EXT, PrimitiveTopologyListRestart, PRIMITIVE_TOPOLOGY_LIST_RESTART, \ |
| @@ -97,6 +98,7 @@ VK_DEFINE_HANDLE(VmaAllocator) | |||
| 97 | EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) \ | 98 | EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME) \ |
| 98 | EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME) \ | 99 | EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME) \ |
| 99 | EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME) \ | 100 | EXTENSION_NAME(VK_EXT_EXTENDED_DYNAMIC_STATE_3_EXTENSION_NAME) \ |
| 101 | EXTENSION_NAME(VK_EXT_4444_FORMATS_EXTENSION_NAME) \ | ||
| 100 | EXTENSION_NAME(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) \ | 102 | EXTENSION_NAME(VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME) \ |
| 101 | EXTENSION_NAME(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) \ | 103 | EXTENSION_NAME(VK_EXT_ROBUSTNESS_2_EXTENSION_NAME) \ |
| 102 | EXTENSION_NAME(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME) \ | 104 | EXTENSION_NAME(VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME) \ |
| @@ -144,6 +146,7 @@ VK_DEFINE_HANDLE(VmaAllocator) | |||
| 144 | #define FOR_EACH_VK_RECOMMENDED_FEATURE(FEATURE_NAME) \ | 146 | #define FOR_EACH_VK_RECOMMENDED_FEATURE(FEATURE_NAME) \ |
| 145 | FEATURE_NAME(custom_border_color, customBorderColors) \ | 147 | FEATURE_NAME(custom_border_color, customBorderColors) \ |
| 146 | FEATURE_NAME(extended_dynamic_state, extendedDynamicState) \ | 148 | FEATURE_NAME(extended_dynamic_state, extendedDynamicState) \ |
| 149 | FEATURE_NAME(format_a4b4g4r4, formatA4B4G4R4) \ | ||
| 147 | FEATURE_NAME(index_type_uint8, indexTypeUint8) \ | 150 | FEATURE_NAME(index_type_uint8, indexTypeUint8) \ |
| 148 | FEATURE_NAME(primitive_topology_list_restart, primitiveTopologyListRestart) \ | 151 | FEATURE_NAME(primitive_topology_list_restart, primitiveTopologyListRestart) \ |
| 149 | FEATURE_NAME(provoking_vertex, provokingVertexLast) \ | 152 | FEATURE_NAME(provoking_vertex, provokingVertexLast) \ |
| @@ -488,6 +491,11 @@ public: | |||
| 488 | return extensions.extended_dynamic_state3; | 491 | return extensions.extended_dynamic_state3; |
| 489 | } | 492 | } |
| 490 | 493 | ||
| 494 | /// Returns true if the device supports VK_EXT_4444_formats. | ||
| 495 | bool IsExt4444FormatsSupported() const { | ||
| 496 | return features.format_a4b4g4r4.formatA4B4G4R4; | ||
| 497 | } | ||
| 498 | |||
| 491 | /// Returns true if the device supports VK_EXT_extended_dynamic_state3. | 499 | /// Returns true if the device supports VK_EXT_extended_dynamic_state3. |
| 492 | bool IsExtExtendedDynamicState3BlendingSupported() const { | 500 | bool IsExtExtendedDynamicState3BlendingSupported() const { |
| 493 | return dynamic_state3_blending; | 501 | return dynamic_state3_blending; |