summaryrefslogtreecommitdiff
path: root/Source/Core/VideoCommon/TextureCacheBase.cpp
diff options
context:
space:
mode:
authorJosJuice <josjuice@gmail.com>2024-04-07 11:13:25 +0200
committerJosJuice <josjuice@gmail.com>2024-04-09 21:08:57 +0200
commit54773bc5d2c847bc4e070a8a647b97a9fc76bcb0 (patch)
tree23974ba939d0a61c792e2fec2aca7e97758f59e0 /Source/Core/VideoCommon/TextureCacheBase.cpp
parent69aca2fbfc88d08a17d36c03d51dd698eb9cce1b (diff)
VideoCommon: Remove calls to GetPointer
This fourth part of my series of patches to get rid of unsafe uses of GetPointer takes care of the "easy" cases in VideoCommon. Three uses of GetPointer now remain in Dolphin: VertexLoaderManager, TextureInfo, and the software renderer's TextureSampler.
Diffstat (limited to 'Source/Core/VideoCommon/TextureCacheBase.cpp')
-rw-r--r--Source/Core/VideoCommon/TextureCacheBase.cpp32
1 files changed, 17 insertions, 15 deletions
diff --git a/Source/Core/VideoCommon/TextureCacheBase.cpp b/Source/Core/VideoCommon/TextureCacheBase.cpp
index fbe4f107bf..d6fec6adc4 100644
--- a/Source/Core/VideoCommon/TextureCacheBase.cpp
+++ b/Source/Core/VideoCommon/TextureCacheBase.cpp
@@ -1872,9 +1872,12 @@ static void GetDisplayRectForXFBEntry(TCacheEntry* entry, u32 width, u32 height,
RcTcacheEntry TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
MathUtil::Rectangle<int>* display_rect)
{
+ // Compute total texture size. XFB textures aren't tiled, so this is simple.
+ const u32 total_size = height * stride;
+
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();
- const u8* src_data = memory.GetPointer(address);
+ const u8* src_data = memory.GetPointerForRange(address, total_size);
if (!src_data)
{
ERROR_LOG_FMT(VIDEO, "Trying to load XFB texture from invalid address {:#010x}", address);
@@ -1900,8 +1903,6 @@ RcTcacheEntry TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height
AbstractTextureFlag_RenderTarget,
AbstractTextureType::Texture_2DArray));
- // Compute total texture size. XFB textures aren't tiled, so this is simple.
- const u32 total_size = height * stride;
entry->SetGeneralParameters(address, total_size,
TextureAndTLUTFormat(TextureFormat::XFB, TLUTFormat::IA8), true);
entry->SetDimensions(width, height, 1);
@@ -2250,15 +2251,6 @@ void TextureCacheBase::CopyRenderTargetToTexture(
!(is_xfb_copy ? g_ActiveConfig.bSkipXFBCopyToRam : g_ActiveConfig.bSkipEFBCopyToRam) ||
!copy_to_vram;
- auto& system = Core::System::GetInstance();
- auto& memory = system.GetMemory();
- u8* dst = memory.GetPointer(dstAddr);
- if (dst == nullptr)
- {
- ERROR_LOG_FMT(VIDEO, "Trying to copy from EFB to invalid address {:#010x}", dstAddr);
- return;
- }
-
// tex_w and tex_h are the native size of the texture in the GC memory.
// The size scaled_* represents the emulated texture. Those differ
// because of upscaling and because of yscaling of XFB copies.
@@ -2302,6 +2294,15 @@ void TextureCacheBase::CopyRenderTargetToTexture(
const u32 bytes_per_row = num_blocks_x * bytes_per_block;
const u32 covered_range = num_blocks_y * dstStride;
+ auto& system = Core::System::GetInstance();
+ auto& memory = system.GetMemory();
+ u8* dst = memory.GetPointerForRange(dstAddr, covered_range);
+ if (dst == nullptr)
+ {
+ ERROR_LOG_FMT(VIDEO, "Trying to copy from EFB to invalid address {:#010x}", dstAddr);
+ return;
+ }
+
if (g_ActiveConfig.bGraphicMods)
{
FBInfo info;
@@ -2576,10 +2577,12 @@ void TextureCacheBase::WriteEFBCopyToRAM(u8* dst_ptr, u32 width, u32 height, u32
void TextureCacheBase::FlushEFBCopy(TCacheEntry* entry)
{
+ const u32 covered_range = entry->pending_efb_copy_height * entry->memory_stride;
+
// Copy from texture -> guest memory.
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();
- u8* const dst = memory.GetPointer(entry->addr);
+ u8* const dst = memory.GetPointerForRange(entry->addr, covered_range);
WriteEFBCopyToRAM(dst, entry->pending_efb_copy_width, entry->pending_efb_copy_height,
entry->memory_stride, std::move(entry->pending_efb_copy));
@@ -2597,7 +2600,6 @@ void TextureCacheBase::FlushEFBCopy(TCacheEntry* entry)
// See the comment above regarding Rogue Squadron 2.
if (entry->is_xfb_copy)
{
- const u32 covered_range = entry->pending_efb_copy_height * entry->memory_stride;
auto range = FindOverlappingTextures(entry->addr, covered_range);
for (auto iter = range.first; iter != range.second; ++iter)
{
@@ -3164,7 +3166,7 @@ u64 TCacheEntry::CalculateHash() const
// FIXME: textures from tmem won't get the correct hash.
auto& system = Core::System::GetInstance();
auto& memory = system.GetMemory();
- u8* ptr = memory.GetPointer(addr);
+ u8* ptr = memory.GetPointerForRange(addr, size_in_bytes);
if (memory_stride == bytes_per_row)
{
return Common::GetHash64(ptr, size_in_bytes, hash_sample_size);