fix(core): call SDL drawing function in kernel task context

[no changelog]
This commit is contained in:
cepetr
2026-02-05 15:51:54 +01:00
committed by cepetr
parent 5ba0333910
commit b4a58ddebd

View File

@@ -30,6 +30,7 @@
#include <io/display.h>
#include <io/unix/sdl_display.h>
#include <sys/logging.h>
#include <sys/systask.h>
#include <SDL.h>
#include <SDL_image.h>
@@ -401,7 +402,7 @@ static SDL_Rect screen_rect(void) {
}
}
void display_refresh(void) {
static void display_refresh_internal(void) {
display_driver_t *drv = &g_display_driver;
if (!drv->initialized) {
@@ -434,6 +435,23 @@ void display_refresh(void) {
SDL_RenderPresent(drv->renderer);
}
static void display_refresh_trampoline(uintptr_t arg1, uintptr_t arg2,
uintptr_t arg3) {
display_refresh_internal();
systask_yield_to((systask_t *)arg1);
}
void display_refresh(void) {
// Call SDL drawing function in the context of the kernel task
if (systask_active() == systask_kernel()) {
display_refresh_internal();
} else {
systask_push_call(systask_kernel(), (void *)display_refresh_trampoline,
(uintptr_t)systask_active(), 0, 0);
systask_yield_to(systask_kernel());
}
}
#ifndef DISPLAY_MONO
void display_fill(const gfx_bitblt_t *bb) {
@@ -572,7 +590,7 @@ void display_clear_save(void) {
}
#ifdef USE_POWER_MANAGER
void display_draw_suspend_overlay(void) {
static void display_draw_suspend_overlay_internal(void) {
display_driver_t *drv = &g_display_driver;
if (!drv->initialized) {
@@ -612,4 +630,24 @@ void display_draw_suspend_overlay(void) {
SDL_DestroyTexture(overlay);
SDL_SetRenderDrawColor(drv->renderer, 0, 0, 0, 255);
}
static void display_draw_suspend_overlay_trampoline(uintptr_t arg1,
uintptr_t arg2,
uintptr_t arg3) {
display_draw_suspend_overlay_internal();
systask_yield_to((systask_t *)arg1);
}
void display_draw_suspend_overlay(void) {
// Call SDL drawing function in the context of the kernel task
if (systask_active() == systask_kernel()) {
display_draw_suspend_overlay_internal();
} else {
systask_push_call(systask_kernel(),
(void *)display_draw_suspend_overlay_trampoline,
(uintptr_t)systask_active(), 0, 0);
systask_yield_to(systask_kernel());
}
}
#endif