1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-01-16 08:15:31 +00:00

Refactor, only bitblt once per "frame".

This commit is contained in:
Peter 2021-10-21 08:48:33 +02:00
parent 333c132e40
commit 7b7db9aac5
3 changed files with 33 additions and 13 deletions

View File

@ -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));

View File

@ -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);

View File

@ -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;