From: Vasiliy Ulyanov Date: Thu, 14 May 2015 10:47:50 +0000 (+0300) Subject: VIGS: add synchronous glReadPixels fallback X-Git-Tag: TizenStudio_2.0_p3.0~209^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bc57086d98295f99645be07f01519e52b1632af4;p=sdk%2Femulator%2Fqemu.git VIGS: add synchronous glReadPixels fallback On some GPUs accessing OpenGL objects from different threads may lead to a deadlock inside the host video driver (e.g. AMD Radeon FGLRX). To workaround this problem new env var has been introduced: VIGS_SYNC_READ_PIXELS. It makes VIGS use a single work_queue for both rendering and pixels reading. Change-Id: Ib929fb41333233e928659dd7829875fb96a4370e Signed-off-by: Vasiliy Ulyanov --- diff --git a/hw/vigs/vigs_offscreen_server.c b/hw/vigs/vigs_offscreen_server.c index 3f961a7..1f54a70 100644 --- a/hw/vigs/vigs_offscreen_server.c +++ b/hw/vigs/vigs_offscreen_server.c @@ -29,6 +29,7 @@ #include "vigs_offscreen_server.h" #include "vigs_backend.h" +#include "vigs_log.h" #include "work_queue.h" struct vigs_display_work_item @@ -109,7 +110,9 @@ static void vigs_offscreen_server_destroy(struct vigs_server *server) struct vigs_offscreen_server *offscreen_server = (struct vigs_offscreen_server*)server; - work_queue_destroy(offscreen_server->display_queue); + if (!offscreen_server->display_sync) { + work_queue_destroy(offscreen_server->display_queue); + } vigs_server_cleanup(server); @@ -124,6 +127,7 @@ struct vigs_server *vigs_offscreen_server_create(uint8_t *vram_ptr, struct vigs_backend *backend, struct work_queue *render_queue) { + const char *sync = getenv("VIGS_SYNC_READ_PIXELS"); struct vigs_offscreen_server *server = NULL; server = g_malloc0(sizeof(*server)); @@ -135,7 +139,12 @@ struct vigs_server *vigs_offscreen_server_create(uint8_t *vram_ptr, return NULL; } - server->display_queue = work_queue_create("display_queue"); + server->display_sync = sync ? !!atoi(sync) : false; + server->display_queue = server->display_sync ? + render_queue : + work_queue_create("display_queue"); + + VIGS_LOG_INFO("VIGS_SYNC_READ_PIXELS: %d", server->display_sync); server->base.begin_update = &vigs_offscreen_server_begin_update; server->base.finish_update = &vigs_offscreen_server_finish_update; diff --git a/hw/vigs/vigs_offscreen_server.h b/hw/vigs/vigs_offscreen_server.h index f0e715f..287b015 100644 --- a/hw/vigs/vigs_offscreen_server.h +++ b/hw/vigs/vigs_offscreen_server.h @@ -36,6 +36,7 @@ struct vigs_offscreen_server { struct vigs_server base; + bool display_sync; struct work_queue *display_queue; };