diff --git a/main.c b/main.c index 9575484..fc42f57 100644 --- a/main.c +++ b/main.c @@ -1,24 +1,26 @@ +#include + +#define SDL_MAIN_USE_CALLBACKS 1 #include "SDL3/SDL_blendmode.h" #include "SDL3/SDL_error.h" -#include "SDL3/SDL_stdinc.h" -#include "SDL3/SDL_surface.h" -#include "mgba/core/config.h" -#include -#define SDL_MAIN_USE_CALLBACKS 1 #include "SDL3/SDL_init.h" #include "SDL3/SDL_log.h" #include "SDL3/SDL_main.h" #include "SDL3/SDL_pixels.h" #include "SDL3/SDL_render.h" +#include "SDL3/SDL_stdinc.h" +#include "SDL3/SDL_surface.h" #include "SDL3/SDL_timer.h" #include "SDL3/SDL_video.h" +#include "mgba/core/config.h" #include "mgba/core/core.h" #include "mgba/core/interface.h" #include "mgba/feature/commandline.h" #include "mgba-util/image.h" #define NUM_CHANNELS 3 +#define FRAMESKIP_LIMIT 20 static SDL_Window* window = NULL; static SDL_Renderer* renderer = NULL; @@ -62,11 +64,7 @@ void myStartRequestImageRed(struct mImageSource* self, unsigned w, unsigned h, i SDL_DestroySurface(filtered[0]); scaled = SDL_CreateSurface(w, h, SDL_PIXELFORMAT_XBGR1555); filtered[0] = SDL_CreateSurface(w, h, SDL_PIXELFORMAT_XBGR1555); - SDL_Log("red: %d x %d", w, h); - -// SDL_DestroyTexture(texture); -// texture = SDL_CreateTextureFromSurface(renderer, scaled); } void myStartRequestImageGreen(struct mImageSource* self, unsigned w, unsigned h, int colorFormats) { @@ -197,7 +195,7 @@ int SDL_AppInit(int argc, char *argv[]) { return -1; } - renderer = SDL_CreateRenderer(window, NULL, 0); + renderer = SDL_CreateRenderer(window, NULL, SDL_RENDERER_PRESENTVSYNC); if (!renderer) { SDL_Log("Couldn't create renderer: %s", SDL_GetError()); return -1; @@ -383,6 +381,7 @@ int SDL_AppEvent(const SDL_Event *event) { int SDL_AppIterate(void) { int i; + static int since_last_present = 0; if (scaled != NULL) { Uint64 timestampNS = 0; @@ -420,9 +419,11 @@ int SDL_AppIterate(void) { } } - for (i = 0; i < NUM_CHANNELS; i++) { - struct mCore* core = cores[i]; - core->runFrame(core); + if (since_last_present < FRAMESKIP_LIMIT) { + for (i = 0; i < NUM_CHANNELS; i++) { + struct mCore* core = cores[i]; + core->runFrame(core); + } } if (!texture_updated) { @@ -439,6 +440,18 @@ int SDL_AppIterate(void) { } SDL_RenderPresent(renderer); + since_last_present = 0; + } else { + since_last_present++; + if (since_last_present >= FRAMESKIP_LIMIT) { + SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); + SDL_RenderClear(renderer); + for (i = 0; i < NUM_CHANNELS; i++) { + SDL_Texture *texture = textures[i]; + SDL_RenderTexture(renderer, texture, NULL, NULL); + } + SDL_RenderPresent(renderer); + } } return 0; /* keep iterating. */