From 612db86a65a50cbddd2682c68783ef5e02e103f4 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 8 Feb 2017 19:51:39 +0900 Subject: [PATCH] commit: fix the double registration for layer vblank handler Change-Id: I5154539f0b6f0f7656035aff9d54d6178be058e2 --- src/tdm_display.c | 31 ++++++++++++++++++------------- src/tdm_private.h | 2 +- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/tdm_display.c b/src/tdm_display.c index e223161..762a933 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -991,6 +991,9 @@ tdm_output_cb_vblank(tdm_output *output_backend, unsigned int sequence, LIST_ADDTAIL(&v->link, &clone_list); } + if (tdm_debug_module & TDM_DEBUG_COMMIT) + TDM_INFO("-----------------------------------------"); + _pthread_mutex_unlock(&private_display->lock); LIST_FOR_EACH_ENTRY_SAFE(v, vv, &clone_list, link) { if (tdm_debug_module & TDM_DEBUG_COMMIT) @@ -1002,6 +1005,9 @@ tdm_output_cb_vblank(tdm_output *output_backend, unsigned int sequence, free(v); } _pthread_mutex_lock(&private_display->lock); + + if (tdm_debug_module & TDM_DEBUG_COMMIT) + TDM_INFO("-----------------------------------------..."); } INTERN void @@ -1881,8 +1887,6 @@ _tdm_layer_committed(tdm_private_layer *private_layer) tdm_private_output *private_output = private_layer->private_output; tdm_private_display *private_display = private_output->private_display; - private_layer->committing = 0; - if (private_display->print_fps) { double curr = tdm_helper_get_time(); private_layer->fps_count++; @@ -1934,18 +1938,20 @@ _tdm_layer_got_output_vblank(tdm_private_output *private_output, unsigned int se private_display = private_output->private_display; - private_output->waiting_vblank = 0; + private_output->layer_waiting_vblank = 0; LIST_INITHEAD(&clone_list); LIST_INITHEAD(&pending_clone_list); LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &private_output->layer_commit_handler_list, link) { LIST_DEL(&lm->link); + lm->private_layer->committing = 0; LIST_ADDTAIL(&lm->link, &clone_list); } LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &private_output->pending_commit_handler_list, link) { LIST_DEL(&lm->link); + lm->private_layer->committing = 0; LIST_ADDTAIL(&lm->link, &pending_clone_list); } @@ -1974,11 +1980,13 @@ _tdm_layer_got_output_vblank(tdm_private_output *private_output, unsigned int se TDM_INFO("layer commit: output(%d) commit", private_output->pipe); /* tdm_vblank APIs is for server. it should be called in unlock status*/ - _pthread_mutex_unlock(&private_display->lock); - ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_layer_cb_wait_vblank, private_output); - _pthread_mutex_lock(&private_display->lock); - TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, wait_failed); - private_output->waiting_vblank = 1; + if (!private_output->layer_waiting_vblank) { + _pthread_mutex_unlock(&private_display->lock); + ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_layer_cb_wait_vblank, private_output); + _pthread_mutex_lock(&private_display->lock); + TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, wait_failed); + private_output->layer_waiting_vblank = 1; + } if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("layer commit: output(%d) wait vblank", private_output->pipe); @@ -2147,18 +2155,15 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da private_output->vblank = tdm_vblank_create(private_display, private_output, NULL); _pthread_mutex_lock(&private_display->lock); TDM_GOTO_IF_FAIL(private_output->vblank != NULL, commit_failed); - - /* to call the frontend's internal vblank handlers before the extern vblank handlers */ - tdm_vblank_set_add_front(private_output->vblank, 1); } - if (!private_output->waiting_vblank) { + if (!private_output->layer_waiting_vblank) { /* tdm_vblank APIs is for server. it should be called in unlock status*/ _pthread_mutex_unlock(&private_display->lock); ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_layer_cb_wait_vblank, private_output); _pthread_mutex_lock(&private_display->lock); TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed); - private_output->waiting_vblank = 1; + private_output->layer_waiting_vblank = 1; if (tdm_debug_module & TDM_DEBUG_COMMIT) TDM_INFO("layer(%p) commit: wait vblank", private_layer); diff --git a/src/tdm_private.h b/src/tdm_private.h index 0d4cfda..cd7405d 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -206,7 +206,7 @@ struct _tdm_private_output { struct list_head layer_commit_handler_list; struct list_head pending_commit_handler_list; tdm_vblank *vblank; - int waiting_vblank; + int layer_waiting_vblank; /* seperate list for multi-thread*/ struct list_head change_handler_list_main; -- 2.7.4