Reuse the same dispd framebuffer if possible.
This commit is contained in:
parent
cf9719526e
commit
e60b8d15a5
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue