summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ameerj2021-08-14 23:19:01 -0400
committerGravatar ameerj2021-08-21 02:37:15 -0400
commite0397f00d0461f9fc927733fe462a41be2de6009 (patch)
treef28f273326dd3add8df44c4f969b97cec7e9f71e /src
parentMerge pull request #6888 from v1993/patch-3 (diff)
downloadyuzu-e0397f00d0461f9fc927733fe462a41be2de6009.tar.gz
yuzu-e0397f00d0461f9fc927733fe462a41be2de6009.tar.xz
yuzu-e0397f00d0461f9fc927733fe462a41be2de6009.zip
vk_rasterizer: Only clear depth and stencil buffers when set in attachment aspect mask
Silences validation errors for clearing the depth/stencil buffers of framebuffer attachments that were not specified to have depth/stencil usage.
Diffstat (limited to '')
-rw-r--r--src/video_core/renderer_vulkan/vk_rasterizer.cpp11
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.cpp5
-rw-r--r--src/video_core/renderer_vulkan/vk_texture_cache.h14
3 files changed, 24 insertions, 6 deletions
diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
index 3ac18ea54..841a6b846 100644
--- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp
+++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp
@@ -228,9 +228,7 @@ void RasterizerVulkan::Clear() {
228 }; 228 };
229 229
230 const u32 color_attachment = regs.clear_buffers.RT; 230 const u32 color_attachment = regs.clear_buffers.RT;
231 const auto attachment_aspect_mask = framebuffer->ImageRanges()[color_attachment].aspectMask; 231 if (use_color && framebuffer->HasAspectColorBit(color_attachment)) {
232 const bool is_color_rt = (attachment_aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != 0;
233 if (use_color && is_color_rt) {
234 VkClearValue clear_value; 232 VkClearValue clear_value;
235 std::memcpy(clear_value.color.float32, regs.clear_color, sizeof(regs.clear_color)); 233 std::memcpy(clear_value.color.float32, regs.clear_color, sizeof(regs.clear_color));
236 234
@@ -248,12 +246,15 @@ void RasterizerVulkan::Clear() {
248 return; 246 return;
249 } 247 }
250 VkImageAspectFlags aspect_flags = 0; 248 VkImageAspectFlags aspect_flags = 0;
251 if (use_depth) { 249 if (use_depth && framebuffer->HasAspectDepthBit()) {
252 aspect_flags |= VK_IMAGE_ASPECT_DEPTH_BIT; 250 aspect_flags |= VK_IMAGE_ASPECT_DEPTH_BIT;
253 } 251 }
254 if (use_stencil) { 252 if (use_stencil && framebuffer->HasAspectStencilBit()) {
255 aspect_flags |= VK_IMAGE_ASPECT_STENCIL_BIT; 253 aspect_flags |= VK_IMAGE_ASPECT_STENCIL_BIT;
256 } 254 }
255 if (aspect_flags == 0) {
256 return;
257 }
257 scheduler.Record([clear_depth = regs.clear_depth, clear_stencil = regs.clear_stencil, 258 scheduler.Record([clear_depth = regs.clear_depth, clear_stencil = regs.clear_stencil,
258 clear_rect, aspect_flags](vk::CommandBuffer cmdbuf) { 259 clear_rect, aspect_flags](vk::CommandBuffer cmdbuf) {
259 VkClearAttachment attachment; 260 VkClearAttachment attachment;
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.cpp b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
index 8f4df7122..ff979a7ac 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.cpp
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.cpp
@@ -1186,9 +1186,12 @@ Framebuffer::Framebuffer(TextureCacheRuntime& runtime, std::span<ImageView*, NUM
1186 renderpass_key.depth_format = depth_buffer->format; 1186 renderpass_key.depth_format = depth_buffer->format;
1187 num_layers = std::max(num_layers, depth_buffer->range.extent.layers); 1187 num_layers = std::max(num_layers, depth_buffer->range.extent.layers);
1188 images[num_images] = depth_buffer->ImageHandle(); 1188 images[num_images] = depth_buffer->ImageHandle();
1189 image_ranges[num_images] = MakeSubresourceRange(depth_buffer); 1189 const VkImageSubresourceRange subresource_range = MakeSubresourceRange(depth_buffer);
1190 image_ranges[num_images] = subresource_range;
1190 samples = depth_buffer->Samples(); 1191 samples = depth_buffer->Samples();
1191 ++num_images; 1192 ++num_images;
1193 has_depth = (subresource_range.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0;
1194 has_stencil = (subresource_range.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != 0;
1192 } else { 1195 } else {
1193 renderpass_key.depth_format = PixelFormat::Invalid; 1196 renderpass_key.depth_format = PixelFormat::Invalid;
1194 } 1197 }
diff --git a/src/video_core/renderer_vulkan/vk_texture_cache.h b/src/video_core/renderer_vulkan/vk_texture_cache.h
index 5fe6b7ba3..6d5a68bfe 100644
--- a/src/video_core/renderer_vulkan/vk_texture_cache.h
+++ b/src/video_core/renderer_vulkan/vk_texture_cache.h
@@ -232,6 +232,18 @@ public:
232 return image_ranges; 232 return image_ranges;
233 } 233 }
234 234
235 [[nodiscard]] bool HasAspectColorBit(size_t index) const noexcept {
236 return (image_ranges.at(index).aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != 0;
237 }
238
239 [[nodiscard]] bool HasAspectDepthBit() const noexcept {
240 return has_depth;
241 }
242
243 [[nodiscard]] bool HasAspectStencilBit() const noexcept {
244 return has_stencil;
245 }
246
235private: 247private:
236 vk::Framebuffer framebuffer; 248 vk::Framebuffer framebuffer;
237 VkRenderPass renderpass{}; 249 VkRenderPass renderpass{};
@@ -241,6 +253,8 @@ private:
241 u32 num_images = 0; 253 u32 num_images = 0;
242 std::array<VkImage, 9> images{}; 254 std::array<VkImage, 9> images{};
243 std::array<VkImageSubresourceRange, 9> image_ranges{}; 255 std::array<VkImageSubresourceRange, 9> image_ranges{};
256 bool has_depth{};
257 bool has_stencil{};
244}; 258};
245 259
246struct TextureCacheParams { 260struct TextureCacheParams {