From ab5bb9133df2d973fd3a614370d175aa7cc4eb5d Mon Sep 17 00:00:00 2001 From: Boram Park Date: Wed, 29 Nov 2017 15:20:28 +0900 Subject: [PATCH] dpms: handling extended DPMS modes Change-Id: I79b90d97c09c019db2f6b14e66dbf12e7e4c6441 --- client/tdm_client.c | 7 +++++++ include/tdm_common.h | 6 +++++- src/tdm_macro.h | 1 + src/tdm_output.c | 26 ++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 1 deletion(-) diff --git a/client/tdm_client.c b/client/tdm_client.c index cd76a0c..f0be8ee 100644 --- a/client/tdm_client.c +++ b/client/tdm_client.c @@ -270,6 +270,13 @@ _tdm_client_output_cb_dpms(void *data, struct wl_tdm_output *wl_tdm_output, uint TDM_RETURN_IF_FAIL(private_output != NULL); + /* If value is extended value, we handle it as DPMS on in client side + * The extended DPMS value is valid only in server side. + * Or, need to export to client side also? + */ + if (value > TDM_OUTPUT_DPMS_OFF) + value = TDM_OUTPUT_DPMS_ON; + if (private_output->dpms == value) return; diff --git a/include/tdm_common.h b/include/tdm_common.h index 887b43f..71f12ca 100644 --- a/include/tdm_common.h +++ b/include/tdm_common.h @@ -88,10 +88,14 @@ typedef enum { /** * @brief The output capability enumeration * @details - * @remark + * If a backend module provides #TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS, we can set + * an extended DPMS mode to an output which a backend module supports. + * Don't use the low-4bit for an extended DPMS mode value. It's used for default + * DPMS modes. */ typedef enum { TDM_OUTPUT_CAPABILITY_ASYNC_DPMS = (1 << 0), /**< if a outupt supports asynchronous DPMS operation */ + TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS = (1 << 2), /**< if a outupt supports extended DPMS operation @since 2.0.0 */ } tdm_output_capability; /** diff --git a/src/tdm_macro.h b/src/tdm_macro.h index 775354e..9a99ae3 100644 --- a/src/tdm_macro.h +++ b/src/tdm_macro.h @@ -162,6 +162,7 @@ extern "C" { /* can't export VSYNC macro because we can't define the exact meaning of vsync off * at this time. Does committing in standy mode work? Doesn't committing in suspend mode work? */ +#define TDM_OUTPUT_DPMS_DEFAULT_MASK 0xF #define TDM_OUTPUT_DPMS_VSYNC_OFF_MASK 0x2 #define TDM_OUTPUT_DPMS_VSYNC_IS_OFF(dpms) ((dpms) & TDM_OUTPUT_DPMS_VSYNC_OFF_MASK) diff --git a/src/tdm_output.c b/src/tdm_output.c index 9bcda3b..18f6db7 100644 --- a/src/tdm_output.c +++ b/src/tdm_output.c @@ -1153,6 +1153,19 @@ tdm_output_set_dpms(tdm_output *output, tdm_output_dpms dpms_value) tdm_func_output *func_output; OUTPUT_FUNC_ENTRY(); + if (dpms_value > TDM_OUTPUT_DPMS_OFF) { + if (dpms_value & TDM_OUTPUT_DPMS_DEFAULT_MASK) { + TDM_ERR("Don't use the low-4bit for an extended DPMS mode: dpms_value(%x)", dpms_value); + return TDM_ERROR_BAD_REQUEST; + } + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS)) { + TDM_ERR("output(%d) doesn't support the extended DPMS control: '%s'", + private_output->pipe, tdm_dpms_str(dpms_value)); + return TDM_ERROR_BAD_REQUEST; + } + } + _pthread_mutex_lock(&private_display->lock); if (private_output->waiting_dpms_change) { @@ -1205,6 +1218,19 @@ tdm_output_set_dpms_async(tdm_output *output, tdm_output_dpms dpms_value) return TDM_ERROR_BAD_REQUEST; } + if (dpms_value > TDM_OUTPUT_DPMS_OFF) { + if (dpms_value & TDM_OUTPUT_DPMS_DEFAULT_MASK) { + TDM_ERR("Don't use the low-4bit for an extended DPMS mode: dpms_value(%x)", dpms_value); + return TDM_ERROR_BAD_REQUEST; + } + + if (!(private_output->caps.capabilities & TDM_OUTPUT_CAPABILITY_EXTENDED_DPMS)) { + TDM_ERR("output(%d) doesn't support the extended DPMS control: '%s'", + private_output->pipe, tdm_dpms_str(dpms_value)); + return TDM_ERROR_BAD_REQUEST; + } + } + _pthread_mutex_lock(&private_display->lock); if (private_output->waiting_dpms_change) { -- 2.7.4