From ff9850ca00ab0c785baa4be8018fd2e08155f70d Mon Sep 17 00:00:00 2001 From: psucien Date: Thu, 27 Jun 2024 22:31:54 +0200 Subject: [PATCH] renderer_vulkan: initial HTile support --- src/video_core/amdgpu/liverpool.h | 4 ++++ src/video_core/renderer_vulkan/liverpool_to_vk.h | 2 -- src/video_core/renderer_vulkan/vk_rasterizer.cpp | 7 +++++-- src/video_core/texture_cache/image.cpp | 3 ++- src/video_core/texture_cache/image.h | 12 ++++++------ src/video_core/texture_cache/texture_cache.cpp | 3 ++- src/video_core/texture_cache/texture_cache.h | 1 + 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/video_core/amdgpu/liverpool.h b/src/video_core/amdgpu/liverpool.h index 68f7dc37f..352bc241a 100644 --- a/src/video_core/amdgpu/liverpool.h +++ b/src/video_core/amdgpu/liverpool.h @@ -324,6 +324,10 @@ struct Liverpool { BitField<0, 2, ZFormat> format; BitField<2, 2, u32> num_samples; BitField<13, 3, u32> tile_split; + BitField<27, 1, u32> allow_expclear; + BitField<28, 1, u32> read_size; + BitField<29, 1, u32> tile_surface_en; + BitField<31, 1, u32> zrange_precision; } z_info; union { BitField<0, 1, StencilFormat> format; diff --git a/src/video_core/renderer_vulkan/liverpool_to_vk.h b/src/video_core/renderer_vulkan/liverpool_to_vk.h index a61d68bdf..90589db62 100644 --- a/src/video_core/renderer_vulkan/liverpool_to_vk.h +++ b/src/video_core/renderer_vulkan/liverpool_to_vk.h @@ -48,8 +48,6 @@ vk::Format DepthFormat(Liverpool::DepthBuffer::ZFormat z_format, vk::ClearValue ColorBufferClearValue(const AmdGpu::Liverpool::ColorBuffer& color_buffer); -vk::ClearValue DepthClearValue(); - void EmitQuadToTriangleListIndices(u8* out_indices, u32 num_vertices); } // namespace Vulkan::LiverpoolToVK diff --git a/src/video_core/renderer_vulkan/vk_rasterizer.cpp b/src/video_core/renderer_vulkan/vk_rasterizer.cpp index ef937025b..06a03758a 100644 --- a/src/video_core/renderer_vulkan/vk_rasterizer.cpp +++ b/src/video_core/renderer_vulkan/vk_rasterizer.cpp @@ -72,9 +72,11 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) { vk::RenderingAttachmentInfo depth_attachment{}; u32 num_depth_attachments{}; if (pipeline->IsDepthEnabled() && regs.depth_buffer.Address() != 0) { - const bool is_clear = regs.depth_render_control.depth_clear_enable; + const auto htile_address = regs.depth_htile_data_base.GetAddress(); + const bool is_clear = regs.depth_render_control.depth_clear_enable || + texture_cache.IsMetaCleared(htile_address); const auto& image_view = - texture_cache.DepthTarget(regs.depth_buffer, liverpool->last_db_extent); + texture_cache.DepthTarget(regs.depth_buffer, htile_address, liverpool->last_db_extent); depth_attachment = { .imageView = *image_view.image_view, .imageLayout = vk::ImageLayout::eGeneral, @@ -83,6 +85,7 @@ void Rasterizer::Draw(bool is_indexed, u32 index_offset) { .clearValue = vk::ClearValue{.depthStencil = {.depth = regs.depth_clear, .stencil = regs.stencil_clear}}, }; + texture_cache.TouchMeta(htile_address, false); num_depth_attachments++; } diff --git a/src/video_core/texture_cache/image.cpp b/src/video_core/texture_cache/image.cpp index 19072a469..101e57700 100644 --- a/src/video_core/texture_cache/image.cpp +++ b/src/video_core/texture_cache/image.cpp @@ -154,7 +154,7 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, usage.render_target = true; } -ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, +ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint) noexcept { is_tiled = false; pixel_format = LiverpoolToVK::DepthFormat(buffer.z_info.format, buffer.stencil_info.format); @@ -165,6 +165,7 @@ ImageInfo::ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, size.depth = 1; pitch = size.width; guest_size_bytes = buffer.GetSizeAligned(); + meta_info.htile_addr = buffer.z_info.tile_surface_en ? htile_address : 0; usage.depth_target = true; } diff --git a/src/video_core/texture_cache/image.h b/src/video_core/texture_cache/image.h index 28429d041..2067cde36 100644 --- a/src/video_core/texture_cache/image.h +++ b/src/video_core/texture_cache/image.h @@ -39,7 +39,7 @@ struct ImageInfo { explicit ImageInfo(const Libraries::VideoOut::BufferAttributeGroup& group) noexcept; explicit ImageInfo(const AmdGpu::Liverpool::ColorBuffer& buffer, const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept; - explicit ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, + explicit ImageInfo(const AmdGpu::Liverpool::DepthBuffer& buffer, VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint = {}) noexcept; explicit ImageInfo(const AmdGpu::Image& image) noexcept; @@ -51,10 +51,10 @@ struct ImageInfo { bool IsDepthStencil() const; struct { - VAddr cmask_addr{}; - VAddr fmask_addr{}; - VAddr htile_addr{}; - } meta_info; + VAddr cmask_addr; + VAddr fmask_addr; + VAddr htile_addr; + } meta_info{}; struct { u32 texture : 1; @@ -62,7 +62,7 @@ struct ImageInfo { u32 render_target : 1; u32 depth_target : 1; u32 vo_buffer : 1; - } usage; // Usage data tracked during image lifetime + } usage{}; // Usage data tracked during image lifetime bool is_tiled = false; vk::Format pixel_format = vk::Format::eUndefined; diff --git a/src/video_core/texture_cache/texture_cache.cpp b/src/video_core/texture_cache/texture_cache.cpp index 93f69aa2d..b5371f6b7 100644 --- a/src/video_core/texture_cache/texture_cache.cpp +++ b/src/video_core/texture_cache/texture_cache.cpp @@ -195,8 +195,9 @@ ImageView& TextureCache::RenderTarget(const AmdGpu::Liverpool::ColorBuffer& buff } ImageView& TextureCache::DepthTarget(const AmdGpu::Liverpool::DepthBuffer& buffer, + VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint) { - const ImageInfo info{buffer, hint}; + const ImageInfo info{buffer, htile_address, hint}; auto& image = FindImage(info, buffer.Address(), false); image.flags &= ~ImageFlagBits::CpuModified; diff --git a/src/video_core/texture_cache/texture_cache.h b/src/video_core/texture_cache/texture_cache.h index f50959e0c..5e6412dcc 100644 --- a/src/video_core/texture_cache/texture_cache.h +++ b/src/video_core/texture_cache/texture_cache.h @@ -58,6 +58,7 @@ public: [[nodiscard]] ImageView& RenderTarget(const AmdGpu::Liverpool::ColorBuffer& buffer, const AmdGpu::Liverpool::CbDbExtent& hint); [[nodiscard]] ImageView& DepthTarget(const AmdGpu::Liverpool::DepthBuffer& buffer, + VAddr htile_address, const AmdGpu::Liverpool::CbDbExtent& hint); /// Reuploads image contents.