commit: fix the double registration for layer vblank handler 01/113701/4
authorBoram Park <boram1288.park@samsung.com>
Wed, 8 Feb 2017 10:51:39 +0000 (19:51 +0900)
committerBoram Park <boram1288.park@samsung.com>
Wed, 8 Feb 2017 11:05:44 +0000 (20:05 +0900)
Change-Id: I5154539f0b6f0f7656035aff9d54d6178be058e2

src/tdm_display.c
src/tdm_private.h

index e223161..762a933 100644 (file)
@@ -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);
index 0d4cfda..cd7405d 100644 (file)
@@ -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;