From 8128cadec763fe87289d47c25db088bb3955e1fe Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Thu, 27 Feb 2020 14:20:26 +0900 Subject: [PATCH 01/16] package version up to 2.10.6 Change-Id: Id32fcf09dc451d6d2c0bf82bba45ddcfa64ff87d Signed-off-by: Junkyeong Kim --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 44fe6a8..6409226 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.10.5 +Version: 2.10.6 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 95d4b2f5c0ff7736bf083740d28187996bc8a306 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Wed, 15 May 2019 17:40:48 +0900 Subject: [PATCH 02/16] layer: add the macro to check the HWC cap is enabled Change-Id: I8812530c7aed667baed03dc0a1e08ee169d9a418 --- src/tdm_layer.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 488f498..3737da1 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -71,6 +71,28 @@ private_output = private_layer->private_output; \ private_display = private_output->private_display +#define OUTPUT_HWC_CAP_CHECK() \ + if (private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC) { \ + TDM_ERR("output(%p) support HWC. Use HWC functions", private_output); \ + _pthread_mutex_unlock(&private_display->lock); \ + return TDM_ERROR_OPERATION_FAILED; \ + } + +#define OUTPUT_HWC_CAP_CHECK_ERROR() \ + if (private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC) { \ + TDM_ERR("output(%p) support HWC. Use HWC functions", private_output); \ + if (error) *error = TDM_ERROR_OPERATION_FAILED; \ + _pthread_mutex_unlock(&private_display->lock); \ + return NULL; \ + } + +#define OUTPUT_HWC_CAP_CHECK_VOID_RETURN() \ + if (private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_HWC) { \ + TDM_ERR("output(%p) support HWC. Use HWC functions", private_output); \ + _pthread_mutex_unlock(&private_display->lock); \ + return; \ + } + static void _tdm_layer_cb_wait_vblank(tdm_vblank *vblank, tdm_error error, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data); static void _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data); -- 2.7.4 From c376fe11f2465688b944aeb07da9a8ca7443dc14 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Wed, 15 May 2019 17:41:41 +0900 Subject: [PATCH 03/16] layer: check if the HWC cap is enabled The layer api MUST not be used when the HWC capability is enabled. When the HWC capability is set by tdm backends, it means that they does not support the layer objects. Change-Id: Ibf9210ea4abf8870e18caa23b5f0f5de2c24eb00 --- src/tdm_layer.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 3737da1..6e0c1bf 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -110,6 +110,8 @@ tdm_layer_get_output(tdm_layer *layer, tdm_error *error) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK_ERROR(); + if (error) *error = TDM_ERROR_NONE; @@ -129,6 +131,8 @@ tdm_layer_get_index(tdm_layer *layer, int *index) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *index = private_layer->index; _pthread_mutex_unlock(&private_display->lock); @@ -145,6 +149,8 @@ tdm_layer_get_capabilities(tdm_layer *layer, tdm_layer_capability *capabilities) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *capabilities = private_layer->caps.capabilities; _pthread_mutex_unlock(&private_display->lock); @@ -162,6 +168,8 @@ tdm_layer_get_available_formats(tdm_layer *layer, const tbm_format **formats, in _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *formats = (const tbm_format *)private_layer->caps.formats; *count = private_layer->caps.format_count; @@ -180,6 +188,8 @@ tdm_layer_get_available_properties(tdm_layer *layer, const tdm_prop **props, int _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *props = (const tdm_prop *)private_layer->caps.props; *count = private_layer->caps.prop_count; @@ -197,6 +207,8 @@ tdm_layer_get_zpos(tdm_layer *layer, int *zpos) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *zpos = private_layer->caps.zpos; _pthread_mutex_unlock(&private_display->lock); @@ -213,6 +225,8 @@ tdm_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + private_module = private_layer->private_module; func_layer = &private_module->func_layer; @@ -247,6 +261,8 @@ tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + private_module = private_layer->private_module; func_layer = &private_module->func_layer; @@ -317,6 +333,8 @@ tdm_layer_set_info(tdm_layer *layer, tdm_info_layer *info) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + ret = tdm_layer_set_info_internal(private_layer, info); _pthread_mutex_unlock(&private_display->lock); @@ -335,6 +353,8 @@ tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + private_module = private_layer->private_module; func_layer = &private_module->func_layer; @@ -562,6 +582,8 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + ret = tdm_layer_set_buffer_internal(private_layer, buffer); _pthread_mutex_unlock(&private_display->lock); @@ -606,6 +628,8 @@ tdm_layer_unset_buffer(tdm_layer *layer) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + ret = tdm_layer_unset_buffer_internal(private_layer); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); @@ -1088,6 +1112,8 @@ tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_dat _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + ret = tdm_layer_commit_internal(private_layer, func, user_data); _pthread_mutex_unlock(&private_display->lock); @@ -1104,6 +1130,8 @@ tdm_layer_is_committing(tdm_layer *layer, unsigned int *committing) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *committing = private_layer->committing; _pthread_mutex_unlock(&private_display->lock); @@ -1152,6 +1180,8 @@ tdm_layer_remove_commit_handler(tdm_layer *layer, tdm_layer_commit_handler func, _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + tdm_layer_remove_commit_handler_internal(layer, func, user_data); _pthread_mutex_unlock(&private_display->lock); @@ -1167,6 +1197,8 @@ tdm_layer_get_displaying_buffer(tdm_layer *layer, tdm_error *error) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK_ERROR(); + if (error) *error = TDM_ERROR_NONE; @@ -1259,6 +1291,8 @@ tdm_layer_set_buffer_queue(tdm_layer *layer, tbm_surface_queue_h buffer_queue) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + private_module = private_layer->private_module; func_layer = &private_module->func_layer; @@ -1316,6 +1350,8 @@ tdm_layer_is_usable(tdm_layer *layer, unsigned int *usable) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + *usable = private_layer->usable; _pthread_mutex_unlock(&private_display->lock); @@ -1332,6 +1368,8 @@ tdm_layer_set_video_pos(tdm_layer *layer, int zpos) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + private_module = private_layer->private_module; func_layer = &private_module->func_layer; @@ -1365,6 +1403,8 @@ tdm_layer_create_capture(tdm_layer *layer, tdm_error *error) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK_ERROR(); + capture = (tdm_capture *)tdm_capture_create_layer_internal(private_layer, error); _pthread_mutex_unlock(&private_display->lock); @@ -1382,6 +1422,8 @@ tdm_layer_get_buffer_flags(tdm_layer *layer, unsigned int *flags) _pthread_mutex_lock(&private_display->lock); + OUTPUT_HWC_CAP_CHECK(); + private_module = private_layer->private_module; func_layer = &private_module->func_layer; -- 2.7.4 From 969395f28c4305706c358d3e786378849a6ee2dc Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 17 Mar 2020 10:10:55 +0900 Subject: [PATCH 04/16] package version up to 2.10.7 Change-Id: If75489a74d769ead519c9be995c1b9ae80b8ca8f --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 6409226..6b38311 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.10.6 +Version: 2.10.7 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From fb9fd63510fd2aa32f39c2705e7cf2acf1e08734 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 13 May 2020 17:06:35 +0900 Subject: [PATCH 05/16] tdm_layer: do not include coverage checking tdm_layer related APIs if hwc mode enabled, tdm_layer APIs are disabled. so exclude layer relate APIs coverage checking because hwc mode is default on now. Change-Id: I50b3a80061ae00c2c538b70eda276e899c92bbfc Signed-off-by: Junkyeong Kim --- src/tdm_layer.c | 32 ++------------------------------ 1 file changed, 2 insertions(+), 30 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 6e0c1bf..b6f07f0 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -93,6 +93,7 @@ return; \ } +/* LCOV_EXCL_START */ static void _tdm_layer_cb_wait_vblank(tdm_vblank *vblank, tdm_error error, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec, void *user_data); static void _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data); @@ -236,11 +237,9 @@ tdm_layer_set_property(tdm_layer *layer, unsigned int id, tdm_value value) private_layer->usable = 0; if (!func_layer->layer_set_property) { - /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ } ret = func_layer->layer_set_property(private_layer->layer_backend, id, value); @@ -267,11 +266,9 @@ tdm_layer_get_property(tdm_layer *layer, unsigned int id, tdm_value *value) func_layer = &private_module->func_layer; if (!func_layer->layer_get_property) { - /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_SOP */ } ret = func_layer->layer_get_property(private_layer->layer_backend, id, value); @@ -297,10 +294,8 @@ tdm_layer_set_info_internal(tdm_private_layer *private_layer, tdm_info_layer *in private_layer->usable = 0; if (!func_layer->layer_set_info) { - /* LCOV_EXCL_START */ TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ } if (info->src_config.format) @@ -359,11 +354,9 @@ tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info) func_layer = &private_module->func_layer; if (!func_layer->layer_get_info) { - /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ } ret = func_layer->layer_get_info(private_layer->layer_backend, info); @@ -373,7 +366,6 @@ tdm_layer_get_info(tdm_layer *layer, tdm_info_layer *info) return ret; } -/* LCOV_EXCL_START */ static void _tdm_layer_dump_buffer(tdm_layer *layer, tbm_surface_h buffer) { @@ -407,7 +399,6 @@ _tdm_layer_dump_buffer(tdm_layer *layer, tbm_surface_h buffer) return; } -/* LCOV_EXCL_STOP */ void tdm_layer_free_buffer(tdm_private_layer *private_layer, tdm_private_layer_buffer *layer_buffer) @@ -509,7 +500,6 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu tdm_private_output *private_output = private_layer->private_output; tdm_func_layer *func_layer; - /* LCOV_EXCL_START */ /* dump buffer */ if (tdm_dump_enable && !(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO)) _tdm_layer_dump_buffer(private_layer, buffer); @@ -522,7 +512,6 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu private_output->index, private_layer->index, i++); tdm_helper_dump_buffer_str(buffer, tdm_debug_dump_dir, str); } - /* LCOV_EXCL_STOP */ private_module = private_layer->private_module; func_layer = &private_module->func_layer; @@ -533,10 +522,8 @@ tdm_layer_set_buffer_internal(tdm_private_layer *private_layer, tbm_surface_h bu private_layer->usable = 0; if (!func_layer->layer_set_buffer) { - /* LCOV_EXCL_START */ TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_START */ } private_layer->pending_buffer_changed = 1; @@ -609,10 +596,8 @@ tdm_layer_unset_buffer_internal(tdm_private_layer *private_layer) TDM_INFO("layer(%p,%d) now usable", private_layer, private_layer->index); if (!func_layer->layer_unset_buffer) { - /* LCOV_EXCL_START */ TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_START */ } ret = func_layer->layer_unset_buffer(private_layer->layer_backend); @@ -644,7 +629,6 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * tdm_private_output *private_output = private_layer->private_output; tdm_private_display *private_display = private_output->private_display; - /* LCOV_EXCL_START */ if (private_display->print_fps) { double curr = tdm_helper_get_time(); if (private_layer->fps_stamp == 0) { @@ -660,7 +644,6 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * private_layer->fps_stamp = 0; private_layer->fps_count = 0; } - /* LCOV_EXCL_STOP */ if (private_layer->showing_buffer) { if (tdm_ttrace_module & TDM_TTRACE_LAYER) { @@ -977,10 +960,8 @@ _tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_da layer_commit_handler = calloc(1, sizeof(tdm_private_layer_commit_handler)); if (!layer_commit_handler) { - /* LCOV_EXCL_START */ TDM_ERR("failed: alloc memory"); return TDM_ERROR_OUT_OF_MEMORY; - /* LCOV_EXCL_STOP */ } if (tdm_debug_module & TDM_DEBUG_COMMIT) @@ -1230,20 +1211,16 @@ _tbm_layer_queue_acquirable_cb(tbm_surface_queue_h surface_queue, void *data) func_layer = &private_module->func_layer; if (!func_layer->layer_set_buffer) { - /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); return; - /* LCOV_EXCL_STOP */ } if (TBM_SURFACE_QUEUE_ERROR_NONE != tbm_surface_queue_acquire(private_layer->buffer_queue, &buffer) || buffer == NULL) { - /* LCOV_EXCL_START */ TDM_ERR("layer(%p,%d) tbm_surface_queue_acquire() failed surface:%p", private_layer, private_layer->index, buffer); _pthread_mutex_unlock(&private_display->lock); return; - /* LCOV_EXCL_STOP */ } ret = tdm_layer_set_buffer_internal(private_layer, buffer); @@ -1302,11 +1279,9 @@ tdm_layer_set_buffer_queue(tdm_layer *layer, tbm_surface_queue_h buffer_queue) private_layer->usable = 0; if (!func_layer->layer_set_buffer) { - /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); TDM_ERR("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ } if (buffer_queue == private_layer->buffer_queue) { @@ -1380,11 +1355,9 @@ tdm_layer_set_video_pos(tdm_layer *layer, int zpos) } if (!func_layer->layer_set_video_pos) { - /* LCOV_EXCL_START */ _pthread_mutex_unlock(&private_display->lock); TDM_ERR("layer(%p,%d) not implemented!!", private_layer, private_layer->index); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ } ret = func_layer->layer_set_video_pos(private_layer->layer_backend, zpos); @@ -1428,12 +1401,10 @@ tdm_layer_get_buffer_flags(tdm_layer *layer, unsigned int *flags) func_layer = &private_module->func_layer; if (!func_layer->layer_get_buffer_flags) { - /* LCOV_EXCL_START */ *flags = 0; _pthread_mutex_unlock(&private_display->lock); TDM_INFO("not implemented!!"); return TDM_ERROR_NONE; - /* LCOV_EXCL_STOP */ } ret = func_layer->layer_get_buffer_flags(private_layer->layer_backend, flags); @@ -1442,3 +1413,4 @@ tdm_layer_get_buffer_flags(tdm_layer *layer, unsigned int *flags) return ret; } +/* LCOV_EXCL_STOP */ -- 2.7.4 From 6239de23b4c336233a55944ee00775cdedd8b8e8 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 15 May 2020 15:53:13 +0900 Subject: [PATCH 06/16] tdm_output: add tdm_output_get_dpms_changing API private_output->waiting_dpms_change flag is set when dpms set, and unset when dpms set done callback called from backend. this flag is used dpms_set_async function. Change-Id: I8da9ac0e900bafc7b8e55570251e51a735eb9f17 Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 16 ++++++++++++++++ src/tdm_private.h | 2 ++ 2 files changed, 18 insertions(+) diff --git a/src/tdm_output.c b/src/tdm_output.c index d6e1cc3..2786020 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1953,6 +1953,22 @@ tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value) return ret; } +INTERN tdm_error +tdm_output_get_dpms_changing(tdm_output *output, int *changing) +{ + tdm_private_output *private_output; + + TDM_RETURN_VAL_IF_FAIL(output != NULL, TDM_ERROR_INVALID_PARAMETER); + TDM_RETURN_VAL_IF_FAIL(changing != NULL, TDM_ERROR_INVALID_PARAMETER); + + private_output = (tdm_private_output*)output; + + *changing = private_output->waiting_dpms_change; + + return TDM_ERROR_NONE; +} + + EXTERN tdm_error tdm_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value) { diff --git a/src/tdm_private.h b/src/tdm_private.h index e8e3c08..6788ba1 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -130,6 +130,8 @@ tdm_error tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data); tdm_error tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value); +tdm_error +tdm_output_get_dpms_changing(tdm_output *output, int *changing); tdm_error tdm_output_choose_commit_per_vblank_mode(tdm_private_output *private_output, int mode); -- 2.7.4 From 09dfd820a68d7a373b1632f581b600fbab3985f6 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 15 May 2020 15:55:48 +0900 Subject: [PATCH 07/16] prevent vblank set while dpms set executing Change-Id: Icfbc5f0eb17db65809ef954e8afe55c84aa028d5 Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 14 ++++++++++++++ src/tdm_vblank.c | 9 ++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 2786020..13163e0 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1270,6 +1270,13 @@ tdm_output_wait_vblank(tdm_output *output, int interval, int sync, return TDM_ERROR_DPMS_OFF; } + if (private_output->waiting_dpms_change) { + TDM_WRN("output(%d) dpms is changing: %s", private_output->pipe, + tdm_dpms_str(private_output->current_dpms_value)); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_DPMS_OFF; + } + ret = _tdm_output_wait_vblank(private_output, interval, sync, func, user_data, 0); _pthread_mutex_unlock(&private_display->lock); @@ -1293,6 +1300,13 @@ tdm_output_wait_vblank_add_front(tdm_output *output, int interval, int sync, return TDM_ERROR_DPMS_OFF; } + if (private_output->waiting_dpms_change) { + TDM_WRN("output(%d) dpms is changing: %s", private_output->pipe, + tdm_dpms_str(private_output->current_dpms_value)); + _pthread_mutex_unlock(&private_display->lock); + return TDM_ERROR_DPMS_OFF; + } + ret = _tdm_output_wait_vblank(private_output, interval, sync, func, user_data, 1); _pthread_mutex_unlock(&private_display->lock); diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index fe72c64..fd3d08a 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -1509,6 +1509,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, tdm_vblank_wait_info *wait_info; tdm_output_dpms dpms = TDM_OUTPUT_DPMS_OFF; unsigned int fps; + int dpms_changing = 0; tdm_error ret; TDM_RETURN_VAL_IF_FAIL(tdm_vblank_is_valid(vblank), TDM_ERROR_INVALID_PARAMETER); @@ -1526,6 +1527,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, } tdm_output_get_dpms(private_vblank->output, &dpms); + tdm_output_get_dpms_changing(private_vblank->output, &dpms_changing); if (!private_vblank->enable_fake) { if (private_vblank->connection == TDM_OUTPUT_CONN_STATUS_DISCONNECTED) { @@ -1536,6 +1538,11 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, VER("can't wait a vblank: DPMS %s", tdm_dpms_str(dpms)); return TDM_ERROR_DPMS_OFF; } + + if (dpms_changing) { + VER("can't wait a vblank: DPMS is changing"); + return TDM_ERROR_DPMS_OFF; + } } wait_info = calloc(1, sizeof * wait_info); @@ -1587,7 +1594,7 @@ tdm_vblank_wait(tdm_vblank *vblank, unsigned int req_sec, unsigned int req_usec, */ if (private_vblank->vrefresh % fps) wait_info->type = VBLANK_TYPE_SW; - else if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms) || + else if (TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms) || dpms_changing || private_vblank->connection != TDM_OUTPUT_CONN_STATUS_MODE_SETTED) wait_info->type = VBLANK_TYPE_SW_FAKE; else if (private_vblank->offset == 0) -- 2.7.4 From 6f71ae683fb3726f994192ed38f2f5cc4de6a1aa Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Tue, 26 May 2020 19:04:43 +0900 Subject: [PATCH 08/16] haltest: check hwc enabled to set output mode if hwc enabled, must not use tdm_output_commit function. Change-Id: I3fedc1d35c8ef914e2939c40f72677fd4c86d39b Signed-off-by: Junkyeong Kim --- haltests/src/tc_tdm_client.cpp | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/haltests/src/tc_tdm_client.cpp b/haltests/src/tc_tdm_client.cpp index 5d41486..d107b20 100644 --- a/haltests/src/tc_tdm_client.cpp +++ b/haltests/src/tc_tdm_client.cpp @@ -289,9 +289,13 @@ _tc_tdm_server_set_output_dpms(tdm_display *dpy, int msg) static void _tc_tdm_test_server_cb_output_mode_change(tdm_output *output, unsigned int index, void *user_data) { + tdm_hwc *hwc = NULL; + tdm_region fb_damage; const tdm_output_mode *modes, *mode; int count = 0; + uint32_t num = 0; tdm_error ret; + tbm_surface_h buffer = NULL; ret = tdm_output_get_available_modes(output, &modes, &count); TDM_UT_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); @@ -305,8 +309,35 @@ _tc_tdm_test_server_cb_output_mode_change(tdm_output *output, unsigned int index ret = tdm_output_set_dpms(output, TDM_OUTPUT_DPMS_ON); TDM_UT_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); - ret = tdm_output_commit(output, 0, NULL, NULL); - TDM_UT_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); + if (tc_tdm_output_is_hwc_enable(output)) { + hwc = tdm_output_get_hwc(output, &ret); + TDM_UT_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); + + TDM_UT_RETURN_IF_FAIL(tc_tdm_buffer_create(mode->hdisplay, mode->vdisplay, TBM_FORMAT_ARGB8888, TBM_BO_SCANOUT, true, 1, &buffer) == true); + + memset(&fb_damage, 0, sizeof(fb_damage)); + ret = tdm_hwc_set_client_target_buffer(hwc, buffer, fb_damage); + TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed); + + ret = tdm_hwc_validate(hwc, NULL, 0, &num); + TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed); + + ret = tdm_hwc_accept_validation(hwc); + TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed); + + ret = tdm_hwc_commit(hwc, 0, NULL, NULL); + TDM_UT_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, failed); + + tbm_surface_internal_unref(buffer); + } else { + ret = tdm_output_commit(output, 0, NULL, NULL); + TDM_UT_RETURN_IF_FAIL(ret == TDM_ERROR_NONE); + } + + return; + +failed: + tbm_surface_internal_unref(buffer); } static void -- 2.7.4 From 5da6193b4e9c5bb2a5a307130912a0bfaf31b950 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 3 Jun 2020 19:13:12 +0900 Subject: [PATCH 09/16] tdm_output: do not include coverage checking tdm_output_commit function hwc mode is default enabled. if hwc mode enabled, tdm_output_commit is not supported. Change-Id: I0f3aba9e181a78a6a7f3698c0234700bb076e0d6 Signed-off-by: Junkyeong Kim --- src/tdm_output.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/tdm_output.c b/src/tdm_output.c index 13163e0..9dc60a9 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1529,6 +1529,7 @@ tdm_output_unset_voutput_commit(tdm_voutput *voutput) return TDM_ERROR_NONE; } +/* LCOV_EXCL_START */ INTERN tdm_error tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data) { @@ -1551,10 +1552,8 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl func_output = &private_module->func_output; if (!func_output->output_commit) { - /* LCOV_EXCL_START */ TDM_WRN("not implemented!!"); return TDM_ERROR_NOT_IMPLEMENTED; - /* LCOV_EXCL_STOP */ } ret = tdm_output_get_dpms_internal(output, &dpms_value); @@ -1569,10 +1568,8 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl 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 */ } if (private_module == private_display->virtual_module) { @@ -1654,7 +1651,6 @@ tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handl return ret; commit_failed: - /* LCOV_EXCL_START */ if (output_commit_handler) { tdm_thread_cb_remove(private_output, TDM_THREAD_CB_OUTPUT_COMMIT, output_commit_handler, _tdm_output_thread_cb_commit, NULL); LIST_DEL(&output_commit_handler->link); @@ -1662,7 +1658,6 @@ commit_failed: } return ret; - /* LCOV_EXCL_STOP */ } EXTERN tdm_error @@ -1710,6 +1705,7 @@ tdm_output_commit(tdm_output *output, int sync, tdm_output_commit_handler func, return ret; } +/* LCOV_EXCL_STOP */ EXTERN tdm_error tdm_output_set_mode(tdm_output *output, const tdm_output_mode *mode) -- 2.7.4 From 9562d70759870343e28c867a1bc40361ab2ea2a5 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Wed, 3 Jun 2020 19:27:29 +0900 Subject: [PATCH 10/16] tdm_helper: do not include coverage checking layer_info related code. hwc mode is default enabled. if hwc mode enabled, tdm_layer related code is not supported Change-Id: I5990e8f544e17533954478fb71a5109632d6fb2e Signed-off-by: Junkyeong Kim --- src/tdm_helper.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 696fc58..469f9b0 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -717,7 +717,7 @@ tdm_helper_capture_output(tdm_output *output, tbm_surface_h dst_buffer, TDM_RETURN_VAL_IF_FAIL(w >= 0, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(h >= 0, TDM_ERROR_INVALID_PARAMETER); TDM_RETURN_VAL_IF_FAIL(func != NULL, TDM_ERROR_INVALID_PARAMETER); - +/* LCOV_EXCL_START */ err = tdm_output_get_layer_count(output, &count); if (err != TDM_ERROR_NONE) { TDM_ERR("tdm_output_get_layer_count fail(%d)\n", err); @@ -745,6 +745,7 @@ tdm_helper_capture_output(tdm_output *output, tbm_surface_h dst_buffer, func(dst_buffer, data); return TDM_ERROR_NONE; +/* LCOV_EXCL_STOP */ } static char * @@ -868,6 +869,7 @@ _tdm_helper_get_backend_information(tdm_private_module *private_module, char *re continue; } +/* LCOV_EXCL_START */ LIST_FOR_EACH_ENTRY(private_layer, &private_output->layer_list, link) { if (!private_layer->usable) { tdm_info_layer info; @@ -955,6 +957,7 @@ _tdm_helper_get_backend_information(tdm_private_module *private_module, char *re } } } +/* LCOV_EXCL_STOP */ } } if (LIST_IS_EMPTY(&private_module->output_list)) -- 2.7.4 From 94b8c4919e3eb824582d492c2896985ac1095608 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 5 Jun 2020 10:35:06 +0900 Subject: [PATCH 11/16] haltest: add hwc property functions tc Change-Id: I99dbb20d9c669879d0c5c9d3c203cd2b13ade345 Signed-off-by: Junkyeong Kim --- haltests/src/tc_tdm_hwc.cpp | 203 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 202 insertions(+), 1 deletion(-) diff --git a/haltests/src/tc_tdm_hwc.cpp b/haltests/src/tc_tdm_hwc.cpp index b3618e9..8307bed 100644 --- a/haltests/src/tc_tdm_hwc.cpp +++ b/haltests/src/tc_tdm_hwc.cpp @@ -135,6 +135,100 @@ TEST_P(TDMHwc, GetSupportedFormatsSuccessful) } } + +/* tdm_hwc_get_video_available_properties() */ +TEST_P(TDMHwc, GetAvailableVideoPropertiesFailNull) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + const tdm_prop *props; + int count; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_get_video_available_properties(NULL, &props, &count); + ASSERT_NE(TDM_ERROR_NONE, error); + + error = tdm_hwc_get_video_available_properties(hwc, NULL, &count); + ASSERT_NE(TDM_ERROR_NONE, error); + + error = tdm_hwc_get_video_available_properties(hwc, &props, NULL); + ASSERT_NE(TDM_ERROR_NONE, error); + } else { + error = tdm_hwc_get_video_available_properties(hwc, &props, &count); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + +TEST_P(TDMHwc, GetAvailableVideoPropertiesSuccess) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + const tdm_prop *props; + int count; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_get_video_available_properties(hwc, &props, &count); + ASSERT_TRUE(TDM_ERROR_NONE == error || TDM_ERROR_NOT_IMPLEMENTED == error); + } else { + error = tdm_hwc_get_video_available_properties(hwc, &props, &count); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + +/* tdm_hwc_get_capabilities() */ +TEST_P(TDMHwc, GetAvailableCapabilitiesFailNull) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + tdm_hwc_capability hwc_caps; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_get_capabilities(NULL, &hwc_caps); + ASSERT_NE(TDM_ERROR_NONE, error); + + error = tdm_hwc_get_capabilities(hwc, NULL); + ASSERT_NE(TDM_ERROR_NONE, error); + } else { + error = tdm_hwc_get_capabilities(hwc, &hwc_caps); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + +TEST_P(TDMHwc, GetAvailableCapabilitiesSuccess) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + tdm_hwc_capability hwc_caps; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_get_capabilities(hwc, &hwc_caps); + ASSERT_TRUE(TDM_ERROR_NONE == error || TDM_ERROR_NOT_IMPLEMENTED == error); + } else { + error = tdm_hwc_get_capabilities(hwc, &hwc_caps); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + /* tdm_hwc_get_available_properties() */ TEST_P(TDMHwc, GetAvailablePropertiesFailNullWin) { @@ -518,6 +612,113 @@ TEST_P(TDMHwc, CommitSuccessful) } } +/* tdm_hwc_set_property() */ +TEST_P(TDMHwc, SetPropertyFailNull) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + tdm_value value; + + value.u32 = 0; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_set_property(NULL, 0, value); + ASSERT_EQ(TDM_ERROR_INVALID_PARAMETER, error); + } else { + error = tdm_hwc_set_property(hwc, 0, value); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + +TEST_P(TDMHwc, SetPropertySuccess) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + const tdm_prop *props; + int count; + tdm_value value; + + value.u32 = 0; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_get_available_properties(hwc, &props, &count); + ASSERT_TRUE(TDM_ERROR_NONE == error || TDM_ERROR_NOT_IMPLEMENTED == error); + + if (count == 0) { + error = tdm_hwc_set_property(hwc, 0, value); + ASSERT_TRUE(TDM_ERROR_NONE == error || TDM_ERROR_NOT_IMPLEMENTED == error); + } else { + error = tdm_hwc_set_property(hwc, props[0].id, value); + ASSERT_EQ(TDM_ERROR_NONE, error); + } + } else { + error = tdm_hwc_set_property(hwc, 0, value); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + +/* tdm_hwc_get_property() */ +TEST_P(TDMHwc, GetPropertyFailNull) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + tdm_value value; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + if (hwc) { + error = tdm_hwc_get_property(NULL, 0, &value); + ASSERT_EQ(TDM_ERROR_INVALID_PARAMETER, error); + } else { + error = tdm_hwc_get_property(hwc, 0, &value); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + +TEST_P(TDMHwc, GetPropertySuccess) +{ + TDM_UT_SKIP_FLAG(has_outputs); + + tdm_hwc *hwc = NULL; + tdm_error error = TDM_ERROR_NONE; + const tdm_prop *props; + int count; + tdm_value value; + + for (int o = 0; o < output_count; o++) { + hwc = tdm_output_get_hwc(outputs[o], &error); + + if (hwc) { + error = tdm_hwc_get_available_properties(hwc, &props, &count); + ASSERT_TRUE(TDM_ERROR_NONE == error || TDM_ERROR_NOT_IMPLEMENTED == error); + + if (count == 0) { + error = tdm_hwc_get_property(hwc, 0, &value); + ASSERT_TRUE(TDM_ERROR_NONE == error || TDM_ERROR_NOT_IMPLEMENTED == error); + } else { + error = tdm_hwc_get_property(hwc, props[0].id, &value); + ASSERT_EQ(TDM_ERROR_NONE, error); + } + } else { + error = tdm_hwc_get_property(hwc, 0, &value); + ASSERT_NE(TDM_ERROR_NONE, error); + } + } +} + #ifdef TDM_UT_TEST_WITH_PARAMS INSTANTIATE_TEST_CASE_P(TDMHwcParams, TDMHwc, @@ -528,4 +729,4 @@ INSTANTIATE_TEST_CASE_P(TDMHwcParams, Values(TDM_DEFAULT_MODULE)); #endif -/* LCOV_EXCL_END */ \ No newline at end of file +/* LCOV_EXCL_END */ -- 2.7.4 From 533e517314802c30ac8a404dc9531ad35998bfd6 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 5 Jun 2020 10:37:19 +0900 Subject: [PATCH 12/16] haltest: add pp preferred_align_vertical tc Change-Id: I1f8fd5980f036a21f0736d45c4679e111ebd977a Signed-off-by: Junkyeong Kim --- haltests/src/tc_tdm_backend_pp.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/haltests/src/tc_tdm_backend_pp.cpp b/haltests/src/tc_tdm_backend_pp.cpp index e1087bc..1dd8760 100644 --- a/haltests/src/tc_tdm_backend_pp.cpp +++ b/haltests/src/tc_tdm_backend_pp.cpp @@ -44,6 +44,7 @@ public: int max_w; int max_h; int preferred_align; + int preferred_align_vertical; tbm_surface_h srcbuf[3]; tbm_surface_h dstbuf[3]; @@ -118,6 +119,8 @@ void TDMBackendPP::SetUp(void) ASSERT_TRUE(max_w == -1 || max_w > 0); ASSERT_TRUE(max_h == -1 || max_h > 0); ASSERT_TRUE(preferred_align == -1 || preferred_align > 0); + ASSERT_EQ(tdm_display_get_pp_preferred_align_vertical(dpy, &preferred_align_vertical), TDM_ERROR_NONE); + ASSERT_TRUE(preferred_align_vertical == -1 || preferred_align_vertical > 0); for (int o = 0; o < output_count; o++) { if (!tc_tdm_output_is_connected(outputs[o])) @@ -166,6 +169,10 @@ bool TDMBackendPP::PrepareBuffers(int sw, int sh, tbm_format sf, int dw, int dh, sw = TDM_UT_SIZE_ALIGN(sw, preferred_align); dw = TDM_UT_SIZE_ALIGN(dw, preferred_align); + if (preferred_align_vertical > 0) { + sh = TDM_UT_SIZE_ALIGN(sh, preferred_align_vertical); + dh = TDM_UT_SIZE_ALIGN(dh, preferred_align_vertical); + } if (capabilities & TDM_PP_CAPABILITY_SCANOUT) src_flags = dst_flags |= TBM_BO_SCANOUT; @@ -437,6 +444,14 @@ TEST_P(TDMBackendPP, PPDispalyGetAvaiableSizeNullOther) } } +TEST_P(TDMBackendPP, PPDispalyGetPreferredAlignVerticalNullObject) +{ + if (tc_tdm_display_has_pp_capability(dpy)) { + ASSERT_EQ(PreparePP(), true); + ASSERT_EQ(tdm_display_get_pp_preferred_align_vertical(NULL, NULL), TDM_ERROR_INVALID_PARAMETER); + } +} + TEST_P(TDMBackendPP, PPDestroy) { TDM_UT_SKIP_FLAG(tc_tdm_display_has_pp_capability(dpy)); -- 2.7.4 From 724bd0eed716fe7374dae473f30b5e3bad08d431 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Fri, 5 Jun 2020 10:37:57 +0900 Subject: [PATCH 13/16] package version up to 2.10.8 Change-Id: I830fac6f4317c807548cea168a85921b32309622 Signed-off-by: Junkyeong Kim --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 6b38311..9dba25f 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -2,7 +2,7 @@ %define HALTESTS_GCOV 0 Name: libtdm -Version: 2.10.7 +Version: 2.10.8 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 644b312c33055b916e9726dfb8e8be8bb3bc231c Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 15 Jun 2020 19:30:21 +0900 Subject: [PATCH 14/16] tdm_hwc: add null check Change-Id: I7f1bd8a7412f8ca980232cdaff072f9a76c78103 Signed-off-by: Junkyeong Kim --- src/tdm_hwc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index 3131ebd..ea96cc8 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -212,6 +212,7 @@ _tdm_hwc_cb_wait_vblank(tdm_vblank *vblank, tdm_error error, unsigned int sequen return; TDM_RETURN_IF_FAIL(hwc_commit_handler != NULL); + TDM_RETURN_IF_FAIL(hwc_commit_handler->private_hwc != NULL); private_output = hwc_commit_handler->private_hwc->private_output; TDM_RETURN_IF_FAIL(private_output != NULL); -- 2.7.4 From efb743bd507754d6c6b97a168b3af7316e1bfcc8 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 15 Jun 2020 19:32:27 +0900 Subject: [PATCH 15/16] tdm_hwc: change use_vblank and layer_waiting_vblank flag setting position Change-Id: I4a6c3804c87612d40e72a69860bb53f54df259cc Signed-off-by: Junkyeong Kim --- src/tdm_hwc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index ea96cc8..31394a5 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -250,17 +250,19 @@ _tdm_hwc_vblank(tdm_private_hwc *private_hwc, tdm_private_hwc_commit_handler *hw if (ret != TDM_ERROR_NONE) goto done; + hwc_commit_handler->use_vblank = 1; + private_output->layer_waiting_vblank = 1; + /* tdm_vblank APIs is for server. it should be called in unlock status*/ _pthread_mutex_unlock(&private_display->lock); ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_hwc_cb_wait_vblank, hwc_commit_handler); _pthread_mutex_lock(&private_display->lock); if (ret != TDM_ERROR_NONE) { - if (!TDM_OUTPUT_DPMS_VSYNC_IS_OFF(private_output->current_dpms_value)) - goto done; + if (!TDM_OUTPUT_DPMS_VSYNC_IS_OFF(private_output->current_dpms_value)) { + hwc_commit_handler->use_vblank = 0; + private_output->layer_waiting_vblank = 0; + } } - - hwc_commit_handler->use_vblank = 1; - private_output->layer_waiting_vblank = 1; } done: -- 2.7.4 From 3c8572680a3f6a87a634001546bc0b391a1443f9 Mon Sep 17 00:00:00 2001 From: Junkyeong Kim Date: Mon, 15 Jun 2020 19:34:27 +0900 Subject: [PATCH 16/16] tdm_hwc: check hwc_commit_handler's validation before list deleting. Change-Id: Id5c37bc169b0fb982ba1261823333cf8c7587933 Signed-off-by: Junkyeong Kim --- src/tdm_hwc.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/tdm_hwc.c b/src/tdm_hwc.c index 31394a5..5f43860 100644 --- a/src/tdm_hwc.c +++ b/src/tdm_hwc.c @@ -86,6 +86,22 @@ _tdm_hwc_find_private_hwc_window(tdm_private_hwc *private_hwc, tdm_hwc_window *h return NULL; } +static tdm_error +_tdm_hwc_check_hwc_commit_handler_validation(tdm_private_hwc *private_hwc, tdm_private_hwc_commit_handler *hwc_commit_handler) +{ + tdm_private_hwc_commit_handler *commit_handler = NULL; + + if (LIST_IS_EMPTY(&private_hwc->hwc_commit_handler_list)) + return TDM_ERROR_INVALID_PARAMETER; + + LIST_FOR_EACH_ENTRY(commit_handler, &private_hwc->hwc_commit_handler_list, link) { + if (commit_handler == hwc_commit_handler) + return TDM_ERROR_NONE; + } + + return TDM_ERROR_INVALID_PARAMETER; +} + static void _tdm_hwc_thread_cb_commit(tdm_private_display *private_display, void *object, tdm_thread_cb_base *cb_base, void *user_data) @@ -104,6 +120,8 @@ _tdm_hwc_thread_cb_commit(tdm_private_display *private_display, void *object, tdm_thread_cb_remove(private_hwc, TDM_THREAD_CB_HWC_COMMIT, hwc_commit_handler, _tdm_hwc_thread_cb_commit, NULL); + TDM_RETURN_IF_FAIL(_tdm_hwc_check_hwc_commit_handler_validation(private_hwc, hwc_commit_handler) == TDM_ERROR_NONE) + LIST_DEL(&hwc_commit_handler->link); if (tdm_debug_module & TDM_DEBUG_COMMIT) { -- 2.7.4