Core: Fix frameskip

This commit is contained in:
Jeffrey Pfau 2016-02-14 17:37:53 -08:00
parent bae1ea0a32
commit 8615defda7
4 changed files with 25 additions and 7 deletions

View File

@ -71,6 +71,7 @@ static void _GBCoreLoadConfig(struct mCore* core, const struct mCoreConfig* conf
struct GB* gb = core->board;
gb->audio.masterVolume = core->opts.volume;
gb->video.frameskip = core->opts.frameskip;
}
static void _GBCoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {

View File

@ -93,7 +93,9 @@ int32_t GBVideoProcessEvents(struct GBVideo* video, int32_t cycles) {
int lyc = video->p->memory.io[REG_LYC];
switch (video->mode) {
case 0:
video->renderer->finishScanline(video->renderer, video->ly);
if (video->frameskipCounter <= 0) {
video->renderer->finishScanline(video->renderer, video->ly);
}
++video->ly;
video->p->memory.io[REG_LY] = video->ly;
video->stat = GBRegisterSTATSetLYC(video->stat, lyc == video->ly);
@ -106,9 +108,13 @@ int32_t GBVideoProcessEvents(struct GBVideo* video, int32_t cycles) {
} else {
video->nextMode = GB_VIDEO_HORIZONTAL_LENGTH;
video->mode = 1;
--video->frameskipCounter;
if (video->frameskipCounter < 0) {
video->renderer->finishFrame(video->renderer);
mCoreSyncPostFrame(video->p->sync);
video->frameskipCounter = video->frameskip;
}
++video->frameCounter;
video->renderer->finishFrame(video->renderer);
mCoreSyncPostFrame(video->p->sync);
struct mCoreThread* thread = mCoreThreadGet();
if (thread && thread->frameCallback) {
@ -214,7 +220,9 @@ void GBVideoProcessDots(struct GBVideo* video) {
if (video->x == GB_VIDEO_HORIZONTAL_PIXELS) {
video->dotCounter = INT_MIN;
}
video->renderer->drawRange(video->renderer, oldX, video->x, video->ly, video->objThisLine, video->objMax);
if (video->frameskipCounter <= 0) {
video->renderer->drawRange(video->renderer, oldX, video->x, video->ly, video->objThisLine, video->objMax);
}
}
void GBVideoWriteLCDC(struct GBVideo* video, GBRegisterLCDC value) {

View File

@ -78,6 +78,7 @@ static void _GBACoreSetSync(struct mCore* core, struct mCoreSync* sync) {
static void _GBACoreLoadConfig(struct mCore* core, const struct mCoreConfig* config) {
struct GBA* gba = core->board;
gba->audio.masterVolume = core->opts.volume;
gba->video.frameskip = core->opts.frameskip;
#if !defined(MINIMAL_CORE) || MINIMAL_CORE < 2
struct GBACore* gbacore = (struct GBACore*) core;

View File

@ -65,6 +65,8 @@ bool parseArguments(struct mArguments* args, int argc, char* const* argv, struct
#endif
;
memset(args, 0, sizeof(*args));
args->frameskip = -1;
args->logLevel = INT_MIN;
if (subparser && subparser->extraOptions) {
// TODO: modularize options to subparsers
strncat(options, subparser->extraOptions, sizeof(options) - strlen(options) - 1);
@ -136,9 +138,15 @@ bool parseArguments(struct mArguments* args, int argc, char* const* argv, struct
}
void applyArguments(struct mArguments* args, struct mSubParser* subparser, struct mCoreConfig* config) {
mCoreConfigSetOverrideIntValue(config, "frameskip", args->frameskip);
mCoreConfigSetOverrideIntValue(config, "logLevel", args->logLevel);
mCoreConfigSetOverrideValue(config, "bios", args->bios);
if (args->frameskip >= 0) {
mCoreConfigSetOverrideIntValue(config, "frameskip", args->frameskip);
}
if (args->logLevel > INT_MIN) {
mCoreConfigSetOverrideIntValue(config, "logLevel", args->logLevel);
}
if (args->bios) {
mCoreConfigSetOverrideValue(config, "bios", args->bios);
}
if (subparser) {
subparser->apply(subparser, config);
}