int mode_changed;
const hal_tdm_output_mode *current_mode;
+ unsigned int current_mode_blob_id;
tbm_surface_h crtc_buffer;
int crtc_enabled;
}
static hal_tdm_error
-_vc4_output_atomic_commit(hal_tdm_output *output, int sync, void *user_data)
+_vc4_output_make_atomic_request(tdm_vc4_output *output_data, drmModeAtomicReqPtr request,
+ int *out_fence_fd, uint32_t *flags)
{
- tdm_vc4_output *output_data = output;
- tdm_vc4_layer *layer_data = NULL;
- tdm_vc4_event *event_data;
- drmModeAtomicReqPtr request;
- uint32_t flags = 0;
- hal_tdm_error ret;
- int out_fence_fd = -1;
-
- TDM_BACKEND_RETURN_VAL_IF_FAIL(output_data, HAL_TDM_ERROR_INVALID_PARAMETER);
+ drmModeModeInfoPtr current_mode;
+ int ret;
if (!output_data->crtc_enabled || output_data->mode_changed) {
- ret = _tdm_vc4_display_set_crtc(output_data->display_data, output_data, 1);
- if (ret != HAL_TDM_ERROR_NONE) {
- TDM_BACKEND_ERR("fail to set crtc.");
- return HAL_TDM_ERROR_OPERATION_FAILED;
+ current_mode = _tdm_vc4_display_get_mode(output_data);
+ if (!current_mode) {
+ TDM_BACKEND_ERR("couldn't find proper mode");
+ drmModeAtomicFree(request);
+ return HAL_TDM_ERROR_BAD_REQUEST;
}
- output_data->crtc_enabled = 1;
-#if 0//TODO: do set crtc with atomic pageflip
- flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
- drmModeModeInfoPtr mode;
- uint32_t blob_id;
+ if (output_data->current_mode_blob_id > 0)
+ drmModeDestroyPropertyBlob(output_data->display_data->drm_fd, output_data->current_mode_blob_id);
- mode = _tdm_vc4_display_get_mode(output_data);
- if (!mode) {
- TDM_BACKEND_ERR("fail to find the drm mode.");
+ if (drmModeCreatePropertyBlob(output_data->display_data->drm_fd, current_mode,
+ sizeof(drmModeModeInfo), &output_data->current_mode_blob_id)) {
+ TDM_BACKEND_ERR("fail to drmModeCreatePropertyBlob mode");
return HAL_TDM_ERROR_OPERATION_FAILED;
}
- if (drmModeCreatePropertyBlob(output_data->display_data->drm_fd, mode, sizeof(*mode), &blob_id) != 0) {
- TDM_BACKEND_ERR("fail to create the Mode PropertyBlob.");
- return HAL_TDM_ERROR_OPERATION_FAILED;
+ ret = drmModeAtomicAddProperty(request, output_data->connector_id,
+ output_data->atomic_props_ids.crtc_id, output_data->crtc_id);
+ if (ret < 0) {
+ TDM_BACKEND_ERR("fail to set crtc error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
}
- drmModeAtomicAddProperty(request, output_data->output_plane, output_data->props.plane_fb_id,
- layer_data->display_buffer->fb_id);
+ ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+ output_data->atomic_props_ids.crtc_mode_id, output_data->current_mode_blob_id);
+ if (ret < 0) {
+ TDM_BACKEND_ERR("fail to set mode error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
+ }
+
+ ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+ output_data->atomic_props_ids.crtc_active, 1);
+ if (ret < 0) {
+ TDM_BACKEND_ERR("fail to set active error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
+ }
output_data->crtc_enabled = 1;
-#endif
+ output_data->mode_changed = 0;
+
+ _tdm_vc4_output_update_status(output_data, HAL_TDM_OUTPUT_CONN_STATUS_MODE_SETTED);
+
+ *flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
}
+ ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+ output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)out_fence_fd);
+ if (ret < 0) {
+ TDM_BACKEND_ERR("fail to out fence ptr error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
+ }
+
+ return HAL_TDM_ERROR_NONE;
+}
+
+static hal_tdm_error
+_vc4_output_atomic_commit(hal_tdm_output *output, int sync, void *user_data)
+{
+ tdm_vc4_output *output_data = output;
+ tdm_vc4_layer *layer_data = NULL;
+ tdm_vc4_event *event_data;
+ drmModeAtomicReqPtr request;
+ uint32_t flags = 0;
+ hal_tdm_error ret;
+ int out_fence_fd = -1;
+
+ TDM_BACKEND_RETURN_VAL_IF_FAIL(output_data, HAL_TDM_ERROR_INVALID_PARAMETER);
+
request = drmModeAtomicAlloc();
if (!request) {
TDM_BACKEND_ERR("drmModeAtomicAlloc failed.");
flags |= DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK;
- ret = drmModeAtomicAddProperty(request, output_data->crtc_id, output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)&out_fence_fd);
- if (ret < 0) {
- TDM_BACKEND_ERR("fail to out fence ptr error:%d", errno);
+ ret = _vc4_output_make_atomic_request(output_data, request, &out_fence_fd, &flags);
+ if (ret != HAL_TDM_ERROR_NONE) {
+ TDM_BACKEND_ERR("_vc4_output_make_atomic_request failed.");
drmModeAtomicFree(request);
return ret;
}
}
static tdm_error
-_vc4_output_atomic_commit(tdm_output *output, int sync, void *user_data)
+_vc4_output_make_atomic_request(tdm_vc4_output_data *output_data, drmModeAtomicReqPtr request,
+ int *out_fence_fd, uint32_t *flags)
{
- tdm_vc4_output_data *output_data = output;
- tdm_vc4_layer_data *layer_data = NULL;
- tdm_vc4_event_data *event_data;
- drmModeAtomicReqPtr request;
- uint32_t flags = 0;
- tdm_error ret;
- int out_fence_fd = -1;
-
- RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+ drmModeModeInfoPtr current_mode;
+ int ret;
if (!output_data->crtc_enabled || output_data->mode_changed) {
- ret = _tdm_vc4_display_set_crtc(output_data->vc4_data, output_data, 1);
- if (ret != TDM_ERROR_NONE) {
- TDM_ERR("fail to set crtc.");
- return TDM_ERROR_OPERATION_FAILED;
+ current_mode = _tdm_vc4_display_get_mode(output_data);
+ if (!current_mode) {
+ TDM_ERR("couldn't find proper mode");
+ drmModeAtomicFree(request);
+ return TDM_ERROR_BAD_REQUEST;
}
- output_data->crtc_enabled = 1;
-#if 0//TODO: do set crtc with atomic pageflip
- flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
- drmModeModeInfoPtr mode;
- uint32_t blob_id;
+ if (output_data->current_mode_blob_id > 0)
+ drmModeDestroyPropertyBlob(output_data->vc4_data->drm_fd, output_data->current_mode_blob_id);
- mode = _tdm_vc4_display_get_mode(output_data);
- if (!mode) {
- TDM_ERR("fail to find the drm mode.");
+ if (drmModeCreatePropertyBlob(output_data->vc4_data->drm_fd, current_mode,
+ sizeof(drmModeModeInfo), &output_data->current_mode_blob_id)) {
+ TDM_ERR("fail to drmModeCreatePropertyBlob mode");
return TDM_ERROR_OPERATION_FAILED;
}
- if (drmModeCreatePropertyBlob(output_data->vc4_data->drm_fd, mode, sizeof(*mode), &blob_id) != 0) {
- TDM_ERR("fail to create the Mode PropertyBlob.");
- return TDM_ERROR_OPERATION_FAILED;
+ ret = drmModeAtomicAddProperty(request, output_data->connector_id,
+ output_data->atomic_props_ids.crtc_id, output_data->crtc_id);
+ if (ret < 0) {
+ TDM_ERR("fail to set crtc error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
}
- drmModeAtomicAddProperty(request, output_data->output_plane, output_data->props.plane_fb_id,
- layer_data->display_buffer->fb_id);
+ ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+ output_data->atomic_props_ids.crtc_mode_id, output_data->current_mode_blob_id);
+ if (ret < 0) {
+ TDM_ERR("fail to set mode error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
+ }
+
+ ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+ output_data->atomic_props_ids.crtc_active, 1);
+ if (ret < 0) {
+ TDM_ERR("fail to set active error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
+ }
output_data->crtc_enabled = 1;
-#endif
+ output_data->mode_changed = 0;
+
+ _tdm_vc4_output_update_status(output_data, TDM_OUTPUT_CONN_STATUS_MODE_SETTED);
+
+ *flags |= DRM_MODE_ATOMIC_ALLOW_MODESET;
}
+ ret = drmModeAtomicAddProperty(request, output_data->crtc_id,
+ output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)out_fence_fd);
+ if (ret < 0) {
+ TDM_ERR("fail to out fence ptr error:%d", errno);
+ drmModeAtomicFree(request);
+ return ret;
+ }
+
+ return TDM_ERROR_NONE;
+}
+
+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;
+ tdm_vc4_event_data *event_data;
+ drmModeAtomicReqPtr request;
+ uint32_t flags = 0;
+ tdm_error ret;
+ int out_fence_fd = -1;
+
+ RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
+
request = drmModeAtomicAlloc();
if (!request) {
TDM_ERR("drmModeAtomicAlloc failed.");
flags |= DRM_MODE_PAGE_FLIP_EVENT | DRM_MODE_ATOMIC_NONBLOCK;
- ret = drmModeAtomicAddProperty(request, output_data->crtc_id, output_data->atomic_props_ids.out_fence_ptr, (uintptr_t)&out_fence_fd);
- if (ret < 0) {
- TDM_ERR("fail to out fence ptr error:%d", errno);
+ ret = _vc4_output_make_atomic_request(output_data, request, &out_fence_fd, &flags);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("_vc4_output_make_atomic_request failed.");
drmModeAtomicFree(request);
return ret;
}
int mode_changed;
const tdm_output_mode *current_mode;
+ unsigned int current_mode_blob_id;
tbm_surface_h crtc_buffer;
int crtc_enabled;