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 3b89da1..5dffe12 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 691f774..57ab192 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);