Browse code

(uxnemu) Use a separate thread for triggering redraws.

The main loop now uses SDL_WaitEvent instead of SDL_PollEvent, and the
indentation level needs to change. For clarity, this commit contains the
code changes, while the next one updates the indentation.

Andrew Alderwick authored on 27/03/2022 12:16:40
Showing 1 changed files
... ...
@@ -32,7 +32,6 @@ WITH REGARD TO THIS SOFTWARE.
32 32
 #define WIDTH 64 * 8
33 33
 #define HEIGHT 40 * 8
34 34
 #define PAD 4
35
-#define BENCH 0
36 35
 
37 36
 static SDL_Window *gWindow;
38 37
 static SDL_Texture *gTexture;
... ...
@@ -44,7 +43,7 @@ static SDL_Rect gRect;
44 43
 
45 44
 static Device *devscreen, *devmouse, *devctrl, *devaudio0, *devfile0;
46 45
 static Uint8 zoom = 1;
47
-static Uint32 stdin_event, audio0_event;
46
+static Uint32 stdin_event, audio0_event, redraw_event;
48 47
 
49 48
 static int
50 49
 error(char *msg, const char *err)
... ...
@@ -87,6 +86,20 @@ stdin_handler(void *p)
87 86
 	(void)p;
88 87
 }
89 88
 
89
+static int
90
+redraw_handler(void *p)
91
+{
92
+	SDL_Event event;
93
+	event.type = redraw_event;
94
+	for(;;) {
95
+		SDL_Delay(16);
96
+		if(SDL_HasEvent(redraw_event) == SDL_FALSE)
97
+			SDL_PushEvent(&event);
98
+	}
99
+	return 0;
100
+	(void)p;
101
+}
102
+
90 103
 static void
91 104
 set_window_size(SDL_Window *window, int w, int h)
92 105
 {
... ...
@@ -155,7 +168,9 @@ init(void)
155 168
 		error("sdl_joystick", SDL_GetError());
156 169
 	stdin_event = SDL_RegisterEvents(1);
157 170
 	audio0_event = SDL_RegisterEvents(POLYPHONY);
171
+	redraw_event = SDL_RegisterEvents(1);
158 172
 	SDL_CreateThread(stdin_handler, "stdin", NULL);
173
+	SDL_CreateThread(redraw_handler, "redraw", NULL);
159 174
 	SDL_StartTextInput();
160 175
 	SDL_ShowCursor(SDL_DISABLE);
161 176
 	SDL_EventState(SDL_DROPFILE, SDL_ENABLE);
... ...
@@ -374,14 +389,13 @@ console_input(Uxn *u, char c)
374 389
 static int
375 390
 run(Uxn *u)
376 391
 {
392
+	SDL_Event event;
377 393
 	Device *devsys = &u->dev[0];
378 394
 	redraw();
379
-	while(!devsys->dat[0xf]) {
380
-		SDL_Event event;
381
-		double elapsed, begin;
382
-		if(!BENCH)
383
-			begin = SDL_GetPerformanceCounter();
384
-		while(SDL_PollEvent(&event) != 0) {
395
+	while(SDL_WaitEvent(&event)) {
396
+			/* .System/halt */
397
+			if(devsys->dat[0xf])
398
+				return error("Run", "Ended.");
385 399
 			/* Window */
386 400
 			if(event.type == SDL_QUIT)
387 401
 				return error("Run", "Quit.");
... ...
@@ -420,8 +434,14 @@ run(Uxn *u)
420 434
 				else
421 435
 					do_shortcut(u, &event);
422 436
 				ksym = event.key.keysym.sym;
423
-				if(SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, SDL_KEYUP, SDL_KEYUP) == 1 && ksym == event.key.keysym.sym)
424
-					break;
437
+				while(SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, redraw_event, redraw_event) == 0) {
438
+					SDL_Delay(4);
439
+					SDL_PumpEvents();
440
+				}
441
+				if(SDL_PeepEvents(&event, 1, SDL_PEEKEVENT, SDL_KEYUP, SDL_KEYUP) == 1 && ksym == event.key.keysym.sym) {
442
+					SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_KEYUP, SDL_KEYUP);
443
+					SDL_PushEvent(&event);
444
+				}
425 445
 			} else if(event.type == SDL_KEYUP)
426 446
 				controller_up(devctrl, get_button(&event));
427 447
 			else if(event.type == SDL_JOYAXISMOTION) {
... ...
@@ -437,16 +457,14 @@ run(Uxn *u)
437 457
 			/* Console */
438 458
 			else if(event.type == stdin_event)
439 459
 				console_input(u, event.cbutton.button);
440
-		}
441
-		uxn_eval(u, GETVECTOR(devscreen));
442
-		if(uxn_screen.fg.changed || uxn_screen.bg.changed)
443
-			redraw();
444
-		if(!BENCH) {
445
-			elapsed = (SDL_GetPerformanceCounter() - begin) / (double)SDL_GetPerformanceFrequency() * 1000.0f;
446
-			SDL_Delay(clamp(16.666f - elapsed, 0, 1000));
447
-		}
460
+			/* .Screen/vector and redraw */
461
+			else if(event.type == redraw_event) {
462
+				uxn_eval(u, GETVECTOR(devscreen));
463
+				if(uxn_screen.fg.changed || uxn_screen.bg.changed)
464
+					redraw();
465
+			}
448 466
 	}
449
-	return error("Run", "Ended.");
467
+	return error("SDL_WaitEvent", SDL_GetError());
450 468
 }
451 469
 
452 470
 int