buffers{};
};
diff --git a/src/yuzu_video_core/texture_cache/texture_cache.h b/src/yuzu_video_core/texture_cache/texture_cache.h
index 3ea23e01..9a8dd8bc 100644
--- a/src/yuzu_video_core/texture_cache/texture_cache.h
+++ b/src/yuzu_video_core/texture_cache/texture_cache.h
@@ -1128,8 +1128,9 @@ void TextureCache::RefreshContents(Image& image, ImageId image_id) {
image.flags &= ~ImageFlagBits::CpuModified;
TrackImage(image, image_id);
- if (image.info.num_samples > 1 && !runtime.CanUploadMSAA()) {
- LOG_WARNING(HW_GPU, "MSAA image uploads are not implemented");
+ if (image.info.num_samples > 1 && !runtime.CanUploadMSAA(image)) {
+ LOG_WARNING(HW_GPU, "MSAA image upload is not supported for format {}",
+ static_cast(image.info.format));
runtime.TransitionImageLayout(image);
return;
}
diff --git a/src/yuzu_video_core/vulkan_common/vulkan_device.cpp b/src/yuzu_video_core/vulkan_common/vulkan_device.cpp
index 69f2ec60..8ca3c00c 100644
--- a/src/yuzu_video_core/vulkan_common/vulkan_device.cpp
+++ b/src/yuzu_video_core/vulkan_common/vulkan_device.cpp
@@ -1194,6 +1194,11 @@ bool Device::GetSuitability(bool requires_swapchain)
SetNext(next, properties.transform_feedback);
}
+ if (instance_version >= VK_API_VERSION_1_2)
+ {
+ properties.depth_stencil_resolve.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES;
+ SetNext(next, properties.depth_stencil_resolve);
+ }
// Perform the property fetch.
physical.GetProperties2(properties2);
properties.properties = properties2.properties;
diff --git a/src/yuzu_video_core/vulkan_common/vulkan_device.h b/src/yuzu_video_core/vulkan_common/vulkan_device.h
index 1b36eef9..4cb00cb3 100644
--- a/src/yuzu_video_core/vulkan_common/vulkan_device.h
+++ b/src/yuzu_video_core/vulkan_common/vulkan_device.h
@@ -266,6 +266,15 @@ public:
return properties.properties.apiVersion;
}
+ bool SupportsDepthStencilResolve(VkImageAspectFlags aspect) const
+ {
+ const auto & caps = properties.depth_stencil_resolve;
+ return instance_version >= VK_API_VERSION_1_2 && dld.vkCreateRenderPass2 &&
+ ((aspect & VK_IMAGE_ASPECT_DEPTH_BIT) == 0 ||
+ (caps.supportedDepthResolveModes & VK_RESOLVE_MODE_SAMPLE_ZERO_BIT)) &&
+ ((aspect & VK_IMAGE_ASPECT_STENCIL_BIT) == 0 ||
+ (caps.supportedStencilResolveModes & VK_RESOLVE_MODE_SAMPLE_ZERO_BIT));
+ }
/// Returns the current driver version provided in Vulkan-formatted version numbers.
u32 GetDriverVersion() const {
return properties.properties.driverVersion;
@@ -857,6 +866,7 @@ private:
};
struct Properties {
+ VkPhysicalDeviceDepthStencilResolveProperties depth_stencil_resolve{};
VkPhysicalDeviceDriverProperties driver{};
VkPhysicalDeviceSubgroupProperties subgroup_properties{};
VkPhysicalDeviceFloatControlsProperties float_controls{};
diff --git a/src/yuzu_video_core/vulkan_common/vulkan_wrapper.cpp b/src/yuzu_video_core/vulkan_common/vulkan_wrapper.cpp
index 4e5f931e..2573f01b 100644
--- a/src/yuzu_video_core/vulkan_common/vulkan_wrapper.cpp
+++ b/src/yuzu_video_core/vulkan_common/vulkan_wrapper.cpp
@@ -174,6 +174,7 @@ void Load(VkDevice device, DeviceDispatch& dld) noexcept {
X(vkCreatePipelineLayout);
X(vkCreateQueryPool);
X(vkCreateRenderPass);
+ X(vkCreateRenderPass2);
X(vkCreateSampler);
X(vkCreateSemaphore);
X(vkCreateShaderModule);
@@ -701,6 +702,13 @@ RenderPass Device::CreateRenderPass(const VkRenderPassCreateInfo& ci) const {
return RenderPass(object, handle, *dld);
}
+RenderPass Device::CreateRenderPass2(const VkRenderPassCreateInfo2 & ci) const
+{
+ VkRenderPass object;
+ Check(dld->vkCreateRenderPass2(handle, &ci, nullptr, &object));
+ return RenderPass(object, handle, *dld);
+}
+
DescriptorSetLayout Device::CreateDescriptorSetLayout(
const VkDescriptorSetLayoutCreateInfo& ci) const {
VkDescriptorSetLayout object;
diff --git a/src/yuzu_video_core/vulkan_common/vulkan_wrapper.h b/src/yuzu_video_core/vulkan_common/vulkan_wrapper.h
index f0cabe81..10b13650 100644
--- a/src/yuzu_video_core/vulkan_common/vulkan_wrapper.h
+++ b/src/yuzu_video_core/vulkan_common/vulkan_wrapper.h
@@ -272,6 +272,7 @@ struct DeviceDispatch : InstanceDispatch {
PFN_vkCreatePipelineLayout vkCreatePipelineLayout{};
PFN_vkCreateQueryPool vkCreateQueryPool{};
PFN_vkCreateRenderPass vkCreateRenderPass{};
+ PFN_vkCreateRenderPass2 vkCreateRenderPass2{};
PFN_vkCreateSampler vkCreateSampler{};
PFN_vkCreateSemaphore vkCreateSemaphore{};
PFN_vkCreateShaderModule vkCreateShaderModule{};
@@ -968,6 +969,7 @@ public:
DescriptorPool CreateDescriptorPool(const VkDescriptorPoolCreateInfo& ci) const;
RenderPass CreateRenderPass(const VkRenderPassCreateInfo& ci) const;
+ RenderPass CreateRenderPass2(const VkRenderPassCreateInfo2 & ci) const;
DescriptorSetLayout CreateDescriptorSetLayout(const VkDescriptorSetLayoutCreateInfo& ci) const;