summaryrefslogtreecommitdiff
path: root/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
diff options
context:
space:
mode:
authorChristian Walther <cwalther@gmx.ch>2020-10-16 23:08:29 +0200
committerChristian Walther <cwalther@gmx.ch>2020-11-28 17:54:34 +0100
commitac91220361e402bbf6ebb741a9b6ea258a05da99 (patch)
tree35adabf23a681eb121e95e7dc6a9bb11390bbda7 /shared-module/sharpdisplay/SharpMemoryFramebuffer.c
parent2ba9805f845e000fa3299e95e93a063471751ecd (diff)
Use movable allocation system for Sharp display framebuffer.
Hybrid allocation is now part of the infrastructure. Moving memory contents would not be necessary because displayio can recreate them, but does not hurt.
Diffstat (limited to 'shared-module/sharpdisplay/SharpMemoryFramebuffer.c')
-rw-r--r--shared-module/sharpdisplay/SharpMemoryFramebuffer.c57
1 files changed, 14 insertions, 43 deletions
diff --git a/shared-module/sharpdisplay/SharpMemoryFramebuffer.c b/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
index aefb6b18d..4b92bd637 100644
--- a/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
+++ b/shared-module/sharpdisplay/SharpMemoryFramebuffer.c
@@ -34,32 +34,10 @@
#include "shared-module/sharpdisplay/SharpMemoryFramebuffer.h"
#include "supervisor/memory.h"
-#include "supervisor/shared/safe_mode.h"
#define SHARPMEM_BIT_WRITECMD_LSB (0x80)
#define SHARPMEM_BIT_VCOM_LSB (0x40)
-static void *hybrid_alloc(size_t sz) {
- supervisor_allocation *allocation = allocate_memory(align32_size(sz), false, false);
- if (allocation) {
- memset(allocation->ptr, 0, sz);
- return allocation->ptr;
- }
- if (gc_alloc_possible()) {
- return m_malloc(sz, true);
- }
- reset_into_safe_mode(MEM_MANAGE);
- return NULL; // unreached
-}
-
-static inline void hybrid_free(void *ptr_in) {
- supervisor_allocation *allocation = allocation_from_ptr(ptr_in);
-
- if (allocation) {
- free_memory(allocation);
- }
-}
-
STATIC uint8_t bitrev(uint8_t n) {
uint8_t r = 0;
for(int i=0;i<8;i++) r |= ((n>>i) & 1)<<(7-i);
@@ -102,9 +80,9 @@ void common_hal_sharpdisplay_framebuffer_reset(sharpdisplay_framebuffer_obj_t *s
}
void common_hal_sharpdisplay_framebuffer_reconstruct(sharpdisplay_framebuffer_obj_t *self) {
- if (!allocation_from_ptr(self->bufinfo.buf)) {
- self->bufinfo.buf = NULL;
- }
+ // Look up the allocation by the old pointer and get the new pointer from it.
+ supervisor_allocation* alloc = allocation_from_ptr(self->bufinfo.buf);
+ self->bufinfo.buf = alloc ? alloc->ptr : NULL;
}
void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_obj_t *self, mp_buffer_info_t *bufinfo) {
@@ -112,7 +90,12 @@ void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_ob
int row_stride = common_hal_sharpdisplay_framebuffer_get_row_stride(self);
int height = common_hal_sharpdisplay_framebuffer_get_height(self);
self->bufinfo.len = row_stride * height + 2;
- self->bufinfo.buf = hybrid_alloc(self->bufinfo.len);
+ supervisor_allocation* alloc = allocate_memory(align32_size(self->bufinfo.len), false, true);
+ if (alloc == NULL) {
+ m_malloc_fail(self->bufinfo.len);
+ }
+ self->bufinfo.buf = alloc->ptr;
+ memset(alloc->ptr, 0, self->bufinfo.len);
uint8_t *data = self->bufinfo.buf;
*data++ = SHARPMEM_BIT_WRITECMD_LSB;
@@ -123,7 +106,9 @@ void common_hal_sharpdisplay_framebuffer_get_bufinfo(sharpdisplay_framebuffer_ob
}
self->full_refresh = true;
}
- *bufinfo = self->bufinfo;
+ if (bufinfo) {
+ *bufinfo = self->bufinfo;
+ }
}
void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *self) {
@@ -137,7 +122,7 @@ void common_hal_sharpdisplay_framebuffer_deinit(sharpdisplay_framebuffer_obj_t *
common_hal_reset_pin(self->chip_select.pin);
- hybrid_free(self->bufinfo.buf);
+ free_memory(allocation_from_ptr(self->bufinfo.buf));
memset(self, 0, sizeof(*self));
}
@@ -154,19 +139,7 @@ void common_hal_sharpdisplay_framebuffer_construct(sharpdisplay_framebuffer_obj_
self->height = height;
self->baudrate = baudrate;
- int row_stride = common_hal_sharpdisplay_framebuffer_get_row_stride(self);
- self->bufinfo.len = row_stride * height + 2;
- // re-use a supervisor allocation if possible
- self->bufinfo.buf = hybrid_alloc(self->bufinfo.len);
-
- uint8_t *data = self->bufinfo.buf;
- *data++ = SHARPMEM_BIT_WRITECMD_LSB;
-
- for(int y=0; y<self->height; y++) {
- *data = bitrev(y+1);
- data += row_stride;
- }
- self->full_refresh = true;
+ common_hal_sharpdisplay_framebuffer_get_bufinfo(self, NULL);
}
void common_hal_sharpdisplay_framebuffer_swapbuffers(sharpdisplay_framebuffer_obj_t *self, uint8_t *dirty_row_bitmask) {
@@ -271,7 +244,5 @@ const framebuffer_p_t sharpdisplay_framebuffer_proto = {
};
void common_hal_sharpdisplay_framebuffer_collect_ptrs(sharpdisplay_framebuffer_obj_t *self) {
- gc_collect_ptr(self->framebuffer);
gc_collect_ptr(self->bus);
- gc_collect_ptr(self->bufinfo.buf);
}