static void tdm_output_destroy(struct ds_tdm_output *output);
static void tdm_output_init_hwc(struct ds_tdm_output *output);
static bool tdm_output_update_mode(struct ds_tdm_output *output);
+static bool tdm_output_set_pending_fb(struct ds_tdm_output *output,
+ struct ds_buffer *ds_buffer);
+static bool tdm_output_hwc_commit(struct ds_tdm_output *output);
struct ds_tdm_output *
create_tdm_output(struct ds_tdm_backend *tdm, tdm_output *tdm_output)
output->back_buffer = buffer;
}
-static void
-tdm_output_hwc_commit_handler(tdm_hwc *hwc, unsigned int sequence,
- unsigned int tv_sec, unsigned int tv_usec, void *user_data)
-{
- struct ds_tdm_output *output;
-
- output = user_data;
-
- tdm_output_update_front_buffer(output);
-
- wl_signal_emit(&output->base.events.frame, &output->base);
-}
-
static bool
tdm_output_iface_commit(struct ds_output *ds_output)
{
struct ds_tdm_output *output;
- struct ds_tdm_buffer *buffer;
- struct ds_buffer *ds_buffer;
output = tdm_output_from_output(ds_output);
}
if (ds_output->pending.committed & DS_OUTPUT_STATE_BUFFER) {
- tdm_region fb_damage;
- tdm_error err;
- uint32_t num_changes;
-
- ds_buffer = ds_output->pending.buffer;
- buffer = get_or_create_tdm_buffer(output->backend, ds_buffer);
- if (!buffer)
- return false;
-
- memset(&fb_damage, 0, sizeof(fb_damage));
- err = tdm_hwc_set_client_target_buffer(output->tdm.hwc,
- buffer->surface, fb_damage);
- if (err != TDM_ERROR_NONE) {
- ds_err("Could not set hwc client target buffer");
- ds_buffer_unlock(buffer->buffer);
- return false;
- }
-
- err = tdm_hwc_validate(output->tdm.hwc, NULL, 0, &num_changes);
- if (err != TDM_ERROR_NONE) {
- ds_err("Could not hwc validate");
- ds_buffer_unlock(buffer->buffer);
- return false;
- }
-
- err = tdm_hwc_accept_validation(output->tdm.hwc);
- if (err != TDM_ERROR_NONE) {
- ds_err("Could not hwc accept validation");
- ds_buffer_unlock(buffer->buffer);
- return false;
- }
+ if (!tdm_output_set_pending_fb(output, ds_output->pending.buffer))
+ ds_err("Could not update buffer");
+ }
- err = tdm_hwc_commit(output->tdm.hwc, 0, tdm_output_hwc_commit_handler,
- output);
- if (err != TDM_ERROR_NONE) {
- ds_err("Could not hwc commit");
- ds_buffer_unlock(buffer->buffer);
- return false;
+ if (!tdm_output_hwc_commit(output)) {
+ ds_err("Could not commit tdm output");
+ if (output->back_buffer) {
+ tdm_buffer_release(output->back_buffer);
}
-
- tdm_output_attach_back_buffer(output, buffer);
-
- ds_dbg("Swap Buffer!!!!!");
}
+ ds_dbg("Swap Buffer!!!!!");
+
return true;
}
return true;
}
+
+static bool
+tdm_output_set_pending_fb(struct ds_tdm_output *output,
+ struct ds_buffer *ds_buffer)
+{
+ struct ds_tdm_buffer *buffer;
+ tdm_region fb_damage;
+ tdm_error err;
+
+ buffer = get_or_create_tdm_buffer(output->backend, ds_buffer);
+ if (!buffer)
+ return false;
+
+ memset(&fb_damage, 0, sizeof(fb_damage));
+ err = tdm_hwc_set_client_target_buffer(output->tdm.hwc,
+ buffer->surface, fb_damage);
+ if (err != TDM_ERROR_NONE) {
+ ds_err("Could not set hwc client target buffer");
+ ds_buffer_unlock(buffer->buffer);
+ return false;
+ }
+
+ tdm_output_attach_back_buffer(output, buffer);
+
+ return true;
+}
+
+static void
+tdm_output_hwc_commit_handler(tdm_hwc *hwc, unsigned int sequence,
+ unsigned int tv_sec, unsigned int tv_usec, void *user_data)
+{
+ struct ds_tdm_output *output;
+
+ output = user_data;
+
+ tdm_output_update_front_buffer(output);
+
+ wl_signal_emit(&output->base.events.frame, &output->base);
+}
+
+static bool
+tdm_output_hwc_commit(struct ds_tdm_output *output)
+{
+ tdm_error err;
+ uint32_t num_changes;
+
+ err = tdm_hwc_validate(output->tdm.hwc, NULL, 0, &num_changes);
+ if (err != TDM_ERROR_NONE) {
+ ds_err("Could not hwc validate");
+ return false;
+ }
+
+ err = tdm_hwc_accept_validation(output->tdm.hwc);
+ if (err != TDM_ERROR_NONE) {
+ ds_err("Could not hwc accept validation");
+ return false;
+ }
+
+ err = tdm_hwc_commit(output->tdm.hwc, 0, tdm_output_hwc_commit_handler,
+ output);
+ if (err != TDM_ERROR_NONE) {
+ ds_err("Could not hwc commit");
+ return false;
+ }
+
+ return true;
+}