return buffer;
}
-static struct ds_tdm_buffer *
+struct ds_tdm_buffer *
get_or_create_tdm_buffer(struct ds_tdm_backend *backend,
struct ds_buffer *ds_buffer)
{
return;
}
- output->hwc = ds_tdm_output_hwc_create(output->tdm.hwc);
+ output->hwc = ds_tdm_output_hwc_create(output, output->tdm.hwc);
if (!output->hwc) {
ds_err("Could not create ds_dm_hwc: output(%p)", output);
return;
output_set_pending_fb(struct ds_tdm_output *output,
struct ds_buffer *ds_buffer)
{
- struct ds_tdm_queue_buffer *queue_buffer;
- struct ds_tdm_buffer *buffer;
- tbm_surface_h surface = NULL;
-
- if (output->queue) {
- queue_buffer = buffer_queue_find_buffer(output->queue, ds_buffer);
- if (queue_buffer) {
- ds_buffer_lock(ds_buffer);
- surface = queue_buffer->surface;
- }
- }
-
- if (!surface) {
- buffer = get_or_create_tdm_buffer(output->backend, ds_buffer);
- if (!buffer)
+ if (!output->hwc->enabled) {
+ if (!ds_tdm_output_hwc_set_client_target_buffer(output->hwc, ds_buffer)) {
+ ds_err("Could not set hwc client target buffer");
return false;
-
- surface = buffer->surface;
+ }
}
- if (!ds_tdm_output_hwc_set_client_target_buffer(output->hwc, surface)) {
- ds_err("Could not set hwc client target buffer");
- ds_buffer_unlock(ds_buffer);
- return false;
- }
+ ds_buffer_lock(ds_buffer);
output_attach_back_buffer(output, ds_buffer);
#include "tdm_internal.h"
#include "tdm_output_hwc.h"
+#include "tdm_buffer_queue.h"
static void
hwc_window_update_front_buffer(struct ds_tdm_output_hwc_window *hwc_window)
}
struct ds_tdm_output_hwc *
-ds_tdm_output_hwc_create(tdm_hwc *thwc)
+ds_tdm_output_hwc_create(struct ds_tdm_output *output, tdm_hwc *thwc)
{
struct ds_tdm_output_hwc *hwc;
return NULL;
hwc->thwc = thwc;
+ hwc->tdm_output = output;
wl_list_init(&hwc->hwc_windows);
wl_signal_init(&hwc->events.commit_handler);
}
bool
-ds_tdm_output_hwc_set_client_target_buffer(struct ds_tdm_output_hwc *hwc, tbm_surface_h tsurface)
+ds_tdm_output_hwc_set_client_target_buffer(struct ds_tdm_output_hwc *hwc, struct ds_buffer *buffer)
{
tdm_error terr;
tdm_region fb_damage;
+ tbm_surface_h tsurface = NULL;
+ struct ds_tdm_queue_buffer *tdm_queue_buffer;
+ struct ds_tdm_buffer *tdm_buffer;
+
+ if (buffer) {
+ if (hwc->tdm_output->queue) {
+ tdm_queue_buffer = buffer_queue_find_buffer(hwc->tdm_output->queue, buffer);
+ if (tdm_queue_buffer)
+ tsurface = tdm_queue_buffer->surface;
+ }
- memset(&fb_damage, 0, sizeof(fb_damage));
-
- hwc->target_buffer_info.src_config.pos.x = 0;
- hwc->target_buffer_info.src_config.pos.y = 0;
- hwc->target_buffer_info.src_config.pos.w = tbm_surface_get_width(tsurface);
- hwc->target_buffer_info.src_config.pos.h = tbm_surface_get_height(tsurface);
- hwc->target_buffer_info.src_config.size.h = get_horizontal_get(tsurface);
- hwc->target_buffer_info.src_config.size.v = tbm_surface_get_height(tsurface);
- hwc->target_buffer_info.src_config.format = tbm_surface_get_format(tsurface);
+ if (!tsurface) {
+ tdm_buffer = get_or_create_tdm_buffer(hwc->tdm_output->backend, buffer);
+ if (!tdm_buffer) {
+ ds_err("Could not get or create tdm buffer");
+ return false;
+ }
- hwc->target_buffer_info.dst_pos.x = 0;
- hwc->target_buffer_info.dst_pos.y = 0;
- hwc->target_buffer_info.dst_pos.w = tbm_surface_get_width(tsurface);
- hwc->target_buffer_info.dst_pos.h = tbm_surface_get_height(tsurface);
+ tsurface = tdm_buffer->surface;
+ }
+ }
- hwc->target_buffer_info.transform = TDM_TRANSFORM_NORMAL;
+ memset(&fb_damage, 0, sizeof(fb_damage));
- tdm_hwc_set_client_target_buffer_info(hwc->thwc, &hwc->target_buffer_info);
+ if (tsurface) {
+ hwc->target_buffer_info.src_config.pos.x = 0;
+ hwc->target_buffer_info.src_config.pos.y = 0;
+ hwc->target_buffer_info.src_config.pos.w = tbm_surface_get_width(tsurface);
+ hwc->target_buffer_info.src_config.pos.h = tbm_surface_get_height(tsurface);
+ hwc->target_buffer_info.src_config.size.h = get_horizontal_get(tsurface);
+ hwc->target_buffer_info.src_config.size.v = tbm_surface_get_height(tsurface);
+ hwc->target_buffer_info.src_config.format = tbm_surface_get_format(tsurface);
+
+ hwc->target_buffer_info.dst_pos.x = 0;
+ hwc->target_buffer_info.dst_pos.y = 0;
+ hwc->target_buffer_info.dst_pos.w = tbm_surface_get_width(tsurface);
+ hwc->target_buffer_info.dst_pos.h = tbm_surface_get_height(tsurface);
+
+ hwc->target_buffer_info.transform = TDM_TRANSFORM_NORMAL;
+
+ tdm_hwc_set_client_target_buffer_info(hwc->thwc, &hwc->target_buffer_info);
+ }
terr = tdm_hwc_set_client_target_buffer(hwc->thwc, tsurface, fb_damage);
if (terr != TDM_ERROR_NONE) {