Merge pull request #6901 from ameerj/vk-clear-bits
vk_rasterizer: Only clear depth/stencil buffers when specified in attachment aspect mask
This commit is contained in:
		| @@ -228,9 +228,7 @@ void RasterizerVulkan::Clear() { | ||||
|     }; | ||||
|  | ||||
|     const u32 color_attachment = regs.clear_buffers.RT; | ||||
|     const auto attachment_aspect_mask = framebuffer->ImageRanges()[color_attachment].aspectMask; | ||||
|     const bool is_color_rt = (attachment_aspect_mask & VK_IMAGE_ASPECT_COLOR_BIT) != 0; | ||||
|     if (use_color && is_color_rt) { | ||||
|     if (use_color && framebuffer->HasAspectColorBit(color_attachment)) { | ||||
|         VkClearValue clear_value; | ||||
|         std::memcpy(clear_value.color.float32, regs.clear_color, sizeof(regs.clear_color)); | ||||
|  | ||||
| @@ -248,12 +246,15 @@ void RasterizerVulkan::Clear() { | ||||
|         return; | ||||
|     } | ||||
|     VkImageAspectFlags aspect_flags = 0; | ||||
|     if (use_depth) { | ||||
|     if (use_depth && framebuffer->HasAspectDepthBit()) { | ||||
|         aspect_flags |= VK_IMAGE_ASPECT_DEPTH_BIT; | ||||
|     } | ||||
|     if (use_stencil) { | ||||
|     if (use_stencil && framebuffer->HasAspectStencilBit()) { | ||||
|         aspect_flags |= VK_IMAGE_ASPECT_STENCIL_BIT; | ||||
|     } | ||||
|     if (aspect_flags == 0) { | ||||
|         return; | ||||
|     } | ||||
|     scheduler.Record([clear_depth = regs.clear_depth, clear_stencil = regs.clear_stencil, | ||||
|                       clear_rect, aspect_flags](vk::CommandBuffer cmdbuf) { | ||||
|         VkClearAttachment attachment; | ||||
|   | ||||
| @@ -1186,9 +1186,12 @@ Framebuffer::Framebuffer(TextureCacheRuntime& runtime, std::span<ImageView*, NUM | ||||
|         renderpass_key.depth_format = depth_buffer->format; | ||||
|         num_layers = std::max(num_layers, depth_buffer->range.extent.layers); | ||||
|         images[num_images] = depth_buffer->ImageHandle(); | ||||
|         image_ranges[num_images] = MakeSubresourceRange(depth_buffer); | ||||
|         const VkImageSubresourceRange subresource_range = MakeSubresourceRange(depth_buffer); | ||||
|         image_ranges[num_images] = subresource_range; | ||||
|         samples = depth_buffer->Samples(); | ||||
|         ++num_images; | ||||
|         has_depth = (subresource_range.aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT) != 0; | ||||
|         has_stencil = (subresource_range.aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT) != 0; | ||||
|     } else { | ||||
|         renderpass_key.depth_format = PixelFormat::Invalid; | ||||
|     } | ||||
|   | ||||
| @@ -232,6 +232,18 @@ public: | ||||
|         return image_ranges; | ||||
|     } | ||||
|  | ||||
|     [[nodiscard]] bool HasAspectColorBit(size_t index) const noexcept { | ||||
|         return (image_ranges.at(index).aspectMask & VK_IMAGE_ASPECT_COLOR_BIT) != 0; | ||||
|     } | ||||
|  | ||||
|     [[nodiscard]] bool HasAspectDepthBit() const noexcept { | ||||
|         return has_depth; | ||||
|     } | ||||
|  | ||||
|     [[nodiscard]] bool HasAspectStencilBit() const noexcept { | ||||
|         return has_stencil; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     vk::Framebuffer framebuffer; | ||||
|     VkRenderPass renderpass{}; | ||||
| @@ -241,6 +253,8 @@ private: | ||||
|     u32 num_images = 0; | ||||
|     std::array<VkImage, 9> images{}; | ||||
|     std::array<VkImageSubresourceRange, 9> image_ranges{}; | ||||
|     bool has_depth{}; | ||||
|     bool has_stencil{}; | ||||
| }; | ||||
|  | ||||
| struct TextureCacheParams { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Fernando S
					Fernando S