mirror of https://github.com/stella-emu/stella.git
Make sure that every frame draws all scanlines in the height of the window.
If the ROM doesn't reach that far, blank out all further scanlines. Optimize FrameManager::height() method.
This commit is contained in:
parent
4a71e48a07
commit
68f9831061
|
@ -56,6 +56,7 @@ uInt8 FrameManager::initialGarbageFrames()
|
|||
FrameManager::FrameManager()
|
||||
: myMode(TvMode::pal),
|
||||
myAutodetectTvMode(true),
|
||||
myHeight(0),
|
||||
myFixedHeight(0)
|
||||
{
|
||||
updateTvMode(TvMode::ntsc);
|
||||
|
@ -120,8 +121,11 @@ void FrameManager::nextLine()
|
|||
break;
|
||||
|
||||
case State::frame:
|
||||
if (myLineInState >= (myFixedHeight > 0 ? myFixedHeight : (myKernelLines + Metrics::visibleOverscan)))
|
||||
if (myLineInState >= myHeight)
|
||||
{
|
||||
myLastY = ystart() + myY; // Last line drawn in this frame
|
||||
setState(State::waitForVsyncStart);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -131,6 +135,15 @@ void FrameManager::nextLine()
|
|||
if (myState == State::frame && previousState == State::frame) myY++;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
uInt32 FrameManager::missingScanlines() const
|
||||
{
|
||||
if (myLastY == ystart() + myY)
|
||||
return 0;
|
||||
else
|
||||
return myHeight - myY;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
void FrameManager::setVsync(bool vsync)
|
||||
{
|
||||
|
@ -278,6 +291,7 @@ void FrameManager::updateTvMode(TvMode mode)
|
|||
}
|
||||
|
||||
myFrameLines = Metrics::vsync + myVblankLines + myKernelLines + myOverscanLines;
|
||||
setFixedHeight(myFixedHeight); // update since myKernelLines may have changed
|
||||
|
||||
myVblankManager.setVblankLines(myVblankLines);
|
||||
}
|
||||
|
@ -294,9 +308,10 @@ void FrameManager::setVblank(bool vblank)
|
|||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
uInt32 FrameManager::height() const
|
||||
void FrameManager::setFixedHeight(uInt32 height)
|
||||
{
|
||||
return myFixedHeight > 0 ? myFixedHeight : (myKernelLines + Metrics::visibleOverscan);
|
||||
myFixedHeight = height;
|
||||
myHeight = myFixedHeight > 0 ? myFixedHeight : (myKernelLines + Metrics::visibleOverscan);
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
|
|
@ -57,9 +57,9 @@ class FrameManager : public Serializable
|
|||
|
||||
bool vsync() const { return myVsync; }
|
||||
|
||||
uInt32 height() const;
|
||||
uInt32 height() const { return myHeight; }
|
||||
|
||||
void setFixedHeight(uInt32 height) { myFixedHeight = height; }
|
||||
void setFixedHeight(uInt32 height);
|
||||
|
||||
uInt32 getY() const { return myY; }
|
||||
|
||||
|
@ -67,6 +67,8 @@ class FrameManager : public Serializable
|
|||
|
||||
uInt32 scanlinesLastFrame() const { return myCurrentFrameFinalLines; }
|
||||
|
||||
uInt32 missingScanlines() const;
|
||||
|
||||
uInt32 frameCount() const { return myTotalFrames; }
|
||||
|
||||
float frameRate() const { return myFrameRate; }
|
||||
|
@ -135,7 +137,7 @@ class FrameManager : public Serializable
|
|||
uInt32 myCurrentFrameFinalLines;
|
||||
uInt32 myVsyncLines;
|
||||
float myFrameRate;
|
||||
uInt32 myY;
|
||||
uInt32 myY, myLastY;
|
||||
bool myFramePending;
|
||||
|
||||
uInt32 myTotalFrames;
|
||||
|
@ -148,6 +150,7 @@ class FrameManager : public Serializable
|
|||
uInt32 myKernelLines;
|
||||
uInt32 myOverscanLines;
|
||||
uInt32 myFrameLines;
|
||||
uInt32 myHeight;
|
||||
uInt32 myFixedHeight;
|
||||
|
||||
private:
|
||||
|
|
|
@ -117,7 +117,6 @@ void TIA::reset()
|
|||
myLastCycle = 0;
|
||||
mySubClock = 0;
|
||||
myXDelta = 0;
|
||||
myLastFrameHeight[0] = myLastFrameHeight[1] = 0;
|
||||
|
||||
myBackground.reset();
|
||||
myPlayfield.reset();
|
||||
|
@ -827,10 +826,6 @@ void TIA::updateEmulation()
|
|||
void TIA::swapBuffers()
|
||||
{
|
||||
myCurrentFrameBuffer.swap(myPreviousFrameBuffer);
|
||||
|
||||
uInt32 tmp = myLastFrameHeight[0];
|
||||
myLastFrameHeight[0] = myLastFrameHeight[1];
|
||||
myLastFrameHeight[1] = tmp;
|
||||
}
|
||||
|
||||
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
||||
|
@ -853,13 +848,11 @@ void TIA::onFrameComplete()
|
|||
mySystem->m6502().stop();
|
||||
mySystem->resetCycles();
|
||||
|
||||
const Int32 missingScanlines = myLastFrameHeight[0] - myFrameManager.getY();
|
||||
|
||||
// Blank out any extra lines not drawn this frame
|
||||
const uInt32 missingScanlines = myFrameManager.missingScanlines();
|
||||
if (missingScanlines > 0)
|
||||
memset(myCurrentFrameBuffer.get() + 160 * myFrameManager.getY(), 0, missingScanlines * 160);
|
||||
|
||||
myLastFrameHeight[0] = myFrameManager.getY();
|
||||
|
||||
// Recalculate framerate, attempting to auto-correct for scanline 'jumps'
|
||||
if(myAutoFrameEnabled)
|
||||
myConsole.setFramerate(myFrameManager.frameRate());
|
||||
|
|
|
@ -445,7 +445,6 @@ class TIA : public Device
|
|||
// Pointer to the current and previous frame buffers
|
||||
BytePtr myCurrentFrameBuffer;
|
||||
BytePtr myPreviousFrameBuffer;
|
||||
uInt32 myLastFrameHeight[2];
|
||||
|
||||
Background myBackground;
|
||||
Playfield myPlayfield;
|
||||
|
|
Loading…
Reference in New Issue