raspi/glfb: clean up objects on exit, remove double buffer

This commit is contained in:
Stefan Seyfried
2013-10-20 00:03:12 +02:00
parent 48df8f882a
commit d736e87d4e

View File

@@ -35,15 +35,14 @@
#define CHECK(x) if (!(x)) { lt_info("GLFB: %s:%d warning: %s\n", __func__, __LINE__, #x); } #define CHECK(x) if (!(x)) { lt_info("GLFB: %s:%d warning: %s\n", __func__, __LINE__, #x); }
/* TODO: encapsulate this into pdata? */ /* TODO: encapsulate this into pdata? */
static DISPMANX_RESOURCE_HANDLE_T res[2]; static DISPMANX_RESOURCE_HANDLE_T res;
static uint32_t vc_img_ptr[2]; static uint32_t vc_img_ptr;
static DISPMANX_UPDATE_HANDLE_T update; static DISPMANX_UPDATE_HANDLE_T update;
static DISPMANX_ELEMENT_HANDLE_T element; static DISPMANX_ELEMENT_HANDLE_T element;
static DISPMANX_DISPLAY_HANDLE_T display; static DISPMANX_DISPLAY_HANDLE_T display;
static DISPMANX_MODEINFO_T info; static DISPMANX_MODEINFO_T info;
static VC_RECT_T dst_rect; static VC_RECT_T dst_rect;
static void *image; static void *image;
static int curr_res;
static int pitch; static int pitch;
static VC_IMAGE_TYPE_T type = VC_IMAGE_ARGB8888; static VC_IMAGE_TYPE_T type = VC_IMAGE_ARGB8888;
@@ -78,9 +77,20 @@ GLFramebuffer::GLFramebuffer(int x, int y)
GLFramebuffer::~GLFramebuffer() GLFramebuffer::~GLFramebuffer()
{ {
int ret;
goodbye = true; goodbye = true;
blit(); /* wake up thread */ blit(); /* wake up thread */
OpenThreads::Thread::join(); OpenThreads::Thread::join();
update = vc_dispmanx_update_start(10);
CHECK(update);
ret = vc_dispmanx_element_remove(update, element);
CHECK(ret == 0);
ret = vc_dispmanx_update_submit_sync(update);
CHECK(ret == 0);
ret = vc_dispmanx_resource_delete(res);
CHECK(ret == 0);
ret = vc_dispmanx_display_close(display);
CHECK(ret == 0);
} }
void GLFramebuffer::run() void GLFramebuffer::run()
@@ -130,12 +140,10 @@ void GLFramebuffer::setup()
image = &osd_buf[0]; image = &osd_buf[0];
/* initialize to half-transparent grey */ /* initialize to half-transparent grey */
memset(image, 0x7f, osd_buf.size()); memset(image, 0x7f, osd_buf.size());
for (int i = 0; i < 2; i++) { res = vc_dispmanx_resource_create(type, width, height, &vc_img_ptr);
res[i] = vc_dispmanx_resource_create(type, width, height, &vc_img_ptr[i]); CHECK(res);
CHECK(res[i]);
}
vc_dispmanx_rect_set(&dst_rect, 0, 0, width, height); vc_dispmanx_rect_set(&dst_rect, 0, 0, width, height);
ret = vc_dispmanx_resource_write_data(res[curr_res], type, pitch, image, &dst_rect); ret = vc_dispmanx_resource_write_data(res, type, pitch, image, &dst_rect);
CHECK(ret == 0); CHECK(ret == 0);
update = vc_dispmanx_update_start(10); update = vc_dispmanx_update_start(10);
CHECK(update); CHECK(update);
@@ -145,7 +153,7 @@ void GLFramebuffer::setup()
display, display,
2000 /*layer*/, 2000 /*layer*/,
&dsp_rect, &dsp_rect,
res[curr_res], res,
&src_rect, &src_rect,
DISPMANX_PROTECTION_NONE, DISPMANX_PROTECTION_NONE,
&alpha, &alpha,
@@ -153,19 +161,15 @@ void GLFramebuffer::setup()
DISPMANX_NO_ROTATE); DISPMANX_NO_ROTATE);
ret = vc_dispmanx_update_submit_sync(update); ret = vc_dispmanx_update_submit_sync(update);
CHECK(ret == 0); CHECK(ret == 0);
curr_res = !curr_res;
} }
void GLFramebuffer::blit_osd() void GLFramebuffer::blit_osd()
{ {
int ret; int ret;
ret = vc_dispmanx_resource_write_data(res[curr_res], type, pitch, image, &dst_rect); ret = vc_dispmanx_resource_write_data(res, type, pitch, image, &dst_rect);
CHECK(ret == 0); CHECK(ret == 0);
update = vc_dispmanx_update_start(10); update = vc_dispmanx_update_start(10);
CHECK(update); CHECK(update);
ret = vc_dispmanx_element_change_source(update, element, res[curr_res]);
CHECK(ret == 0);
ret = vc_dispmanx_update_submit_sync(update); ret = vc_dispmanx_update_submit_sync(update);
CHECK(ret == 0); CHECK(ret == 0);
curr_res = !curr_res;
} }