5 #include <tdm_helper.h>
13 #define NUM_UI_LAYERS 3
21 #define ZPOS_NONE -999
23 tbm_format hwc_window_video_formats[] = {
29 _comp_to_str(tdm_hwc_window_composition composition_type)
31 if (composition_type == TDM_HWC_WIN_COMPOSITION_CLIENT)
33 else if (composition_type == TDM_HWC_WIN_COMPOSITION_DEVICE)
35 else if (composition_type == TDM_HWC_WIN_COMPOSITION_CURSOR)
37 else if (composition_type == TDM_HWC_WIN_COMPOSITION_VIDEO)
39 else if (composition_type == TDM_HWC_WIN_COMPOSITION_NONE)
46 _vc4_hwc_cursor_buffer_unset(tdm_vc4_hwc_window_data *hwc_window_data)
48 hwc_window_data->surface = NULL;
49 hwc_window_data->cursor_img_surface = 0;
51 hwc_window_data->info.src_config.pos.w = hwc_window_data->cursor_img.width;
52 hwc_window_data->info.src_config.pos.h = hwc_window_data->cursor_img.height;
53 hwc_window_data->info.dst_pos.w = hwc_window_data->cursor_img.width;
54 hwc_window_data->info.dst_pos.h = hwc_window_data->cursor_img.height;
60 _vc4_hwc_cursor_adjust_pos(tdm_vc4_hwc_window_data *hwc_window_data)
64 /* dst pos of cursor is possible set by negative value
65 * this is temporary code.
68 x = hwc_window_data->info.dst_pos.x;
69 y = hwc_window_data->info.dst_pos.y;
71 if (x < 0) hwc_window_data->info.dst_pos.x = 0;
72 if (y < 0) hwc_window_data->info.dst_pos.y = 0;
76 _vc4_hwc_cursor_buffer_set(tdm_vc4_hwc_data *hwc_data, tdm_vc4_hwc_window_data *hwc_window_data)
78 tbm_surface_h cursor_tsurface = NULL;
79 tbm_surface_info_s tsurface_info;
80 tbm_surface_error_e ret = TBM_SURFACE_ERROR_NONE;
81 int img_w, img_h, new_w, new_h;
82 tbm_format new_format;
83 unsigned int flags = TBM_BO_SCANOUT;
84 void *src_ptr = NULL, *dst_ptr = NULL;
88 _vc4_hwc_cursor_adjust_pos(hwc_window_data);
90 if (!hwc_window_data->cursor_img_refresh && hwc_window_data->surface)
93 img_w = hwc_window_data->cursor_img.width;
94 img_h = hwc_window_data->cursor_img.height;
95 new_format = hwc_window_data->info.src_config.format;
97 /* cursor restriction to set the cursor layer */
98 new_w = (CURSOR_MIN_W > img_w) ? CURSOR_MIN_W : img_w;
99 new_h = (CURSOR_MIN_H > img_h) ? CURSOR_MIN_H : img_h;
101 if (hwc_data->cursor_tsurface) {
102 tbm_surface_internal_unref(hwc_data->cursor_tsurface);
103 hwc_data->cursor_tsurface = NULL;
106 cursor_tsurface = tbm_surface_internal_create_with_flags(new_w, new_h, new_format, flags);
107 RETURN_VAL_IF_FAIL(cursor_tsurface, 0);
109 hwc_data->cursor_tsurface = cursor_tsurface;
110 ret = tbm_surface_map(hwc_data->cursor_tsurface, TBM_SURF_OPTION_WRITE, &tsurface_info);
111 if (ret != TBM_SURFACE_ERROR_NONE) {
112 TDM_ERR("Failed to map tsurface\n");
113 tbm_surface_internal_unref(hwc_data->cursor_tsurface);
114 hwc_data->cursor_tsurface = NULL;
118 src_ptr = hwc_window_data->cursor_img.ptr;
119 dst_ptr = tsurface_info.planes[0].ptr;
120 src_stride = hwc_window_data->cursor_img.stride;
122 memset(dst_ptr, 0, tsurface_info.planes[0].stride * tsurface_info.height);
124 for (i = 0 ; i < img_h ; i++) {
125 memcpy(dst_ptr, src_ptr, src_stride);
126 dst_ptr += tsurface_info.planes[0].stride;
127 src_ptr += src_stride;
130 tbm_surface_unmap(hwc_data->cursor_tsurface);
132 hwc_window_data->surface = hwc_data->cursor_tsurface;
133 hwc_window_data->cursor_img_surface = 1;
135 /* fix the dst_pos info of the cursor window */
136 hwc_window_data->info.src_config.pos.w = new_w;
137 hwc_window_data->info.src_config.pos.h = new_h;
138 hwc_window_data->info.dst_pos.w = new_w;
139 hwc_window_data->info.dst_pos.h = new_h;
141 hwc_window_data->cursor_img_refresh = 0;
147 _print_validate_result(tdm_vc4_hwc_data *hwc_data, tdm_hwc_window **composited_wnds, uint32_t num_wnds)
149 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
152 for (i = 0; i < num_wnds; i++) {
153 hwc_window_data = composited_wnds[i];
154 switch (hwc_window_data->validated_type) {
155 case TDM_HWC_WIN_COMPOSITION_CLIENT:
156 TDM_DBG(" window(%p) %s -> %s : lzpos(%d) -- {%s} on TARGET WINDOW", hwc_window_data,
157 _comp_to_str(hwc_window_data->client_type),
158 _comp_to_str(hwc_window_data->validated_type),
159 hwc_data->target_hwc_window->lzpos,
160 hwc_window_data->name ? hwc_window_data->name : "NONE");
162 case TDM_HWC_WIN_COMPOSITION_DEVICE:
163 case TDM_HWC_WIN_COMPOSITION_VIDEO:
164 case TDM_HWC_WIN_COMPOSITION_CURSOR:
165 case TDM_HWC_WIN_COMPOSITION_NONE:
166 TDM_DBG(" window(%p) %s -> %s : lzpos(%d) -- {%s}", hwc_window_data,
167 _comp_to_str(hwc_window_data->client_type),
168 _comp_to_str(hwc_window_data->validated_type),
169 hwc_window_data->lzpos,
170 hwc_window_data->name ? hwc_window_data->name : "NONE");
179 _vc4_hwc_window_can_set_on_hw_layer(tdm_vc4_hwc_window_data *hwc_window_data)
181 if (!hwc_window_data->surface)
184 if (hwc_window_data->info.transform != TDM_TRANSFORM_NORMAL)
187 if (hwc_window_data->info.src_config.pos.w != hwc_window_data->info.dst_pos.w)
190 if (hwc_window_data->info.src_config.pos.h != hwc_window_data->info.dst_pos.h)
193 if (!IS_RGB(hwc_window_data->info.src_config.format))
196 if (hwc_window_data->info.dst_pos.x > hwc_window_data->hwc_data->output_data->current_mode->hdisplay ||
197 hwc_window_data->info.dst_pos.y > hwc_window_data->hwc_data->output_data->current_mode->vdisplay)
200 if (hwc_window_data->info.src_config.pos.w < MIN_WIDTH || hwc_window_data->info.src_config.pos.w % 2)
206 static tbm_surface_queue_h
207 _vc4_hwc_window_get_tbm_buffer_queue(tdm_hwc_window *hwc_window, tdm_error *error)
209 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
210 tbm_surface_queue_h tqueue = NULL;
215 *error = TDM_ERROR_INVALID_PARAMETER;
217 RETURN_VAL_IF_FAIL(hwc_window != NULL, NULL);
219 hwc_window_data = hwc_window;
221 width = hwc_window_data->info.src_config.size.h;
222 height = hwc_window_data->info.src_config.size.v;
223 format = hwc_window_data->info.src_config.format;
225 tqueue = tbm_surface_queue_create(NUM_BUFFERS, width, height, format, TBM_BO_SCANOUT);
227 *error = TDM_ERROR_OPERATION_FAILED;
228 RETURN_VAL_IF_FAIL(tqueue != NULL, NULL);
231 *error = TDM_ERROR_NONE;
237 _vc4_hwc_layer_attach_window(tdm_vc4_layer_data *layer_data, tdm_vc4_hwc_window_data *hwc_window_data)
239 tdm_error ret = TDM_ERROR_NONE;
241 RETURN_VAL_IF_FAIL(layer_data, TDM_ERROR_OPERATION_FAILED);
243 if (hwc_window_data == NULL || hwc_window_data->surface == NULL) {
244 if (layer_data->display_buffer)
245 ret = vc4_layer_unset_buffer(layer_data);
246 RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
248 ret = vc4_layer_set_info((tdm_layer *)layer_data, (tdm_info_layer *)&(hwc_window_data->info));
249 RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
250 RETURN_VAL_IF_FAIL(hwc_window_data->surface != NULL, TDM_ERROR_INVALID_PARAMETER);
251 ret = vc4_layer_set_buffer(layer_data, hwc_window_data->surface);
252 RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
259 _vc4_hwc_prepare_commit(tdm_vc4_hwc_data *hwc_data)
261 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
262 tdm_vc4_layer_data *layer_data = NULL;
263 int use_layers_zpos[NUM_LAYERS] = {0,};
266 /* set target hwc window to the layer */
267 if (hwc_data->need_target_window) {
268 layer_data = vc4_output_data_get_layer_data(hwc_data->output_data, hwc_data->target_hwc_window->lzpos);
269 _vc4_hwc_layer_attach_window(layer_data, hwc_data->target_hwc_window);
270 use_layers_zpos[hwc_data->target_hwc_window->lzpos] = 1;
273 /* set the hwc_windows to the layers */
274 LIST_FOR_EACH_ENTRY_REV(hwc_window_data, &hwc_data->hwc_window_list, link) {
275 if (hwc_window_data->validated_type == TDM_HWC_WIN_COMPOSITION_NONE ||
276 hwc_window_data->validated_type == TDM_HWC_WIN_COMPOSITION_CLIENT) {
278 if (hwc_window_data->cursor_img_surface)
279 _vc4_hwc_cursor_buffer_unset(hwc_window_data);
284 if (hwc_window_data == hwc_data->target_hwc_window)
287 /* set the cursor buffer HERE if it needs */
288 if (hwc_window_data->validated_type == TDM_HWC_WIN_COMPOSITION_CURSOR)
289 _vc4_hwc_cursor_buffer_set(hwc_data, hwc_window_data);
291 layer_data = vc4_output_data_get_layer_data(hwc_data->output_data, hwc_window_data->lzpos);
292 _vc4_hwc_layer_attach_window(layer_data, hwc_window_data);
293 use_layers_zpos[hwc_window_data->lzpos] = 1;
296 /* unset the unused layers */
297 for (lzpos = 0; lzpos < NUM_LAYERS; lzpos++) {
298 if (use_layers_zpos[lzpos])
301 layer_data = vc4_output_data_get_layer_data(hwc_data->output_data, lzpos);
305 _vc4_hwc_layer_attach_window(layer_data, NULL);
309 for (lzpos = NUM_LAYERS -1 ; lzpos >= 0; lzpos--) {
310 if (use_layers_zpos[lzpos])
311 TDM_DBG(" lzpos(%d) : %s", lzpos, use_layers_zpos[lzpos] ? "SET" : "UNSET");
314 return TDM_ERROR_NONE;
317 /* assign the validated_type to the composited_wnds
318 * assign the layer_zpos to the composited_wnds
321 _vc4_hwc_apply_policy(tdm_vc4_hwc_data *hwc_data , tdm_hwc_window **composited_wnds, uint32_t num_wnds)
323 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
324 tdm_vc4_hwc_window_data **composited_list = NULL;
325 int client_count = 0;
326 int device_count = 0;
328 int cursor_count = 0;
329 int ui_lzpos_top = ZPOS_2;
330 int ui_lzpos_bottom = ZPOS_0;
331 int num_ui_layers = NUM_UI_LAYERS;
332 int set_clients_below = 0;
335 composited_list = (tdm_vc4_hwc_window_data **)composited_wnds;
337 /* initialize the need_target_window */
338 hwc_data->need_target_window = 0;
340 /* initialize the validated_types */
341 LIST_FOR_EACH_ENTRY_REV(hwc_window_data, &hwc_data->hwc_window_list, link) {
342 if (hwc_window_data->validated_type != TDM_HWC_WIN_COMPOSITION_NONE)
343 hwc_window_data->validated_type = TDM_HWC_WIN_COMPOSITION_NONE;
346 /* use the target_window to commit when there is no window. */
348 hwc_data->need_target_window = 1;
349 hwc_data->target_hwc_window->lzpos = ui_lzpos_bottom;
353 /* 1. first check validate_type without target_window */
354 for (i = 0; i < num_wnds; i++) {
355 switch (composited_list[i]->client_type) {
356 case TDM_HWC_WIN_COMPOSITION_VIDEO:
357 composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_VIDEO;
360 case TDM_HWC_WIN_COMPOSITION_CURSOR:
361 if (set_clients_below) break;
362 if (cursor_count > 0) break;
364 composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CURSOR;
367 case TDM_HWC_WIN_COMPOSITION_DEVICE:
368 if (set_clients_below) break;
369 if (num_ui_layers <= 0) break;
370 if (!_vc4_hwc_window_can_set_on_hw_layer(composited_list[i])) break;
372 composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_DEVICE;
380 composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT;
382 set_clients_below = 1;
385 /* 2. check need target window and set ui_lzpos top and bottom */
386 num_ui_layers = NUM_UI_LAYERS;
388 if (video_count > 0) {
393 if (client_count > 0) {
396 hwc_data->need_target_window = 1;
397 hwc_data->target_hwc_window->lzpos = ui_lzpos_bottom - 1;
400 if (num_ui_layers > device_count)
401 ui_lzpos_top = ui_lzpos_bottom + device_count - 1;
403 /* 3. set lzpos and modify validate_type with target_window */
404 for (i = 0; i < num_wnds; i++) {
405 switch (composited_list[i]->validated_type) {
406 case TDM_HWC_WIN_COMPOSITION_VIDEO:
407 composited_list[i]->lzpos = ZPOS_VIDEO1;
409 case TDM_HWC_WIN_COMPOSITION_CURSOR:
410 composited_list[i]->lzpos = ZPOS_CURSOR;
412 case TDM_HWC_WIN_COMPOSITION_DEVICE:
413 if (num_ui_layers <= 0) break;
414 composited_list[i]->lzpos = ui_lzpos_top;
422 composited_list[i]->validated_type = TDM_HWC_WIN_COMPOSITION_CLIENT;
423 composited_list[i]->lzpos = ZPOS_NONE;
428 _vc4_hwc_get_changed_number(tdm_vc4_hwc_data *hwc_data)
431 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
433 LIST_FOR_EACH_ENTRY(hwc_window_data, &hwc_data->hwc_window_list, link) {
434 if (hwc_window_data->client_type == TDM_HWC_WIN_COMPOSITION_NONE)
437 if (hwc_window_data->client_type != hwc_window_data->validated_type)
445 _vc4_hwc_create_window(tdm_hwc *hwc, tdm_hwc_window_info *info, tdm_error *error)
447 tdm_vc4_hwc_data *hwc_data = hwc;
448 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
451 *error = TDM_ERROR_NONE;
454 TDM_ERR("invalid params");
456 *error = TDM_ERROR_INVALID_PARAMETER;
460 hwc_window_data = calloc(1, sizeof(tdm_vc4_hwc_window_data));
461 if (!hwc_window_data) {
462 TDM_ERR("alloc failed");
464 *error = TDM_ERROR_OUT_OF_MEMORY;
468 hwc_window_data->hwc_data = hwc_data;
471 memcpy(&hwc_window_data->info, info, sizeof(tdm_hwc_window_info));
473 LIST_INITHEAD(&hwc_window_data->link);
475 return hwc_window_data;
479 vc4_hwc_create_window(tdm_hwc *hwc, tdm_error *error)
481 tdm_vc4_hwc_data *hwc_data = hwc;
482 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
484 RETURN_VAL_IF_FAIL(hwc_data, NULL);
486 hwc_window_data = _vc4_hwc_create_window(hwc_data, NULL, error);
487 RETURN_VAL_IF_FAIL(hwc_window_data, NULL);
489 LIST_ADDTAIL(&hwc_window_data->link, &hwc_data->hwc_window_list);
491 TDM_DBG("hwc_window(%p) create", hwc_window_data);
493 *error = TDM_ERROR_NONE;
495 return hwc_window_data;
499 vc4_hwc_get_video_supported_formats(tdm_hwc *hwc, const tbm_format **formats, int *count)
501 RETURN_VAL_IF_FAIL(hwc != NULL, TDM_ERROR_INVALID_PARAMETER);
502 RETURN_VAL_IF_FAIL(formats != NULL, TDM_ERROR_INVALID_PARAMETER);
503 RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
505 // TODO: fix these formats.
506 *formats = hwc_window_video_formats;
507 *count = sizeof(hwc_window_video_formats) / sizeof(tbm_format);
509 return TDM_ERROR_NONE;
513 vc4_hwc_get_capabilities(tdm_hwc *hwc, tdm_hwc_capability *capabilities)
515 RETURN_VAL_IF_FAIL(hwc != NULL, TDM_ERROR_INVALID_PARAMETER);
516 RETURN_VAL_IF_FAIL(capabilities != NULL, TDM_ERROR_INVALID_PARAMETER);
518 *capabilities |= TDM_HWC_CAPABILITY_VIDEO_SCALE;
520 return TDM_ERROR_NONE;
524 vc4_hwc_get_available_properties(tdm_hwc *hwc, const tdm_prop **props, int *count)
526 tdm_vc4_hwc_data *hwc_data = hwc;
528 RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER);
529 RETURN_VAL_IF_FAIL(props != NULL, TDM_ERROR_INVALID_PARAMETER);
530 RETURN_VAL_IF_FAIL(count != NULL, TDM_ERROR_INVALID_PARAMETER);
535 return TDM_ERROR_NONE;
539 vc4_hwc_get_client_target_buffer_queue(tdm_hwc *hwc, tdm_error *error)
541 tdm_vc4_hwc_data *hwc_data = hwc;
542 tbm_surface_queue_h tqueue = NULL;
545 *error = TDM_ERROR_INVALID_PARAMETER;
547 RETURN_VAL_IF_FAIL(hwc_data != NULL, NULL);
549 if (hwc_data->target_hwc_window == NULL) {
551 *error = TDM_ERROR_OPERATION_FAILED;
555 tqueue = _vc4_hwc_window_get_tbm_buffer_queue(hwc_data->target_hwc_window, error);
556 RETURN_VAL_IF_FAIL(tqueue, NULL);
559 *error = TDM_ERROR_NONE;
565 vc4_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h buffer, tdm_region damage)
567 tdm_vc4_hwc_data *hwc_data = hwc;
570 RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER);
571 RETURN_VAL_IF_FAIL(hwc_data->target_hwc_window != NULL, TDM_ERROR_OPERATION_FAILED);
573 err = vc4_hwc_window_set_buffer(hwc_data->target_hwc_window, buffer);
574 RETURN_VAL_IF_FAIL(err == TDM_ERROR_NONE, err);
576 err = vc4_hwc_window_set_buffer_damage(hwc_data->target_hwc_window, damage);
577 RETURN_VAL_IF_FAIL(err == TDM_ERROR_NONE, err);
579 return TDM_ERROR_NONE;
583 vc4_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types)
585 tdm_vc4_hwc_data *hwc_data = hwc;
587 RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER);
588 RETURN_VAL_IF_FAIL(num_types != NULL, TDM_ERROR_INVALID_PARAMETER);
590 TDM_INFO(" ==============Validate=================================");
592 _vc4_hwc_apply_policy(hwc_data, composited_wnds, num_wnds);
594 *num_types = _vc4_hwc_get_changed_number(hwc_data);
596 _print_validate_result(hwc_data, composited_wnds, num_wnds);
598 return TDM_ERROR_NONE;
602 vc4_hwc_get_changed_composition_types(tdm_hwc *hwc, uint32_t *num_elements,
603 tdm_hwc_window **hwc_wnds, tdm_hwc_window_composition *composition_types)
605 tdm_vc4_hwc_data *hwc_data = hwc;
606 tdm_vc4_hwc_window_data *hwc_window_data = NULL;
609 RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER);
610 RETURN_VAL_IF_FAIL(num_elements != NULL, TDM_ERROR_INVALID_PARAMETER);
612 if ((hwc_wnds == NULL) || (composition_types == NULL)) {
613 *num_elements = _vc4_hwc_get_changed_number(hwc_data);
614 return TDM_ERROR_NONE;
617 LIST_FOR_EACH_ENTRY_REV(hwc_window_data, &hwc_data->hwc_window_list, link) {
618 if (hwc_window_data->client_type == TDM_HWC_WIN_COMPOSITION_NONE)
621 if (num >= *num_elements)
624 if (hwc_window_data->client_type != hwc_window_data->validated_type) {
625 composition_types[num] = hwc_window_data->validated_type;
626 hwc_wnds[num] = hwc_window_data;
631 /* set real num of changed composition types */
634 return TDM_ERROR_NONE;
638 vc4_hwc_accept_validation(tdm_hwc *hwc)
640 tdm_vc4_hwc_data *hwc_data = hwc;
641 tdm_error ret = TDM_ERROR_NONE;
643 RETURN_VAL_IF_FAIL(hwc_data != NULL, TDM_ERROR_INVALID_PARAMETER);
644 RETURN_VAL_IF_FAIL(hwc_data->output_data != NULL, TDM_ERROR_INVALID_PARAMETER);
646 TDM_DBG(" ==============Accept Changes Done=================================");
648 ret = _vc4_hwc_prepare_commit(hwc_data);
649 RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
651 return TDM_ERROR_NONE;
655 vc4_hwc_commit(tdm_hwc *hwc, int sync, void *user_data)
657 tdm_vc4_hwc_data *hwc_data = hwc;
658 tdm_vc4_output_data *output_data = NULL;
661 RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER);
663 output_data = hwc_data->output_data;
664 RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
666 TDM_INFO(" ==============COMMIT=================================");
668 ret = vc4_output_commit(output_data, sync, user_data);
669 RETURN_VAL_IF_FAIL(ret == TDM_ERROR_NONE, ret);
671 return TDM_ERROR_NONE;
675 vc4_hwc_set_commit_handler(tdm_hwc *hwc, tdm_hwc_commit_handler func)
677 tdm_vc4_hwc_data *hwc_data = hwc;
679 RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER);
680 RETURN_VAL_IF_FAIL(func, TDM_ERROR_INVALID_PARAMETER);
682 hwc_data->commit_func = func;
684 return TDM_ERROR_NONE;
688 vc4_hwc_target_window_set_info(tdm_vc4_hwc_data *hwc_data, int width, int height)
690 tdm_hwc_window_info info = {0};
691 tdm_vc4_hwc_window_data *target_hwc_window;
692 tdm_error ret = TDM_ERROR_NONE;
694 RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER);
695 RETURN_VAL_IF_FAIL(hwc_data->target_hwc_window, TDM_ERROR_INVALID_PARAMETER);
697 target_hwc_window = hwc_data->target_hwc_window;
701 info.dst_pos.w = width;
702 info.dst_pos.h = height;
704 info.src_config.pos.x = 0;
705 info.src_config.pos.y = 0;
706 info.src_config.pos.w = width;
707 info.src_config.pos.h = height;
709 info.src_config.size.h = width;
710 info.src_config.size.v = height;
711 info.src_config.format = TBM_FORMAT_ARGB8888;
713 ret = vc4_hwc_window_set_info(target_hwc_window, &info);
714 if (ret != TDM_ERROR_NONE) {
715 TDM_ERR("set info target hwc window failed (%d)", ret);
716 return TDM_ERROR_OPERATION_FAILED;
719 return TDM_ERROR_NONE;
723 vc4_hwc_initailize_target_window(tdm_vc4_hwc_data *hwc_data)
725 tdm_hwc_window_info info = {0};
726 tdm_error ret = TDM_ERROR_NONE;
727 tdm_vc4_hwc_window_data *target_hwc_window;
729 RETURN_VAL_IF_FAIL(hwc_data, TDM_ERROR_INVALID_PARAMETER);
736 info.src_config.pos.x = 0;
737 info.src_config.pos.y = 0;
738 info.src_config.pos.w = 1;
739 info.src_config.pos.h = 2;
741 info.src_config.size.h = 2;
742 info.src_config.size.v = 1;
743 info.src_config.format = TBM_FORMAT_ARGB8888;
745 target_hwc_window = _vc4_hwc_create_window(hwc_data, &info, &ret);
746 if (ret != TDM_ERROR_NONE) {
747 TDM_ERR("create target hwc window failed (%d)", ret);
748 return TDM_ERROR_OPERATION_FAILED;
751 if (hwc_data->target_hwc_window)
752 vc4_hwc_window_destroy(hwc_data->target_hwc_window);
754 hwc_data->target_hwc_window = target_hwc_window;
755 hwc_data->need_set_crtc = 1;
757 return TDM_ERROR_NONE;