Skip to content

Commit 2ba9805

Browse files
committed
Use movable allocation system for terminal tilegrid.
Moving memory is now done by the infrastructure and neither necessary nor correct here anymore.
1 parent c7404a3 commit 2ba9805

File tree

2 files changed

+17
-27
lines changed

2 files changed

+17
-27
lines changed

py/circuitpy_mpconfig.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,6 @@ struct _supervisor_allocation_node;
867867
mp_obj_t rtc_time_source; \
868868
GAMEPAD_ROOT_POINTERS \
869869
mp_obj_t pew_singleton; \
870-
mp_obj_t terminal_tilegrid_tiles; \
871870
BOARD_UART_ROOT_POINTER \
872871
FLASH_ROOT_POINTERS \
873872
MEMORYMONITOR_ROOT_POINTERS \

supervisor/shared/display.c

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -81,19 +81,21 @@ void supervisor_start_terminal(uint16_t width_px, uint16_t height_px) {
8181

8282
uint16_t total_tiles = width_in_tiles * height_in_tiles;
8383

84-
// First try to allocate outside the heap. This will fail when the VM is running.
85-
tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, false);
86-
uint8_t* tiles;
87-
if (tilegrid_tiles == NULL) {
88-
tiles = m_malloc(total_tiles, true);
89-
MP_STATE_VM(terminal_tilegrid_tiles) = tiles;
90-
} else {
91-
tiles = (uint8_t*) tilegrid_tiles->ptr;
84+
// Reuse the previous allocation if possible
85+
if (tilegrid_tiles) {
86+
if (get_allocation_length(tilegrid_tiles) != align32_size(total_tiles)) {
87+
free_memory(tilegrid_tiles);
88+
tilegrid_tiles = NULL;
89+
}
9290
}
93-
94-
if (tiles == NULL) {
95-
return;
91+
if (!tilegrid_tiles) {
92+
tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, true);
93+
if (!tilegrid_tiles) {
94+
return;
95+
}
9696
}
97+
uint8_t* tiles = (uint8_t*) tilegrid_tiles->ptr;
98+
9799
grid->y = tall ? blinka_bitmap.height : 0;
98100
grid->x = tall ? 0 : blinka_bitmap.width;
99101
grid->top_left_y = 0;
@@ -120,28 +122,17 @@ void supervisor_stop_terminal(void) {
120122
if (tilegrid_tiles != NULL) {
121123
free_memory(tilegrid_tiles);
122124
tilegrid_tiles = NULL;
123-
supervisor_terminal_text_grid.inline_tiles = false;
124125
supervisor_terminal_text_grid.tiles = NULL;
125126
}
126127
#endif
127128
}
128129

129130
void supervisor_display_move_memory(void) {
130131
#if CIRCUITPY_TERMINALIO
131-
displayio_tilegrid_t* grid = &supervisor_terminal_text_grid;
132-
if (MP_STATE_VM(terminal_tilegrid_tiles) != NULL &&
133-
grid->tiles == MP_STATE_VM(terminal_tilegrid_tiles)) {
134-
uint16_t total_tiles = grid->width_in_tiles * grid->height_in_tiles;
135-
136-
tilegrid_tiles = allocate_memory(align32_size(total_tiles), false, false);
137-
if (tilegrid_tiles != NULL) {
138-
memcpy(tilegrid_tiles->ptr, grid->tiles, total_tiles);
139-
grid->tiles = (uint8_t*) tilegrid_tiles->ptr;
140-
} else {
141-
grid->tiles = NULL;
142-
grid->inline_tiles = false;
143-
}
144-
MP_STATE_VM(terminal_tilegrid_tiles) = NULL;
132+
if (tilegrid_tiles != NULL) {
133+
supervisor_terminal_text_grid.tiles = (uint8_t*) tilegrid_tiles->ptr;
134+
} else {
135+
supervisor_terminal_text_grid.tiles = NULL;
145136
}
146137
#endif
147138

0 commit comments

Comments
 (0)