return TDM_ERROR_NONE;
}
-#if 0
static tdm_error
_tdm_vc4_display_commit_layer(tdm_vc4_layer_data *layer_data)
{
return TDM_ERROR_NONE;
}
-#endif
static void
_tdm_vc4_display_cb_event(int fd, unsigned int sequence,
return TDM_ERROR_NONE;
}
-tdm_error
-vc4_output_commit(tdm_output *output, int sync, void *user_data)
+static tdm_error
+_vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data)
{
tdm_vc4_output_data *output_data = output;
tdm_vc4_layer_data *layer_data = NULL;
drmModeAtomicFree(request);
-#if 0
+ return TDM_ERROR_NONE;
+}
+
+static tdm_error
+_vc4_output_layers_commit(tdm_output *output, int sync, void *user_data)
+{
+ tdm_vc4_output_data *output_data = output;
tdm_vc4_data *vc4_data;
- vc4_data = output_data->vc4_data;
- int do_waitvblank = 0;
+ tdm_vc4_layer_data *layer_data = NULL;
+ tdm_error ret;
+ int do_waitvblank = 1;
- event_data = calloc(1, sizeof(tdm_vc4_event_data));
- if (!event_data) {
- TDM_ERR("fail to alloc event_data.");
- drmModeAtomicFree(request);
- return TDM_ERROR_OUT_OF_MEMORY;
- }
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
- event_data->type = TDM_DRM_EVENT_TYPE_COMMIT;
- event_data->output_data = output_data;
- event_data->user_data = user_data;
+ vc4_data = output_data->vc4_data;
LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link) {
ret = _tdm_vc4_display_commit_layer(layer_data);
- if (ret != TDM_ERROR_NONE) {
- free(event_data);
+ if (ret != TDM_ERROR_NONE)
return ret;
- }
}
if (do_waitvblank == 1) {
- event_data = calloc(1, sizeof(tdm_vc4_event_data));
+ tdm_vc4_event_data *event_data = calloc(1, sizeof(tdm_vc4_event_data));
uint target_msc;
if (!event_data) {
return ret;
}
}
-#endif
+
+ return TDM_ERROR_NONE;
+}
+
+tdm_error
+vc4_output_commit(tdm_output *output, int sync, void *user_data)
+{
+ tdm_vc4_output_data *output_data = output;
+ tdm_vc4_data *vc4_data;
+ tdm_error ret = TDM_ERROR_NONE;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
+ vc4_data = output_data->vc4_data;
+
+ /* check the atomic pageflip */
+ if (vc4_data->has_atomic) {
+ ret = _vc4_output_atomic_commit(output, sync, user_data);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("_vc4_output_atomic_commit failed.");
+ return ret;
+ }
+ } else {
+ ret = _vc4_output_layers_commit(output, sync, user_data);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("_vc4_output_layers_commit failed.");
+ return ret;
+ }
+ }
return TDM_ERROR_NONE;
}