From 56fcd4d21c8127afac963fe1ac78218bf0846d31 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 22 Apr 2019 17:33:24 +0900 Subject: [PATCH 01/16] display: remove unused fds of display_buffer Change-Id: I3aaa12dbe1e410dba52657c6c2fdbb4a8d77f6b5 --- src/tdm_vc4_display.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/tdm_vc4_display.c b/src/tdm_vc4_display.c index 48a769e..f9931cf 100644 --- a/src/tdm_vc4_display.c +++ b/src/tdm_vc4_display.c @@ -2292,7 +2292,7 @@ _tdm_vc4_display_cb_destroy_buffer(tbm_surface_h buffer, void *user_data) } } - TDM_DBG("destroy buffer fd:%d", display_buffer->fds[0]); + TDM_DBG("destroy buffer:%p", display_buffer->buffer); LIST_DEL(&display_buffer->link); free(display_buffer); @@ -2336,9 +2336,8 @@ _tdm_vc4_display_create_buffer(tdm_vc4_data *vc4_data, tbm_surface_h buffer, tdm for (i = 0; i < display_buffer->count; i++) { tbm_bo bo = tbm_surface_internal_get_bo(buffer, i); display_buffer->handles[i] = tbm_bo_get_handle(bo, TBM_DEVICE_DEFAULT).u32; - display_buffer->fds[i] = tbm_bo_get_handle(bo, TBM_DEVICE_MM).u32; /* ToDo */ - TDM_DBG(" create buffer:%p bo%d(fd:%d handle:%d)", - buffer, i, display_buffer->fds[i], display_buffer->handles[i]); + TDM_DBG(" create buffer:%p bo%d(handle:%d)", + buffer, i, display_buffer->handles[i]); } for (i = 0; i < count; i++) { -- 2.7.4 From c042ac2b3562d5b2e2d9de676177b9256419ef08 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 22 Apr 2019 17:35:00 +0900 Subject: [PATCH 02/16] display: set buffer handle to all planes of display_buffer Change-Id: I96a0b9aef14078612619add33947d37bf92d2b3c --- src/tdm_vc4_display.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/tdm_vc4_display.c b/src/tdm_vc4_display.c index f9931cf..d21119d 100644 --- a/src/tdm_vc4_display.c +++ b/src/tdm_vc4_display.c @@ -2333,20 +2333,20 @@ _tdm_vc4_display_create_buffer(tdm_vc4_data *vc4_data, tbm_surface_h buffer, tdm buffer, display_buffer->width, display_buffer->height, FOURCC_STR(display_buffer->format), display_buffer->count, count); - for (i = 0; i < display_buffer->count; i++) { - tbm_bo bo = tbm_surface_internal_get_bo(buffer, i); + for (i = 0; i < count; i++) { + int bo_idx = 0; + tbm_bo bo = NULL; + + bo_idx = tbm_surface_internal_get_plane_bo_idx(buffer, i); + bo = tbm_surface_internal_get_bo(buffer, bo_idx); display_buffer->handles[i] = tbm_bo_get_handle(bo, TBM_DEVICE_DEFAULT).u32; - TDM_DBG(" create buffer:%p bo%d(handle:%d)", - buffer, i, display_buffer->handles[i]); - } - for (i = 0; i < count; i++) { tbm_surface_internal_get_plane_data(buffer, i, &display_buffer->size, &display_buffer->offsets[i], &display_buffer->pitches[i]); - TDM_DBG(" create buffer:%p plane%d(size:%d offset:%d pitch:%d)", + TDM_DBG(" create buffer:%p plane%d(size:%d offset:%d pitch:%d) bo%d(handle:%d)", buffer, i, display_buffer->size, display_buffer->offsets[i], - display_buffer->pitches[i]); + display_buffer->pitches[i], bo_idx, display_buffer->handles[i]); } ret = drmModeAddFB2(vc4_data->drm_fd, display_buffer->width, display_buffer->height, -- 2.7.4 From 64a783966e9c6c0b32518b801229699855f29ffe Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 24 Apr 2019 18:40:24 +0900 Subject: [PATCH 03/16] hwc: adjust dst pos of cursor even if cursor image isn't changed Change-Id: I0f39ff96370c645b9d94e23aa1cbf7ae4c0fe388 --- src/tdm_vc4_hwc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index 107d1fb..ea3d924 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -83,6 +83,8 @@ _vc4_hwc_cursor_buffer_set(tdm_vc4_hwc_data *hwc_data, tdm_vc4_hwc_window_data * int src_stride; int i; + _vc4_hwc_cursor_adjust_pos(hwc_window_data); + if (!hwc_window_data->cursor_img_refresh && hwc_window_data->surface) return 1; @@ -134,8 +136,6 @@ _vc4_hwc_cursor_buffer_set(tdm_vc4_hwc_data *hwc_data, tdm_vc4_hwc_window_data * hwc_window_data->info.dst_pos.w = new_w; hwc_window_data->info.dst_pos.h = new_h; - _vc4_hwc_cursor_adjust_pos(hwc_window_data); - hwc_window_data->cursor_img_refresh = 0; return 1; -- 2.7.4 From 21edcd6bb8febb7aa5b44d925f2272a98de54240 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 19 Apr 2019 17:42:41 +0900 Subject: [PATCH 04/16] hwc: refectoring hwc_apply_policy for supporting video 1. support hw cursor and only use ZPOS3 layer for cursor 2. if video client is shown, ui_lzpos_bottom move to ZPOS_1 Change-Id: I6ac89c88e9f425ec7892f1402abbc314e661439c --- src/tdm_vc4_hwc.c | 127 ++++++++++++++++++++++++++---------------------------- 1 file changed, 61 insertions(+), 66 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index ea3d924..fb23094 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -15,7 +15,7 @@ #define ZPOS_2 2 #define ZPOS_1 1 #define ZPOS_0 0 -#define ZPOS_VIDEO1 -1 //TODO: +#define ZPOS_VIDEO1 0 #define ZPOS_NONE -999 tbm_format hwc_window_video_formats[] = { @@ -324,10 +324,10 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w int device_count = 0; int video_count = 0; int cursor_count = 0; - int next_idx = 0; int ui_lzpos_top = ZPOS_2; int ui_lzpos_bottom = ZPOS_0; int num_ui_layers = NUM_LAYERS; + int set_clients_below = 0; int i = 0; composited_list = (tdm_vc4_hwc_window_data **)composited_wnds; @@ -344,87 +344,82 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w /* use the target_window to commit when there is no window. */ if (num_wnds == 0) { hwc_data->need_target_window = 1; + hwc_data->target_hwc_window->lzpos = ui_lzpos_bottom; return; } - /* count the composited(visible) windows */ + /* 1. first check validate_type without target_window */ for (i = 0; i < num_wnds; i++) { - if (composited_list[i]->client_type == TDM_HWC_WIN_COMPOSITION_CURSOR) - cursor_count++; - if (composited_list[i]->client_type == TDM_HWC_WIN_COMPOSITION_CLIENT) - client_count++; - if (client_count == 0 && composited_list[i]->client_type == TDM_HWC_WIN_COMPOSITION_DEVICE) - device_count++; - if (composited_list[i]->client_type == TDM_HWC_WIN_COMPOSITION_VIDEO) - video_count++; + switch (composited_list[i]->client_type) { + case TDM_HWC_WIN_COMPOSITION_VIDEO: + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_VIDEO; + video_count++; + continue; + case TDM_HWC_WIN_COMPOSITION_CURSOR: + if (set_clients_below) break; + if (cursor_count > 0) break; + + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CURSOR; + cursor_count++; + continue; + case TDM_HWC_WIN_COMPOSITION_DEVICE: + if (set_clients_below) break; + if (num_ui_layers <= 0) break; + if (!_vc4_hwc_window_can_set_on_hw_layer(composited_list[i])) break; + + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_DEVICE; + device_count++; + num_ui_layers--; + continue; + default: + break; + } + + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; + client_count++; + set_clients_below = 1; } - /* apply the cursor layers */ - if (cursor_count > 1) - goto set_clients_below; + /* 2. check need target window and set ui_lzpos top and bottom */ + num_ui_layers = NUM_LAYERS; - if (cursor_count == 1) { - /* set cursor composition and layer zpos */ - composited_list[next_idx]->validated_type = TDM_HWC_WIN_COMPOSITION_CURSOR; - composited_list[next_idx]->lzpos = ZPOS_CURSOR; - next_idx++; + if (video_count > 0) { + ui_lzpos_bottom++; + num_ui_layers--; } - /* reset the lzpos_bottom when it needs target_window */ - if ((client_count > 0) || (client_count + device_count > 2)) { - hwc_data->need_target_window = 1; - ui_lzpos_bottom = ZPOS_1; + if (client_count > 0) { + ui_lzpos_bottom++; num_ui_layers--; + hwc_data->need_target_window = 1; + hwc_data->target_hwc_window->lzpos = ui_lzpos_bottom - 1; } - /* apply the device layers from the top to the bottom */ - if ((num_ui_layers - device_count) > 0) + if (num_ui_layers > device_count) ui_lzpos_top = ui_lzpos_bottom + device_count - 1; - while (device_count > 0) { - /* apply the video layer */ - if (composited_list[next_idx]->client_type == TDM_HWC_WIN_COMPOSITION_VIDEO) { - composited_list[next_idx]->validated_type = TDM_HWC_WIN_COMPOSITION_VIDEO; - composited_list[next_idx]->lzpos = ZPOS_VIDEO1; - next_idx++; - continue; - } - - /* set clients below when vc4 can not set the window to the hw layer */ - if (!_vc4_hwc_window_can_set_on_hw_layer(composited_list[next_idx])) - break; - - /* set device comopsition and layer zpos */ - composited_list[next_idx]->validated_type = TDM_HWC_WIN_COMPOSITION_DEVICE; - composited_list[next_idx]->lzpos = ui_lzpos_top; - ui_lzpos_top--; - next_idx++; - - if (ui_lzpos_top < ui_lzpos_bottom) - break; - - device_count--; - } - -set_clients_below: - /* apply the client layers */ - while (next_idx < num_wnds) { - hwc_data->need_target_window = 1; - if (composited_list[next_idx]->client_type == TDM_HWC_WIN_COMPOSITION_VIDEO) { - composited_list[next_idx]->validated_type = TDM_HWC_WIN_COMPOSITION_VIDEO; - composited_list[next_idx]->lzpos = ZPOS_VIDEO1; - next_idx++; - continue; + /* 3. set lzpos and modify validate_type with target_window */ + for (i = 0; i < num_wnds; i++) { + switch (composited_list[i]->validated_type) { + case TDM_HWC_WIN_COMPOSITION_VIDEO: + composited_list[i]->lzpos = ZPOS_VIDEO1; + continue; + case TDM_HWC_WIN_COMPOSITION_CURSOR: + composited_list[i]->lzpos = ZPOS_CURSOR; + continue; + case TDM_HWC_WIN_COMPOSITION_DEVICE: + if (num_ui_layers <= 0) break; + composited_list[i]->lzpos = ui_lzpos_top; + ui_lzpos_top--; + num_ui_layers--; + continue; + default: + break; } - /* set client composition */ - composited_list[next_idx]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; - composited_list[next_idx]->lzpos = ZPOS_NONE; - next_idx++; + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; + composited_list[i]->lzpos = ZPOS_NONE; } - - if (hwc_data->need_target_window) - hwc_data->target_hwc_window->lzpos = ZPOS_0; } static int -- 2.7.4 From 70a4922ab8ade3c42a0edcefd59408a6a47ca4ef Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 24 Apr 2019 21:14:43 +0900 Subject: [PATCH 05/16] Package version up to 1.0.1 Change-Id: I1c4cdc3422a438ae47db9d6e0e14e3c2de1a64ed --- packaging/libtdm-vc4.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm-vc4.spec b/packaging/libtdm-vc4.spec index 3aabd88..e461e6c 100644 --- a/packaging/libtdm-vc4.spec +++ b/packaging/libtdm-vc4.spec @@ -1,5 +1,5 @@ Name: libtdm-vc4 -Version: 1.0.0 +Version: 1.0.1 Release: 0 Summary: Tizen Display Manager VC4 Back-End Library Group: Development/Libraries -- 2.7.4 From cb318a0abd431bbec253ce599ea9630d077c7b86 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 26 Apr 2019 11:15:17 +0900 Subject: [PATCH 06/16] hwc: fix coding rule Change-Id: I3f6132beee28ea8be1fb2de05b31e5b8b565437a --- src/tdm_vc4_hwc.c | 72 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index fb23094..1021910 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -351,28 +351,28 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w /* 1. first check validate_type without target_window */ for (i = 0; i < num_wnds; i++) { switch (composited_list[i]->client_type) { - case TDM_HWC_WIN_COMPOSITION_VIDEO: - composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_VIDEO; - video_count++; - continue; - case TDM_HWC_WIN_COMPOSITION_CURSOR: - if (set_clients_below) break; - if (cursor_count > 0) break; - - composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CURSOR; - cursor_count++; - continue; - case TDM_HWC_WIN_COMPOSITION_DEVICE: - if (set_clients_below) break; - if (num_ui_layers <= 0) break; - if (!_vc4_hwc_window_can_set_on_hw_layer(composited_list[i])) break; - - composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_DEVICE; - device_count++; - num_ui_layers--; - continue; - default: - break; + case TDM_HWC_WIN_COMPOSITION_VIDEO: + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_VIDEO; + video_count++; + continue; + case TDM_HWC_WIN_COMPOSITION_CURSOR: + if (set_clients_below) break; + if (cursor_count > 0) break; + + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CURSOR; + cursor_count++; + continue; + case TDM_HWC_WIN_COMPOSITION_DEVICE: + if (set_clients_below) break; + if (num_ui_layers <= 0) break; + if (!_vc4_hwc_window_can_set_on_hw_layer(composited_list[i])) break; + + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_DEVICE; + device_count++; + num_ui_layers--; + continue; + default: + break; } composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; @@ -401,20 +401,20 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w /* 3. set lzpos and modify validate_type with target_window */ for (i = 0; i < num_wnds; i++) { switch (composited_list[i]->validated_type) { - case TDM_HWC_WIN_COMPOSITION_VIDEO: - composited_list[i]->lzpos = ZPOS_VIDEO1; - continue; - case TDM_HWC_WIN_COMPOSITION_CURSOR: - composited_list[i]->lzpos = ZPOS_CURSOR; - continue; - case TDM_HWC_WIN_COMPOSITION_DEVICE: - if (num_ui_layers <= 0) break; - composited_list[i]->lzpos = ui_lzpos_top; - ui_lzpos_top--; - num_ui_layers--; - continue; - default: - break; + case TDM_HWC_WIN_COMPOSITION_VIDEO: + composited_list[i]->lzpos = ZPOS_VIDEO1; + continue; + case TDM_HWC_WIN_COMPOSITION_CURSOR: + composited_list[i]->lzpos = ZPOS_CURSOR; + continue; + case TDM_HWC_WIN_COMPOSITION_DEVICE: + if (num_ui_layers <= 0) break; + composited_list[i]->lzpos = ui_lzpos_top; + ui_lzpos_top--; + num_ui_layers--; + continue; + default: + break; } composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; -- 2.7.4 From 4a9363cf6b5e5c89399de7717559491c9b117f06 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 26 Apr 2019 11:16:44 +0900 Subject: [PATCH 07/16] hwc: change NUM_LAYERS to 4 NUM_LAYERS should include cursor layer Change-Id: I825e967d5e79b61ce8bbb427dbe3b97bc679fdbe --- src/tdm_vc4_hwc.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index 1021910..22899f2 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -5,18 +5,20 @@ #include #include "tdm_vc4.h" -#define MIN_WIDTH 32 +#define MIN_WIDTH 32 -#define NUM_LAYERS 3 -#define NUM_BUFFERS 3 +#define NUM_LAYERS 4 +#define NUM_BUFFERS 3 -#define ZPOS_MAX 4 -#define ZPOS_CURSOR 3 -#define ZPOS_2 2 -#define ZPOS_1 1 -#define ZPOS_0 0 -#define ZPOS_VIDEO1 0 -#define ZPOS_NONE -999 +#define NUM_UI_LAYERS 3 + +#define ZPOS_MAX 4 +#define ZPOS_CURSOR 3 +#define ZPOS_2 2 +#define ZPOS_1 1 +#define ZPOS_0 0 +#define ZPOS_VIDEO1 0 +#define ZPOS_NONE -999 tbm_format hwc_window_video_formats[] = { TBM_FORMAT_NV12, @@ -326,7 +328,7 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w int cursor_count = 0; int ui_lzpos_top = ZPOS_2; int ui_lzpos_bottom = ZPOS_0; - int num_ui_layers = NUM_LAYERS; + int num_ui_layers = NUM_UI_LAYERS; int set_clients_below = 0; int i = 0; @@ -381,7 +383,7 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w } /* 2. check need target window and set ui_lzpos top and bottom */ - num_ui_layers = NUM_LAYERS; + num_ui_layers = NUM_UI_LAYERS; if (video_count > 0) { ui_lzpos_bottom++; -- 2.7.4 From 070423cd4ca4adbd7129a50fc5caa9507c85a547 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 29 Apr 2019 15:36:00 +0900 Subject: [PATCH 08/16] Package version up to 1.0.2 Change-Id: I07813dd3e125b93afb40b9b49339abbdd766af2a --- packaging/libtdm-vc4.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm-vc4.spec b/packaging/libtdm-vc4.spec index e461e6c..4debeb7 100644 --- a/packaging/libtdm-vc4.spec +++ b/packaging/libtdm-vc4.spec @@ -1,5 +1,5 @@ Name: libtdm-vc4 -Version: 1.0.1 +Version: 1.0.2 Release: 0 Summary: Tizen Display Manager VC4 Back-End Library Group: Development/Libraries -- 2.7.4 From 297f90228b484c930ae79b663cb645d04ec25513 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Fri, 19 Jul 2019 17:53:42 +0900 Subject: [PATCH 09/16] hwc: initailize target_window in get_hwc info of target_window is set in output_set_mode Change-Id: I5abb4cfb2119c6968f9b4be2d033bbf7643ce8c8 --- src/tdm_vc4_display.c | 14 ++++++++++++-- src/tdm_vc4_hwc.c | 47 +++++++++++++++++++++++++++++++++++++++++------ src/tdm_vc4_hwc.h | 3 ++- 3 files changed, 55 insertions(+), 9 deletions(-) diff --git a/src/tdm_vc4_display.c b/src/tdm_vc4_display.c index d21119d..ce2cee1 100644 --- a/src/tdm_vc4_display.c +++ b/src/tdm_vc4_display.c @@ -1976,9 +1976,9 @@ vc4_output_set_mode(tdm_output *output, const tdm_output_mode *mode) /* create or replace the target_window when the output mode is set */ if (output_data->hwc_enable) { - ret = vc4_hwc_initailize_target_window(output_data->hwc_data, mode->hdisplay, mode->vdisplay); + ret = vc4_hwc_target_window_set_info(output_data->hwc_data, mode->hdisplay, mode->vdisplay); if (ret != TDM_ERROR_NONE) { - TDM_ERR("create target hwc window failed (%d)", ret); + TDM_ERR("set info target hwc window failed (%d)", ret); return ret; } } @@ -2006,6 +2006,7 @@ vc4_output_get_hwc(tdm_output *output, tdm_error *error) { tdm_vc4_hwc_data *hwc_data = NULL; tdm_vc4_output_data *output_data = output; + tdm_error ret = TDM_ERROR_NONE; if (!output_data) { TDM_ERR("invalid params"); @@ -2034,6 +2035,15 @@ vc4_output_get_hwc(tdm_output *output, tdm_error *error) output_data->hwc_data = hwc_data; + ret = vc4_hwc_initailize_target_window(output_data->hwc_data); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("create target hwc window failed (%d)", ret); + free(hwc_data); + if (error) + *error = ret; + return NULL; + } + if (error) *error = TDM_ERROR_NONE; diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index 22899f2..ab7f8ce 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -685,28 +685,63 @@ vc4_hwc_set_commit_handler(tdm_hwc *hwc, tdm_hwc_commit_handler func) } tdm_error -vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data, int width, int height) +vc4_hwc_target_window_set_info(tdm_vc4_hwc_data *hwc_data, int width, int height) { tdm_hwc_window_info info = {0}; - tdm_error ret = TDM_ERROR_NONE; tdm_vc4_hwc_window_data *target_hwc_window; + tdm_error ret = TDM_ERROR_NONE; RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER); + RETURN_VAL_IF_FAIL(hwc_data->target_hwc_window, TDM_ERROR_INVALID_PARAMETER); + + target_hwc_window = hwc_data->target_hwc_window; info.dst_pos.x = 0; info.dst_pos.y = 0; - info.dst_pos.h = height; - info.dst_pos.w = width; + info.dst_pos.h = width; + info.dst_pos.w = height; info.src_config.pos.x = 0; info.src_config.pos.y = 0; - info.src_config.pos.h = height; - info.src_config.pos.w = width; + info.src_config.pos.h = width; + info.src_config.pos.w = height; info.src_config.size.h = width; info.src_config.size.v = height; info.src_config.format = TBM_FORMAT_ARGB8888; + ret = vc4_hwc_window_set_info(target_hwc_window, &info); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("set info target hwc window failed (%d)", ret); + return TDM_ERROR_OPERATION_FAILED; + } + + return TDM_ERROR_NONE; +} + +tdm_error +vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data) +{ + tdm_hwc_window_info info = {0}; + tdm_error ret = TDM_ERROR_NONE; + tdm_vc4_hwc_window_data *target_hwc_window; + + RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER); + + info.dst_pos.x = 0; + info.dst_pos.y = 0; + info.dst_pos.h = 2; + info.dst_pos.w = 1; + + info.src_config.pos.x = 0; + info.src_config.pos.y = 0; + info.src_config.pos.h = 2; + info.src_config.pos.w = 1; + + info.src_config.size.h = 2; + info.src_config.size.v = 1; + info.src_config.format = TBM_FORMAT_ARGB8888; + target_hwc_window = _vc4_hwc_create_window(hwc_data, &info, &ret); if (ret != TDM_ERROR_NONE) { TDM_ERR("create target hwc window failed (%d)", ret); diff --git a/src/tdm_vc4_hwc.h b/src/tdm_vc4_hwc.h index ad2cb64..96bf2bf 100644 --- a/src/tdm_vc4_hwc.h +++ b/src/tdm_vc4_hwc.h @@ -3,6 +3,7 @@ #include "tdm_vc4.h" -tdm_error vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data, int width, int height); +tdm_error vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data); +tdm_error vc4_hwc_target_window_set_info(tdm_vc4_hwc_data *hwc_data, int width, int height); #endif /* _TDM_VC4_HWC_H_ */ -- 2.7.4 From f108ef3ef6ea6dfd17e3cb01e6f86a44f85e8343 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 22 Jul 2019 20:28:50 +0900 Subject: [PATCH 10/16] Package version up to 1.0.3 Change-Id: Ib56666db5a3bce2747276d80ceaea483135e3a0b --- packaging/libtdm-vc4.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm-vc4.spec b/packaging/libtdm-vc4.spec index 4debeb7..091c44c 100644 --- a/packaging/libtdm-vc4.spec +++ b/packaging/libtdm-vc4.spec @@ -1,5 +1,5 @@ Name: libtdm-vc4 -Version: 1.0.2 +Version: 1.0.3 Release: 0 Summary: Tizen Display Manager VC4 Back-End Library Group: Development/Libraries -- 2.7.4 From 4d916927c91f52d3ba0fa7df6cd03c0f9175333d Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 23 Jul 2019 10:14:57 +0900 Subject: [PATCH 11/16] make the target_window info get the proper w/h. Change-Id: Ib493b75d3534616e1c015b7ea9695d69688862df --- src/tdm_vc4_hwc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index ab7f8ce..91eef2d 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -698,13 +698,13 @@ vc4_hwc_target_window_set_info(tdm_vc4_hwc_data *hwc_data, int width, int height info.dst_pos.x = 0; info.dst_pos.y = 0; - info.dst_pos.h = width; - info.dst_pos.w = height; + info.dst_pos.w = width; + info.dst_pos.h = height; info.src_config.pos.x = 0; info.src_config.pos.y = 0; - info.src_config.pos.h = width; - info.src_config.pos.w = height; + info.src_config.pos.w = width; + info.src_config.pos.h = height; info.src_config.size.h = width; info.src_config.size.v = height; @@ -730,13 +730,13 @@ vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data) info.dst_pos.x = 0; info.dst_pos.y = 0; - info.dst_pos.h = 2; info.dst_pos.w = 1; + info.dst_pos.h = 2; info.src_config.pos.x = 0; info.src_config.pos.y = 0; - info.src_config.pos.h = 2; info.src_config.pos.w = 1; + info.src_config.pos.h = 2; info.src_config.size.h = 2; info.src_config.size.v = 1; -- 2.7.4 From e925e6bf68c4c326471662192124e7a211c49fc6 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Tue, 23 Jul 2019 10:31:42 +0900 Subject: [PATCH 12/16] fix the initialize size of the target window Change-Id: I022f0aeb087a1865742c6ce4b7288b6c5a949783 --- src/tdm_vc4_hwc.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index 91eef2d..0d47db9 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -730,13 +730,13 @@ vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data) info.dst_pos.x = 0; info.dst_pos.y = 0; - info.dst_pos.w = 1; - info.dst_pos.h = 2; + info.dst_pos.w = 2; + info.dst_pos.h = 1; info.src_config.pos.x = 0; info.src_config.pos.y = 0; - info.src_config.pos.w = 1; - info.src_config.pos.h = 2; + info.src_config.pos.w = 2; + info.src_config.pos.h = 1; info.src_config.size.h = 2; info.src_config.size.v = 1; -- 2.7.4 From 7998384c0a5380d25704f215b775d75cf53611a7 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Thu, 11 Jul 2019 17:20:19 +0900 Subject: [PATCH 13/16] vc4 backend can detect the multi output from the drm module Change-Id: I0ee0bcb6a512458cfeb3e3aee127f04f43292dc9 --- src/tdm_vc4_display.c | 481 +++++++++++++++++++------------------------------- 1 file changed, 185 insertions(+), 296 deletions(-) diff --git a/src/tdm_vc4_display.c b/src/tdm_vc4_display.c index ce2cee1..c7ae1e7 100644 --- a/src/tdm_vc4_display.c +++ b/src/tdm_vc4_display.c @@ -89,9 +89,21 @@ _tdm_vc4_display_get_mode(tdm_vc4_output_data *output_data) return NULL; } - for (i = 0; i < output_data->count_drm_modes; i++) { + const tdm_output_mode *mode; + + mode = output_data->current_mode; + TDM_INFO("Current mode: %s, %d, %d, %d, %d, %d", + mode->name, mode->hdisplay, mode->vdisplay, mode->vrefresh, mode->flags, mode->type); + + + TDM_INFO(" Count modes: %d %d", output_data->count_drm_modes, output_data->count_modes); + + for (i = 0; i < output_data->count_modes; i++) { drmModeModeInfoPtr vc4_mode = &output_data->vc4_modes[i]; + TDM_INFO(" DRM mode: %s, %d, %d, %d, %d, %d", + vc4_mode->name, vc4_mode->hdisplay, vc4_mode->vdisplay, vc4_mode->vrefresh, vc4_mode->flags, vc4_mode->type); + if ((vc4_mode->hdisplay == output_data->current_mode->hdisplay) && (vc4_mode->vdisplay == output_data->current_mode->vdisplay) && (vc4_mode->vrefresh == output_data->current_mode->vrefresh) && @@ -581,150 +593,81 @@ _tdm_vc4_display_get_property(tdm_vc4_data *vc4_data, static tdm_error _tdm_vc4_display_create_layer_list_type(tdm_vc4_data *vc4_data) { - tdm_vc4_output_data *output_data = NULL; - drmModePlanePtr *planes = NULL; - unsigned int *types = NULL; - unsigned int type = 0; - int plane_cnt, primary_cnt, ovl_cnt, cursor_cnt; - int opos_next, cpos_next; + drmModePlanePtr plane; tdm_error ret; int i; - if (LIST_IS_EMPTY(&vc4_data->output_list)) { - TDM_ERR("no output"); - return TDM_ERROR_OPERATION_FAILED; - } - - /* The TDM drm backend only support one output. */ - LIST_FOR_EACH_ENTRY(output_data, &vc4_data->output_list, link) { - break; - } - - ret = _tdm_vc4_display_get_property(vc4_data, - vc4_data->plane_res->planes[0], - DRM_MODE_OBJECT_PLANE, "type", &type, - NULL); - if (ret != TDM_ERROR_NONE) { - TDM_ERR("plane doesn't have 'type' property. Call a fallback function"); - - /* if a plane doesn't have "type" property, we call a fallback function - * as default - */ - return _tdm_vc4_display_create_layer_list(vc4_data); - } - - planes = calloc(vc4_data->plane_res->count_planes, sizeof(drmModePlanePtr)); - if (!planes) { - TDM_ERR("alloc failed"); - goto failed; - } - - types = calloc(vc4_data->plane_res->count_planes, sizeof(unsigned int)); - if (!types) { - TDM_ERR("alloc failed"); - goto failed; - } - - plane_cnt = 0; for (i = 0; i < vc4_data->plane_res->count_planes; i++) { - drmModePlanePtr plane; + tdm_vc4_output_data *output_data = NULL; + tdm_vc4_layer_data *layer_data; + unsigned int type = 0; + int output_find = 0; plane = drmModeGetPlane(vc4_data->drm_fd, vc4_data->plane_res->planes[i]); if (!plane) { - TDM_ERR("no plane(%d)", vc4_data->plane_res->planes[i]); - goto failed; - } - - if ((plane->possible_crtcs & (1 << output_data->pipe)) == 0) { - drmModeFreePlane(plane); + TDM_ERR("no plane"); continue; } ret = _tdm_vc4_display_get_property(vc4_data, - vc4_data->plane_res->planes[i], - DRM_MODE_OBJECT_PLANE, "type", &type, - NULL); + vc4_data->plane_res->planes[i], + DRM_MODE_OBJECT_PLANE, "type", &type, NULL); if (ret != TDM_ERROR_NONE) { - drmModeFreePlane(plane); TDM_ERR("plane(%d) doesn't have 'type' info", vc4_data->plane_res->planes[i]); - goto failed; + drmModeFreePlane(plane); + continue; } - planes[plane_cnt] = plane; - types[plane_cnt] = type; - plane_cnt++; - } - - primary_cnt = ovl_cnt = cursor_cnt = 0; - for (i = 0; i < plane_cnt; i++) { - if (types[i] == DRM_PLANE_TYPE_CURSOR) - cursor_cnt++; - else if (types[i] == DRM_PLANE_TYPE_OVERLAY) - ovl_cnt++; - else if (types[i] == DRM_PLANE_TYPE_PRIMARY) - primary_cnt++; - else - TDM_ERR("invalid type(%d)", types[i]); - } - - if (primary_cnt != 1) { - TDM_ERR("primary layer count(%d) should be one", primary_cnt); - goto failed; - } - - /* do not use primary plane(0) because of yuv format displaying problem */ - /* set 2nd overlay plane to primary, 1st plane is for video */ - opos_next = 0; - cpos_next = ovl_cnt; - for (i = 1; i < plane_cnt; i++) { - tdm_vc4_layer_data *layer_data; - layer_data = calloc(1, sizeof(tdm_vc4_layer_data)); if (!layer_data) { TDM_ERR("alloc failed"); - goto failed; + drmModeFreePlane(plane); + continue; + } + + LIST_FOR_EACH_ENTRY(output_data, &vc4_data->output_list, link) { + if (plane->possible_crtcs & (1 << output_data->pipe)) { + output_find = 1; + break; + } + } + + if (!output_find) { + TDM_ERR("plane(%d) couldn't found proper output", plane->plane_id); + drmModeFreePlane(plane); + free(layer_data); + continue; } layer_data->vc4_data = vc4_data; layer_data->output_data = output_data; - layer_data->plane_id = planes[i]->plane_id; + layer_data->plane_id = vc4_data->plane_res->planes[i]; - if (types[i] == DRM_PLANE_TYPE_CURSOR) { + if (type == DRM_PLANE_TYPE_CURSOR) { layer_data->capabilities = TDM_LAYER_CAPABILITY_CURSOR | TDM_LAYER_CAPABILITY_GRAPHIC; - layer_data->zpos = cpos_next++; - } else if (types[i] == DRM_PLANE_TYPE_OVERLAY) { - if (i == 1) { - layer_data->capabilities = TDM_LAYER_CAPABILITY_OVERLAY | - TDM_LAYER_CAPABILITY_GRAPHIC | - TDM_LAYER_CAPABILITY_SCALE | - TDM_LAYER_CAPABILITY_NO_CROP; - } else if (i == 2) { - layer_data->capabilities = TDM_LAYER_CAPABILITY_PRIMARY | - TDM_LAYER_CAPABILITY_GRAPHIC | - TDM_LAYER_CAPABILITY_NO_CROP; - output_data->primary_layer = layer_data; - } else { - layer_data->capabilities = TDM_LAYER_CAPABILITY_OVERLAY | - TDM_LAYER_CAPABILITY_GRAPHIC | - TDM_LAYER_CAPABILITY_NO_CROP; - } - layer_data->zpos = opos_next++; + layer_data->zpos = 2; + } else if (type == DRM_PLANE_TYPE_OVERLAY) { + layer_data->capabilities = TDM_LAYER_CAPABILITY_OVERLAY | + TDM_LAYER_CAPABILITY_GRAPHIC; + layer_data->zpos = 1; + } else if (type == DRM_PLANE_TYPE_PRIMARY) { + layer_data->capabilities = TDM_LAYER_CAPABILITY_PRIMARY | + TDM_LAYER_CAPABILITY_GRAPHIC; + layer_data->zpos = 0; + output_data->primary_layer = layer_data; } else { + drmModeFreePlane(plane); free(layer_data); continue; } - /* only support 7 layers */ - if (i == 8) { - free(layer_data); - break; - } - TDM_INFO("layer_data(%p) plane_id(%d) crtc_id(%d) zpos(%d) capabilities(%x)", - layer_data, layer_data->plane_id, layer_data->output_data->crtc_id, - layer_data->zpos, layer_data->capabilities); + layer_data, layer_data->plane_id, layer_data->output_data->crtc_id, + layer_data->zpos, layer_data->capabilities); + + LIST_ADDTAIL(&layer_data->link, &output_data->layer_list); /* get the atomic prop ids*/ if (vc4_data->has_atomic) { @@ -799,28 +742,14 @@ _tdm_vc4_display_create_layer_list_type(tdm_vc4_data *vc4_data) } } - LIST_ADDTAIL(&layer_data->link, &output_data->layer_list); + drmModeFreePlane(plane); } - for (i = 0; i < plane_cnt; i++) - if (planes[i]) - drmModeFreePlane(planes[i]); - - free(planes); - free(types); - return TDM_ERROR_NONE; failed_atomic_prop_id: -failed: - if (planes) { - for (i = 0; i < vc4_data->plane_res->count_planes; i++) - if (planes[i]) - drmModeFreePlane(planes[i]); - free(planes); - } - - free(types); + if (plane) + drmModeFreePlane(plane); return TDM_ERROR_OPERATION_FAILED; } @@ -951,18 +880,19 @@ tdm_error tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data) { tdm_vc4_output_data *output_data; - int i, count; + int i; tdm_error ret; - drmModeConnectorPtr connector; - drmModeEncoderPtr encoder; - int conn_idx = -1; - int hdmia_idx = -1, hdmib_idx = -1; - int crtc_id = 0, c; + int allocated = 0; + int count = 0; RETURN_VAL_IF_FAIL(LIST_IS_EMPTY(&vc4_data->output_list), TDM_ERROR_OPERATION_FAILED); for (i = 0; i < vc4_data->mode_res->count_connectors; i++) { + drmModeConnectorPtr connector; + drmModeEncoderPtr encoder; + int crtc_id = 0, c, j; + connector = drmModeGetConnector(vc4_data->drm_fd, vc4_data->mode_res->connectors[i]); if (!connector) { @@ -971,192 +901,147 @@ tdm_vc4_display_create_output_list(tdm_vc4_data *vc4_data) goto failed_create; } - /* The TDM drm backend is not interested with disconnected connectors. - * And it only considers 1 connected connector because it is the TDM - * reference backend and can't take care of all hardware devices. - * To support various connectors, planes and crtcs, the new TDM backend - * should be implemented. - */ - if (connector->connection == DRM_MODE_CONNECTED) { - conn_idx = i; + if (connector->count_encoders != 1) { + TDM_ERR("too many encoders: %d", connector->count_encoders); drmModeFreeConnector(connector); - break; + ret = TDM_ERROR_OPERATION_FAILED; + goto failed_create; } - if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) - hdmia_idx = i; - if (connector->connector_type == DRM_MODE_CONNECTOR_HDMIB) - hdmib_idx = i; - - drmModeFreeConnector(connector); - } - - /* use hdmi connector_id if there is no connector which is connected */ - if (conn_idx == -1) { - if (hdmia_idx != -1) - conn_idx = hdmia_idx; - else if (hdmib_idx != -1) - conn_idx = hdmib_idx; - else - conn_idx = 0; - } - - connector = drmModeGetConnector(vc4_data->drm_fd, - vc4_data->mode_res->connectors[conn_idx]); - if (!connector) { - TDM_ERR("no connector"); - ret = TDM_ERROR_OPERATION_FAILED; - goto failed_create; - } - - if (connector->count_encoders != 1) { - TDM_ERR("too many encoders: %d", connector->count_encoders); - drmModeFreeConnector(connector); - ret = TDM_ERROR_OPERATION_FAILED; - goto failed_create; - } + encoder = drmModeGetEncoder(vc4_data->drm_fd, connector->encoders[0]); + if (!encoder) { + TDM_ERR("no encoder"); + drmModeFreeConnector(connector); + ret = TDM_ERROR_OPERATION_FAILED; + goto failed_create; + } - encoder = drmModeGetEncoder(vc4_data->drm_fd, connector->encoders[0]); - if (!encoder) { - TDM_ERR("no encoder"); - drmModeFreeConnector(connector); - ret = TDM_ERROR_OPERATION_FAILED; - goto failed_create; - } + for (c = 0; c < vc4_data->mode_res->count_crtcs; c++) { + if (allocated & (1 << c)) + continue; - for (c = 0; c < vc4_data->mode_res->count_crtcs; c++) { - if ((encoder->possible_crtcs & (1 << c)) == 0) - continue; + if ((encoder->possible_crtcs & (1 << c)) == 0) + continue; - crtc_id = vc4_data->mode_res->crtcs[c]; - break; - } + crtc_id = vc4_data->mode_res->crtcs[c]; + allocated |= (1 << c); + break; + } - if (crtc_id == 0) { - TDM_ERR("no possible crtc"); - drmModeFreeConnector(connector); - drmModeFreeEncoder(encoder); - ret = TDM_ERROR_OPERATION_FAILED; - goto failed_create; - } + if (crtc_id == 0) { + TDM_ERR("no possible crtc"); + drmModeFreeConnector(connector); + drmModeFreeEncoder(encoder); + ret = TDM_ERROR_OPERATION_FAILED; + goto failed_create; + } - output_data = calloc(1, sizeof(tdm_vc4_output_data)); - if (!output_data) { - TDM_ERR("alloc failed"); - drmModeFreeConnector(connector); - drmModeFreeEncoder(encoder); - ret = TDM_ERROR_OUT_OF_MEMORY; - goto failed_create; - } + output_data = calloc(1, sizeof(tdm_vc4_output_data)); + if (!output_data) { + TDM_ERR("alloc failed"); + drmModeFreeConnector(connector); + drmModeFreeEncoder(encoder); + ret = TDM_ERROR_OUT_OF_MEMORY; + goto failed_create; + } - LIST_INITHEAD(&output_data->layer_list); + LIST_INITHEAD(&output_data->layer_list); - output_data->vc4_data = vc4_data; - output_data->connector_id = vc4_data->mode_res->connectors[conn_idx]; - output_data->encoder_id = encoder->encoder_id; - output_data->crtc_id = crtc_id; - output_data->pipe = c; - output_data->connector_type = connector->connector_type; - output_data->connector_type_id = connector->connector_type_id; + output_data->vc4_data = vc4_data; + output_data->connector_id = vc4_data->mode_res->connectors[i]; + output_data->encoder_id = encoder->encoder_id; + output_data->crtc_id = crtc_id; + output_data->pipe = c; + output_data->connector_type = connector->connector_type; + output_data->connector_type_id = connector->connector_type_id; - if (connector->connection == DRM_MODE_CONNECTED) - output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED; - else - output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; + if (connector->connection == DRM_MODE_CONNECTED) + output_data->status = TDM_OUTPUT_CONN_STATUS_CONNECTED; + else + output_data->status = TDM_OUTPUT_CONN_STATUS_DISCONNECTED; - for (i = 0; i < connector->count_props; i++) { - drmModePropertyPtr prop = drmModeGetProperty(vc4_data->drm_fd, - connector->props[i]); - if (!prop) - continue; - if (!strcmp(prop->name, "DPMS")) { - output_data->dpms_prop_id = connector->props[i]; + for (j = 0; j < connector->count_props; j++) { + drmModePropertyPtr prop = drmModeGetProperty(vc4_data->drm_fd, + connector->props[j]); + if (!prop) + continue; + if (!strcmp(prop->name, "DPMS")) { + output_data->dpms_prop_id = connector->props[j]; + drmModeFreeProperty(prop); + break; + } drmModeFreeProperty(prop); - break; } - drmModeFreeProperty(prop); - } - if (output_data->dpms_prop_id == 0) - TDM_WRN("not support DPMS"); + output_data->count_modes = connector->count_modes; + output_data->vc4_modes = calloc(connector->count_modes, sizeof(drmModeModeInfo)); + if (!output_data->vc4_modes) { + TDM_ERR("alloc failed"); + free(output_data); + drmModeFreeConnector(connector); + drmModeFreeEncoder(encoder); + ret = TDM_ERROR_OUT_OF_MEMORY; + goto failed_create; + } - count = 0; - for (i = 0; i < connector->count_modes; i++) { - if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) || - (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT)) - continue; - count++; - } + output_data->output_modes = calloc(connector->count_modes, sizeof(tdm_output_mode)); + if (!output_data->output_modes) { + TDM_ERR("alloc failed"); + free(output_data->vc4_modes); + free(output_data); + drmModeFreeConnector(connector); + drmModeFreeEncoder(encoder); + ret = TDM_ERROR_OUT_OF_MEMORY; + goto failed_create; + } - output_data->count_drm_modes = connector->count_modes; - output_data->count_modes = count; - output_data->vc4_modes = calloc(connector->count_modes, - sizeof(drmModeModeInfo)); - if (!output_data->vc4_modes) { - TDM_ERR("alloc failed"); - free(output_data); - drmModeFreeConnector(connector); - drmModeFreeEncoder(encoder); - ret = TDM_ERROR_OUT_OF_MEMORY; - goto failed_create; - } - output_data->output_modes = calloc(output_data->count_modes, - sizeof(tdm_output_mode)); - if (!output_data->output_modes) { - TDM_ERR("alloc failed"); - free(output_data->vc4_modes); - free(output_data); - drmModeFreeConnector(connector); - drmModeFreeEncoder(encoder); - ret = TDM_ERROR_OUT_OF_MEMORY; - goto failed_create; - } - count = 0; - for (i = 0; i < connector->count_modes; i++) { - output_data->vc4_modes[i] = connector->modes[i]; - if ((connector->modes[i].hdisplay > MODE_WIDTH_LIMIT) || - (connector->modes[i].vdisplay > MODE_HEIGHT_LIMIT)) - continue; - if (connector->modes[i].vrefresh > 60) - continue; - _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[i], - &output_data->output_modes[count]); - count++; - } + count = 0; + for (j = 0; j < connector->count_modes; j++) { + output_data->vc4_modes[j] = connector->modes[j]; + if ((connector->modes[j].hdisplay > MODE_WIDTH_LIMIT) || + (connector->modes[j].vdisplay > MODE_HEIGHT_LIMIT)) + continue; + if (connector->modes[j].vrefresh > 60) + continue; + _tdm_vc4_display_to_tdm_mode(&output_data->vc4_modes[j], + &output_data->output_modes[count]); + count++; + } - if (vc4_data->hwc_mode) - output_data->hwc_enable = 1; + if (vc4_data->hwc_mode) + output_data->hwc_enable = 1; - LIST_ADDTAIL(&output_data->link, &vc4_data->output_list); + LIST_ADDTAIL(&output_data->link, &vc4_data->output_list); - TDM_DBG("output_data(%p) connector_id(%d:%d:%d-%d) encoder_id(%d) crtc_id(%d) pipe(%d) dpms_id(%d)", - output_data, output_data->connector_id, output_data->status, - output_data->connector_type, - output_data->connector_type_id, output_data->encoder_id, output_data->crtc_id, - output_data->pipe, output_data->dpms_prop_id); + TDM_INFO("output_data(%p) connector_id(%d:%d:%d-%d) encoder_id(%d) crtc_id(%d) pipe(%d) dpms_id(%d) count_modes(%d)", + output_data, output_data->connector_id, output_data->status, + output_data->connector_type, + output_data->connector_type_id, output_data->encoder_id, output_data->crtc_id, + output_data->pipe, output_data->dpms_prop_id, output_data->count_modes); - drmModeFreeEncoder(encoder); - drmModeFreeConnector(connector); + drmModeFreeEncoder(encoder); + drmModeFreeConnector(connector); - /* get the atomic prop ids*/ - if (vc4_data->has_atomic) { - ret = _vc4_output_get_atomic_prop_id(vc4_data->drm_fd, output_data->connector_id, - DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", &output_data->atomic_props_ids.crtc_id); - if (ret != TDM_ERROR_NONE) - goto failed_atomic_prop_id; + /* get the atomic prop ids*/ + if (vc4_data->has_atomic) { + ret = _vc4_output_get_atomic_prop_id(vc4_data->drm_fd, output_data->connector_id, + DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", &output_data->atomic_props_ids.crtc_id); + if (ret != TDM_ERROR_NONE) + goto failed_atomic_prop_id; - ret = _vc4_output_get_atomic_prop_id(vc4_data->drm_fd, output_data->crtc_id, - DRM_MODE_OBJECT_CRTC, "MODE_ID", &output_data->atomic_props_ids.crtc_mode_id); - if (ret != TDM_ERROR_NONE) - goto failed_atomic_prop_id; + ret = _vc4_output_get_atomic_prop_id(vc4_data->drm_fd, output_data->crtc_id, + DRM_MODE_OBJECT_CRTC, "MODE_ID", &output_data->atomic_props_ids.crtc_mode_id); + if (ret != TDM_ERROR_NONE) + goto failed_atomic_prop_id; - ret = _vc4_output_get_atomic_prop_id(vc4_data->drm_fd, output_data->crtc_id, + ret = _vc4_output_get_atomic_prop_id(vc4_data->drm_fd, output_data->crtc_id, DRM_MODE_OBJECT_CRTC, "ACTIVE", &output_data->atomic_props_ids.crtc_active); - if (ret != TDM_ERROR_NONE) - goto failed_atomic_prop_id; + if (ret != TDM_ERROR_NONE) + goto failed_atomic_prop_id; + } } - TDM_DBG("output count: %d", vc4_data->mode_res->count_connectors); + TDM_INFO("output count: %d", vc4_data->mode_res->count_connectors); return TDM_ERROR_NONE; failed_atomic_prop_id: @@ -1207,7 +1092,7 @@ vc4_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error) i = 0; LIST_FOR_EACH_ENTRY(output_data, &vc4_data->output_list, link) - outputs[i++] = output_data; + outputs[i++] = output_data; if (error) *error = TDM_ERROR_NONE; @@ -1985,6 +1870,10 @@ vc4_output_set_mode(tdm_output *output, const tdm_output_mode *mode) output_data->current_mode = mode; output_data->mode_changed = 1; + + TDM_INFO("Set the output mode: %s, %d, %d, %d, %d, %d", + mode->name, mode->hdisplay, mode->vdisplay, mode->vrefresh, mode->flags, mode->type); + return TDM_ERROR_NONE; } -- 2.7.4 From e77f78ba19dcd0315eb554e1b4eb0a201d0a60a7 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Mon, 22 Jul 2019 14:28:00 +0900 Subject: [PATCH 14/16] add mirror set/unset vc4 can the capability of the mirror Change-Id: Iaeca4e8d8549fa39555afd1b272305dc543f3105 --- src/tdm_vc4.c | 2 + src/tdm_vc4.h | 4 ++ src/tdm_vc4_display.c | 135 ++++++++++++++++++++++++++++++++++++++++++++++++-- src/tdm_vc4_hwc.c | 35 ++++++++++++- src/tdm_vc4_types.h | 5 ++ 5 files changed, 177 insertions(+), 4 deletions(-) diff --git a/src/tdm_vc4.c b/src/tdm_vc4.c index eb100d4..c3798bb 100644 --- a/src/tdm_vc4.c +++ b/src/tdm_vc4.c @@ -288,6 +288,8 @@ tdm_vc4_init(tdm_display *dpy, tdm_error *error) vc4_func_output.output_get_dpms = vc4_output_get_dpms; vc4_func_output.output_set_mode = vc4_output_set_mode; vc4_func_output.output_get_mode = vc4_output_get_mode; + vc4_func_output.output_set_mirror = vc4_output_set_mirror; + vc4_func_output.output_unset_mirror = vc4_output_unset_mirror; #ifdef HAVE_UDEV vc4_func_output.output_set_status_handler = vc4_output_set_status_handler; #endif diff --git a/src/tdm_vc4.h b/src/tdm_vc4.h index 8f1b863..dffb04e 100644 --- a/src/tdm_vc4.h +++ b/src/tdm_vc4.h @@ -50,6 +50,8 @@ tdm_error vc4_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value); tdm_error vc4_output_get_dpms(tdm_output *output, tdm_output_dpms *dpms_value); tdm_error vc4_output_set_mode(tdm_output *output, const tdm_output_mode *mode); tdm_error vc4_output_get_mode(tdm_output *output, const tdm_output_mode **mode); +tdm_error vc4_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform transform); +tdm_error vc4_output_unset_mirror(tdm_output *output); tdm_error vc4_output_set_status_handler(tdm_output *output, tdm_output_status_handler func, void *user_data); tdm_hwc *vc4_output_get_hwc(tdm_output *output, tdm_error *error); @@ -94,5 +96,7 @@ void tdm_vc4_display_destroy_output_list(tdm_vc4_data *vc4_data); tdm_error tdm_vc4_display_create_layer_list(tdm_vc4_data *vc4_data); tdm_vc4_layer_data * vc4_output_data_get_layer_data(tdm_vc4_output_data *output_data, int layer_zops); +tdm_error vc4_output_data_prepare_mirror_commit(tdm_vc4_output_data *output_data, tbm_surface_h surface); + void tdm_vc4_data_destroy_buffer_list(tdm_vc4_data *vc4_data); #endif /* _TDM_VC4_H_ */ diff --git a/src/tdm_vc4_display.c b/src/tdm_vc4_display.c index c7ae1e7..12f235f 100644 --- a/src/tdm_vc4_display.c +++ b/src/tdm_vc4_display.c @@ -72,7 +72,7 @@ check_hw_restriction(unsigned int crtc_w, unsigned int crtc_h, unsigned int buf_ if (src_x != *new_src_x || src_w != *new_src_w || dst_x != *new_dst_x || dst_w != *new_dst_w) - TDM_DBG("=> buf_w(%d) src(%d,%d) dst(%d,%d), virt(%d) start(%d) end(%d)", + TDM_INFO("=> buf_w(%d) src(%d,%d) dst(%d,%d), virt(%d) start(%d) end(%d)", buf_w, *new_src_x, *new_src_w, *new_dst_x, *new_dst_w, virtual_screen, start, end); @@ -216,6 +216,7 @@ _tdm_vc4_display_set_crtc(tdm_vc4_data *vc4_data, tdm_vc4_output_data *output_da TDM_DBG("drmModeSetCrtc drm_fd(%d) crtc_id(%u) fb_id(%u) mode(%u,%u)", vc4_data->drm_fd, output_data->crtc_id, fb_id, mode->hdisplay, mode->vdisplay); + if (drmModeSetCrtc(vc4_data->drm_fd, output_data->crtc_id, fb_id, 0, 0, &output_data->connector_id, 1, mode)) { @@ -240,6 +241,7 @@ _tdm_vc4_display_set_crtc(tdm_vc4_data *vc4_data, tdm_vc4_output_data *output_da } else { TDM_DBG("drmModeSetCrtc unset drm_fd(%d) crtc_id(%u)", vc4_data->drm_fd, output_data->crtc_id); + if (drmModeSetCrtc(vc4_data->drm_fd, output_data->crtc_id, 0, 0, 0, NULL, 0, NULL)) { TDM_ERR("unset crtc failed: %m"); @@ -409,6 +411,7 @@ _tdm_vc4_display_cb_event(int fd, unsigned int sequence, tdm_vc4_output_data *output_data; tdm_vc4_hwc_data *hwc_data; + if (!event_data) { TDM_ERR("no event data"); return; @@ -416,6 +419,10 @@ _tdm_vc4_display_cb_event(int fd, unsigned int sequence, output_data = event_data->output_data; + + TDM_DBG("==== Atomic Commit Handler pipe, %u, crtc_id, %u connector_id, %u", + output_data->pipe, output_data->crtc_id, output_data->connector_id); + switch (event_data->type) { case TDM_DRM_EVENT_TYPE_PAGEFLIP: if (output_data->commit_func) @@ -1266,8 +1273,10 @@ vc4_output_get_capability(tdm_output *output, tdm_caps_output *caps) drmModeFreeProperty(prop); } - if (output_data->hwc_enable) + if (output_data->hwc_enable) { caps->capabilities |= TDM_OUTPUT_CAPABILITY_HWC; + caps->capabilities |= TDM_OUTPUT_CAPABILITY_MIRROR; + } drmModeFreeObjectProperties(props); drmModeFreeCrtc(crtc); @@ -1551,7 +1560,7 @@ _vc4_layer_make_atomic_request(tdm_vc4_layer_data *layer_data, drmModeAtomicReqP layer_data->info_changed = 0; if (!layer_data->display_buffer) { - TDM_DBG("MakeAtomicRequest: drm_fd(%d) plane_id(%u) crtc_id(%u) off", + TDM_INFO("MakeAtomicRequest: drm_fd(%d) plane_id(%u) crtc_id(%u) off", vc4_data->drm_fd, layer_data->plane_id, output_data->crtc_id); ret = _vc4_layer_add_atomic_properties(layer_data, request, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); @@ -1688,6 +1697,9 @@ _vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data) event_data->output_data = output_data; event_data->user_data = user_data; + TDM_DBG("==== Atomic Commit pipe, %u, crtc_id, %u connector_id, %u", + output_data->pipe, output_data->crtc_id, output_data->connector_id); + if (drmModeAtomicCommit(output_data->vc4_data->drm_fd, request, flags, event_data) < 0) { TDM_ERR("drmModeAtomicCommit failed."); drmModeAtomicFree(request); @@ -1874,6 +1886,12 @@ vc4_output_set_mode(tdm_output *output, const tdm_output_mode *mode) TDM_INFO("Set the output mode: %s, %d, %d, %d, %d, %d", mode->name, mode->hdisplay, mode->vdisplay, mode->vrefresh, mode->flags, mode->type); + ret = _tdm_vc4_display_set_crtc(output_data->vc4_data, output_data, 1); + if (ret != TDM_ERROR_NONE) { + TDM_ERR("fail to set crtc."); + return TDM_ERROR_OPERATION_FAILED; + } + return TDM_ERROR_NONE; } @@ -1890,6 +1908,53 @@ vc4_output_get_mode(tdm_output *output, const tdm_output_mode **mode) return TDM_ERROR_NONE; } +tdm_error +vc4_output_set_mirror(tdm_output *output, tdm_output *src_output, tdm_transform transform) +{ + tdm_vc4_output_data *output_data = (tdm_vc4_output_data *)output; + tdm_vc4_output_data *src_output_data = (tdm_vc4_output_data *)src_output; + + RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER); + RETURN_VAL_IF_FAIL(src_output_data, TDM_ERROR_INVALID_PARAMETER); + + if (!output_data->hwc_enable) { + TDM_ERR("Output Mirroring is not Implemented."); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + output_data->mirror_src_output_data = src_output_data; + src_output_data->mirror_dst_output_data = output_data; + src_output_data->mirror_dst_transform = transform; + + TDM_INFO("Set the mirror. transform(%d)", transform); + + return TDM_ERROR_NONE; +} + +tdm_error +vc4_output_unset_mirror(tdm_output *output) +{ + tdm_vc4_output_data *output_data = (tdm_vc4_output_data *)output; + tdm_vc4_output_data *src_output_data; + + RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER); + + if (!output_data->hwc_enable) { + TDM_ERR("Output Mirroring is not Implemented."); + return TDM_ERROR_NOT_IMPLEMENTED; + } + + src_output_data = output_data->mirror_src_output_data; + + src_output_data->mirror_dst_transform = TDM_TRANSFORM_NORMAL; + src_output_data->mirror_dst_output_data = NULL; + output_data->mirror_src_output_data = NULL; + + TDM_INFO("Unet the mirror."); + + return TDM_ERROR_NONE; +} + tdm_hwc * vc4_output_get_hwc(tdm_output *output, tdm_error *error) { @@ -2350,3 +2415,67 @@ vc4_output_data_get_layer_data(tdm_vc4_output_data *output_data, int layer_zpos) return NULL; } + +static void +_vc4_output_data_center_rect_get(int src_w, int src_h, int dst_w, int dst_h, tdm_pos *fit) +{ + float rh; + + if (src_w <= 0 || src_h <= 0 || dst_w <= 0 || dst_h <= 0 || !fit) + return; + + rh = (float) src_h / src_w; + + fit->x = 0; + fit->y = 0; + fit->w = dst_w; + fit->h = dst_w * rh; + + //TDM_ERR("=###### (%d, %d, %d, %d) (%f)", fit->x, fit->y, fit->w, fit->h, rh); +} + +tdm_error +vc4_output_data_prepare_mirror_commit(tdm_vc4_output_data *output_data, tbm_surface_h surface) +{ + tdm_vc4_layer_data *layer_data = NULL; + tdm_info_layer info; + tbm_surface_info_s surf_info; + tdm_error ret; + tdm_pos dst_pos; + + RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER); + RETURN_VAL_IF_FAIL(surface, TDM_ERROR_INVALID_PARAMETER); + + RETURN_VAL_IF_FAIL(output_data->current_mode, TDM_ERROR_OPERATION_FAILED); + + layer_data = vc4_output_data_get_layer_data(output_data, 0); + RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_OPERATION_FAILED); + + memset(&dst_pos, 0, sizeof(tdm_pos)); + + tbm_surface_get_info(surface, &surf_info); + // TODO: NEED to fix the calculation of the dst_pos + _vc4_output_data_center_rect_get(surf_info.width, surf_info.height, + output_data->current_mode->hdisplay, output_data->current_mode->hdisplay, + &dst_pos); + + info.src_config.size.h = surf_info.width; + info.src_config.size.v = surf_info.height; + info.src_config.pos.x = 0; + info.src_config.pos.y = 0; + info.src_config.pos.w = surf_info.width; + info.src_config.pos.h = surf_info.height; + info.dst_pos.x = dst_pos.x; + info.dst_pos.y = dst_pos.y; + info.dst_pos.w = dst_pos.w; + info.dst_pos.h = dst_pos.h; + info.transform = TDM_TRANSFORM_NORMAL; + + ret = vc4_layer_set_info((tdm_layer *)layer_data, &info); + RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + + ret = vc4_layer_set_buffer(layer_data, surface); + RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + + return TDM_ERROR_NONE; +} \ No newline at end of file diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index 0d47db9..14de29c 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -583,13 +583,29 @@ tdm_error vc4_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types) { tdm_vc4_hwc_data *hwc_data = hwc; + tdm_vc4_output_data *output_data; + tdm_vc4_hwc_window_data **composited_list = NULL; + int i; RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER); RETURN_VAL_IF_FAIL(num_types != NULL, TDM_ERROR_INVALID_PARAMETER); + output_data = hwc_data->output_data; + RETURN_VAL_IF_FAIL(output_data != NULL, TDM_ERROR_INVALID_PARAMETER); + TDM_INFO(" ==============Validate================================="); - _vc4_hwc_apply_policy(hwc_data, composited_wnds, num_wnds); + /* mirror is set. all clients should be the client type. */ + if (output_data->mirror_dst_output_data) { + composited_list = (tdm_vc4_hwc_window_data **)composited_wnds; + for (i = 0; i < num_wnds; i++) { + composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT; + } + hwc_data->need_target_window = 1; + hwc_data->target_hwc_window->lzpos = ZPOS_0; + } else { + _vc4_hwc_apply_policy(hwc_data, composited_wnds, num_wnds); + } *num_types = _vc4_hwc_get_changed_number(hwc_data); @@ -638,16 +654,27 @@ tdm_error vc4_hwc_accept_validation(tdm_hwc *hwc) { tdm_vc4_hwc_data *hwc_data = hwc; + tdm_vc4_output_data *output_data; tdm_error ret = TDM_ERROR_NONE; RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER); RETURN_VAL_IF_FAIL(hwc_data->output_data != NULL, TDM_ERROR_INVALID_PARAMETER); + output_data = hwc_data->output_data; + TDM_DBG(" ==============Accept Changes Done================================="); ret = _vc4_hwc_prepare_commit(hwc_data); RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + /* prepare_mirror_commit for mirroring */ + if (output_data->mirror_dst_output_data) { + ret = vc4_output_data_prepare_mirror_commit(output_data->mirror_dst_output_data, + hwc_data->target_hwc_window->surface); + if (ret != TDM_ERROR_NONE) + TDM_ERR("fail to prepare mirror_commit."); + } + return TDM_ERROR_NONE; } @@ -668,6 +695,12 @@ vc4_hwc_commit(tdm_hwc *hwc, int sync, void *user_data) ret = vc4_output_commit(output_data, sync, user_data); RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + /* commit for mirroring */ + if (output_data->mirror_dst_output_data) { + ret = vc4_output_commit(output_data->mirror_dst_output_data, sync, NULL); + RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret); + } + return TDM_ERROR_NONE; } diff --git a/src/tdm_vc4_types.h b/src/tdm_vc4_types.h index ed71a75..dc290be 100644 --- a/src/tdm_vc4_types.h +++ b/src/tdm_vc4_types.h @@ -201,6 +201,11 @@ struct _tdm_vc4_output_data { uint32_t crtc_mode_id; uint32_t crtc_active; } atomic_props_ids; + + /* mirroring output_data, only one support */ + tdm_vc4_output_data *mirror_dst_output_data; + tdm_transform mirror_dst_transform; + tdm_vc4_output_data *mirror_src_output_data; }; struct _tdm_vc4_layer_data { -- 2.7.4 From 5f18d88aa6307cc734f7345afc75abf29fb129a0 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 9 Aug 2019 17:13:17 +0900 Subject: [PATCH 15/16] fix the zpos of the layers Change-Id: I7a94133ec8cd02140a74bdbe5cb8b62862e8be85 --- src/tdm_vc4_hwc.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/tdm_vc4_hwc.c b/src/tdm_vc4_hwc.c index 14de29c..2d6a064 100644 --- a/src/tdm_vc4_hwc.c +++ b/src/tdm_vc4_hwc.c @@ -10,11 +10,10 @@ #define NUM_LAYERS 4 #define NUM_BUFFERS 3 -#define NUM_UI_LAYERS 3 +#define NUM_UI_LAYERS 2 -#define ZPOS_MAX 4 -#define ZPOS_CURSOR 3 -#define ZPOS_2 2 +#define ZPOS_MAX 3 +#define ZPOS_CURSOR 2 #define ZPOS_1 1 #define ZPOS_0 0 #define ZPOS_VIDEO1 0 @@ -326,7 +325,7 @@ _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_w int device_count = 0; int video_count = 0; int cursor_count = 0; - int ui_lzpos_top = ZPOS_2; + int ui_lzpos_top = ZPOS_1; int ui_lzpos_bottom = ZPOS_0; int num_ui_layers = NUM_UI_LAYERS; int set_clients_below = 0; -- 2.7.4 From 72b164d14edcb72786aa9c58d6787b42fc95b970 Mon Sep 17 00:00:00 2001 From: SooChan Lim Date: Fri, 9 Aug 2019 18:57:52 +0900 Subject: [PATCH 16/16] Package version up to 1.0.4 Change-Id: I485d2796ca79a557bf249e982a7976a8a2fcd3bb --- packaging/libtdm-vc4.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/libtdm-vc4.spec b/packaging/libtdm-vc4.spec index 091c44c..f48d36f 100644 --- a/packaging/libtdm-vc4.spec +++ b/packaging/libtdm-vc4.spec @@ -1,5 +1,5 @@ Name: libtdm-vc4 -Version: 1.0.3 +Version: 1.0.4 Release: 0 Summary: Tizen Display Manager VC4 Back-End Library Group: Development/Libraries -- 2.7.4