From e60b8d15a55b8f88fd6377c2351d9615098bb4a2 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sat, 23 Mar 2013 23:01:02 +0100 Subject: [PATCH] Reuse the same dispd framebuffer if possible. --- dispd/client/window.cpp | 32 +++++++++++++++++++++++++++++--- dispd/client/window.h | 2 ++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/dispd/client/window.cpp b/dispd/client/window.cpp index df522fc9..bfee9424 100644 --- a/dispd/client/window.cpp +++ b/dispd/client/window.cpp @@ -74,10 +74,36 @@ struct dispd_window* dispd_create_window_game_rgba(struct dispd_session* session extern "C" bool dispd_destroy_window(struct dispd_window* window) { + free(window->cached_buffer); free(window); return true; } +static uint8_t* request_buffer(struct dispd_window* window, size_t size) +{ + if ( window->cached_buffer ) + { + if ( window->cached_buffer_size == size ) + { + uint8_t* ret = window->cached_buffer; + window->cached_buffer = NULL; + window->cached_buffer_size = 0; + return ret; + } + free(window->cached_buffer); + window->cached_buffer = NULL; + window->cached_buffer_size = 0; + } + return (uint8_t*) malloc(size); +} + +static void return_buffer(struct dispd_window* window, uint8_t* b, size_t size) +{ + free(window->cached_buffer); + window->cached_buffer = b; + window->cached_buffer_size = size; +} + static struct dispd_framebuffer* disp_begin_render_vga(struct dispd_window* window) { @@ -93,7 +119,7 @@ struct dispd_framebuffer* disp_begin_render_vga(struct dispd_window* window) fb->bpp = 16; fb->pitch = fb->width * fb->bpp / 8; fb->datasize = fb->pitch * fb->height; - fb->data = (uint8_t*) malloc(fb->datasize); + fb->data = (uint8_t*) request_buffer(window, fb->datasize); if ( !fb->data ) { free(fb); return NULL; } return fb; } @@ -119,7 +145,7 @@ struct dispd_framebuffer* disp_begin_render_rgba(struct dispd_window* window) fb->bpp = 32; fb->pitch = fb->width * fb->bpp / 8; fb->datasize = fb->pitch * fb->height; - fb->data = (uint8_t*) malloc(fb->datasize); + fb->data = (uint8_t*) request_buffer(window, fb->datasize); if ( !fb->data ) { free(fb); return NULL; } return fb; } @@ -159,7 +185,7 @@ bool dispd_finish_render(struct dispd_framebuffer* fb) if ( dispmsg_issue(&msg, sizeof(msg)) == 0 ) ret = true; } - free(fb->data); + return_buffer(window, fb->data, fb->datasize); free(fb); return ret; } diff --git a/dispd/client/window.h b/dispd/client/window.h index c19ad815..d0ec36a8 100644 --- a/dispd/client/window.h +++ b/dispd/client/window.h @@ -32,6 +32,8 @@ extern "C" { struct dispd_window { struct dispd_session* session; + uint8_t* cached_buffer; + size_t cached_buffer_size; bool is_vga; bool is_rgba; };