From 95f9f04612c3dc7bf0b5e5ca96aace2a4b0ea358 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Tue, 6 Feb 2024 01:28:07 +0300 Subject: [PATCH] rsx: Provide tile alignment utility (align to 64 * pitch blocks) --- rpcs3/Emu/RSX/Core/RSXContext.cpp | 9 +++++++++ rpcs3/Emu/RSX/Core/RSXContext.h | 2 ++ rpcs3/Emu/RSX/rsx_utils.h | 7 +++++++ 3 files changed, 18 insertions(+) diff --git a/rpcs3/Emu/RSX/Core/RSXContext.cpp b/rpcs3/Emu/RSX/Core/RSXContext.cpp index 41fe199f2d..3d770b8ce2 100644 --- a/rpcs3/Emu/RSX/Core/RSXContext.cpp +++ b/rpcs3/Emu/RSX/Core/RSXContext.cpp @@ -38,4 +38,13 @@ namespace rsx return {}; } + + utils::address_range GCM_tile_reference::tile_align(const utils::address_range& range) const + { + const auto alignment = 64 * tile->pitch; + const u32 start_offset = rsx::align_down2(range.start - base_address, alignment); + const u32 end_offset = rsx::align2(range.end - base_address + 1, alignment); + + return utils::address_range::start_length(start_offset + base_address, end_offset - start_offset); + } } diff --git a/rpcs3/Emu/RSX/Core/RSXContext.h b/rpcs3/Emu/RSX/Core/RSXContext.h index 13fe40e77e..c61529e4ff 100644 --- a/rpcs3/Emu/RSX/Core/RSXContext.h +++ b/rpcs3/Emu/RSX/Core/RSXContext.h @@ -25,6 +25,8 @@ namespace rsx { return !!tile; } + + utils::address_range tile_align(const rsx::address_range& range) const; }; struct GCM_context diff --git a/rpcs3/Emu/RSX/rsx_utils.h b/rpcs3/Emu/RSX/rsx_utils.h index eeef27c8c2..07cc4cc6ab 100644 --- a/rpcs3/Emu/RSX/rsx_utils.h +++ b/rpcs3/Emu/RSX/rsx_utils.h @@ -306,6 +306,13 @@ namespace rsx return ((value + alignment - 1) / alignment) * alignment; } + // General purpose downward alignment without power-of-2 constraint + template + static inline T align_down2(T value, U alignment) + { + return (value / alignment) * alignment; + } + // Copy memory in inverse direction from source // Used to scale negatively x axis while transfering image data template