struct list_head item_link; /* link of surface queue */
int modes;
+ unsigned int enqueue_sync_count;
+ unsigned int acquire_sync_count;
};
static bool
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);
*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);
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;
+}