Fix artifacts due to varying frame height and doublebuffering.

Duplicate myLastFrameHeight and swap the values
This commit is contained in:
Christian Speckner 2017-02-19 22:28:47 +01:00
parent 146d0afe4f
commit 75bd732525
2 changed files with 17 additions and 5 deletions

View File

@ -116,7 +116,7 @@ void TIA::reset()
myLastCycle = 0; myLastCycle = 0;
mySubClock = 0; mySubClock = 0;
myXDelta = 0; myXDelta = 0;
myLastFrameHeight = 0; myLastFrameHeight[0] = myLastFrameHeight[1] = 0;
myBackground.reset(); myBackground.reset();
myPlayfield.reset(); myPlayfield.reset();
@ -889,10 +889,20 @@ void TIA::updateEmulation()
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TIA::onFrameStart() void TIA::swapBuffers()
{ {
myCurrentFrameBuffer.swap(myPreviousFrameBuffer); myCurrentFrameBuffer.swap(myPreviousFrameBuffer);
uInt32 tmp = myLastFrameHeight[0];
myLastFrameHeight[0] = myLastFrameHeight[1];
myLastFrameHeight[1] = tmp;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void TIA::onFrameStart()
{
swapBuffers();
for (uInt8 i = 0; i < 4; i++) for (uInt8 i = 0; i < 4; i++)
updatePaddle(i); updatePaddle(i);
} }
@ -903,12 +913,12 @@ void TIA::onFrameComplete()
mySystem->m6502().stop(); mySystem->m6502().stop();
mySystem->resetCycles(); mySystem->resetCycles();
Int32 missingScanlines = myLastFrameHeight - myFrameManager.getY(); Int32 missingScanlines = myLastFrameHeight[0] - myFrameManager.getY();
if (missingScanlines > 0) if (missingScanlines > 0)
memset(myCurrentFrameBuffer.get() + 160 * myFrameManager.getY(), 0, missingScanlines * 160); memset(myCurrentFrameBuffer.get() + 160 * myFrameManager.getY(), 0, missingScanlines * 160);
myLastFrameHeight = myFrameManager.getY(); myLastFrameHeight[0] = myFrameManager.getY();
// Recalculate framerate, attempting to auto-correct for scanline 'jumps' // Recalculate framerate, attempting to auto-correct for scanline 'jumps'
if(myAutoFrameEnabled) if(myAutoFrameEnabled)

View File

@ -383,6 +383,8 @@ class TIA : public Device
uInt8 resxCounter(); uInt8 resxCounter();
void swapBuffers();
/** /**
Get the result of the specified collision register. Get the result of the specified collision register.
*/ */
@ -441,7 +443,7 @@ class TIA : public Device
// Pointer to the current and previous frame buffers // Pointer to the current and previous frame buffers
BytePtr myCurrentFrameBuffer; BytePtr myCurrentFrameBuffer;
BytePtr myPreviousFrameBuffer; BytePtr myPreviousFrameBuffer;
uInt32 myLastFrameHeight; uInt32 myLastFrameHeight[2];
Background myBackground; Background myBackground;
Playfield myPlayfield; Playfield myPlayfield;