return (e_layer_1->zpos - e_layer_2->zpos);
}
+static int
+_e_output_cb_hwc_window_sort(const void *d1, const void *d2)
+{
+ E_Hwc_Window *hwc_window1 = (E_Hwc_Window *)d1;
+ E_Hwc_Window *hwc_window2 = (E_Hwc_Window *)d2;
+
+ if (!hwc_window1) return(1);
+ if (!hwc_window2) return(-1);
+
+ return (e_hwc_window_zpos_get(hwc_window1) - e_hwc_window_zpos_get(hwc_window2));
+}
+
+static Eina_Bool
+_e_output_vbuf_capture_hwc_windows(E_Output *output, E_Hwc_Window *hwc_window, E_Comp_Wl_Video_Buf *vbuf, int rotate, Eina_Bool rotate_check)
+{
+ int w = 0, h = 0;
+ E_Comp_Wl_Video_Buf *tmp = NULL;
+ tbm_surface_h surface = NULL;
+ Eina_Rectangle showing_pos = {0, };
+ Eina_Rectangle dst_pos = {0, };
+ Eina_Rectangle src_crop = {0, };
+ Eina_Rectangle dst_crop = {0, };
+ Eina_Bool ret = EINA_FALSE;
+
+ e_output_size_get(output, &w, &h);
+
+ surface = e_hwc_window_displaying_surface_get(hwc_window);
+ if (!surface) return EINA_FALSE;
+
+ tmp = e_comp_wl_video_buffer_create_tbm(surface);
+ if (tmp == NULL)
+ return EINA_FALSE;
+
+ ret = _e_output_capture_src_crop_get_hwc_window(output, hwc_window, &src_crop, &showing_pos);
+ if (ret == EINA_FALSE)
+ goto done;
+
+ ret = _e_output_capture_position_get(output, vbuf->width, vbuf->height, &dst_pos, rotate_check);
+ if (ret == EINA_FALSE)
+ goto done;
+
+ _e_output_capture_dst_crop_get_hwc_window(output, hwc_window, tmp, vbuf, w, h,
+ &dst_pos, &showing_pos, &dst_crop, rotate);
+
+ e_comp_wl_video_buffer_convert(tmp, vbuf,
+ src_crop.x, src_crop.y, src_crop.w, src_crop.h,
+ dst_crop.x, dst_crop.y, dst_crop.w, dst_crop.h,
+ EINA_TRUE, rotate, 0, 0);
+
+ ret = EINA_TRUE;
+
+done:
+ e_comp_wl_video_buffer_unref(tmp);
+
+ return ret;
+}
+
static Eina_Bool
_e_output_vbuf_capture_hwc_window(E_Output *output, E_Comp_Wl_Video_Buf *vbuf, int rotate, Eina_Bool rotate_check)
{
E_Hwc *hwc = NULL;
E_Hwc_Window *hwc_window = NULL;
Eina_List *l;
- Eina_Bool ret = EINA_FALSE;
+ Eina_List *visible_list = NULL;
+ Eina_Bool target_window = EINA_FALSE;
e_output_size_get(output, &width, &height);
if (width == 0 || height == 0)
- return ret;
+ return EINA_FALSE;
hwc = output->hwc;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc, EINA_FALSE);
EINA_LIST_FOREACH(hwc->hwc_windows, l, hwc_window)
{
- E_Comp_Wl_Video_Buf *tmp = NULL;
- tbm_surface_h surface = NULL;
- Eina_Rectangle showing_pos = {0, };
- Eina_Rectangle dst_pos = {0, };
- Eina_Rectangle src_crop = {0, };
- Eina_Rectangle dst_crop = {0, };
-
if (!hwc_window) continue;
+ if (hwc_window->is_target) continue;
if (e_hwc_window_is_video(hwc_window)) continue;
+ if (e_hwc_window_zpos_get(hwc_window) == -999) continue;
- surface = e_hwc_window_displaying_surface_get(hwc_window);
- if (!surface) continue;
-
- tmp = e_comp_wl_video_buffer_create_tbm(surface);
- if (tmp == NULL) continue;
-
- ret = _e_output_capture_src_crop_get_hwc_window(output, hwc_window, &src_crop, &showing_pos);
- if (ret == EINA_FALSE)
+ if (e_hwc_window_accepted_state_get(hwc_window) == E_HWC_WINDOW_STATE_CLIENT)
{
- e_comp_wl_video_buffer_unref(tmp);
+ target_window = EINA_TRUE;
+ visible_list = eina_list_append(visible_list, hwc_window);
continue;
}
- ret = _e_output_capture_position_get(output, vbuf->width, vbuf->height, &dst_pos, rotate_check);
- if (ret == EINA_FALSE)
+ if (e_hwc_window_accepted_state_get(hwc_window) == E_HWC_WINDOW_STATE_DEVICE)
+ visible_list = eina_list_append(visible_list, hwc_window);
+ }
+
+ if (eina_list_count(visible_list) == 0)
+ {
+ EOINF("no visible hwc_window for capture", output);
+ _e_output_vbuf_capture_hwc_windows(output, (E_Hwc_Window *)hwc->target_hwc_window, vbuf, rotate, rotate_check);
+ return EINA_TRUE;
+ }
+
+ visible_list = eina_list_sort(visible_list, eina_list_count(visible_list), _e_output_cb_hwc_window_sort);
+
+ EINA_LIST_FOREACH(visible_list, l, hwc_window)
+ {
+ if (e_hwc_window_accepted_state_get(hwc_window) == E_HWC_WINDOW_STATE_CLIENT)
{
- e_comp_wl_video_buffer_unref(tmp);
+ if (target_window)
+ {
+ target_window = EINA_FALSE;
+ _e_output_vbuf_capture_hwc_windows(output, (E_Hwc_Window *)hwc->target_hwc_window, vbuf, rotate, rotate_check);
+ }
continue;
}
- _e_output_capture_dst_crop_get_hwc_window(output, hwc_window, tmp, vbuf, width, height,
- &dst_pos, &showing_pos, &dst_crop, rotate);
-
- e_comp_wl_video_buffer_convert(tmp, vbuf,
- src_crop.x, src_crop.y, src_crop.w, src_crop.h,
- dst_crop.x, dst_crop.y, dst_crop.w, dst_crop.h,
- EINA_TRUE, rotate, 0, 0);
-
- e_comp_wl_video_buffer_unref(tmp);
+ _e_output_vbuf_capture_hwc_windows(output, hwc_window, vbuf, rotate, rotate_check);
}
- ret = EINA_TRUE;
-
- return ret;
+ return EINA_TRUE;
}
+
static Eina_Bool
_e_output_vbuf_capture(E_Output *output, E_Comp_Wl_Video_Buf *vbuf, int rotate, Eina_Bool rotate_check)
{