summaryrefslogtreecommitdiff
path: root/supervisor
diff options
context:
space:
mode:
authorChristian Walther <cwalther@gmx.ch>2020-10-11 20:39:19 +0200
committerChristian Walther <cwalther@gmx.ch>2020-11-28 17:54:34 +0100
commit2ba9805f845e000fa3299e95e93a063471751ecd (patch)
tree3f1af3fa41607bb70d945a3d1c633ade7fa06c7f /supervisor
parentc7404a3ff89c738c002ec63448a58d56330dfcc3 (diff)
Use movable allocation system for terminal tilegrid.
Moving memory is now done by the infrastructure and neither necessary nor correct here anymore.
Diffstat (limited to 'supervisor')
-rw-r--r--supervisor/shared/display.c43
1 files changed, 17 insertions, 26 deletions
diff --git a/supervisor/shared/display.c b/supervisor/shared/display.c
index de45e2672..9c9c66cd7 100644
--- a/supervisor/shared/display.c
+++ b/supervisor/shared/display.c
@@ -81,19 +81,21 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
uint16_t total_tiles = width_in_tiles * height_in_tiles;
- // First try to allocate outside the heap. This will fail when the VM is running.
- tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, false);
- uint8_t* tiles;
- if (tilegrid_tiles == NULL) {
- tiles = m_malloc(total_tiles, true);
- MP_STATE_VM(terminal_tilegrid_tiles) = tiles;
- } else {
- tiles = (uint8_t*) tilegrid_tiles->ptr;
+ // Reuse the previous allocation if possible
+ if (tilegrid_tiles) {
+ if (get_allocation_length(tilegrid_tiles) != align32_size(total_tiles)) {
+ free_memory(tilegrid_tiles);
+ tilegrid_tiles = NULL;
+ }
}
-
- if (tiles == NULL) {
- return;
+ if (!tilegrid_tiles) {
+ tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, true);
+ if (!tilegrid_tiles) {
+ return;
+ }
}
+ uint8_t* tiles = (uint8_t*) tilegrid_tiles->ptr;
+
grid->y = tall ? blinka_bitmap.height : 0;
grid->x = tall ? 0 : blinka_bitmap.width;
grid->top_left_y = 0;
@@ -120,7 +122,6 @@ void supervisor_stop_terminal(void) {
if (tilegrid_tiles != NULL) {
free_memory(tilegrid_tiles);
tilegrid_tiles = NULL;
- supervisor_terminal_text_grid.inline_tiles = false;
supervisor_terminal_text_grid.tiles = NULL;
}
#endif
@@ -128,20 +129,10 @@ void supervisor_stop_terminal(void) {
void supervisor_display_move_memory(void) {
#if CIRCUITPY_TERMINALIO
- displayio_tilegrid_t* grid = &supervisor_terminal_text_grid;
- if (MP_STATE_VM(terminal_tilegrid_tiles) != NULL &&
- grid->tiles == MP_STATE_VM(terminal_tilegrid_tiles)) {
- uint16_t total_tiles = grid->width_in_tiles * grid->height_in_tiles;
-
- tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, false);
- if (tilegrid_tiles != NULL) {
- memcpy(tilegrid_tiles->ptr, grid->tiles, total_tiles);
- grid->tiles = (uint8_t*) tilegrid_tiles->ptr;
- } else {
- grid->tiles = NULL;
- grid->inline_tiles = false;
- }
- MP_STATE_VM(terminal_tilegrid_tiles) = NULL;
+ if (tilegrid_tiles != NULL) {
+ supervisor_terminal_text_grid.tiles = (uint8_t*) tilegrid_tiles->ptr;
+ } else {
+ supervisor_terminal_text_grid.tiles = NULL;
}
#endif