From 729ebaadb2cf64309af3064245486f7f5dfeba8b Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 16 Aug 2018 18:10:31 +0900 Subject: [PATCH] virtual: send voutput commit buffer to client cannot commit while commiting (after receive commit_done, can send next buffer) Change-Id: I522deef02429910b96ccf18e7a200fb79591e6bb Signed-off-by: Junkyeong Kim --- src/tdm_display.c | 15 ++++++++++++++- src/tdm_layer.c | 2 ++ src/tdm_output.c | 10 ++++++++-- src/tdm_private_types.h | 6 ++++++ 4 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/tdm_display.c b/src/tdm_display.c index 3373f88..9398a08 100644 --- a/src/tdm_display.c +++ b/src/tdm_display.c @@ -362,10 +362,12 @@ tdm_display_call_thread_cb_output_create(tdm_private_display *private_display, t tdm_thread_cb_display_output_create output_create; tdm_error ret; + if (LIST_IS_EMPTY(&private_display->output_create_handler_list)) return TDM_ERROR_NONE; + memset(&output_create, 0, sizeof output_create); output_create.base.type = TDM_THREAD_CB_DISPLAY_OUTPUT_CREATE; output_create.base.length = sizeof output_create; - output_create.base.object_stamp = 0; + output_create.base.object_stamp = tdm_helper_get_time(); output_create.base.data = NULL; output_create.base.sync = 1; output_create.output = output; @@ -810,6 +812,15 @@ tdm_display_find_output(tdm_display *dpy, const char *name, tdm_error *error) } } + if (private_display->virtual_module) { + private_module = private_display->virtual_module; + LIST_FOR_EACH_ENTRY(private_output, &private_module->output_list, link) { + if (strncmp(private_output->name, name, TDM_NAME_LEN)) + continue; + _pthread_mutex_unlock(&private_display->lock); + return private_output; + } + } _pthread_mutex_unlock(&private_display->lock); return NULL; @@ -855,6 +866,8 @@ tdm_display_create_output(tdm_display *dpy, const char *name, tdm_error *error) TDM_RETURN_VAL_IF_FAIL_WITH_ERROR(output != NULL, ret, NULL); if (output_find != 1) private_output = NULL; + else + strncpy(private_output->name, name, TDM_NAME_LEN); return private_output; } diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 429f885..ea70afa 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -949,6 +949,8 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da else private_layer->committing = 1; + private_layer->commiting_buffer = layer_commit_handler->committed_buffer->buffer; + if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p,%d) waiting_buffer(%p) committed_buffer(%p)", private_layer, private_layer->index, private_layer->waiting_buffer, diff --git a/src/tdm_output.c b/src/tdm_output.c index 0185615..66ad21b 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1220,12 +1220,14 @@ _tdm_output_commit_virtual(tdm_output *output, int sync, tdm_output_commit_handl tdm_private_output *private_output; tdm_private_output_commit_handler *output_commit_handler = NULL; tdm_private_layer *private_layer = NULL; + tdm_private_display *private_display; 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; + private_display = private_output->private_display; if (!LIST_IS_EMPTY(&private_output->output_commit_handler_list)) { /* support only 1 commit */ @@ -1252,14 +1254,16 @@ _tdm_output_commit_virtual(tdm_output *output, int sync, tdm_output_commit_handl 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; + buffer = private_layer->commiting_buffer; + TDM_GOTO_IF_FAIL(buffer != NULL, commit_failed); + _pthread_mutex_unlock(&private_display->lock); 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); + _pthread_mutex_lock(&private_display->lock); return ret; @@ -1890,6 +1894,8 @@ tdm_output_commit_done(tdm_output *output, tbm_surface_h buffer) if (private_layer) break; } + private_layer->commiting_buffer = NULL; + LIST_FOR_EACH_ENTRY(output_commit_handler, &private_output->output_commit_handler_list, link) { if (output_commit_handler) break; } diff --git a/src/tdm_private_types.h b/src/tdm_private_types.h index d74f4f2..743367b 100644 --- a/src/tdm_private_types.h +++ b/src/tdm_private_types.h @@ -233,6 +233,9 @@ struct _tdm_private_output { /* hwc */ int need_set_target_info; tdm_private_hwc *private_hwc; + + /* virtual */ + char name[TDM_NAME_LEN]; }; struct _tdm_private_layer { @@ -270,6 +273,9 @@ struct _tdm_private_layer { double fps_stamp; unsigned int fps_count; + + /* virtual */ + tbm_surface_h commiting_buffer; }; struct _tdm_private_hwc { -- 2.7.4