fix (renderer): made renderer update thread safe

This commit is contained in:
antifallobst 2023-03-03 17:50:24 +01:00
parent dd0c2a3169
commit 0042786b77
2 changed files with 7 additions and 0 deletions

View File

@ -60,6 +60,7 @@ typedef struct {
graphics_buffer_T** graphics_buffer_layers; graphics_buffer_T** graphics_buffer_layers;
font_T font; font_T font;
bool initialized; bool initialized;
bool blocked;
} graphics_renderer_T; } graphics_renderer_T;
graphics_buffer_T* graphics_buffer_request (uint32_t pos_x, uint32_t pos_y, uint32_t width, uint32_t height, graphics_buffer_layer_E layer); graphics_buffer_T* graphics_buffer_request (uint32_t pos_x, uint32_t pos_y, uint32_t width, uint32_t height, graphics_buffer_layer_E layer);

View File

@ -163,6 +163,7 @@ void graphics_renderer_init(boot_info_T* boot_info_T) {
g_renderer.back_buffer = memory_allocate(g_renderer.buffer_size); g_renderer.back_buffer = memory_allocate(g_renderer.buffer_size);
g_renderer.graphics_buffer_layers = memory_allocate(GRAPHICS_BUFFER_ENUM_MAX * sizeof(graphics_buffer_T*)); g_renderer.graphics_buffer_layers = memory_allocate(GRAPHICS_BUFFER_ENUM_MAX * sizeof(graphics_buffer_T*));
g_renderer.font = g_font; g_renderer.font = g_font;
g_renderer.blocked = false;
memory_set(g_renderer.graphics_buffer_layers, 0, GRAPHICS_BUFFER_ENUM_MAX * sizeof(graphics_buffer_T*)); memory_set(g_renderer.graphics_buffer_layers, 0, GRAPHICS_BUFFER_ENUM_MAX * sizeof(graphics_buffer_T*));
memory_set(g_renderer.back_buffer, 0, g_renderer.buffer_size); memory_set(g_renderer.back_buffer, 0, g_renderer.buffer_size);
@ -202,6 +203,9 @@ void graphics_renderer_update_graphics_buffer(graphics_buffer_T* graphics_buffer
} }
void graphics_renderer_update() { void graphics_renderer_update() {
CORE_HALT_WHILE(g_renderer.blocked)
g_renderer.blocked = true;
memory_set(g_renderer.back_buffer, 0, g_renderer.buffer_size); memory_set(g_renderer.back_buffer, 0, g_renderer.buffer_size);
graphics_buffer_T* graphics_buffer = g_renderer.graphics_buffer_layers[GRAPHICS_BUFFER_STANDARD]; graphics_buffer_T* graphics_buffer = g_renderer.graphics_buffer_layers[GRAPHICS_BUFFER_STANDARD];
@ -219,6 +223,8 @@ void graphics_renderer_update() {
// swap back_buffer into framebuffer // swap back_buffer into framebuffer
memory_copy(g_renderer.back_buffer, g_renderer.framebuffer.address, g_renderer.buffer_size); memory_copy(g_renderer.back_buffer, g_renderer.framebuffer.address, g_renderer.buffer_size);
g_renderer.blocked = false;
} }
graphics_buffer_T* graphics_renderer_get_top_buffer(graphics_buffer_layer_E layer) { graphics_buffer_T* graphics_renderer_get_top_buffer(graphics_buffer_layer_E layer) {