diff --git a/GPU/Software/DrawPixelX86.cpp b/GPU/Software/DrawPixelX86.cpp index 187c3b2a0e..9ef65c52b4 100644 --- a/GPU/Software/DrawPixelX86.cpp +++ b/GPU/Software/DrawPixelX86.cpp @@ -149,7 +149,7 @@ RegCache::Reg PixelJitCache::GetColorOff(const PixelFuncID &id) { // Now add the pointer for the color buffer. if (loadDepthOff) { - _assert_(Accessible(&fb.data, &depthbuf.data)); + _assert_msg_(Accessible(&fb.data, &depthbuf.data), "fb.data and depthbuf.data too far apart: %p %p (fb=%08x d=%08x)", fb.data, depthbuf.data, gstate.getFrameBufAddress(), gstate.getDepthBufAddress()); depthTemp = regCache_.Alloc(RegCache::GEN_DEPTH_OFF); if (RipAccessible(&fb.data) && RipAccessible(&depthbuf.data)) { MOV(PTRBITS, R(argYReg), M(&fb.data)); diff --git a/GPU/Software/SoftGpu.cpp b/GPU/Software/SoftGpu.cpp index ca0f48b776..6b98f99c52 100644 --- a/GPU/Software/SoftGpu.cpp +++ b/GPU/Software/SoftGpu.cpp @@ -1028,7 +1028,12 @@ void SoftGPU::Execute_FramebufPtr(u32 op, u32 diff) { // We assume fb.data won't change while we're drawing. if (diff) { drawEngine_->transformUnit.Flush(this, "framebuf"); - fb.data = Memory::GetPointerWrite(gstate.getFrameBufAddress()); + if (gstate.getFrameBufAddress() != 0) { + _dbg_assert_msg_(Memory::IsValidAddress(gstate.getFrameBufAddress()), "Invalid framebuffer address %08x", gstate.getFrameBufAddress()); + fb.data = Memory::GetPointerWriteUnchecked(gstate.getFrameBufAddress()); + } else { + fb.data = nullptr; + } } } @@ -1049,7 +1054,12 @@ void SoftGPU::Execute_ZbufPtr(u32 op, u32 diff) { drawEngine_->transformUnit.Flush(this, "depthbuf"); // For the pointer, ignore memory mirrors. This also gives some buffer for draws that go outside. // TODO: Confirm how wrapping is handled in drawing. Adjust if we ever handle VRAM mirrors more accurately. - depthbuf.data = Memory::GetPointerWrite(gstate.getDepthBufAddress() & 0x041FFFF0); + if (gstate.getDepthBufAddress() != 0) { + _dbg_assert_msg_(Memory::IsValidAddress(gstate.getDepthBufAddress()), "Invalid depthbuffer address %08x", gstate.getDepthBufAddress()); + depthbuf.data = Memory::GetPointerWriteUnchecked(gstate.getDepthBufAddress() & 0x041FFFF0); + } else { + depthbuf.data = nullptr; + } } }