mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-14 21:37:52 -07:00
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.
This commit is contained in:
parent
69aca2fbfc
commit
54773bc5d2
@ -602,7 +602,6 @@ static void BPWritten(PixelShaderManager& pixel_shader_manager, XFStateManager&
|
|||||||
{
|
{
|
||||||
auto& system = Core::System::GetInstance();
|
auto& system = Core::System::GetInstance();
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
u8* src_ptr = memory.GetPointer(src_addr);
|
|
||||||
|
|
||||||
// AR and GB tiles are stored in separate TMEM banks => can't use a single memcpy for
|
// AR and GB tiles are stored in separate TMEM banks => can't use a single memcpy for
|
||||||
// everything
|
// everything
|
||||||
@ -612,10 +611,13 @@ static void BPWritten(PixelShaderManager& pixel_shader_manager, XFStateManager&
|
|||||||
{
|
{
|
||||||
if (tmem_addr_even + TMEM_LINE_SIZE > TMEM_SIZE ||
|
if (tmem_addr_even + TMEM_LINE_SIZE > TMEM_SIZE ||
|
||||||
tmem_addr_odd + TMEM_LINE_SIZE > TMEM_SIZE)
|
tmem_addr_odd + TMEM_LINE_SIZE > TMEM_SIZE)
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(texMem + tmem_addr_even, src_ptr + bytes_read, TMEM_LINE_SIZE);
|
memory.CopyFromEmu(texMem + tmem_addr_even, src_addr + bytes_read, TMEM_LINE_SIZE);
|
||||||
memcpy(texMem + tmem_addr_odd, src_ptr + bytes_read + TMEM_LINE_SIZE, TMEM_LINE_SIZE);
|
memory.CopyFromEmu(texMem + tmem_addr_odd, src_addr + bytes_read + TMEM_LINE_SIZE,
|
||||||
|
TMEM_LINE_SIZE);
|
||||||
tmem_addr_even += TMEM_LINE_SIZE;
|
tmem_addr_even += TMEM_LINE_SIZE;
|
||||||
tmem_addr_odd += TMEM_LINE_SIZE;
|
tmem_addr_odd += TMEM_LINE_SIZE;
|
||||||
bytes_read += TMEM_LINE_SIZE * 2;
|
bytes_read += TMEM_LINE_SIZE * 2;
|
||||||
|
@ -158,7 +158,7 @@ public:
|
|||||||
if constexpr (is_preprocess)
|
if constexpr (is_preprocess)
|
||||||
{
|
{
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
const u8* const start_address = memory.GetPointer(address);
|
const u8* const start_address = memory.GetPointerForRange(address, size);
|
||||||
|
|
||||||
system.GetFifo().PushFifoAuxBuffer(start_address, size);
|
system.GetFifo().PushFifoAuxBuffer(start_address, size);
|
||||||
|
|
||||||
@ -179,10 +179,10 @@ public:
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
start_address = memory.GetPointer(address);
|
start_address = memory.GetPointerForRange(address, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid the crash if memory.GetPointer failed ..
|
// Avoid the crash if memory.GetPointerForRange failed ..
|
||||||
if (start_address != nullptr)
|
if (start_address != nullptr)
|
||||||
{
|
{
|
||||||
// temporarily swap dl and non-dl (small "hack" for the stats)
|
// temporarily swap dl and non-dl (small "hack" for the stats)
|
||||||
|
@ -1872,9 +1872,12 @@ static void GetDisplayRectForXFBEntry(TCacheEntry* entry, u32 width, u32 height,
|
|||||||
RcTcacheEntry TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
|
RcTcacheEntry TextureCacheBase::GetXFBTexture(u32 address, u32 width, u32 height, u32 stride,
|
||||||
MathUtil::Rectangle<int>* display_rect)
|
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& system = Core::System::GetInstance();
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
const u8* src_data = memory.GetPointer(address);
|
const u8* src_data = memory.GetPointerForRange(address, total_size);
|
||||||
if (!src_data)
|
if (!src_data)
|
||||||
{
|
{
|
||||||
ERROR_LOG_FMT(VIDEO, "Trying to load XFB texture from invalid address {:#010x}", address);
|
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,
|
AbstractTextureFlag_RenderTarget,
|
||||||
AbstractTextureType::Texture_2DArray));
|
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,
|
entry->SetGeneralParameters(address, total_size,
|
||||||
TextureAndTLUTFormat(TextureFormat::XFB, TLUTFormat::IA8), true);
|
TextureAndTLUTFormat(TextureFormat::XFB, TLUTFormat::IA8), true);
|
||||||
entry->SetDimensions(width, height, 1);
|
entry->SetDimensions(width, height, 1);
|
||||||
@ -2250,15 +2251,6 @@ void TextureCacheBase::CopyRenderTargetToTexture(
|
|||||||
!(is_xfb_copy ? g_ActiveConfig.bSkipXFBCopyToRam : g_ActiveConfig.bSkipEFBCopyToRam) ||
|
!(is_xfb_copy ? g_ActiveConfig.bSkipXFBCopyToRam : g_ActiveConfig.bSkipEFBCopyToRam) ||
|
||||||
!copy_to_vram;
|
!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.
|
// 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
|
// The size scaled_* represents the emulated texture. Those differ
|
||||||
// because of upscaling and because of yscaling of XFB copies.
|
// 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 bytes_per_row = num_blocks_x * bytes_per_block;
|
||||||
const u32 covered_range = num_blocks_y * dstStride;
|
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)
|
if (g_ActiveConfig.bGraphicMods)
|
||||||
{
|
{
|
||||||
FBInfo info;
|
FBInfo info;
|
||||||
@ -2576,10 +2577,12 @@ void TextureCacheBase::WriteEFBCopyToRAM(u8* dst_ptr, u32 width, u32 height, u32
|
|||||||
|
|
||||||
void TextureCacheBase::FlushEFBCopy(TCacheEntry* entry)
|
void TextureCacheBase::FlushEFBCopy(TCacheEntry* entry)
|
||||||
{
|
{
|
||||||
|
const u32 covered_range = entry->pending_efb_copy_height * entry->memory_stride;
|
||||||
|
|
||||||
// Copy from texture -> guest memory.
|
// Copy from texture -> guest memory.
|
||||||
auto& system = Core::System::GetInstance();
|
auto& system = Core::System::GetInstance();
|
||||||
auto& memory = system.GetMemory();
|
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,
|
WriteEFBCopyToRAM(dst, entry->pending_efb_copy_width, entry->pending_efb_copy_height,
|
||||||
entry->memory_stride, std::move(entry->pending_efb_copy));
|
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.
|
// See the comment above regarding Rogue Squadron 2.
|
||||||
if (entry->is_xfb_copy)
|
if (entry->is_xfb_copy)
|
||||||
{
|
{
|
||||||
const u32 covered_range = entry->pending_efb_copy_height * entry->memory_stride;
|
|
||||||
auto range = FindOverlappingTextures(entry->addr, covered_range);
|
auto range = FindOverlappingTextures(entry->addr, covered_range);
|
||||||
for (auto iter = range.first; iter != range.second; ++iter)
|
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.
|
// FIXME: textures from tmem won't get the correct hash.
|
||||||
auto& system = Core::System::GetInstance();
|
auto& system = Core::System::GetInstance();
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
u8* ptr = memory.GetPointer(addr);
|
u8* ptr = memory.GetPointerForRange(addr, size_in_bytes);
|
||||||
if (memory_stride == bytes_per_row)
|
if (memory_stride == bytes_per_row)
|
||||||
{
|
{
|
||||||
return Common::GetHash64(ptr, size_in_bytes, hash_sample_size);
|
return Common::GetHash64(ptr, size_in_bytes, hash_sample_size);
|
||||||
|
@ -259,19 +259,21 @@ void LoadIndexedXF(CPArray array, u32 index, u16 address, u8 size)
|
|||||||
{
|
{
|
||||||
// load stuff from array to address in xf mem
|
// load stuff from array to address in xf mem
|
||||||
|
|
||||||
u32* currData = (u32*)(&xfmem) + address;
|
const u32 buf_size = size * sizeof(u32);
|
||||||
|
u32* currData = reinterpret_cast<u32*>(&xfmem) + address;
|
||||||
u32* newData;
|
u32* newData;
|
||||||
auto& system = Core::System::GetInstance();
|
auto& system = Core::System::GetInstance();
|
||||||
auto& fifo = system.GetFifo();
|
auto& fifo = system.GetFifo();
|
||||||
if (fifo.UseDeterministicGPUThread())
|
if (fifo.UseDeterministicGPUThread())
|
||||||
{
|
{
|
||||||
newData = (u32*)fifo.PopFifoAuxBuffer(size * sizeof(u32));
|
newData = reinterpret_cast<u32*>(fifo.PopFifoAuxBuffer(buf_size));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
newData = (u32*)memory.GetPointer(g_main_cp_state.array_bases[array] +
|
newData = reinterpret_cast<u32*>(memory.GetPointerForRange(
|
||||||
g_main_cp_state.array_strides[array] * index);
|
g_main_cp_state.array_bases[array] + g_main_cp_state.array_strides[array] * index,
|
||||||
|
buf_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& xf_state_manager = system.GetXFStateManager();
|
auto& xf_state_manager = system.GetXFStateManager();
|
||||||
@ -294,12 +296,14 @@ void LoadIndexedXF(CPArray array, u32 index, u16 address, u8 size)
|
|||||||
|
|
||||||
void PreprocessIndexedXF(CPArray array, u32 index, u16 address, u8 size)
|
void PreprocessIndexedXF(CPArray array, u32 index, u16 address, u8 size)
|
||||||
{
|
{
|
||||||
|
const size_t buf_size = size * sizeof(u32);
|
||||||
|
|
||||||
auto& system = Core::System::GetInstance();
|
auto& system = Core::System::GetInstance();
|
||||||
auto& memory = system.GetMemory();
|
auto& memory = system.GetMemory();
|
||||||
const u8* new_data = memory.GetPointer(g_preprocess_cp_state.array_bases[array] +
|
const u8* new_data = memory.GetPointerForRange(
|
||||||
g_preprocess_cp_state.array_strides[array] * index);
|
g_preprocess_cp_state.array_bases[array] + g_preprocess_cp_state.array_strides[array] * index,
|
||||||
|
buf_size);
|
||||||
|
|
||||||
const size_t buf_size = size * sizeof(u32);
|
|
||||||
system.GetFifo().PushFifoAuxBuffer(new_data, buf_size);
|
system.GetFifo().PushFifoAuxBuffer(new_data, buf_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user