GPU: Fix a bug where using VRAM as a display capture source would sometimes cause graphical glitches under certain conditions. (Regression from commit 2c6a5f9.)

This commit is contained in:
rogerman 2018-12-17 15:33:16 -08:00
parent 88d930ce82
commit ae8fb2c3bb
1 changed files with 8 additions and 8 deletions

16
desmume/src/GPU.cpp Normal file → Executable file
View File

@ -7328,6 +7328,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
const bool isRead3DLineNative = CurrentRenderer->IsFramebufferNativeSize(); const bool isRead3DLineNative = CurrentRenderer->IsFramebufferNativeSize();
const bool isReadVRAMLineNative = this->_isLineCaptureNative[DISPCNT.VRAM_Block][readLineIndexWithOffset]; const bool isReadVRAMLineNative = this->_isLineCaptureNative[DISPCNT.VRAM_Block][readLineIndexWithOffset];
bool willReadNativeVRAM = isReadVRAMLineNative;
bool willWriteVRAMLineNative = true; bool willWriteVRAMLineNative = true;
bool needCaptureNative = true; bool needCaptureNative = true;
bool needConvertDisplayLine23 = false; bool needConvertDisplayLine23 = false;
@ -7343,7 +7344,6 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
// Convert VRAM for native VRAM capture. // Convert VRAM for native VRAM capture.
const u16 *vramNative16 = (u16 *)MMU.blank_memory; const u16 *vramNative16 = (u16 *)MMU.blank_memory;
bool willReadNativeVRAM = true;
if ( (DISPCAPCNT.SrcB == 0) && (DISPCAPCNT.CaptureSrc != 0) && (vramConfiguration.banks[DISPCNT.VRAM_Block].purpose == VramConfiguration::LCDC) ) if ( (DISPCAPCNT.SrcB == 0) && (DISPCAPCNT.CaptureSrc != 0) && (vramConfiguration.banks[DISPCNT.VRAM_Block].purpose == VramConfiguration::LCDC) )
{ {
@ -7353,7 +7353,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
this->VerifyVRAMLineDidChange(DISPCNT.VRAM_Block, readLineIndexWithOffset); this->VerifyVRAMLineDidChange(DISPCNT.VRAM_Block, readLineIndexWithOffset);
willReadNativeVRAM = isReadVRAMLineNative; willReadNativeVRAM = this->_isLineCaptureNative[DISPCNT.VRAM_Block][readLineIndexWithOffset];
} }
switch (DISPCAPCNT.value & 0x63000000) switch (DISPCAPCNT.value & 0x63000000)
@ -7372,7 +7372,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
case 0x20000000: // VRAM only - ((DISPCAPCNT.CaptureSrc == 1) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 0)) case 0x20000000: // VRAM only - ((DISPCAPCNT.CaptureSrc == 1) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 0))
case 0x21000000: // VRAM only - ((DISPCAPCNT.CaptureSrc == 1) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 0)) case 0x21000000: // VRAM only - ((DISPCAPCNT.CaptureSrc == 1) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 0))
willWriteVRAMLineNative = isReadVRAMLineNative; willWriteVRAMLineNative = willReadNativeVRAM;
break; break;
case 0x22000000: // FIFO only - ((DISPCAPCNT.CaptureSrc == 1) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 1)) case 0x22000000: // FIFO only - ((DISPCAPCNT.CaptureSrc == 1) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 1))
@ -7383,7 +7383,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
case 0x40000000: // Display + VRAM - ((DISPCAPCNT.CaptureSrc == 2) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 0)) case 0x40000000: // Display + VRAM - ((DISPCAPCNT.CaptureSrc == 2) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 0))
case 0x60000000: // Display + VRAM - ((DISPCAPCNT.CaptureSrc == 3) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 0)) case 0x60000000: // Display + VRAM - ((DISPCAPCNT.CaptureSrc == 3) && (DISPCAPCNT.SrcA == 0) && (DISPCAPCNT.SrcB == 0))
willWriteVRAMLineNative = (isReadDisplayLineNative && isReadVRAMLineNative); willWriteVRAMLineNative = (isReadDisplayLineNative && willReadNativeVRAM);
needConvertDisplayLine23 = (OUTPUTFORMAT == NDSColorFormat_BGR666_Rev); needConvertDisplayLine23 = (OUTPUTFORMAT == NDSColorFormat_BGR666_Rev);
needConvertDisplayLine32 = (OUTPUTFORMAT == NDSColorFormat_BGR888_Rev); needConvertDisplayLine32 = (OUTPUTFORMAT == NDSColorFormat_BGR888_Rev);
break; break;
@ -7398,7 +7398,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
case 0x41000000: // 3D + VRAM - ((DISPCAPCNT.CaptureSrc == 2) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 0)) case 0x41000000: // 3D + VRAM - ((DISPCAPCNT.CaptureSrc == 2) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 0))
case 0x61000000: // 3D + VRAM - ((DISPCAPCNT.CaptureSrc == 3) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 0)) case 0x61000000: // 3D + VRAM - ((DISPCAPCNT.CaptureSrc == 3) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 0))
willWriteVRAMLineNative = (isRead3DLineNative && isReadVRAMLineNative); willWriteVRAMLineNative = (isRead3DLineNative && willReadNativeVRAM);
break; break;
case 0x43000000: // 3D + FIFO - ((DISPCAPCNT.CaptureSrc == 2) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 1)) case 0x43000000: // 3D + FIFO - ((DISPCAPCNT.CaptureSrc == 2) && (DISPCAPCNT.SrcA == 1) && (DISPCAPCNT.SrcB == 1))
@ -7458,7 +7458,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
} }
else else
{ {
const u16 *vramPtr16 = (isReadVRAMLineNative) ? vramNative16 : vramCustom16; const u16 *vramPtr16 = (willReadNativeVRAM) ? vramNative16 : vramCustom16;
srcAPtr = (DISPCAPCNT.SrcA == 0) ? (u16 *)compInfo.target.lineColorHead : this->_3DFramebuffer16 + compInfo.line.blockOffsetCustom; srcAPtr = (DISPCAPCNT.SrcA == 0) ? (u16 *)compInfo.target.lineColorHead : this->_3DFramebuffer16 + compInfo.line.blockOffsetCustom;
srcBPtr = (DISPCAPCNT.SrcB == 0) ? vramPtr16 : this->_fifoLine16; srcBPtr = (DISPCAPCNT.SrcB == 0) ? vramPtr16 : this->_fifoLine16;
@ -7478,7 +7478,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
this->_RenderLine_DisplayCaptureCustom<NDSColorFormat_BGR555_Rev, CAPTURELENGTH>(DISPCAPCNT, this->_RenderLine_DisplayCaptureCustom<NDSColorFormat_BGR555_Rev, CAPTURELENGTH>(DISPCAPCNT,
compInfo.line, compInfo.line,
isReadDisplayLineNative, isReadDisplayLineNative,
((srcBPtr == vramCustom16) || (srcBPtr == vramCustom32)), (srcBPtr == vramNative16),
srcAPtr, srcAPtr,
srcBPtr, srcBPtr,
dstCustomPtr); dstCustomPtr);
@ -7494,7 +7494,7 @@ void GPUEngineA::_RenderLine_DisplayCapture(const GPUEngineCompositorInfo &compI
this->_RenderLine_DisplayCaptureCustom<OUTPUTFORMAT, CAPTURELENGTH>(DISPCAPCNT, this->_RenderLine_DisplayCaptureCustom<OUTPUTFORMAT, CAPTURELENGTH>(DISPCAPCNT,
compInfo.line, compInfo.line,
isReadDisplayLineNative, isReadDisplayLineNative,
((srcBPtr == vramCustom16) || (srcBPtr == vramCustom32)), (srcBPtr == vramNative16),
srcAPtr, srcAPtr,
srcBPtr, srcBPtr,
dstCustomPtr); dstCustomPtr);