diff options
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_rasterizer.cpp | 11 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.cpp | 5 | ||||
| -rw-r--r-- | src/video_core/renderer_vulkan/vk_texture_cache.h | 14 | 
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() {      };      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; 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          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;      } 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:          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 { | 
