Merge pull request #11165 from Morph1984/ds_blit

vulkan_device: Return true if either depth/stencil format supports blit
This commit is contained in:
liamwhite 2023-09-24 10:50:04 -04:00 committed by GitHub
commit b356909212
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 47 additions and 29 deletions

View file

@ -1049,15 +1049,27 @@ void TextureCacheRuntime::BlitImage(Framebuffer* dst_framebuffer, ImageView& dst
dst_region, src_region, filter, operation); dst_region, src_region, filter, operation);
return; return;
} }
ASSERT(src.format == dst.format);
if (aspect_mask == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) { if (aspect_mask == (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)) {
if (!device.IsBlitDepthStencilSupported()) { const auto format = src.format;
const auto can_blit_depth_stencil = [this, format] {
switch (format) {
case VideoCore::Surface::PixelFormat::D24_UNORM_S8_UINT:
case VideoCore::Surface::PixelFormat::S8_UINT_D24_UNORM:
return device.IsBlitDepth24Stencil8Supported();
case VideoCore::Surface::PixelFormat::D32_FLOAT_S8_UINT:
return device.IsBlitDepth32Stencil8Supported();
default:
UNREACHABLE();
}
}();
if (!can_blit_depth_stencil) {
UNIMPLEMENTED_IF(is_src_msaa || is_dst_msaa); UNIMPLEMENTED_IF(is_src_msaa || is_dst_msaa);
blit_image_helper.BlitDepthStencil(dst_framebuffer, src.DepthView(), src.StencilView(), blit_image_helper.BlitDepthStencil(dst_framebuffer, src.DepthView(), src.StencilView(),
dst_region, src_region, filter, operation); dst_region, src_region, filter, operation);
return; return;
} }
} }
ASSERT(src.format == dst.format);
ASSERT(!(is_dst_msaa && !is_src_msaa)); ASSERT(!(is_dst_msaa && !is_src_msaa));
ASSERT(operation == Fermi2D::Operation::SrcCopy); ASSERT(operation == Fermi2D::Operation::SrcCopy);

View file

@ -428,7 +428,8 @@ Device::Device(VkInstance instance_, vk::PhysicalDevice physical_, VkSurfaceKHR
first_next = &diagnostics_nv; first_next = &diagnostics_nv;
} }
is_blit_depth_stencil_supported = TestDepthStencilBlits(); is_blit_depth24_stencil8_supported = TestDepthStencilBlits(VK_FORMAT_D24_UNORM_S8_UINT);
is_blit_depth32_stencil8_supported = TestDepthStencilBlits(VK_FORMAT_D32_SFLOAT_S8_UINT);
is_optimal_astc_supported = ComputeIsOptimalAstcSupported(); is_optimal_astc_supported = ComputeIsOptimalAstcSupported();
is_warp_potentially_bigger = !extensions.subgroup_size_control || is_warp_potentially_bigger = !extensions.subgroup_size_control ||
properties.subgroup_size_control.maxSubgroupSize > GuestWarpSize; properties.subgroup_size_control.maxSubgroupSize > GuestWarpSize;
@ -782,14 +783,13 @@ bool Device::ComputeIsOptimalAstcSupported() const {
return true; return true;
} }
bool Device::TestDepthStencilBlits() const { bool Device::TestDepthStencilBlits(VkFormat format) const {
static constexpr VkFormatFeatureFlags required_features = static constexpr VkFormatFeatureFlags required_features =
VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT; VK_FORMAT_FEATURE_BLIT_SRC_BIT | VK_FORMAT_FEATURE_BLIT_DST_BIT;
const auto test_features = [](VkFormatProperties props) { const auto test_features = [](VkFormatProperties props) {
return (props.optimalTilingFeatures & required_features) == required_features; return (props.optimalTilingFeatures & required_features) == required_features;
}; };
return test_features(format_properties.at(VK_FORMAT_D32_SFLOAT_S8_UINT)) && return test_features(format_properties.at(format));
test_features(format_properties.at(VK_FORMAT_D24_UNORM_S8_UINT));
} }
bool Device::IsFormatSupported(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage, bool Device::IsFormatSupported(VkFormat wanted_format, VkFormatFeatureFlags wanted_usage,

View file

@ -362,9 +362,14 @@ public:
return features.features.depthBounds; return features.features.depthBounds;
} }
/// Returns true when blitting from and to depth stencil images is supported. /// Returns true when blitting from and to D24S8 images is supported.
bool IsBlitDepthStencilSupported() const { bool IsBlitDepth24Stencil8Supported() const {
return is_blit_depth_stencil_supported; return is_blit_depth24_stencil8_supported;
}
/// Returns true when blitting from and to D32S8 images is supported.
bool IsBlitDepth32Stencil8Supported() const {
return is_blit_depth32_stencil8_supported;
} }
/// Returns true if the device supports VK_NV_viewport_swizzle. /// Returns true if the device supports VK_NV_viewport_swizzle.
@ -674,7 +679,7 @@ private:
bool ComputeIsOptimalAstcSupported() const; bool ComputeIsOptimalAstcSupported() const;
/// Returns true if the device natively supports blitting depth stencil images. /// Returns true if the device natively supports blitting depth stencil images.
bool TestDepthStencilBlits() const; bool TestDepthStencilBlits(VkFormat format) const;
private: private:
VkInstance instance; ///< Vulkan instance. VkInstance instance; ///< Vulkan instance.
@ -739,7 +744,8 @@ private:
// Misc features // Misc features
bool is_optimal_astc_supported{}; ///< Support for all guest ASTC formats. bool is_optimal_astc_supported{}; ///< Support for all guest ASTC formats.
bool is_blit_depth_stencil_supported{}; ///< Support for blitting from and to depth stencil. bool is_blit_depth24_stencil8_supported{}; ///< Support for blitting from and to D24S8.
bool is_blit_depth32_stencil8_supported{}; ///< Support for blitting from and to D32S8.
bool is_warp_potentially_bigger{}; ///< Host warp size can be bigger than guest. bool is_warp_potentially_bigger{}; ///< Host warp size can be bigger than guest.
bool is_integrated{}; ///< Is GPU an iGPU. bool is_integrated{}; ///< Is GPU an iGPU.
bool is_virtual{}; ///< Is GPU a virtual GPU. bool is_virtual{}; ///< Is GPU a virtual GPU.