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)
{
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;
}

View File

@ -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;
};