From 997d5021ed3e269908d993386c59edeac10ddea9 Mon Sep 17 00:00:00 2001 From: erysdren Date: Mon, 14 Oct 2024 15:16:22 -0500 Subject: [PATCH] remove several blit operations, should be faster now --- platform/sdl3/main.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/platform/sdl3/main.c b/platform/sdl3/main.c index e545066..ae6c254 100644 --- a/platform/sdl3/main.c +++ b/platform/sdl3/main.c @@ -15,8 +15,6 @@ static u16 backbuffer[YETI_FRAMEBUFFER_WIDTH * YETI_FRAMEBUFFER_HEIGHT]; static SDL_Window *window = NULL; static SDL_Renderer *renderer = NULL; static SDL_Texture *texture = NULL; -static SDL_Surface *front = NULL; -static SDL_Surface *back = NULL; static bool focused = true; @@ -67,17 +65,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char **argv) SDL_RenderClear(renderer); SDL_RenderPresent(renderer); - back = SDL_CreateSurfaceFrom(YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT, SDL_PIXELFORMAT_XBGR1555, backbuffer, YETI_FRAMEBUFFER_WIDTH * sizeof(u16)); - if (!back) - die(SDL_GetError()); - - format = SDL_GetWindowPixelFormat(window); - - front = SDL_CreateSurface(YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT, format); - if (!front) - die(SDL_GetError()); - - texture = SDL_CreateTexture(renderer, format, SDL_TEXTUREACCESS_STREAMING, YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT); + texture = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_XBGR1555, SDL_TEXTUREACCESS_STREAMING, YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT); if (!texture) die(SDL_GetError()); @@ -133,13 +121,20 @@ void do_frame(Sint64 dt) SDL_AppResult SDL_AppIterate(void *appstate) { + void *pixels; + int pitch; + /* speed limiter */ now = SDL_GetTicks(); do_frame(now - then); then = now; - SDL_BlitSurface(back, NULL, front, NULL); - SDL_UpdateTexture(texture, NULL, front->pixels, front->pitch); + if (SDL_LockTexture(texture, NULL, &pixels, &pitch)) + { + SDL_memcpy(pixels, backbuffer, sizeof(backbuffer)); + SDL_UnlockTexture(texture); + } + SDL_RenderClear(renderer); SDL_RenderTexture(renderer, texture, NULL, NULL); SDL_RenderPresent(renderer); @@ -175,12 +170,21 @@ SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event) } else if (event->key.scancode == SDL_SCANCODE_F12) { + SDL_Surface *screen; char filename[256]; + + screen = SDL_CreateSurfaceFrom(YETI_FRAMEBUFFER_WIDTH, YETI_FRAMEBUFFER_HEIGHT, SDL_PIXELFORMAT_XBGR1555, backbuffer, YETI_FRAMEBUFFER_WIDTH * sizeof(u16)); + if (!screen) + die("%s", SDL_GetError()); + SDL_snprintf(filename, sizeof(filename), "yeti%03d.bmp", screenshot_idx++); while (file_exists(filename)) SDL_snprintf(filename, sizeof(filename), "yeti%03d.bmp", screenshot_idx++); - SDL_SaveBMP(back, filename); + + SDL_SaveBMP(screen, filename); SDL_Log("Saved screenshot %s", filename); + + SDL_DestroySurface(screen); } break; @@ -200,8 +204,6 @@ void SDL_AppQuit(void *appstate, SDL_AppResult result) { if (window) SDL_DestroyWindow(window); if (renderer) SDL_DestroyRenderer(renderer); - if (back) SDL_DestroySurface(back); - if (front) SDL_DestroySurface(front); if (texture) SDL_DestroyTexture(texture); SDL_Quit();