Reuse the same dispd framebuffer if possible.

This commit is contained in:
Jonas 'Sortie' Termansen 2013-03-23 23:01:02 +01:00
parent cf9719526e
commit e60b8d15a5
2 changed files with 31 additions and 3 deletions

View File

@ -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) extern "C" bool dispd_destroy_window(struct dispd_window* window)
{ {
free(window->cached_buffer);
free(window); free(window);
return true; 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 static
struct dispd_framebuffer* disp_begin_render_vga(struct dispd_window* window) 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->bpp = 16;
fb->pitch = fb->width * fb->bpp / 8; fb->pitch = fb->width * fb->bpp / 8;
fb->datasize = fb->pitch * fb->height; 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; } if ( !fb->data ) { free(fb); return NULL; }
return fb; return fb;
} }
@ -119,7 +145,7 @@ struct dispd_framebuffer* disp_begin_render_rgba(struct dispd_window* window)
fb->bpp = 32; fb->bpp = 32;
fb->pitch = fb->width * fb->bpp / 8; fb->pitch = fb->width * fb->bpp / 8;
fb->datasize = fb->pitch * fb->height; 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; } if ( !fb->data ) { free(fb); return NULL; }
return fb; return fb;
} }
@ -159,7 +185,7 @@ bool dispd_finish_render(struct dispd_framebuffer* fb)
if ( dispmsg_issue(&msg, sizeof(msg)) == 0 ) if ( dispmsg_issue(&msg, sizeof(msg)) == 0 )
ret = true; ret = true;
} }
free(fb->data); return_buffer(window, fb->data, fb->datasize);
free(fb); free(fb);
return ret; return ret;
} }

View File

@ -32,6 +32,8 @@ extern "C" {
struct dispd_window struct dispd_window
{ {
struct dispd_session* session; struct dispd_session* session;
uint8_t* cached_buffer;
size_t cached_buffer_size;
bool is_vga; bool is_vga;
bool is_rgba; bool is_rgba;
}; };