if (tdm_debug_module & TDM_DEBUG_COMMIT)
TDM_INFO("layer commit: output(%d) commit", private_output->pipe);
- /* tdm_vblank APIs is for server. it should be called in unlock status*/
- if (!private_output->layer_waiting_vblank) {
- _pthread_mutex_unlock(&private_display->lock);
- ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_layer_cb_wait_vblank, private_output);
- _pthread_mutex_lock(&private_display->lock);
- TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, wait_failed);
- private_output->layer_waiting_vblank = 1;
+ if (private_output->current_dpms_value == TDM_OUTPUT_DPMS_ON) {
+ /* tdm_vblank APIs is for server. it should be called in unlock status*/
+ if (!private_output->layer_waiting_vblank) {
+ _pthread_mutex_unlock(&private_display->lock);
+ ret = tdm_vblank_wait(private_output->vblank, 0, 0, 1, _tdm_layer_cb_wait_vblank, private_output);
+ _pthread_mutex_lock(&private_display->lock);
+ TDM_GOTO_IF_FAIL(ret == TDM_ERROR_NONE, wait_failed);
+ private_output->layer_waiting_vblank = 1;
+ }
}
if (tdm_debug_module & TDM_DEBUG_COMMIT)
LIST_ADDTAIL(&lm->link, &private_output->layer_commit_handler_list);
}
+ if (private_output->current_dpms_value != TDM_OUTPUT_DPMS_ON) {
+ TDM_WRN("TDM_OUTPUT_DPMS_OFF. Directly call vblank callback.");
+ _pthread_mutex_unlock(&private_display->lock);
+ _tdm_layer_cb_wait_vblank(private_output->vblank, 0, 0, 0, 0, private_output);
+ _pthread_mutex_lock(&private_display->lock);
+ }
+
return;
wait_failed:
+ /* CAUTION: Once _tdm_layer_commit returns success, the layer commit handler MUST be called always.
+ * That is, even if we get error in _tdm_layer_got_output_vblank() function for some reasons,
+ * the layer commit handler MUST be called.
+ */
LIST_FOR_EACH_ENTRY_SAFE(lm, lmm, &pending_clone_list, link) {
+ TDM_WRN("Directly call layer commit handlers: ret(%d)\n", ret);
LIST_DEL(&lm->link);
+ _pthread_mutex_unlock(&private_display->lock);
+ if (lm->func)
+ lm->func(lm->private_layer, sequence, tv_sec, tv_usec, lm->user_data);
+ _pthread_mutex_lock(&private_display->lock);
_tdm_layer_free_buffer(lm->private_layer, lm->committed_buffer);
free(lm);
}
+
return;
}
return 0;
}
+/* CAUTION: Once _tdm_layer_commit returns success, the layer commit handler MUST be called always.
+ * That is, even if we get error in _tdm_layer_got_output_vblank() function for some reasons,
+ * the layer commit handler MUST be called.
+ */
static tdm_error
_tdm_layer_commit(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data)
{