From 7b7db9aac542c201852f5267f5ed24a9f7c8bbf7 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 21 Oct 2021 08:48:33 +0200 Subject: [PATCH] Refactor, only bitblt once per "frame". --- src/initdsp.c | 8 ++++---- src/main.c | 6 ++++-- src/sdl.c | 32 +++++++++++++++++++++++++------- 3 files changed, 33 insertions(+), 13 deletions(-) diff --git a/src/initdsp.c b/src/initdsp.c index 84ce917..3155146 100644 --- a/src/initdsp.c +++ b/src/initdsp.c @@ -274,7 +274,7 @@ in_display_segment(baseaddr) void flush_display_buffer() { // printf("flush_display_buffer\n"); #ifdef SDL - sdl_bitblt_to_screen(0, 0, sdl_displaywidth, sdl_displayheight); + // sdl_bitblt_to_screen(0, 0, sdl_displaywidth, sdl_displayheight); #endif #ifdef XWINDOW (currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, currentdsp->Visible.x, @@ -308,7 +308,7 @@ void flush_display_region(int x, int y, int w, int h) { // printf("flush_display_region %d %d %d %d\n", x, y, w, h); #ifdef SDL - sdl_bitblt_to_screen(x, y, w, h); + // sdl_bitblt_to_screen(x, y, w, h); #endif #if (defined(XWINDOW) || defined(DOS)) TPRINT(("Enter flush_display_region x=%d, y=%d, w=%d, h=%d\n", x, y, w, h)); @@ -354,7 +354,7 @@ void flush_display_lineregion(UNSIGNED x, DLword *ybase, UNSIGNED w, UNSIGNED h) y = ((DLword *)ybase - DisplayRegion68k) / DLWORD_PERLINE; // printf("flush_display_lineregion %d %d %d %d\n", x, y, w, h); #ifdef SDL - sdl_bitblt_to_screen(x, y, w, h); + // sdl_bitblt_to_screen(x, y, w, h); #endif #if (defined(XWINDOW) || defined(DOS)) TPRINT(("Enter flush_display_lineregion x=%d, y=%d, w=%d, h=%d\n", x, y, w, h)); @@ -388,7 +388,7 @@ void flush_display_ptrregion(DLword *ybase, UNSIGNED bitoffset, UNSIGNED w, UNSI x = bitoffset + (BITSPERWORD * (baseoffset - (DLWORD_PERLINE * y))); // printf("flush_display_ptrregion %d %d %d %d\n", x, y, w, h); #ifdef SDL - sdl_bitblt_to_screen(x, y, w, h); + // sdl_bitblt_to_screen(x, y, w, h); #endif #if (defined(XWINDOW) || defined(DOS)) TPRINT(("Enter flush_display_ptrregion\n x=%d, y=%d, w=%d, h=%d\n", x, y, w, h)); diff --git a/src/main.c b/src/main.c index f9abe74..5e2c40b 100644 --- a/src/main.c +++ b/src/main.c @@ -249,7 +249,9 @@ int flushing = FALSE; /* see dbprint.h if set, all debug/trace printing will cal #include "devif.h" extern DspInterface currentdsp; #endif /* DOS || XWINDOW */ - +#ifdef SDL +extern int init_SDL(int, int, int); +#endif extern time_t MDate; extern int nokbdflag; extern int nomouseflag; @@ -516,7 +518,7 @@ int main(int argc, char *argv[]) make_dsp_instance(currentdsp, 0, 0, 0, 1); /* All defaults the first time */ #endif /* DOS || XWINDOW */ #if defined(SDL) - init_SDL(1600, 1024, 1); + init_SDL(1888, 1110, 1); #endif /* SDL */ /* Load sysout to VM space and returns real sysout_size(not 0) */ sysout_size = sysout_loader(sysout_name, sysout_size); diff --git a/src/sdl.c b/src/sdl.c index eb05392..29ea2b5 100644 --- a/src/sdl.c +++ b/src/sdl.c @@ -201,15 +201,21 @@ void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel) + x * surface->format->BytesPerPixel); *target_pixel = pixel; } +int should_update_texture = 0; + void sdl_bitblt_to_screen(int _x, int _y, int _w, int _h) { // printf("bitblting\n"); int before = SDL_GetTicks(); int width = sdl_displaywidth; int height = sdl_displayheight; int bpw = 32; - for(int y = _y; y < _y + _h; y++) { - for(int x = _x / bpw; x < (_x + _w + bpw - 1) / bpw; x++) { - int w = DisplayRegion68k[y*(sdl_displaywidth/bpw) + x]; + int pitch = sdl_displaywidth / bpw; + int xlimit = (_x + _w + bpw - 1) / bpw; + int ylimit = _y + _h; + for(int y = _y; y < ylimit; y++) { + for(int x = _x / bpw; x < xlimit; x++) { + int w = DisplayRegion68k[y * pitch + x]; + int thex = x * bpw; for(int b = 0; b < bpw; b++) { //printf("%d/%d %d\n", x, y, b); int px = 0; @@ -219,11 +225,12 @@ void sdl_bitblt_to_screen(int _x, int _y, int _w, int _h) { px = 0xffffffff; } //printf("px is %x\n", px); - int xx = x * bpw + b; + int xx = thex + b; buffer[y * sdl_displaywidth + xx] = px; } } } + should_update_texture = 1; int after = SDL_GetTicks(); // printf("bitblting took %dms\n", after - before); /* before = SDL_GetTicks(); */ @@ -401,14 +408,25 @@ void process_SDLevents() { // handle_keyboard(); /* sdl_bitblt_to_screen(); */ // SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32)); - int before = SDL_GetTicks(); - SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32)); - int after = SDL_GetTicks(); + int before = 0; + int after = 0; + /* if(should_update_texture) { */ + /* before = SDL_GetTicks(); */ + /* SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32)); */ + /* after = SDL_GetTicks(); */ + /* should_update_texture = 0; */ + /* } */ // printf("UpdateTexture took %dms\n", after - before); int this_draw = SDL_GetTicks(); before = SDL_GetTicks(); // printf("processing events took %dms\n", before - process_events_time); if(this_draw - last_draw > 16) { + before = SDL_GetTicks(); + SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32)); + after = SDL_GetTicks(); + should_update_texture = 0; + + sdl_bitblt_to_screen(0, 0, sdl_displaywidth, sdl_displayheight); SDL_RenderClear(sdl_renderer); SDL_Rect r; r.x = 0;