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 {
pthread_mutex_t mtx;
struct lkt_thread self;
volatile int launched;
/* SDL you sucks */
volatile int is_sdl_init;
};
/* Thread related functions */
......@@ -43,15 +46,29 @@ struct module_sdl2_window {
static void *
sdl_thread__(struct lkt_thread_arg *arg)
{
struct lkt_win *const win = arg->args;
struct lkt_thread *self = arg->self;
struct module_sdl2_window *sdl2 = win->window;
volatile struct lkt_win *const win = arg->args;
volatile struct module_sdl2_window *sdl2 = win->window;
SDL_Event event;
uint64_t flags;
int w, h, redraw = 0;
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");
loop:
......@@ -63,14 +80,17 @@ loop:
break;
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;
}
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_SPACE) {
const char *cmd_pause[] = { "cycle", "pause", NULL };
mpv_command_async((mpv_handle *) sdl2->mpv, 0, cmd_pause);
fprintf(stderr, " . sdl_thread__: Toggle pause\n");
}
break;
......@@ -82,6 +102,7 @@ loop:
SDL_SetWindowFullscreen((SDL_Window *) sdl2->window, SDL_WINDOW_FULLSCREEN);
/* May use SDL_WINDOW_FULLSCREEN_DESKTOP, need to check. */
sdl2->is_fullscreen = 1 - sdl2->is_fullscreen;
fprintf(stderr, " . sdl_thread__: Toggle fullscreen\n");
}
break;
......@@ -204,30 +225,30 @@ module_sdl2_new(struct lkt_win *const win)
{
RETURN_UNLESS(win, "Invalid arguments", false);
struct module_sdl2_window *sdl2 = win->window;
if (sdl2 == NULL) {
sdl2 = calloc(1, sizeof(struct module_sdl2_window));
RETURN_UNLESS(sdl2, "Out of memory", false);
memset(sdl2, 0, sizeof(struct module_sdl2_window));
if (win->window == NULL) {
win->window = calloc(1, sizeof(struct module_sdl2_window));
RETURN_UNLESS(win->window, "Out of memory", false);
memset(win->window, 0, sizeof(struct module_sdl2_window));
/* Yeah, this is how it is done. */
pthread_mutex_t mtx = PTHREAD_MUTEX_INITIALIZER;
sdl2->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);
((struct module_sdl2_window *) win->window)->mtx = mtx;
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", false);
sdl2->glcontext = SDL_GL_CreateContext((SDL_Window *) sdl2->window);
RETURN_UNLESS(sdl2->glcontext, "Failed to create the SDL context", false);
/* Start the SDL thread */
struct lkt_thread_arg *arg = calloc(1, sizeof(struct lkt_thread_arg));
RETURN_UNLESS(arg, "Out of memory", false);
arg->args = win;
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 */
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_API_TYPE, MPV_RENDER_API_TYPE_OPENGL },
......@@ -248,24 +269,14 @@ module_sdl2_new(struct lkt_win *const win)
};
/* 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);
/* Finish */
SDL_SetWindowTitle((SDL_Window *) sdl2->window, "Lektord");
SDL_SetWindowTitle((SDL_Window *) ((struct module_sdl2_window *) win->window)->window, "Lektord");
SDL_DisableScreenSaver();
win->window = sdl2;
/* 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);
}
((struct module_sdl2_window *) win->window)->launched = 1;
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