mirror of
https://github.com/trezor/trezor-firmware.git
synced 2026-02-20 00:33:30 +01:00
fix(core): call SDL drawing function in kernel task context
[no changelog]
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user