Add a matching PerformMemoryUpload().

Just so we have both Download and Upload to use later.
This commit is contained in:
Unknown W. Brackets 2014-06-10 00:45:03 -07:00
parent 5bd1d9d009
commit adee76cd62
9 changed files with 34 additions and 1 deletions

View file

@ -1330,6 +1330,11 @@ bool DIRECTX9_GPU::PerformMemoryDownload(u32 dest, int size) {
return false;
}
bool DIRECTX9_GPU::PerformMemoryUpload(u32 dest, int size) {
InvalidateCache(dest, size, GPU_INVALIDATE_HINT);
return false;
}
bool DIRECTX9_GPU::PerformStencilUpload(u32 dest, int size) {
return false;
}

View file

@ -49,6 +49,7 @@ public:
virtual bool PerformMemoryCopy(u32 dest, u32 src, int size);
virtual bool PerformMemorySet(u32 dest, u8 v, int size);
virtual bool PerformMemoryDownload(u32 dest, int size);
virtual bool PerformMemoryUpload(u32 dest, int size);
virtual bool PerformStencilUpload(u32 dest, int size);
virtual void ClearCacheNextFrame();
virtual void DeviceLost(); // Only happens on Android. Drop all textures and shaders.

View file

@ -1997,7 +1997,11 @@ void GLES_GPU::InvalidateCacheInternal(u32 addr, int size, GPUInvalidationType t
void GLES_GPU::PerformMemoryCopyInternal(u32 dest, u32 src, int size) {
if (!framebufferManager_.NotifyFramebufferCopy(src, dest, size)) {
Memory::Memcpy(dest, Memory::GetPointer(src), size);
// We use a little hack for Download/Upload using a VRAM mirror.
// Since they're identical we don't need to copy.
if (!Memory::IsVRAMAddress(dest) || (dest ^ 0x00400000) != src) {
Memory::Memcpy(dest, Memory::GetPointer(src), size);
}
}
InvalidateCache(dest, size, GPU_INVALIDATE_HINT);
}
@ -2064,6 +2068,12 @@ bool GLES_GPU::PerformMemoryDownload(u32 dest, int size) {
return gpu->PerformMemoryCopy(dest ^ 0x00400000, dest, size);
}
bool GLES_GPU::PerformMemoryUpload(u32 dest, int size) {
// Cheat a bit to force a download of the framebuffer.
// VRAM + 0x00400000 is simply a VRAM mirror.
return gpu->PerformMemoryCopy(dest, dest ^ 0x00400000, size);
}
bool GLES_GPU::PerformStencilUpload(u32 dest, int size) {
if (framebufferManager_.MayIntersectFramebuffer(dest)) {
if (IsOnSeparateCPUThread()) {

View file

@ -48,6 +48,7 @@ public:
virtual bool PerformMemoryCopy(u32 dest, u32 src, int size);
virtual bool PerformMemorySet(u32 dest, u8 v, int size);
virtual bool PerformMemoryDownload(u32 dest, int size);
virtual bool PerformMemoryUpload(u32 dest, int size);
virtual bool PerformStencilUpload(u32 dest, int size);
virtual void ClearCacheNextFrame();
virtual void DeviceLost(); // Only happens on Android. Drop all textures and shaders.

View file

@ -250,6 +250,7 @@ public:
virtual bool PerformMemoryCopy(u32 dest, u32 src, int size) = 0;
virtual bool PerformMemorySet(u32 dest, u8 v, int size) = 0;
virtual bool PerformMemoryDownload(u32 dest, int size) = 0;
virtual bool PerformMemoryUpload(u32 dest, int size) = 0;
virtual bool PerformStencilUpload(u32 dest, int size) = 0;
// Will cause the texture cache to be cleared at the start of the next frame.

View file

@ -675,6 +675,12 @@ bool NullGPU::PerformMemoryDownload(u32 dest, int size) {
return false;
}
bool NullGPU::PerformMemoryUpload(u32 dest, int size) {
// Nothing to update.
InvalidateCache(dest, size, GPU_INVALIDATE_HINT);
return false;
}
bool NullGPU::PerformStencilUpload(u32 dest, int size) {
return false;
}

View file

@ -37,6 +37,7 @@ public:
virtual bool PerformMemoryCopy(u32 dest, u32 src, int size);
virtual bool PerformMemorySet(u32 dest, u8 v, int size);
virtual bool PerformMemoryDownload(u32 dest, int size);
virtual bool PerformMemoryUpload(u32 dest, int size);
virtual bool PerformStencilUpload(u32 dest, int size);
virtual void ClearCacheNextFrame() {};

View file

@ -876,6 +876,13 @@ bool SoftGPU::PerformMemoryDownload(u32 dest, int size)
return false;
}
bool SoftGPU::PerformMemoryUpload(u32 dest, int size)
{
// Nothing to update.
InvalidateCache(dest, size, GPU_INVALIDATE_HINT);
return false;
}
bool SoftGPU::PerformStencilUpload(u32 dest, int size)
{
return false;

View file

@ -62,6 +62,7 @@ public:
virtual bool PerformMemoryCopy(u32 dest, u32 src, int size);
virtual bool PerformMemorySet(u32 dest, u8 v, int size);
virtual bool PerformMemoryDownload(u32 dest, int size);
virtual bool PerformMemoryUpload(u32 dest, int size);
virtual bool PerformStencilUpload(u32 dest, int size);
virtual void ClearCacheNextFrame() {};