if (video->ec->hwc_window)
e_hwc_window_free(video->ec->hwc_window);
- /* video window is under the 24depth hwc_window for ui */
- e_hwc_window_zpos_set(hwc_window, -1);
-
/* set new hwc_window to the e_client */
video->ec->hwc_window = hwc_window;
}
static tdm_error
_e_video_layer_set_info(E_Video_Layer *layer, E_Video_Info_Layer *vinfo)
{
- tdm_error ret;
+ tdm_error ret = TDM_ERROR_NONE;
tdm_info_layer info_layer = {0};
EINA_SAFETY_ON_NULL_RETURN_VAL(layer, TDM_ERROR_INVALID_PARAMETER);
EINA_SAFETY_ON_NULL_RETURN_VAL(vinfo, TDM_ERROR_INVALID_PARAMETER);
if (_is_video_hwc_windows(layer->video))
- {
- tdm_hwc_window_info hwc_win_info = {0};
- E_Hwc_Window *hwc_window;
-
- hwc_window = layer->e_client->hwc_window;
- EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, TDM_ERROR_OPERATION_FAILED);
- EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window->thwc_window, TDM_ERROR_OPERATION_FAILED);
-
- memcpy(&hwc_win_info.src_config, &vinfo->src_config, sizeof(tdm_info_config));
- memcpy(&hwc_win_info.dst_pos, &vinfo->dst_pos, sizeof(tdm_pos));
- hwc_win_info.transform = vinfo->transform;
-
- ret = tdm_hwc_window_set_info(hwc_window->thwc_window, &hwc_win_info);
- EINA_SAFETY_ON_TRUE_RETURN_VAL(ret != TDM_ERROR_NONE, ret);
-
- /* to re-evaluate the window policy */
- e_comp_render_queue();
-
- memcpy(&layer->info, vinfo, sizeof(E_Video_Info_Layer));
- }
+ memcpy(&layer->info, vinfo, sizeof(E_Video_Info_Layer));
else
{
static tdm_error
_e_video_layer_set_buffer(E_Video_Layer * layer, tbm_surface_h buff)
{
- tdm_error ret;
+ tdm_error ret = TDM_ERROR_NONE;
EINA_SAFETY_ON_NULL_RETURN_VAL(layer, TDM_ERROR_BAD_REQUEST);
EINA_SAFETY_ON_NULL_RETURN_VAL(buff, TDM_ERROR_BAD_REQUEST);
return video_layer->cur_tsurface;
}
+EINTERN Eina_Bool
+e_comp_wl_video_hwc_window_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc_win_info)
+{
+ E_Client *ec = NULL;
+ Eina_List *l = NULL;
+ E_Video *video = NULL;
+ E_Video_Layer *video_layer;
+ E_Video_Info_Layer *vinfo;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
+
+ if (!e_hwc_window_is_video(hwc_window))
+ {
+ ERR("ehw:%p is NOT Video HWC window.", hwc_window);
+ return EINA_FALSE;
+ }
+
+ ec = hwc_window->ec;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+
+ EINA_LIST_FOREACH(video_list, l, video)
+ if (video->ec == ec) break;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(video,EINA_FALSE);
+
+ video_layer = video->layer;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(video_layer, EINA_FALSE);
+
+ vinfo = &video_layer->info;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(vinfo, EINA_FALSE);
+
+ memcpy(&hwc_win_info->src_config, &vinfo->src_config, sizeof(tdm_info_config));
+ memcpy(&hwc_win_info->dst_pos, &vinfo->dst_pos, sizeof(tdm_pos));
+ hwc_win_info->transform = vinfo->transform;
+
+ return EINA_TRUE;
+}
+
static void
_e_video_vblank_handler(tdm_output *output, unsigned int sequence,
unsigned int tv_sec, unsigned int tv_usec,
EINTERN void e_comp_wl_video_hwc_window_commit_data_release(E_Hwc_Window *hwc_window, unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec);
EINTERN tbm_surface_h e_comp_wl_video_hwc_widow_surface_get(E_Hwc_Window *hwc_window);
+EINTERN Eina_Bool e_comp_wl_video_hwc_window_info_get(E_Hwc_Window *hwc_window, tdm_hwc_window_info *hwc_win_info);
#define C(b,m) (((b) >> (m)) & 0xFF)
#define FOURCC_STR(id) C(id,0), C(id,8), C(id,16), C(id,24)
int size_w, size_h, src_x, src_y, src_w, src_h;
int dst_x, dst_y, dst_w, dst_h;
tbm_format format;
+ tdm_hwc_window_info hwc_win_info = {0};
+ tdm_error error;
+
+ if (e_hwc_window_is_video(hwc_window))
+ {
+ if (!e_comp_wl_video_hwc_window_info_get(hwc_window, &hwc_win_info))
+ {
+ ERR("Video window does not get the hwc_win_info.");
+ return EINA_FALSE;
+ }
+
+ error = tdm_hwc_window_set_info(hwc_window->thwc_window, &hwc_win_info);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
+
+ return EINA_TRUE;
+ }
/* set hwc_window when the layer infomation is different from the previous one */
tbm_surface_get_info(tsurface, &surf_info);
E_Output_Hwc *output_hwc = hwc_window->output_hwc;
E_Output *output = output_hwc->output;
- EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
- EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window->ec, EINA_FALSE);
+ /* do not check the transformation of the video window */
+ if (e_hwc_window_is_video(hwc_window)) return EINA_TRUE;
ec = hwc_window->ec;
EINTERN Eina_Bool
e_hwc_window_zpos_set(E_Hwc_Window *hwc_window, int zpos)
{
+ tdm_error error;
+ tdm_hwc_window *thwc_window;
+
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
- hwc_window->zpos = zpos;
+ if (hwc_window->zpos != zpos) hwc_window->zpos = zpos;
+
+ /* video dose not set the zpos...... need to be fixed. */
+ if (e_hwc_window_is_video(hwc_window)) return EINA_TRUE;
+
+ thwc_window = hwc_window->thwc_window;
+ EINA_SAFETY_ON_NULL_RETURN_VAL(thwc_window, EINA_FALSE);
+
+ error = tdm_hwc_window_set_zpos(thwc_window, hwc_window->zpos);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
return EINA_TRUE;
}
EINTERN Eina_Bool
e_hwc_window_update(E_Hwc_Window *hwc_window)
{
- tdm_hwc_window *thwc_window;
E_Client *ec;
- tdm_error error;
Eina_Bool result;
E_Comp_Wl_Buffer *buffer = NULL;
E_Comp_Wl_Data *wl_comp_data = (E_Comp_Wl_Data *)e_comp->wl_comp_data;
ec = hwc_window->ec;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
- thwc_window = hwc_window->thwc_window;
- EINA_SAFETY_ON_NULL_RETURN_VAL(thwc_window, EINA_FALSE);
-
- error = tdm_hwc_window_set_zpos(thwc_window, hwc_window->zpos);
- EINA_SAFETY_ON_TRUE_RETURN_VAL(error != TDM_ERROR_NONE, EINA_FALSE);
-
/* hwc_window manager could ask to prevent some e_clients being shown by hw directly;
* if hwc_window's ec has no correct transformation we can't allow such ec to claim on
* hw overlay, 'cause currently hw doesn't support transformation; */
- if (hwc_window->hwc_acceptable &&
- _e_hwc_window_correct_transformation_check(hwc_window))
+ if (hwc_window->hwc_acceptable)
{
- if (e_hwc_window_is_cursor(hwc_window))
+ if (e_hwc_window_is_video(hwc_window))
{
- tsurface = hwc_window->cursor_tsurface;
- state = E_HWC_WINDOW_STATE_CURSOR;
- }
- else
- {
- buffer = _get_comp_wl_buffer(ec);
+ tsurface = e_comp_wl_video_hwc_widow_surface_get(hwc_window);
+ state = E_HWC_WINDOW_STATE_VIDEO;
- if (buffer)
- tsurface = wayland_tbm_server_get_surface(wl_comp_data->tbm.server, buffer->resource);
-
- state = E_HWC_WINDOW_STATE_DEVICE;
+ if (tsurface)
+ {
+ result = _e_hwc_window_info_set(hwc_window, tsurface);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(result != EINA_TRUE, EINA_FALSE);
+ }
}
-
- if (tsurface)
+ else
{
- result = _e_hwc_window_info_set(hwc_window, tsurface);
- EINA_SAFETY_ON_TRUE_RETURN_VAL(result != EINA_TRUE, EINA_FALSE);
+ if (_e_hwc_window_correct_transformation_check(hwc_window))
+ {
+ if (e_hwc_window_is_cursor(hwc_window))
+ {
+ tsurface = hwc_window->cursor_tsurface;
+ state = E_HWC_WINDOW_STATE_CURSOR;
+ }
+ else
+ {
+ buffer = _get_comp_wl_buffer(ec);
+ if (buffer) tsurface = wayland_tbm_server_get_surface(wl_comp_data->tbm.server, buffer->resource);
+ state = E_HWC_WINDOW_STATE_DEVICE;
+ }
+
+ if (tsurface)
+ {
+ result = _e_hwc_window_info_set(hwc_window, tsurface);
+ EINA_SAFETY_ON_TRUE_RETURN_VAL(result != EINA_TRUE, EINA_FALSE);
+ }
+ }
+ else
+ state = E_HWC_WINDOW_STATE_CLIENT;
}
- else
- state = E_HWC_WINDOW_STATE_CLIENT;
-
}
else
state = E_HWC_WINDOW_STATE_CLIENT;
#include "e.h"
#include "services/e_service_quickpanel.h"
-#define DBG_EVALUATE 0
+#define DBG_EVALUATE 1
static Eina_Bool _e_output_hwc_windows_pp_output_data_commit(E_Output_Hwc *output_hwc, E_Hwc_Window_Commit_Data *data);
static Eina_Bool _e_output_hwc_windows_pp_window_commit(E_Output_Hwc *output_hwc, E_Hwc_Window *hwc_window);
hwc_windows = e_output_hwc_windows_get(output_hwc);
EINA_LIST_FOREACH(hwc_windows, l, hwc_window)
{
- if (e_hwc_window_is_video(hwc_window)) continue;
+// if (e_hwc_window_is_video(hwc_window)) continue;
if (!e_hwc_window_state_set(hwc_window, E_HWC_WINDOW_STATE_NONE))
{
const Eina_List *l;
E_Hwc_Window *hwc_window;
E_Client *ec;
- Eina_Bool result;
- int zpos = 0;
+ int graphic_zpos = 0;
+ int video_zpos = -1;
/* clients are sorted in reverse order */
EINA_LIST_REVERSE_FOREACH(cl_list, l, ec)
{
hwc_window = ec->hwc_window;
- if (!hwc_window)
+ if (!hwc_window) continue;
+
+ if (e_hwc_window_is_video(hwc_window))
{
- ERR("hwc-opt: cannot find the hwc_window by ec(%p)", ec);
- continue;
+ if (!e_hwc_window_zpos_set(hwc_window, video_zpos))
+ {
+ ERR("hwc-opt: cannot set video_zpos for E_Hwc_Window(%p)", hwc_window);
+ continue;
+ }
+ /* video window is under the 24depth hwc_window for ui */
+ video_zpos--;
}
-
- /* e20 deal with video window at the e_comp_wl_video */
- if (e_hwc_window_is_video(hwc_window)) continue;
-
- result = e_hwc_window_zpos_set(hwc_window, zpos);
- if (result != EINA_TRUE)
+ else
{
- ERR("hwc-opt: cannot set zpos for E_Hwc_Window(%p)", hwc_window);
- continue;
+ if (!e_hwc_window_zpos_set(hwc_window, graphic_zpos))
+ {
+ ERR("hwc-opt: cannot set graphic_zpos for E_Hwc_Window(%p)", hwc_window);
+ continue;
+ }
+ graphic_zpos++;
}
- result = e_hwc_window_update(hwc_window);
- if (result != EINA_TRUE)
+ if (!e_hwc_window_update(hwc_window))
{
ERR("hwc-opt: cannot update E_Hwc_Window(%p)", hwc_window);
continue;
}
- zpos++;
}
#if DBG_EVALUATE
ELOGF("HWC-WINS", " Request HWC Validation to TDM HWC:", NULL, NULL);
EINA_LIST_FOREACH(vis_cl_list, l, ec)
{
hwc_window = ec->hwc_window;
+
+ /* The video window is not composited by gl compositor */
+ if (e_hwc_window_is_video(hwc_window)) continue;
+
hwc_window->hwc_acceptable = EINA_FALSE;
ELOGF("HWC-WINS", " ehw:%p -- {%25s} is NOT hwc_acceptable.",
ec->pixmap, ec, hwc_window, ec->icccm.title);
hwc_window = ec->hwc_window;
hwc_window->hwc_acceptable = EINA_TRUE;
+ /* The video window is not composited by gl compositor */
+ if (e_hwc_window_is_video(hwc_window)) continue;
+
// check clients not able to use hwc
// if ec has invalid buffer or scaled( transformed ) or forced composite(never_hwc)
if (!_e_output_hwc_windows_ec_check(ec))