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.
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