+ tdm_private_module *private_module; \
+ tdm_func_pp *func_pp; \
+ tdm_private_display *private_display; \
+ tdm_private_pp *private_pp; \
+ tdm_error ret = TDM_ERROR_NONE; \
+ TDM_RETURN_VAL_IF_FAIL(pp != NULL, TDM_ERROR_INVALID_PARAMETER); \
+ private_pp = (tdm_private_pp*)pp; \
+ private_display = private_pp->private_display; \
+ private_module = private_pp->private_module; \
+ func_pp = &private_module->func_pp
+
+static void
+_tdm_pp_print_list(struct list_head *list)
+{
+ tdm_pp_private_buffer *b = NULL;
+ char str[512], *p;
+ int len = sizeof(str);
+
+ TDM_RETURN_IF_FAIL(list != NULL);
+
+ str[0] = '\0';
+ p = str;
+ LIST_FOR_EACH_ENTRY(b, list, link) {
+ if (len > 0) {
+ tbm_bo src_bo = tbm_surface_internal_get_bo(b->src, 0);
+ tbm_bo dst_bo = tbm_surface_internal_get_bo(b->dst, 0);
+ int src_flags = tbm_bo_get_flags(src_bo);
+ int dst_flags = tbm_bo_get_flags(dst_bo);
+ int l = snprintf(p, len, " (%p[bo_flags:%x], %p[bo_flags:%x])",
+ b->src, src_flags, b->dst, dst_flags);
+ p += l;
+ len -= l;
+ } else
+ break;
+ }
+
+ TDM_INFO("\t %s", str);
+}
+
+static tdm_pp_private_buffer *
+_tdm_pp_find_tbm_buffers(struct list_head *list, tbm_surface_h src, tbm_surface_h dst)
+{
+ tdm_pp_private_buffer *b = NULL, *bb = NULL;
+
+ LIST_FOR_EACH_ENTRY_SAFE(b, bb, list, link) {
+ if (b->src == src && b->dst == dst)
+ return b;
+ }
+
+ return NULL;
+}
+
+static tdm_pp_private_buffer *
+_tdm_pp_find_buffer(struct list_head *list, tdm_pp_private_buffer *pp_buffer)
+{
+ tdm_pp_private_buffer *b = NULL, *bb = NULL;
+
+ LIST_FOR_EACH_ENTRY_SAFE(b, bb, list, link) {
+ if (b == pp_buffer)
+ return b;
+ }
+
+ return NULL;
+}
+
+static void
+_tdm_pp_thread_cb_done(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data)
+{
+ tdm_thread_cb_pp_done *pp_done = (tdm_thread_cb_pp_done *)cb_base;
+ tdm_private_pp *private_pp = object;
+ tdm_pp_private_buffer *pp_buffer = NULL, *first_entry = NULL;
+ tbm_surface_h src;
+ tbm_surface_h dst;
+
+ TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED());
+
+ assert(private_pp->owner_tid == syscall(SYS_gettid));
+
+ src = pp_done->src;
+ dst = pp_done->dst;
+
+ if (tdm_debug_dump & TDM_DUMP_FLAG_PP) {
+ /* LCOV_EXCL_START */
+ char str[TDM_PATH_LEN];
+ static int i;
+ snprintf(str, TDM_PATH_LEN, "pp_dst_%03d", i++);
+ tdm_helper_dump_buffer_str(dst, tdm_debug_dump_dir, str);
+ /* LCOV_EXCL_STOP */
+ }
+
+ if (!LIST_IS_EMPTY(&private_pp->buffer_list)) {
+ first_entry = container_of((&private_pp->buffer_list)->next, pp_buffer, link);
+ if (first_entry->src != src || first_entry->dst != dst)
+ TDM_ERR("buffer(%p,%p) is skipped", first_entry->src, first_entry->dst);
+ } else {
+ TDM_NEVER_GET_HERE();
+ }
+
+ if ((pp_buffer = _tdm_pp_find_tbm_buffers(&private_pp->buffer_list, src, dst))) {
+ LIST_DEL(&pp_buffer->link);
+ LIST_DELINIT(&pp_buffer->commit_link);
+
+ if (tdm_debug_module & TDM_DEBUG_BUFFER)
+ TDM_INFO("pp(%p) done: src(%p) dst(%p)", private_pp, src, dst);
+
+ if (tdm_ttrace_module & TDM_TTRACE_PP) {
+ tbm_bo bo = tbm_surface_internal_get_bo(dst, 0);
+ TDM_TRACE_ASYNC_END((intptr_t)private_pp, "[PP] %d", tbm_bo_export(bo));
+ }
+
+ _pthread_mutex_unlock(&private_display->lock);
+ if (private_pp->done_func)
+ private_pp->done_func(private_pp, src, dst, private_pp->done_user_data);
+ tdm_buffer_unref_backend(src);
+ tdm_buffer_unref_backend(dst);
+ _pthread_mutex_lock(&private_display->lock);
+
+ free(pp_buffer);
+ }
+}