virtual: send set buffer to client when commit 23/186323/2
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 9 Aug 2018 02:41:29 +0000 (11:41 +0900)
committerJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 9 Aug 2018 02:43:09 +0000 (11:43 +0900)
do not use virtual backend.
send buffer from front end to client directly.
cannot commit while commiting.

Change-Id: Iae254500c19e428d3841d064a6fda9a94919f0a5
Signed-off-by: Junkyeong Kim <jk0430.kim@samsung.com>
src/tdm_backend.c
src/tdm_output.c
src/tdm_private.h
src/tdm_server.c

index 7d469d1..1a60673 100644 (file)
@@ -238,7 +238,7 @@ tdm_backend_register_output(tdm_display *dpy, tdm_output *output)
        BACKEND_FUNC_ENTRY();
 
        TDM_RETURN_VAL_IF_FAIL(TDM_MUTEX_IS_LOCKED(), TDM_ERROR_OPERATION_FAILED);
-       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_OPERATION_FAILED);
+       TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER);
 
        /* this function is only for backend. if backend calls this function, it means
         * that it's triggered by frontend. frontend should set current_module before calling
index 778dc6d..0185615 100644 (file)
@@ -1214,9 +1214,69 @@ tdm_output_remove_commit_handler(tdm_output *output, tdm_output_commit_handler f
        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;
@@ -1229,8 +1289,12 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl
 
        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!!");
@@ -1811,4 +1875,34 @@ tdm_output_set_disconnect(tdm_output *output)
 
        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 */
index fea8715..3cfd101 100644 (file)
@@ -269,7 +269,11 @@ tdm_output_set_connect(tdm_output *output);
 tdm_error
 tdm_output_set_disconnect(tdm_output *output);
 tdm_error
-tdm_output_send_buffer(tdm_output *output, tbm_surface_h tbm_surface);
+tdm_output_send_buffer(tdm_output *output, tbm_surface_h buffer);
+tdm_error
+tdm_output_commit_buffer(tdm_output *output);
+tdm_error
+tdm_output_commit_done(tdm_output *output, tbm_surface_h buffer);
 
 #ifdef __cplusplus
 }
index aa546e6..b4aede3 100644 (file)
@@ -814,7 +814,7 @@ _tdm_voutput_cb_commit_done(struct wl_client *client, struct wl_resource *resour
                // handle error
                return;
        }
-//     tdm_output_commit_done(voutput_info->output, voutput_info->attach_buffer->buffer);
+       tdm_output_commit_done(voutput_info->output, voutput_info->attach_buffer->buffer);
        voutput_info->committing = 0;
        voutput_info->attach_buffer = NULL;
 }