From 08ac90dfd139c9760e878736095d4e8db4cce1aa Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 25 Jul 2017 18:58:56 +0900 Subject: [PATCH 01/16] correct the wrong condition Change-Id: Ie7a60db49527b1f1e71067d10eda4327d0492603 --- src/tdm_layer.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index abf2a91..e751f54 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -712,7 +712,7 @@ _tdm_layer_commit_possible(tdm_private_layer *private_layer) tdm_private_output *private_output = private_layer->private_output; tdm_private_display *private_display = private_output->private_display; - TDM_RETURN_VAL_IF_FAIL(!(private_display->commit_per_vblank > 0), 1); + TDM_RETURN_VAL_IF_FAIL(private_display->commit_per_vblank > 0, 1); /* There is a previous commit request which is not done and displayed on screen yet. * We can't commit at this time. @@ -729,7 +729,8 @@ _tdm_layer_commit_possible(tdm_private_layer *private_layer) return 0; } - TDM_INFO("layer(%p) commit: possible", private_layer); + if (tdm_debug_module & TDM_DEBUG_COMMIT) + TDM_INFO("layer(%p) commit: possible", private_layer); return 1; } -- 2.7.4 From 6abc037265160665b1a54f67e79c019acda1b77f Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 25 Jul 2017 19:05:18 +0900 Subject: [PATCH 02/16] deinit the event loop after all resources are destroyed. The event loop should be deinited after all event sources are removed. The event sources can be removed in _tdm_display_destroy_private_display and _tdm_display_unload_module function. So we make the tdm thread join to the main thread and remove all resources. And finally we deinit the event loop. Change-Id: I32f3b5429b40b0711ef50215d05e0eda1c8b1814 --- src/tdm.c | 8 +++++--- src/tdm_event_loop.c | 14 ++++++++++++-- src/tdm_private.h | 2 ++ 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/tdm.c b/src/tdm.c index 9baace2..7723018 100644 --- a/src/tdm.c +++ b/src/tdm.c @@ -1006,6 +1006,7 @@ tdm_display_init(tdm_error *error) failed_update: _tdm_display_unload_module(private_display); failed_load: + tdm_event_loop_stop(private_display); tdm_event_loop_deinit(private_display); failed_event: _pthread_mutex_unlock(&private_display->lock); @@ -1040,11 +1041,12 @@ tdm_display_deinit(tdm_display *dpy) * things because it's finalized. */ _pthread_mutex_lock(&private_display->lock); - tdm_event_loop_deinit(private_display); - _pthread_mutex_unlock(&private_display->lock); - + tdm_event_loop_stop(private_display); _tdm_display_destroy_private_display(private_display); _tdm_display_unload_module(private_display); + _pthread_mutex_unlock(&private_display->lock); + + tdm_event_loop_deinit(private_display); #ifdef INIT_BUFMGR if (private_display->bufmgr) diff --git a/src/tdm_event_loop.c b/src/tdm_event_loop.c index c947243..1c88685 100644 --- a/src/tdm_event_loop.c +++ b/src/tdm_event_loop.c @@ -147,8 +147,9 @@ tdm_event_loop_deinit(tdm_private_display *private_display) if (!private_display->private_loop) return; - /* after tdm_thread_deinit, we don't worry about thread things because it's finalized */ - tdm_thread_deinit(private_display->private_loop); + if (tdm_thread_is_running()) + TDM_ERR("thread is still running. tdm_event_loop_stop SHOULD be called"); + tdm_server_deinit(private_display->private_loop); if (private_display->private_loop->backend_source) @@ -162,6 +163,15 @@ tdm_event_loop_deinit(tdm_private_display *private_display) } INTERN void +tdm_event_loop_stop(tdm_private_display *private_display) +{ + TDM_RETURN_IF_FAIL(TDM_MUTEX_IS_LOCKED()); + + /* after tdm_thread_deinit, we don't worry about thread things because it's finalized */ + tdm_thread_deinit(private_display->private_loop); +} + +INTERN void tdm_event_loop_create_backend_source(tdm_private_display *private_display) { tdm_private_loop *private_loop = private_display->private_loop; diff --git a/src/tdm_private.h b/src/tdm_private.h index 12ac385..cecf66d 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -494,6 +494,8 @@ tdm_event_loop_init(tdm_private_display *private_display); void tdm_event_loop_deinit(tdm_private_display *private_display); void +tdm_event_loop_stop(tdm_private_display *private_display); +void tdm_event_loop_create_backend_source(tdm_private_display *private_display); int tdm_event_loop_get_fd(tdm_private_display *private_display); -- 2.7.4 From 99800526d224cd5d8ae872a9047d9c648df41400 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 28 Jul 2017 10:59:31 +0900 Subject: [PATCH 03/16] package version up to 1.7.4 Change-Id: I30ad6821660e110bf9b51dc80352a6e3092cfb98 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index a0dfb3a..5862dcf 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.7.3 +Version: 1.7.4 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 64548b108119a23117924598442f621a04675369 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 7 Aug 2017 16:53:34 +0900 Subject: [PATCH 04/16] fix memory leak Change-Id: I3e259c314d069bc76884b96dba2b08d975060716 --- src/tdm_capture.c | 2 ++ src/tdm_pp.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 4772332..2bd1986 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -578,6 +578,8 @@ tdm_capture_commit(tdm_capture *capture) tdm_buffer_unref_backend(b->buffer); _pthread_mutex_lock(&private_display->lock); LIST_DEL(&b->link); + + free(b); } } diff --git a/src/tdm_pp.c b/src/tdm_pp.c index 02de669..52ef19b 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -496,6 +496,8 @@ tdm_pp_commit(tdm_pp *pp) tdm_buffer_unref_backend(b->dst); _pthread_mutex_lock(&private_display->lock); LIST_DEL(&b->link); + + free(b); } } -- 2.7.4 From 6aac53b7e9506ce76a53e2f5e8852f09b90b4c5d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 7 Aug 2017 16:57:16 +0900 Subject: [PATCH 05/16] remove buffers from commit_buffer_list when commit failed. When pp, commit is the sync operation, cb_done() will be called at the line of commit(). In this case, buffers will be freed in cb_done() before LIST_FOR_EACH_ENTRY_SAFE(b, bb, &commit_buffer_list, commit_link) line done. So commit_link should be deleted when freed. When commit() successed, commit_link will be deleted twice. So we need to use LIST_DELINIT instead of LIST_DEL Change-Id: I6a09878e1eae49d31eb3f3626e005a3ae10841d8 --- src/tdm_capture.c | 3 ++- src/tdm_pp.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/tdm_capture.c b/src/tdm_capture.c index 2bd1986..6be39eb 100644 --- a/src/tdm_capture.c +++ b/src/tdm_capture.c @@ -149,6 +149,7 @@ tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, if ((capture_buffer = _tdm_capture_find_tbm_buffer(&private_capture->buffer_list, buffer))) { LIST_DEL(&capture_buffer->link); + LIST_DELINIT(&capture_buffer->commit_link); _pthread_mutex_unlock(&private_display->lock); if (private_capture->done_func) @@ -561,7 +562,7 @@ tdm_capture_commit(tdm_capture *capture) TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &commit_buffer_list, commit_link) { - LIST_DEL(&b->commit_link); + LIST_DELINIT(&b->commit_link); if (!_tdm_capture_find_buffer(&private_capture->buffer_list, b)) continue; diff --git a/src/tdm_pp.c b/src/tdm_pp.c index 52ef19b..ab95105 100644 --- a/src/tdm_pp.c +++ b/src/tdm_pp.c @@ -150,6 +150,7 @@ tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, 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); _pthread_mutex_unlock(&private_display->lock); if (private_pp->done_func) @@ -477,7 +478,7 @@ tdm_pp_commit(tdm_pp *pp) TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); LIST_FOR_EACH_ENTRY_SAFE(b, bb, &commit_buffer_list, commit_link) { - LIST_DEL(&b->commit_link); + LIST_DELINIT(&b->commit_link); if (!_tdm_pp_find_buffer(&private_pp->buffer_list, b)) continue; -- 2.7.4 From ac1f0059fbb5b8acb87137e06530601b08985a1f Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 7 Aug 2017 15:27:41 +0900 Subject: [PATCH 06/16] adapt ASLR for tdm-monitor and tools Change-Id: I14544a6fa5f4a9d4ded753ec12f031a7e09309ef --- client/Makefile.am | 5 ++++- tools/Makefile.am | 10 ++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/client/Makefile.am b/client/Makefile.am index becccc6..af2503f 100644 --- a/client/Makefile.am +++ b/client/Makefile.am @@ -36,9 +36,12 @@ bin_PROGRAMS = \ tdm_monitor_SOURCES = \ $(top_srcdir)/protocol/tdm-protocol.c \ tdm_monitor.c -tdm_monitor_LDFLAGS = ${LDFLAGS} +tdm_monitor_LDFLAGS = \ + -pie \ + ${LDFLAGS} tdm_monitor_LDADD = $(TDM_CLIENT_LIBS) ../common/libtdm-common.la tdm_monitor_CFLAGS = \ + -fPIE \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ -I$(top_srcdir)/protocol \ diff --git a/tools/Makefile.am b/tools/Makefile.am index 2057e4a..d19e5e6 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -6,8 +6,11 @@ bin_PROGRAMS = \ tdm_test_server_SOURCES = \ buffers.c \ tdm_test_server.c -tdm_test_server_LDFLAGS = ${LDFLAGS} +tdm_test_server_LDFLAGS = \ + -pie \ + ${LDFLAGS} tdm_test_server_CFLAGS = \ + -fPIE \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ -I$(top_srcdir)/src @@ -18,8 +21,11 @@ tdm_test_server_LDADD = \ #tdm-test-cliet tdm_test_client_SOURCES = \ tdm_test_client.c -tdm_test_client_LDFLAGS = ${LDFLAGS} +tdm_test_client_LDFLAGS = \ + -pie \ + ${LDFLAGS} tdm_test_client_CFLAGS = \ + -fPIE \ $(TDM_CFLAGS) \ -I$(top_srcdir)/include \ -I$(top_srcdir)/client \ -- 2.7.4 From ef47b57f107531c8db9d259da688655bed167df1 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Mon, 7 Aug 2017 19:30:08 +0900 Subject: [PATCH 07/16] package version up to 1.7.5 Change-Id: Id40ac9c7d9193125051433a0603f0abbf3a01871 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 5862dcf..574bf0c 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.7.4 +Version: 1.7.5 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From ed1b259294d55a8f9876695482e403aca9665149 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 16 Aug 2017 14:04:00 +0900 Subject: [PATCH 08/16] client: enhance vblank logs Change-Id: I6b12bc6aa56a1d4cdd2c319d7172dc46945fbd20 --- client/tdm_client.c | 47 +++++++++++++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/client/tdm_client.c b/client/tdm_client.c index 4d8ba30..1604ca7 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -94,6 +94,8 @@ struct _tdm_private_client_vblank { unsigned int started; + double last_time; + struct list_head link; }; @@ -113,8 +115,7 @@ typedef struct _tdm_client_wait_info { void *user_data; unsigned int req_id; - unsigned int req_sec; - unsigned int req_usec; + double req_time; int need_free; struct list_head link; @@ -130,12 +131,20 @@ _tdm_client_vblank_cb_done(void *data, struct wl_tdm_vblank *wl_tdm_vblank, TDM_RETURN_IF_FAIL(private_vblank != NULL); + private_vblank->last_time = TDM_TIME(tv_sec, tv_usec); + + TDM_DBG("vblank(%p) req_id(%u) sequence(%u) time(%.6f)", + private_vblank, req_id, sequence, TDM_TIME(tv_sec, tv_usec)); + TDM_TRACE_COUNT(ClientDoneVBlank, req_id); LIST_FOR_EACH_ENTRY_SAFE(w, ww, &private_vblank->wait_list, link) { if (w->req_id != req_id) continue; + if (w->req_time >= private_vblank->last_time) + TDM_ERR("'req(%.6f) < last(%.6f)' failed", w->req_time, private_vblank->last_time); + if (w->func) w->func(private_vblank, error, sequence, tv_sec, tv_usec, w->user_data); @@ -751,6 +760,7 @@ tdm_client_vblank_wait(tdm_client_vblank *vblank, unsigned int interval, tdm_cli tdm_private_client_vblank *private_vblank; tdm_client_wait_info *w; struct timespec tp; + unsigned int req_sec, req_usec; int ret = 0; TDM_RETURN_VAL_IF_FAIL(vblank != NULL, TDM_ERROR_INVALID_PARAMETER); @@ -786,15 +796,23 @@ tdm_client_vblank_wait(tdm_client_vblank *vblank, unsigned int interval, tdm_cli LIST_ADDTAIL(&w->link, &private_vblank->wait_list); clock_gettime(CLOCK_MONOTONIC, &tp); + req_sec = (unsigned int)tp.tv_sec; + req_usec = (unsigned int)(tp.tv_nsec / 1000); + w->req_id = ++private_output->req_id; - w->req_sec = (unsigned int)tp.tv_sec; - w->req_usec = (unsigned int)(tp.tv_nsec / 1000); + w->req_time = TDM_TIME(req_sec, req_usec); w->need_free = (private_vblank->sync) ? 0 : 1; - wl_tdm_vblank_wait_vblank(private_vblank->vblank, interval, w->req_id, w->req_sec, w->req_usec); + wl_tdm_vblank_wait_vblank(private_vblank->vblank, interval, w->req_id, req_sec, req_usec); TDM_TRACE_COUNT(ClientWaitVBlank, w->req_id); + TDM_DBG("vblank(%p) interval(%u) req_id(%d) req(%.6f)", + vblank, interval, w->req_id, TDM_TIME(req_sec, req_usec)); + + if (private_vblank->last_time >= w->req_time) + TDM_ERR("'last(%.6f) < req(%.6f)' failed", private_vblank->last_time, w->req_time); + if (!private_vblank->sync) { wl_display_flush(private_client->display); return TDM_ERROR_NONE; @@ -806,7 +824,7 @@ tdm_client_vblank_wait(tdm_client_vblank *vblank, unsigned int interval, tdm_cli clock_gettime(CLOCK_MONOTONIC, &tp); TDM_DBG("block during %d us", ((unsigned int)(tp.tv_sec * 1000000) + (unsigned int)(tp.tv_nsec / 1000)) - - (w->req_sec * 1000000 + w->req_usec)); + - (req_sec * 1000000 + req_usec)); LIST_DEL(&w->link); free(w); @@ -823,6 +841,7 @@ tdm_client_vblank_wait_seq(tdm_client_vblank *vblank, unsigned int sequence, tdm_private_client_vblank *private_vblank; tdm_client_wait_info *w; struct timespec tp; + unsigned int req_sec, req_usec; int ret = 0; TDM_RETURN_VAL_IF_FAIL(vblank != NULL, TDM_ERROR_INVALID_PARAMETER); @@ -853,15 +872,23 @@ tdm_client_vblank_wait_seq(tdm_client_vblank *vblank, unsigned int sequence, LIST_ADDTAIL(&w->link, &private_vblank->wait_list); clock_gettime(CLOCK_MONOTONIC, &tp); + req_sec = (unsigned int)tp.tv_sec; + req_usec = (unsigned int)(tp.tv_nsec / 1000); + w->req_id = ++private_output->req_id; - w->req_sec = (unsigned int)tp.tv_sec; - w->req_usec = (unsigned int)(tp.tv_nsec / 1000); + w->req_time = TDM_TIME(req_sec, req_usec); w->need_free = (private_vblank->sync) ? 0 : 1; - wl_tdm_vblank_wait_vblank_seq(private_vblank->vblank, sequence, w->req_id, w->req_sec, w->req_usec); + wl_tdm_vblank_wait_vblank_seq(private_vblank->vblank, sequence, w->req_id, req_sec, req_usec); TDM_TRACE_COUNT(ClientWaitVBlank, w->req_id); + TDM_DBG("vblank(%p) sequence(%u) req_id(%d) req(%.6f)", + vblank, sequence, w->req_id, TDM_TIME(req_sec, req_usec)); + + if (private_vblank->last_time >= w->req_time) + TDM_ERR("'last(%.6f) < req(%.6f)' failed", private_vblank->last_time, w->req_time); + if (!private_vblank->sync) { wl_display_flush(private_client->display); return TDM_ERROR_NONE; @@ -873,7 +900,7 @@ tdm_client_vblank_wait_seq(tdm_client_vblank *vblank, unsigned int sequence, clock_gettime(CLOCK_MONOTONIC, &tp); TDM_DBG("block during %d us", ((unsigned int)(tp.tv_sec * 1000000) + (unsigned int)(tp.tv_nsec / 1000)) - - (w->req_sec * 1000000 + w->req_usec)); + - (req_sec * 1000000 + req_usec)); LIST_DEL(&w->link); free(w); -- 2.7.4 From 37d61fb89d1ac9c1a8a7081a7dd9883c6c221eaa Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 16 Aug 2017 14:06:44 +0900 Subject: [PATCH 09/16] vblank: correct the client request time The client request time SHOULD be bigger than the last vblank time. To make sure it, we forcely set the last vblank time to the client request time when the req_time is smaller than the last_time. Change-Id: Ib1dbec907fa04693d6df05b8260e300f6032563e --- src/tdm_vblank.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/tdm_vblank.c b/src/tdm_vblank.c index 88a5084..0cff134 100644 --- a/src/tdm_vblank.c +++ b/src/tdm_vblank.c @@ -818,6 +818,10 @@ _tdm_vblank_wait_HW(tdm_vblank_wait_info *wait_info) last = private_vblank->last_time; req = wait_info->req_time; + /* make sure that req time is bigger than last. */ + if (req < last) + req = last; + skip = (unsigned int)((req - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN); prev = last + private_vblank->vblank_gap * skip; @@ -965,6 +969,10 @@ _tdm_vblank_wait_SW(tdm_vblank_wait_info *wait_info) last = private_vblank->last_time; req = wait_info->req_time; + /* make sure that req time is bigger than last. */ + if (req < last) + req = last; + skip = (unsigned int)((req - last) / private_vblank->vblank_gap + TDM_TIME_MARGIN); prev = last + private_vblank->vblank_gap * skip; -- 2.7.4 From aab186afb9fd1c1b41fce0793c852e7db07e099f Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 16 Aug 2017 14:23:05 +0900 Subject: [PATCH 10/16] client: change log level Change-Id: I7e3cdf1e0104cc556da6b0407d1dc403c36f75e5 --- client/tdm_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/tdm_client.c b/client/tdm_client.c index 1604ca7..858e4f5 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -143,7 +143,7 @@ _tdm_client_vblank_cb_done(void *data, struct wl_tdm_vblank *wl_tdm_vblank, continue; if (w->req_time >= private_vblank->last_time) - TDM_ERR("'req(%.6f) < last(%.6f)' failed", w->req_time, private_vblank->last_time); + TDM_WRN("'req(%.6f) < last(%.6f)' failed", w->req_time, private_vblank->last_time); if (w->func) w->func(private_vblank, error, sequence, tv_sec, tv_usec, w->user_data); -- 2.7.4 From b65dd59a429bac51cbb52037988f20a5c66aac62 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 16 Aug 2017 14:23:43 +0900 Subject: [PATCH 11/16] package version up to 1.7.6 Change-Id: I8598c7f16df9c651f79f53aabf6bc7009e691b21 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 574bf0c..1003c6a 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.7.5 +Version: 1.7.6 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4 From 6d033cebc3f8455d76431c608cfc5c00cc2ac358 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Sat, 19 Aug 2017 16:41:33 +0900 Subject: [PATCH 12/16] layer: dump layer buffers when showing Change-Id: I157ff0b26fdbbb71cea08d5c65a99691dffbbae2 --- src/tdm_layer.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index e751f54..1488e28 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -281,13 +281,23 @@ _tdm_layer_dump_buffer(tdm_layer *layer, tbm_surface_h buffer) tdm_private_layer *private_layer = (tdm_private_layer*)layer; tdm_private_output *private_output = private_layer->private_output; unsigned int pipe; - int zpos; - char fname[PATH_MAX]; + char fname[PATH_MAX], bufs[PATH_MAX]; + int zpos, len = PATH_MAX; + tdm_private_layer *l = NULL; + char *p = bufs; + int *remain = &len; pipe = private_output->pipe; zpos = private_layer->caps.zpos; - snprintf(fname, sizeof(fname), "tdm_%d_lyr_%d", pipe, zpos); + bufs[0] = '\0'; + LIST_FOR_EACH_ENTRY(l, &private_output->layer_list, link) { + if (!l->showing_buffer) + continue; + TDM_SNPRINTF(p, remain, "_%p", l->showing_buffer->buffer); + } + + snprintf(fname, sizeof(fname), "tdm_%d_lyr_%d%s", pipe, zpos, bufs); tbm_surface_internal_dump_buffer(buffer, fname); TDM_DBG("%s dump excute", fname); @@ -431,10 +441,6 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) ret = func_layer->layer_set_buffer(private_layer->layer_backend, buffer); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); - /* dump buffer */ - if (tdm_dump_enable && !(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO)) - _tdm_layer_dump_buffer(layer, buffer); - if (ret == TDM_ERROR_NONE) { if (private_layer->waiting_buffer) _tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer); @@ -510,6 +516,10 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * private_layer->showing_buffer = *committed_buffer; *committed_buffer = NULL; + /* dump buffer */ + if (tdm_dump_enable && !(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO) && private_layer->showing_buffer) + _tdm_layer_dump_buffer(private_layer, private_layer->showing_buffer->buffer); + if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p) committed_buffer(%p) showing_buffer(%p)", private_layer, *committed_buffer, -- 2.7.4 From c15f22ca21d310185c6a4f4b3fc4b55c8389d773 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 22 Aug 2017 13:23:35 +0900 Subject: [PATCH 13/16] correct wrong description Change-Id: I2b5110d70a8ae81ac805d557c0b6715256947cbc --- include/tdm_helper.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index ef0a657..176279b 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -81,12 +81,6 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file); * This function supports only if a buffer has below formats. * - TBM_FORMAT_ARGB8888 * - TBM_FORMAT_XRGB8888 - * - TBM_FORMAT_YVU420 - * - TBM_FORMAT_YUV420 - * - TBM_FORMAT_NV12 - * - TBM_FORMAT_NV21 - * - TBM_FORMAT_YUYV - * - TBM_FORMAT_UYVY * @param[in] buffer A TDM buffer */ void -- 2.7.4 From 224add70bc00208471268a44ff1a49a0ad9daaec Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 22 Aug 2017 13:24:19 +0900 Subject: [PATCH 14/16] add tdm_helper_clear_buffer_color function Change-Id: I033f2212eb057b9896cb5d37e0d6eacb059994a5 --- include/tdm_helper.h | 11 +++++++++++ src/tdm_helper.c | 16 ++++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/include/tdm_helper.h b/include/tdm_helper.h index 176279b..1459e72 100644 --- a/include/tdm_helper.h +++ b/include/tdm_helper.h @@ -87,6 +87,17 @@ void tdm_helper_clear_buffer_pos(tbm_surface_h buffer, tdm_pos *pos); /** + * @brief fill a buffer with 0 for given pos. + * @details + * This function supports only if a buffer has below formats. + * - TBM_FORMAT_ARGB8888 + * - TBM_FORMAT_XRGB8888 + * @param[in] buffer A TDM buffer + */ +void +tdm_helper_clear_buffer_color(tbm_surface_h buffer, tdm_pos *pos, unsigned int color); + +/** * @brief fill a buffer with 0. * @details * This function supports only if a buffer has below formats. diff --git a/src/tdm_helper.c b/src/tdm_helper.c index 947d41e..fc271fb 100644 --- a/src/tdm_helper.c +++ b/src/tdm_helper.c @@ -350,8 +350,8 @@ tdm_helper_dump_buffer(tbm_surface_h buffer, const char *file) TDM_INFO("dump %s", file); } -void -tdm_helper_clear_buffer_pos(tbm_surface_h buffer, tdm_pos *pos) +EXTERN void +tdm_helper_clear_buffer_color(tbm_surface_h buffer, tdm_pos *pos, unsigned int color) { tbm_surface_info_s info; int ret; @@ -372,8 +372,8 @@ tdm_helper_clear_buffer_pos(tbm_surface_h buffer, tdm_pos *pos) for (y = pos->y; y <= (pos->y + pos->h); y++) { p = info.planes[0].ptr + info.planes[0].stride * y; for (x = pos->x; x <= (pos->x + pos->w); x++) { - int *ibuf = (int*)p; - ibuf[x] = 0x00000000; + unsigned int *ibuf = (unsigned int*)p; + ibuf[x] = color; } } } @@ -414,6 +414,14 @@ tdm_helper_clear_buffer_pos(tbm_surface_h buffer, tdm_pos *pos) } EXTERN void +tdm_helper_clear_buffer_pos(tbm_surface_h buffer, tdm_pos *pos) +{ + TDM_RETURN_IF_FAIL(buffer != NULL); + + tdm_helper_clear_buffer_color(buffer, pos, 0); +} + +EXTERN void tdm_helper_clear_buffer(tbm_surface_h buffer) { TDM_RETURN_IF_FAIL(buffer != NULL); -- 2.7.4 From 2f78ce60d7d46d28f5cbbe6ef4dcc6ff2d8e5061 Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 22 Aug 2017 13:25:48 +0900 Subject: [PATCH 15/16] dump layer when calling tdm_layer_set_buffer To dump all buffers of a layer, set_buffer function is much better than layer_committed function. Change-Id: I51c3daf926490a23764067e4a75fa6a12cab5f18 --- src/tdm_layer.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tdm_layer.c b/src/tdm_layer.c index 1488e28..c6128a8 100644 --- a/src/tdm_layer.c +++ b/src/tdm_layer.c @@ -441,6 +441,10 @@ tdm_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer) ret = func_layer->layer_set_buffer(private_layer->layer_backend, buffer); TDM_WARNING_IF_FAIL(ret == TDM_ERROR_NONE); + /* dump buffer */ + if (tdm_dump_enable && !(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO)) + _tdm_layer_dump_buffer(layer, buffer); + if (ret == TDM_ERROR_NONE) { if (private_layer->waiting_buffer) _tdm_layer_free_buffer(private_layer, private_layer->waiting_buffer); @@ -516,10 +520,6 @@ tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer * private_layer->showing_buffer = *committed_buffer; *committed_buffer = NULL; - /* dump buffer */ - if (tdm_dump_enable && !(private_layer->caps.capabilities & TDM_LAYER_CAPABILITY_VIDEO) && private_layer->showing_buffer) - _tdm_layer_dump_buffer(private_layer, private_layer->showing_buffer->buffer); - if (tdm_debug_module & TDM_DEBUG_BUFFER) TDM_INFO("layer(%p) committed_buffer(%p) showing_buffer(%p)", private_layer, *committed_buffer, -- 2.7.4 From 33bb942033e5e34a5e56bd7bf2454dd1dcd8e49c Mon Sep 17 00:00:00 2001 From: Boram Park Date: Tue, 22 Aug 2017 15:14:06 +0900 Subject: [PATCH 16/16] package version up to 1.7.7 Change-Id: I523415f93746816f933806d07f6c1d2f03088895 --- packaging/libtdm.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm.spec b/packaging/libtdm.spec index 1003c6a..8c78b8b 100644 --- a/packaging/libtdm.spec +++ b/packaging/libtdm.spec @@ -1,7 +1,7 @@ %bcond_with utest Name: libtdm -Version: 1.7.6 +Version: 1.7.7 Release: 0 Summary: User Library of Tizen Display Manager Group: Development/Libraries -- 2.7.4