mirror of https://github.com/mgba-emu/mgba.git
Partially implement frameskip
This commit is contained in:
parent
3ad2510b78
commit
813b2c0697
|
@ -169,6 +169,7 @@ struct GBAVideoRenderer {
|
||||||
union GBAOAM* oam;
|
union GBAOAM* oam;
|
||||||
|
|
||||||
int framesPending;
|
int framesPending;
|
||||||
|
int frameskip;
|
||||||
int turbo;
|
int turbo;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@ void GBAVideoSoftwareRendererCreate(struct GBAVideoSoftwareRenderer* renderer) {
|
||||||
|
|
||||||
renderer->d.turbo = 0;
|
renderer->d.turbo = 0;
|
||||||
renderer->d.framesPending = 0;
|
renderer->d.framesPending = 0;
|
||||||
|
renderer->d.frameskip = 0;
|
||||||
|
|
||||||
{
|
{
|
||||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||||
|
@ -200,6 +201,9 @@ static void GBAVideoSoftwareRendererWritePalette(struct GBAVideoRenderer* render
|
||||||
|
|
||||||
static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) {
|
static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) {
|
||||||
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
||||||
|
if (renderer->frameskip > 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint32_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y];
|
uint32_t* row = &softwareRenderer->outputBuffer[softwareRenderer->outputBufferStride * y];
|
||||||
if (softwareRenderer->dispcnt.forcedBlank) {
|
if (softwareRenderer->dispcnt.forcedBlank) {
|
||||||
for (int x = 0; x < VIDEO_HORIZONTAL_PIXELS; ++x) {
|
for (int x = 0; x < VIDEO_HORIZONTAL_PIXELS; ++x) {
|
||||||
|
@ -229,10 +233,14 @@ static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* rendere
|
||||||
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer;
|
||||||
|
|
||||||
pthread_mutex_lock(&softwareRenderer->mutex);
|
pthread_mutex_lock(&softwareRenderer->mutex);
|
||||||
renderer->framesPending++;
|
if (renderer->frameskip > 0) {
|
||||||
pthread_cond_broadcast(&softwareRenderer->upCond);
|
--renderer->frameskip;
|
||||||
if (!renderer->turbo) {
|
} else {
|
||||||
pthread_cond_wait(&softwareRenderer->downCond, &softwareRenderer->mutex);
|
renderer->framesPending++;
|
||||||
|
pthread_cond_broadcast(&softwareRenderer->upCond);
|
||||||
|
if (!renderer->turbo) {
|
||||||
|
pthread_cond_wait(&softwareRenderer->downCond, &softwareRenderer->mutex);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&softwareRenderer->mutex);
|
pthread_mutex_unlock(&softwareRenderer->mutex);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue