added tbm_surface_queue_set_sync_count 59/161359/3
authorChangyeon Lee <cyeon.lee@samsung.com>
Tue, 21 Nov 2017 02:32:06 +0000 (11:32 +0900)
committerChangyeon Lee <cyeon.lee@samsung.com>
Thu, 23 Nov 2017 04:57:04 +0000 (13:57 +0900)
some renderer enqueue surface before rendering of surface is done
if user want to ensure that rendering of surface is done when it is enqueued,
queue do map surface in surface_queue_enqueue function

Change-Id: I364420451113dd5a88d2c726d3b1db16a2769fa2

src/tbm_surface_queue.c
src/tbm_surface_queue.h

index 3b89da1416317749eecae09c53cdd063330c9612..5dffe12ea8330e6c5f8d80b8786cb6583712e905 100644 (file)
@@ -162,6 +162,8 @@ struct _tbm_surface_queue {
        struct list_head item_link; /* link of surface queue */
 
        int modes;
+       unsigned int enqueue_sync_count;
+       unsigned int acquire_sync_count;
 };
 
 static bool
@@ -1110,6 +1112,19 @@ tbm_surface_queue_enqueue(tbm_surface_queue_h
 
        node->type = QUEUE_NODE_TYPE_ENQUEUE;
 
+       if (surface_queue->enqueue_sync_count == 1) {
+               tbm_surface_info_s info;
+               int ret;
+
+               TBM_LOG_E("start map surface:%p", surface);
+               ret = tbm_surface_map(surface, TBM_SURF_OPTION_READ, &info);
+               TBM_LOG_E("end map surface:%p", surface);
+               if (ret == TBM_SURFACE_ERROR_NONE)
+                       tbm_surface_unmap(surface);
+       }
+
+       if (surface_queue->enqueue_sync_count > 0) surface_queue->enqueue_sync_count--;
+
        pthread_mutex_unlock(&surface_queue->lock);
        pthread_cond_signal(&surface_queue->dirty_cond);
 
@@ -1493,6 +1508,19 @@ tbm_surface_queue_acquire(tbm_surface_queue_h
 
        *surface = node->surface;
 
+       if (surface_queue->acquire_sync_count == 1) {
+               tbm_surface_info_s info;
+               int ret;
+
+               TBM_LOG_E("start map surface:%p", *surface);
+               ret = tbm_surface_map(*surface, TBM_SURF_OPTION_READ, &info);
+               TBM_LOG_E("end map surface:%p", *surface);
+               if (ret == TBM_SURFACE_ERROR_NONE)
+                       tbm_surface_unmap(*surface);
+       }
+
+       if (surface_queue->acquire_sync_count > 0) surface_queue->acquire_sync_count--;
+
        TBM_QUEUE_TRACE("tbm_surface_queue(%p) tbm_surface(%p)\n", surface_queue, *surface);
 
        pthread_mutex_unlock(&surface_queue->lock);
@@ -2167,3 +2195,34 @@ tbm_surface_queue_set_modes(tbm_surface_queue_h surface_queue,
 
        return TBM_SURFACE_QUEUE_ERROR_NONE;
 }
+
+tbm_surface_queue_error_e
+tbm_surface_queue_set_sync_count(tbm_surface_queue_h surface_queue,
+                                 unsigned int sync_count)
+{
+       int dequeue_num, enqueue_num;
+
+       _tbm_surf_queue_mutex_lock();
+
+       TBM_SURF_QUEUE_RETURN_VAL_IF_FAIL(_tbm_surface_queue_is_valid(surface_queue),
+                                  TBM_SURFACE_QUEUE_ERROR_INVALID_QUEUE);
+
+       pthread_mutex_lock(&surface_queue->lock);
+
+       dequeue_num = _tbm_surface_queue_get_node_count(surface_queue, QUEUE_NODE_TYPE_DEQUEUE);
+       enqueue_num = _tbm_surface_queue_get_node_count(surface_queue, QUEUE_NODE_TYPE_ENQUEUE);
+
+       if (dequeue_num + sync_count == 0)
+               surface_queue->acquire_sync_count = enqueue_num;
+       else
+               surface_queue->enqueue_sync_count = dequeue_num + sync_count;
+
+       TBM_QUEUE_TRACE("tbm_surface_queue(%p) enqueue_sync_count:(%d) acquire_sync_count:(%d)\n",
+                               surface_queue, surface_queue->enqueue_sync_count, surface_queue->acquire_sync_count);
+
+       pthread_mutex_unlock(&surface_queue->lock);
+
+       _tbm_surf_queue_mutex_unlock();
+
+       return TBM_SURFACE_QUEUE_ERROR_NONE;
+}
index 691f7742d808ade3fef81209243553ebb6b5592d..57ab19250b6c31b509ce493fbbbbdd3c8647f44e 100644 (file)
@@ -197,6 +197,9 @@ tbm_surface_queue_error_e tbm_surface_queue_get_trace_surface_num(
 tbm_surface_queue_error_e tbm_surface_queue_set_modes(
                        tbm_surface_queue_h surface_queue, int modes);
 
+tbm_surface_queue_error_e tbm_surface_queue_set_sync_count(
+                       tbm_surface_queue_h surface_queue, unsigned int sync_count);
+
 /*The functions of queue factory*/
 tbm_surface_queue_h tbm_surface_queue_create(int queue_size, int width,
                int height, int format, int flags);