return ret;
}
+tdm_error
+_tdm_output_commit_virtual(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data)
+{
+ tdm_private_output *private_output;
+ tdm_private_output_commit_handler *output_commit_handler = NULL;
+ tdm_private_layer *private_layer = NULL;
+ tbm_surface_h buffer;
+ tdm_error ret = TDM_ERROR_NONE;
+
+ TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
+
+ private_output = (tdm_private_output*)output;
+
+ if (!LIST_IS_EMPTY(&private_output->output_commit_handler_list)) {
+ /* support only 1 commit */
+ TDM_ERR("voutput canot commit while commiting");
+ return TDM_ERROR_OPERATION_FAILED;
+ }
+
+ output_commit_handler = calloc(1, sizeof(tdm_private_output_commit_handler));
+ if (!output_commit_handler) {
+ /* LCOV_EXCL_START */
+ TDM_ERR("failed: alloc memory");
+ return TDM_ERROR_OUT_OF_MEMORY;
+ /* LCOV_EXCL_STOP */
+ }
+
+ LIST_ADDTAIL(&output_commit_handler->link, &private_output->output_commit_handler_list);
+ output_commit_handler->private_output = private_output;
+ output_commit_handler->func = func;
+ output_commit_handler->user_data = user_data;
+ output_commit_handler->owner_tid = syscall(SYS_gettid);
+
+ /* voutput use only 1 layer */
+ LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link) {
+ if (private_layer) break;
+ }
+ TDM_GOTO_IF_FAIL(private_layer, commit_failed);
+ TDM_GOTO_IF_FAIL(private_layer->committed_buffer, commit_failed);
+
+ buffer = private_layer->committed_buffer->buffer;
+
+ ret = tdm_output_send_buffer(private_output, buffer);
+ TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed);
+ ret = tdm_output_commit_buffer(private_output);
+ TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, commit_failed);
+
+ return ret;
+
+commit_failed:
+ /* LCOV_EXCL_START */
+ if (output_commit_handler) {
+ LIST_DEL(&output_commit_handler->link);
+ free(output_commit_handler);
+ }
+ return ret;
+/* LCOV_EXCL_STOP */
+}
+
INTERN tdm_error
tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data)
{
+ tdm_private_display *private_display;
tdm_private_output *private_output;
tdm_private_module *private_module;
tdm_func_output *func_output;
private_output = (tdm_private_output*)output;
private_module = private_output->private_module;
+ private_display = private_module->private_display;
func_output = &private_module->func_output;
+ if (private_module == private_display->virtual_module)
+ return _tdm_output_commit_virtual(output, sync, func, user_data);
+
if (!func_output->output_commit) {
/* LCOV_EXCL_START */
TDM_WRN("not implemented!!");
return ret;
}
+
+INTERN tdm_error
+tdm_output_commit_done(tdm_output *output, tbm_surface_h buffer)
+{
+ tdm_private_layer *private_layer = NULL;
+ tdm_private_output_commit_handler *output_commit_handler = NULL;
+ static int sequence = 0;
+ tdm_private_output *private_output;
+ TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER); \
+ private_output = (tdm_private_output*)output;
+
+ LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link) {
+ if (private_layer) break;
+ }
+
+ LIST_FOR_EACH_ENTRY(output_commit_handler, &private_output->output_commit_handler_list, link) {
+ if (output_commit_handler) break;
+ }
+ TDM_RETURN_VAL_IF_FAIL(output_commit_handler, TDM_ERROR_INVALID_PARAMETER);
+
+ LIST_DEL(&output_commit_handler->link);
+
+ output_commit_handler->func(private_output,
+ sequence++,
+ 0, 0,
+ output_commit_handler->user_data);
+ free(output_commit_handler);
+
+ return TDM_ERROR_NONE;
+}
/* LCOV_EXCL_STOP */