aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/hw/gpu.cpp29
-rw-r--r--src/core/hw/gpu.h4
2 files changed, 20 insertions, 13 deletions
diff --git a/src/core/hw/gpu.cpp b/src/core/hw/gpu.cpp
index 0ee6b7c3..49fc574b 100644
--- a/src/core/hw/gpu.cpp
+++ b/src/core/hw/gpu.cpp
@@ -53,10 +53,10 @@ void SetFramebufferLocation(const FramebufferLocation mode) {
* Gets the location of the framebuffers
* @return Location of framebuffers as FramebufferLocation enum
*/
-const FramebufferLocation GetFramebufferLocation() {
- if ((g_regs.framebuffer_top_right_1 & ~Memory::VRAM_MASK) == Memory::VRAM_PADDR) {
+FramebufferLocation GetFramebufferLocation(u32 address) {
+ if ((address & ~Memory::VRAM_MASK) == Memory::VRAM_PADDR) {
return FRAMEBUFFER_LOCATION_VRAM;
- } else if ((g_regs.framebuffer_top_right_1 & ~Memory::FCRAM_MASK) == Memory::FCRAM_PADDR) {
+ } else if ((address & ~Memory::FCRAM_MASK) == Memory::FCRAM_PADDR) {
return FRAMEBUFFER_LOCATION_FCRAM;
} else {
ERROR_LOG(GPU, "unknown framebuffer location!");
@@ -64,21 +64,26 @@ const FramebufferLocation GetFramebufferLocation() {
return FRAMEBUFFER_LOCATION_UNKNOWN;
}
+u32 GetFramebufferAddr(const u32 address) {
+ switch (GetFramebufferLocation(address)) {
+ case FRAMEBUFFER_LOCATION_FCRAM:
+ return Memory::VirtualAddressFromPhysical_FCRAM(address);
+ case FRAMEBUFFER_LOCATION_VRAM:
+ return Memory::VirtualAddressFromPhysical_VRAM(address);
+ default:
+ ERROR_LOG(GPU, "unknown framebuffer location");
+ }
+ return 0;
+}
+
/**
* Gets a read-only pointer to a framebuffer in memory
* @param address Physical address of framebuffer
* @return Returns const pointer to raw framebuffer
*/
const u8* GetFramebufferPointer(const u32 address) {
- switch (GetFramebufferLocation()) {
- case FRAMEBUFFER_LOCATION_FCRAM:
- return (const u8*)Memory::GetPointer(Memory::VirtualAddressFromPhysical_FCRAM(address));
- case FRAMEBUFFER_LOCATION_VRAM:
- return (const u8*)Memory::GetPointer(Memory::VirtualAddressFromPhysical_VRAM(address));
- default:
- ERROR_LOG(GPU, "unknown framebuffer location");
- }
- return NULL;
+ u32 addr = GetFramebufferAddr(address);
+ return (addr != 0) ? Memory::GetPointer(addr) : nullptr;
}
template <typename T>
diff --git a/src/core/hw/gpu.h b/src/core/hw/gpu.h
index 47d7fcb2..b66cf4a3 100644
--- a/src/core/hw/gpu.h
+++ b/src/core/hw/gpu.h
@@ -219,10 +219,12 @@ void SetFramebufferLocation(const FramebufferLocation mode);
*/
const u8* GetFramebufferPointer(const u32 address);
+u32 GetFramebufferAddr(const u32 address);
+
/**
* Gets the location of the framebuffers
*/
-const FramebufferLocation GetFramebufferLocation();
+FramebufferLocation GetFramebufferLocation(u32 address);
template <typename T>
inline void Read(T &var, const u32 addr);