From 54773bc5d2c847bc4e070a8a647b97a9fc76bcb0 Mon Sep 17 00:00:00 2001 From: JosJuice Date: Sun, 7 Apr 2024 11:13:25 +0200 Subject: 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. --- Source/Core/VideoCommon/TextureCacheBase.cpp | 32 +++++++++++++++------------- 1 file changed, 17 insertions(+), 15 deletions(-) (limited to 'Source/Core/VideoCommon/TextureCacheBase.cpp') 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* 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); -- cgit v1.2.3