1
0
mirror of https://github.com/Interlisp/maiko.git synced 2026-02-27 00:59:46 +00:00

Only bitblt on damage.

Also add an alternative for key handling, which does not work any better...
This commit is contained in:
Peter
2021-10-20 23:45:55 +02:00
committed by Nick Briggs
parent a722e01a4f
commit e39b650f4d
4 changed files with 91 additions and 28 deletions

View File

@@ -43,6 +43,10 @@ extern DLword *DISP_MAX_Address;
#define DISPLAYBUFFER
#endif /* XWINDOW */
#ifdef SDL
#define DISPLAYBUFFER
#endif /* SDL */
#ifdef DOS
#define DISPLAYBUFFER
#endif /* DOS */

View File

@@ -470,6 +470,10 @@ do_it_now:
if (in_display_segment(dstbase)) flush_display_region(dx, dty, w, h);
#endif /* XWINDOW */
#ifdef SDL
if (in_display_segment(dstbase)) flush_display_region(dx, dty, w, h);
#endif /* XWINDOW */
#ifdef DOS
/* Copy the changed section of display bank to the frame buffer */
if (in_display_segment(dstbase)) {
@@ -823,6 +827,10 @@ do_it_now:
if (in_display_segment(dstbase)) flush_display_region(dlx, dty, width, height);
#endif /* XWINDOW */
#ifdef SDL
if (in_display_segment(dstbase)) flush_display_region(dlx, dty, width, height);
#endif /* SDL */
#ifdef DOS
/* Copy the changed section of display bank to the frame buffer */
if (in_display_segment(dstbase)) {
@@ -1070,6 +1078,10 @@ do_it_now:
if (in_display_segment(dstbase)) flush_display_region(left, dty, width, height);
#endif /* XWINDOW */
#ifdef SDL
if (in_display_segment(dstbase)) flush_display_region(left, dty, width, height);
#endif /* SDL */
#ifdef DOS
/* Copy the changed section of display bank to the frame buffer */
if (in_display_segment(dstbase)) {
@@ -1199,6 +1211,10 @@ void bltchar(LispPTR *args)
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
#endif /* XWINDOW */
#ifdef SDL
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
#endif /* SDL */
#ifdef DOS
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
#endif /* DOS */
@@ -1415,6 +1431,9 @@ void newbltchar(LispPTR *args) {
#ifdef XWINDOW
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
#endif /* XWINDOW */
#ifdef SDL
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
#endif /* SDL */
#ifdef DOS
if (in_display_segment(dstbase)) flush_display_lineregion(dx, dstbase, w, h);
#endif /* DOS */

View File

@@ -261,8 +261,11 @@ in_display_segment(baseaddr)
/* */
/************************************************************************/
<<<<<<< HEAD
void flush_display_buffer(void) {
#ifdef SDL
sdl_bitblt_to_screen(0, 0, sdl_displaywidth, sdl_displayheight);
#endif
#ifdef XWINDOW
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, currentdsp->Visible.x,
currentdsp->Visible.y, currentdsp->Visible.width,
@@ -290,7 +293,10 @@ void flush_display_buffer(void) {
/************************************************************************/
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);
#endif
#if (defined(XWINDOW) || defined(DOS))
TPRINT(("Enter flush_display_region x=%d, y=%d, w=%d, h=%d\n", x, y, w, h));
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
@@ -333,7 +339,10 @@ void flush_display_lineregion(UNSIGNED x, DLword *ybase, int w, int h)
{
int y;
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);
#endif
#if (defined(XWINDOW) || defined(DOS))
TPRINT(("Enter flush_display_lineregion x=%p, y=%d, w=%d, h=%d\n", (void *)x, y, w, h));
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);
@@ -364,7 +373,10 @@ void flush_display_ptrregion(DLword *ybase, UNSIGNED bitoffset, int w, int h)
baseoffset = (((DLword *)ybase) - DisplayRegion68k);
y = baseoffset / DLWORD_PERLINE;
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);
#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));
(currentdsp->bitblt_to_screen)(currentdsp, DisplayRegion68k, x, y, w, h);

View File

@@ -125,7 +125,7 @@ int sdl_windowheight = 0;
// each pixel is shown as this many pixels
int sdl_pixelscale = 0;
extern char *DisplayRegion68k;
extern Uint32 *DisplayRegion68k;
extern DLword *EmKbdAd068K, *EmKbdAd168K, *EmKbdAd268K, *EmKbdAd368K, *EmKbdAd468K, *EmKbdAd568K,
@@ -201,13 +201,14 @@ void set_pixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
+ x * surface->format->BytesPerPixel);
*target_pixel = pixel;
}
void sdl_bitblt_to_screen(uint32_t *source) {
void sdl_bitblt_to_screen(int _x, int _y, int _w, int _h) {
// printf("bitblting\n");
int width = sdl_displaywidth;
int height = sdl_displayheight;
int bpw = 32;
for(int y = 0; y < height; y++) {
for(int x = 0; x < width / bpw; x++) {
int w = source[y*(sdl_displaywidth/bpw) + x];
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];
for(int b = 0; b < bpw; b++) {
//printf("%d/%d %d\n", x, y, b);
int px = 0;
@@ -222,6 +223,7 @@ void sdl_bitblt_to_screen(uint32_t *source) {
}
}
}
SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32));
}
int map_key(SDL_Keycode k) {
for(int i = 0; keymap[i] != -1; i+= 2) {
@@ -288,6 +290,28 @@ static int min(int a, int b) {
return a;
return b;
}
static int last_draw = 0;
static int last_keystate[512] = { 0 };
/* void handle_keyboard() { */
/* SDL_PumpEvents(); */
/* int numkeys; */
/* const Uint8 *keystates = SDL_GetKeyboardState(&numkeys); */
/* for(int i = 0; keymap[i] != -1; i+= 2) { */
/* int keycode = keymap[i+1]; */
/* int lk = keymap[i]; */
/* int scancode = SDL_GetScancodeFromKey(keycode); */
/* if(scancode < numkeys) { */
/* int state = keystates[scancode]; */
/* if(state != last_keystate[scancode]) { */
/* printf("lk %d scancode %d %s <%s>\n", lk, scancode, state ? "pressed" : "released", SDL_GetKeyName(keycode)); */
/* kb_trans(lk - KEYCODE_OFFSET, state ? FALSE : TRUE); */
/* DoRing(); */
/* if ((KBDEventFlg += 1) > 0) Irq_Stk_End = Irq_Stk_Check = 0; */
/* } */
/* last_keystate[scancode] = state; */
/* } */
/* } */
/* } */
void process_SDLevents() {
SDL_Event event;
while(SDL_PollEvent(&event)) {
@@ -365,25 +389,29 @@ void process_SDLevents() {
printf("other event type: %d\n", event.type);
}
}
int before = SDL_GetTicks();
sdl_bitblt_to_screen(DisplayRegion68k);
int after = SDL_GetTicks();
// printf("blitting took %dms\n", after - before);
SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32));
SDL_RenderClear(sdl_renderer);
SDL_Rect r;
r.x = 0;
r.y = 0;
r.w = min(sdl_windowwidth / sdl_pixelscale, sdl_displaywidth);
r.h = min(sdl_windowheight / sdl_pixelscale, sdl_displayheight);
SDL_Rect s;
s.x = 0;
s.y = 0;
s.w = min(sdl_windowwidth / sdl_pixelscale * sdl_pixelscale, sdl_displaywidth * sdl_pixelscale);
s.h = min(sdl_windowheight / sdl_pixelscale * sdl_pixelscale, sdl_displayheight * sdl_pixelscale);
SDL_RenderCopy(sdl_renderer, sdl_texture, &r, &s);
SDL_RenderPresent(sdl_renderer);
SDL_PumpEvents();
// handle_keyboard();
/* int before = SDL_GetTicks(); */
/* sdl_bitblt_to_screen(); */
/* int after = SDL_GetTicks(); */
// printf("blitting took %dms\n", after - before);
// SDL_UpdateTexture(sdl_texture, NULL, buffer, sdl_displaywidth * sizeof(Uint32));
int this_draw = SDL_GetTicks();
if(this_draw - last_draw > 16) {
SDL_RenderClear(sdl_renderer);
SDL_Rect r;
r.x = 0;
r.y = 0;
r.w = min(sdl_windowwidth / sdl_pixelscale, sdl_displaywidth);
r.h = min(sdl_windowheight / sdl_pixelscale, sdl_displayheight);
SDL_Rect s;
s.x = 0;
s.y = 0;
s.w = min(sdl_windowwidth / sdl_pixelscale * sdl_pixelscale, sdl_displaywidth * sdl_pixelscale);
s.h = min(sdl_windowheight / sdl_pixelscale * sdl_pixelscale, sdl_displayheight * sdl_pixelscale);
SDL_RenderCopy(sdl_renderer, sdl_texture, &r, &s);
SDL_RenderPresent(sdl_renderer);
last_draw = this_draw;
}
}
int init_SDL(int w, int h, int s) {
sdl_pixelscale = s;