vulkan_device: Test depth stencil blit support by format
This commit is contained in:
parent
26658c2e93
commit
d31676935e
3 changed files with 47 additions and 29 deletions
|
@ -1043,15 +1043,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);
|
||||||
|
|
||||||
|
|
|
@ -376,7 +376,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;
|
||||||
|
@ -739,14 +740,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,
|
||||||
|
|
|
@ -359,9 +359,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.
|
||||||
|
@ -657,7 +662,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.
|
||||||
|
@ -722,7 +727,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.
|
||||||
|
|
Loading…
Reference in a new issue