Skip to content
Extraits de code Groupes Projets
Vérifiée Valider 63913fe4 rédigé par Kubat's avatar Kubat
Parcourir les fichiers

Moving the SDL_INIT into the thread that will handle sdl. THIS IS

BECAUSE SDL SUCKS WITH MULTIPLE THREADS
parent dbf12798
Aucune branche associée trouvée
Aucune étiquette associée trouvée
1 requête de fusion!57Resolve "SDL2 module"
...@@ -36,6 +36,9 @@ struct module_sdl2_window { ...@@ -36,6 +36,9 @@ struct module_sdl2_window {
pthread_mutex_t mtx; pthread_mutex_t mtx;
struct lkt_thread self; struct lkt_thread self;
volatile int launched; volatile int launched;
/* SDL you sucks */
volatile int is_sdl_init;
}; };
/* Thread related functions */ /* Thread related functions */
...@@ -43,15 +46,29 @@ struct module_sdl2_window { ...@@ -43,15 +46,29 @@ struct module_sdl2_window {
static void * static void *
sdl_thread__(struct lkt_thread_arg *arg) sdl_thread__(struct lkt_thread_arg *arg)
{ {
struct lkt_win *const win = arg->args; volatile struct lkt_win *const win = arg->args;
struct lkt_thread *self = arg->self; volatile struct module_sdl2_window *sdl2 = win->window;
struct module_sdl2_window *sdl2 = win->window;
SDL_Event event; SDL_Event event;
uint64_t flags; uint64_t flags;
int w, h, redraw = 0; int w, h, redraw = 0;
free(arg); free(arg);
(void) self;
RETURN_UNLESS(sdl2 && sdl2->window, "Big nope here, the sdl window pointer is NULL", NULL); /* Init the SDL window
Yeah, SDL you sucks */
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "no"); /* It seems that sdl sucks. */
RETURN_IF(SDL_Init(SDL_INIT_VIDEO) < 0, "Failed to init SDL", NULL);
sdl2->window = SDL_CreateWindow("lektord", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
WIDTH, HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE);
RETURN_UNLESS(sdl2->window, "Failed to create the window", NULL);
sdl2->glcontext = SDL_GL_CreateContext((SDL_Window *) sdl2->window);
RETURN_UNLESS(sdl2->glcontext, "Failed to create the SDL context", NULL);
sdl2->is_sdl_init = 1;
while (!sdl2->launched)
sched_yield();
fprintf(stderr, " * Started SDL thread\n"); fprintf(stderr, " * Started SDL thread\n");
loop: loop:
...@@ -63,14 +80,17 @@ loop: ...@@ -63,14 +80,17 @@ loop:
break; break;
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
if (event.window.event == SDL_WINDOWEVENT_EXPOSED) if (event.window.event == SDL_WINDOWEVENT_EXPOSED) {
fprintf(stderr, " . sdl_thread__: Window exposed\n");
redraw = 1; redraw = 1;
}
break; break;
case SDL_KEYDOWN: case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_SPACE) { if (event.key.keysym.sym == SDLK_SPACE) {
const char *cmd_pause[] = { "cycle", "pause", NULL }; const char *cmd_pause[] = { "cycle", "pause", NULL };
mpv_command_async((mpv_handle *) sdl2->mpv, 0, cmd_pause); mpv_command_async((mpv_handle *) sdl2->mpv, 0, cmd_pause);
fprintf(stderr, " . sdl_thread__: Toggle pause\n");
} }
break; break;
...@@ -82,6 +102,7 @@ loop: ...@@ -82,6 +102,7 @@ loop:
SDL_SetWindowFullscreen((SDL_Window *) sdl2->window, SDL_WINDOW_FULLSCREEN); SDL_SetWindowFullscreen((SDL_Window *) sdl2->window, SDL_WINDOW_FULLSCREEN);
/* May use SDL_WINDOW_FULLSCREEN_DESKTOP, need to check. */ /* May use SDL_WINDOW_FULLSCREEN_DESKTOP, need to check. */
sdl2->is_fullscreen = 1 - sdl2->is_fullscreen; sdl2->is_fullscreen = 1 - sdl2->is_fullscreen;
fprintf(stderr, " . sdl_thread__: Toggle fullscreen\n");
} }
break; break;
...@@ -204,30 +225,30 @@ module_sdl2_new(struct lkt_win *const win) ...@@ -204,30 +225,30 @@ module_sdl2_new(struct lkt_win *const win)
{ {
RETURN_UNLESS(win, "Invalid arguments", false); RETURN_UNLESS(win, "Invalid arguments", false);
struct module_sdl2_window *sdl2 = win->window; if (win->window == NULL) {
win->window = calloc(1, sizeof(struct module_sdl2_window));
if (sdl2 == NULL) { RETURN_UNLESS(win->window, "Out of memory", false);
sdl2 = calloc(1, sizeof(struct module_sdl2_window)); memset(win->window, 0, sizeof(struct module_sdl2_window));
RETURN_UNLESS(sdl2, "Out of memory", false);
memset(sdl2, 0, sizeof(struct module_sdl2_window));
/* Yeah, this is how it is done. */ /* Yeah, this is how it is done. */
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
sdl2->mtx = mtx; ((struct module_sdl2_window *) win->window)->mtx = mtx;
/* CREATE THE SDL2 WINDOW TODO */
SDL_SetHint(SDL_HINT_NO_SIGNAL_HANDLERS, "no"); /* It seems that sdl sucks. */
RETURN_IF(SDL_Init(SDL_INIT_VIDEO) < 0, "Failed to init SDL", false);
sdl2->window = SDL_CreateWindow("lektord", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, /* Start the SDL thread */
WIDTH, HEIGHT, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE); struct lkt_thread_arg *arg = calloc(1, sizeof(struct lkt_thread_arg));
RETURN_UNLESS(sdl2->window, "Failed to create the window", false); RETURN_UNLESS(arg, "Out of memory", false);
sdl2->glcontext = SDL_GL_CreateContext((SDL_Window *) sdl2->window); arg->args = win;
RETURN_UNLESS(sdl2->glcontext, "Failed to create the SDL context", false); RETURN_IF(lkt_th_new(&((struct module_sdl2_window *) win->window)->self, LKT_DEFAULT_LIST_SIZE, sdl_thread__,
arg),
"Failed to launch the SDL thread", false);
} }
while (!((struct module_sdl2_window *) win->window)->is_sdl_init)
sched_yield();
/* Init mpv here */ /* Init mpv here */
RETURN_IF(init_mpv__((mpv_handle **) &sdl2->mpv), "Failed to init mpv", false); RETURN_IF(init_mpv__((mpv_handle **) & ((struct module_sdl2_window *) win->window)->mpv),
"Failed to init mpv", false);
mpv_render_param params[] = { mpv_render_param params[] = {
{ MPV_RENDER_PARAM_API_TYPE, MPV_RENDER_API_TYPE_OPENGL }, { MPV_RENDER_PARAM_API_TYPE, MPV_RENDER_API_TYPE_OPENGL },
...@@ -248,24 +269,14 @@ module_sdl2_new(struct lkt_win *const win) ...@@ -248,24 +269,14 @@ module_sdl2_new(struct lkt_win *const win)
}; };
/* Init mpv_gl here */ /* Init mpv_gl here */
RETURN_IF(init_mpv_gl__((mpv_handle *) sdl2->mpv, (mpv_render_context **) &sdl2->mpv_gl, params), RETURN_IF(init_mpv_gl__((mpv_handle *) ((struct module_sdl2_window *) win->window)->mpv,
(mpv_render_context **) & ((struct module_sdl2_window *) win->window)->mpv_gl, params),
"Failed to init mpv_gl", false); "Failed to init mpv_gl", false);
/* Finish */ /* Finish */
SDL_SetWindowTitle((SDL_Window *) sdl2->window, "Lektord"); SDL_SetWindowTitle((SDL_Window *) ((struct module_sdl2_window *) win->window)->window, "Lektord");
SDL_DisableScreenSaver(); SDL_DisableScreenSaver();
win->window = sdl2; ((struct module_sdl2_window *) win->window)->launched = 1;
/* Start the SDL thread */
if (!sdl2->launched) {
struct lkt_thread_arg *arg = calloc(1, sizeof(struct lkt_thread_arg));
RETURN_UNLESS(arg, "Out of memory", false);
arg->args = win;
sdl2->launched = 1;
RETURN_IF(lkt_th_new(&sdl2->self, LKT_DEFAULT_LIST_SIZE, sdl_thread__, arg),
"Failed to launch the SDL thread", false);
}
return true; return true;
} }
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter