if (tsurface == hwc_window->current.buffer.tsurface) return EINA_FALSE;
e_hwc_window_queue_buffer_reference(&hwc_window->current.queue_buffer_ref, queue_buffer);
- e_hwc_window_buffer_set(&hwc_window->current.buffer, tsurface, NULL, 0);
+ e_hwc_window_buffer_set(&hwc_window->current.buffer, tsurface, queue_buffer->queue, 0);
e_hwc_window_info_update(hwc_window);
/* the damage isn't supported by hwc extension yet */
EINA_SAFETY_ON_FALSE_RETURN(hwc_window);
queue_buffer = e_hwc_window_queue_buffer_find(hwc->pp_queue, tsurface_dst);
- if (!queue_buffer)
- {
- ERR("fail to e_hwc_window_queue_buffer_find");
- goto done;
- }
-
- if (!e_hwc_window_queue_buffer_enqueue(hwc->pp_queue, queue_buffer))
- ERR("fail to e_hwc_window_queue_buffer_enqueue");
-
- /* source tsurface buffer queue */
- if (hwc->pp_buffer.queue)
+ if (queue_buffer)
{
- queue_buffer = e_hwc_window_queue_buffer_find(hwc->pp_buffer.queue,
- hwc->pp_buffer.tsurface);
- if (queue_buffer)
- e_hwc_window_queue_buffer_release(hwc->pp_buffer.queue, queue_buffer);
+ if (!e_hwc_window_queue_buffer_enqueue(hwc->pp_queue, queue_buffer))
+ ERR("fail to e_hwc_window_queue_buffer_enqueue");
}
+ else
+ ERR("fail to e_hwc_window_queue_buffer_find");
- e_comp_wl_buffer_reference(&hwc->pp_buffer_ref, NULL);
+ e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref, NULL);
+ e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, NULL);
-done:
tbm_surface_internal_unref(tsurface_src);
tbm_surface_internal_unref(tsurface_dst);
hwc->tpp = NULL;
}
- e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0);
+ e_hwc_window_buffer_set(&hwc->pp_update.buffer, NULL, NULL, 0);
}
}
}
static Eina_Bool
-_e_hwc_windows_pp_buffer_update(E_Hwc *hwc)
+_e_hwc_windows_pp_update(E_Hwc *hwc)
{
E_Hwc_Window *hwc_window;
EINA_SAFETY_ON_NULL_RETURN_VAL(hwc_window, EINA_FALSE);
- if (hwc_window->current.buffer.tsurface == hwc->pp_buffer.tsurface)
+ if (hwc_window->current.buffer.tsurface == hwc->pp_update.buffer.tsurface)
return EINA_FALSE;
- e_hwc_window_buffer_set(&hwc->pp_buffer,
- hwc_window->current.buffer.tsurface, hwc_window->current.buffer.queue, 0);
+ if (e_hwc_window_is_target(hwc_window))
+ e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref,
+ hwc_window->current.queue_buffer_ref.buffer);
+ else
+ e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, _e_hwc_windows_comp_wl_buffer_get(hwc_window));
- if (!e_hwc_window_is_target(hwc_window))
- e_comp_wl_buffer_reference(&hwc->pp_buffer_ref, _e_hwc_windows_comp_wl_buffer_get(hwc_window));
+ e_hwc_window_buffer_set(&hwc->pp_update.buffer,
+ hwc_window->current.buffer.tsurface, hwc_window->current.buffer.queue, 0);
return EINA_TRUE;
}
if (!e_hwc_window_queue_buffer_can_dequeue(hwc->pp_queue)) return EINA_TRUE;
- if (!_e_hwc_windows_pp_buffer_update(hwc)) return EINA_TRUE;
+ if (!_e_hwc_windows_pp_update(hwc)) return EINA_TRUE;
queue_buffer = e_hwc_window_queue_buffer_dequeue(hwc->pp_queue);
if (!queue_buffer)
return EINA_FALSE;
}
-
if ((hwc->pp_dst_rect.x != 0) ||
(hwc->pp_dst_rect.y != 0) ||
(hwc->pp_dst_rect.w != tbm_surface_get_width(queue_buffer->tsurface)) ||
if (hwc->tpp)
{
- if (!_e_hwc_windows_pp_info_set(hwc, hwc->pp_buffer.tsurface, queue_buffer->tsurface,
+ if (!_e_hwc_windows_pp_info_set(hwc, hwc->pp_update.buffer.tsurface, queue_buffer->tsurface,
&hwc->pp_src_rect, &hwc->pp_dst_rect))
{
EHWSERR("fail _e_hwc_windows_pp_info_set", hwc);
}
tbm_surface_internal_ref(queue_buffer->tsurface);
- tbm_surface_internal_ref(hwc->pp_buffer.tsurface);
- terror = tdm_pp_attach(hwc->tpp, hwc->pp_buffer.tsurface, queue_buffer->tsurface);
+ tbm_surface_internal_ref(hwc->pp_update.buffer.tsurface);
+ terror = tdm_pp_attach(hwc->tpp, hwc->pp_update.buffer.tsurface, queue_buffer->tsurface);
EINA_SAFETY_ON_FALSE_GOTO(terror == TDM_ERROR_NONE, attach_fail);
EHWSTRACE("!!!!!!!! HWC PP Commit !!!!!!!!", NULL, hwc);
- EHWSTRACE("PP COM tsurface:%p tqueue:%p pp_hwc_window:%p", NULL, hwc,
- hwc->pp_buffer.tsurface, hwc->pp_tqueue, hwc->pp_hwc_window);
+ EHWSTRACE("PP COM src_tsurface:%p dst_tsurface:%p tqueue:%p pp_hwc_window:%p", NULL, hwc,
+ hwc->pp_update.buffer.tsurface, queue_buffer->tsurface, hwc->pp_tqueue, hwc->pp_hwc_window);
terror = tdm_pp_commit(hwc->tpp);
EINA_SAFETY_ON_FALSE_GOTO(terror == TDM_ERROR_NONE, commit_fail);
else
{
/* sw copy */
- _e_hwc_windows_pixman_copy(hwc, hwc->pp_buffer.tsurface, queue_buffer->tsurface,
+ _e_hwc_windows_pixman_copy(hwc, hwc->pp_update.buffer.tsurface, queue_buffer->tsurface,
&hwc->pp_src_rect, &hwc->pp_dst_rect);
+
+ EHWSTRACE("PP Pixman src_tsurface:%p dst_tsurface:%p tqueue:%p pp_hwc_window:%p", NULL, hwc,
+ hwc->pp_update.buffer.tsurface, queue_buffer->tsurface, hwc->pp_tqueue, hwc->pp_hwc_window);
+
/* enqueue buffer */
e_hwc_window_queue_buffer_enqueue(hwc->pp_queue, queue_buffer);
}
}
else
{
- comp_info = _e_hwc_windows_comp_info_get(hwc->pp_buffer.tsurface);
+ comp_info = _e_hwc_windows_comp_info_get(hwc->pp_update.buffer.tsurface);
if (comp_info)
e_presentation_time_container_feedback_merge(&pp_comp_info->presentation_container,
&comp_info->presentation_container);
commit_fail:
attach_fail:
tbm_surface_internal_unref(queue_buffer->tsurface);
- tbm_surface_internal_unref(hwc->pp_buffer.tsurface);
+ tbm_surface_internal_unref(hwc->pp_update.buffer.tsurface);
pp_fail:
if (queue_buffer)
e_hwc_window_queue_buffer_release(hwc->pp_queue, queue_buffer);
- if ((hwc->pp_buffer.tsurface) && (hwc->pp_buffer.queue))
- {
- queue_buffer = e_hwc_window_queue_buffer_find(hwc->pp_buffer.queue, hwc->pp_buffer.tsurface);
- if (queue_buffer)
- e_hwc_window_queue_buffer_release(hwc->pp_buffer.queue, queue_buffer);
- }
-
EHWSERR("failed _e_hwc_windows_pp_data_commit", hwc);
hwc->pp_commit = EINA_FALSE;
hwc->tpp = NULL;
}
- e_hwc_window_buffer_set(&hwc->pp_buffer, NULL, NULL, 0);
+ e_hwc_window_queue_buffer_reference(&hwc->pp_update.queue_buffer_ref, NULL);
+ e_comp_wl_buffer_reference(&hwc->pp_update.buffer_ref, NULL);
+ e_hwc_window_buffer_set(&hwc->pp_update.buffer, NULL, NULL, 0);
}
_e_hwc_windows_target_window_pp_queue_set(hwc->target_hwc_window, NULL);