mirror of https://github.com/mgba-emu/mgba.git
GB Video: Fix video frames getting missed when LCDC is off
This commit is contained in:
parent
1e10098e33
commit
b309e9894c
1
CHANGES
1
CHANGES
|
@ -6,6 +6,7 @@ Bugfixes:
|
||||||
- Qt: Fix "close" button on Overrides view
|
- Qt: Fix "close" button on Overrides view
|
||||||
- Qt: Fix saving overrides
|
- Qt: Fix saving overrides
|
||||||
- FFmpeg: Fix encoding AAC
|
- FFmpeg: Fix encoding AAC
|
||||||
|
- GB Video: Fix video frames getting missed when LCDC is off
|
||||||
Misc:
|
Misc:
|
||||||
- All: Only update version info if needed
|
- All: Only update version info if needed
|
||||||
- FFmpeg: Encoding cleanup
|
- FFmpeg: Encoding cleanup
|
||||||
|
|
|
@ -91,8 +91,10 @@ int32_t GBVideoProcessEvents(struct GBVideo* video, int32_t cycles) {
|
||||||
video->nextEvent -= cycles;
|
video->nextEvent -= cycles;
|
||||||
}
|
}
|
||||||
if (video->nextEvent <= 0) {
|
if (video->nextEvent <= 0) {
|
||||||
if (video->nextEvent != INT_MAX) {
|
if (video->nextMode != INT_MAX) {
|
||||||
video->nextMode -= video->eventDiff;
|
video->nextMode -= video->eventDiff;
|
||||||
|
}
|
||||||
|
if (video->nextFrame != INT_MAX) {
|
||||||
video->nextFrame -= video->eventDiff;
|
video->nextFrame -= video->eventDiff;
|
||||||
}
|
}
|
||||||
video->nextEvent = INT_MAX;
|
video->nextEvent = INT_MAX;
|
||||||
|
@ -116,24 +118,11 @@ int32_t GBVideoProcessEvents(struct GBVideo* video, int32_t cycles) {
|
||||||
} else {
|
} else {
|
||||||
video->nextMode = GB_VIDEO_HORIZONTAL_LENGTH;
|
video->nextMode = GB_VIDEO_HORIZONTAL_LENGTH;
|
||||||
video->mode = 1;
|
video->mode = 1;
|
||||||
--video->frameskipCounter;
|
|
||||||
if (video->frameskipCounter < 0) {
|
|
||||||
mCoreSyncPostFrame(video->p->sync);
|
|
||||||
video->frameskipCounter = video->frameskip;
|
|
||||||
}
|
|
||||||
++video->frameCounter;
|
|
||||||
|
|
||||||
if (video->nextFrame != 0) {
|
if (video->nextFrame != 0) {
|
||||||
video->nextFrame = 0;
|
video->nextFrame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (video->p->stream && video->p->stream->postVideoFrame) {
|
|
||||||
const color_t* pixels;
|
|
||||||
size_t stride;
|
|
||||||
video->renderer->getPixels(video->renderer, &stride, (const void**) &pixels);
|
|
||||||
video->p->stream->postVideoFrame(video->p->stream, pixels, stride);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GBRegisterSTATIsVblankIRQ(video->stat) || GBRegisterSTATIsOAMIRQ(video->stat)) {
|
if (GBRegisterSTATIsVblankIRQ(video->stat) || GBRegisterSTATIsOAMIRQ(video->stat)) {
|
||||||
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
|
video->p->memory.io[REG_IF] |= (1 << GB_IRQ_LCDSTAT);
|
||||||
}
|
}
|
||||||
|
@ -209,6 +198,21 @@ int32_t GBVideoProcessEvents(struct GBVideo* video, int32_t cycles) {
|
||||||
if (video->p->cpu->executionState == LR35902_CORE_FETCH) {
|
if (video->p->cpu->executionState == LR35902_CORE_FETCH) {
|
||||||
GBFrameEnded(video->p);
|
GBFrameEnded(video->p);
|
||||||
video->nextFrame = GB_VIDEO_TOTAL_LENGTH;
|
video->nextFrame = GB_VIDEO_TOTAL_LENGTH;
|
||||||
|
video->nextEvent = GB_VIDEO_TOTAL_LENGTH;
|
||||||
|
|
||||||
|
--video->frameskipCounter;
|
||||||
|
if (video->frameskipCounter < 0) {
|
||||||
|
mCoreSyncPostFrame(video->p->sync);
|
||||||
|
video->frameskipCounter = video->frameskip;
|
||||||
|
}
|
||||||
|
++video->frameCounter;
|
||||||
|
|
||||||
|
if (video->p->stream && video->p->stream->postVideoFrame) {
|
||||||
|
const color_t* pixels;
|
||||||
|
size_t stride;
|
||||||
|
video->renderer->getPixels(video->renderer, &stride, (const void**) &pixels);
|
||||||
|
video->p->stream->postVideoFrame(video->p->stream, pixels, stride);
|
||||||
|
}
|
||||||
struct mCoreThread* thread = mCoreThreadGet();
|
struct mCoreThread* thread = mCoreThreadGet();
|
||||||
mCoreThreadFrameStarted(thread);
|
mCoreThreadFrameStarted(thread);
|
||||||
} else {
|
} else {
|
||||||
|
@ -296,7 +300,7 @@ void GBVideoWriteLCDC(struct GBVideo* video, GBRegisterLCDC value) {
|
||||||
if (GBRegisterLCDCIsEnable(video->p->memory.io[REG_LCDC]) && !GBRegisterLCDCIsEnable(value)) {
|
if (GBRegisterLCDCIsEnable(video->p->memory.io[REG_LCDC]) && !GBRegisterLCDCIsEnable(value)) {
|
||||||
video->mode = 0;
|
video->mode = 0;
|
||||||
video->nextMode = INT_MAX;
|
video->nextMode = INT_MAX;
|
||||||
video->nextEvent = INT_MAX;
|
video->nextEvent = video->nextFrame;
|
||||||
video->stat = GBRegisterSTATSetMode(video->stat, video->mode);
|
video->stat = GBRegisterSTATSetMode(video->stat, video->mode);
|
||||||
video->p->memory.io[REG_STAT] = video->stat;
|
video->p->memory.io[REG_STAT] = video->stat;
|
||||||
video->ly = 0;
|
video->ly = 0;
|
||||||
|
|
Loading…
Reference in New Issue