Browse Source
Merge pull request #6901 from ameerj/vk-clear-bits
vk_rasterizer: Only clear depth/stencil buffers when specified in attachment aspect mask
pull/15/merge
Fernando S
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with
24 additions and
6 deletions
-
src/video_core/renderer_vulkan/vk_rasterizer.cpp
-
src/video_core/renderer_vulkan/vk_texture_cache.cpp
-
src/video_core/renderer_vulkan/vk_texture_cache.h
|
|
|
@ -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 { |
|
|
|
|