-typedef struct _tdm_func_display
-{
- /**
- * @brief Get the display capabilities of a backend module
- * @param[in] bdata The backend module data
- * @param[out] caps The display capabilities of a backend module
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @remark
- * A backend module @b SHOULD implement this function. TDM calls this function
- * not only at the initial time, but also at the update time when new output
- * is connected.\n
- * If a hardware has the restriction of the number of max usable layer count,
- * a backend module can set the max count to max_layer_count of #tdm_caps_display
- * structure. Otherwise, set -1.
- */
- tdm_error (*display_get_capabilitiy)(tdm_backend_data *bdata, tdm_caps_display *caps);
-
- /**
- * @brief Get the pp capabilities of a backend module
- * @param[in] bdata The backend module data
- * @param[out] caps The pp capabilities of a backend module
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see tdm_backend_register_func_pp
- * @remark
- * TDM calls this function not only at the initial time, but also at the update
- * time when new output is connected.\n
- * A backend module doesn't need to implement this function if a hardware
- * doesn't have the memory-to-memory converting device. Otherwise, a backend module
- * @b SHOULD fill the #tdm_caps_pp data. #tdm_caps_pp contains the hardware
- * restriction information which a converting device can handle. ie, format, size, etc.
- */
- tdm_error (*display_get_pp_capability)(tdm_backend_data *bdata, tdm_caps_pp *caps);
-
- /**
- * @brief Get the capture capabilities of a backend module
- * @param[in] bdata The backend module data
- * @param[out] caps The capture capabilities of a backend module
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see tdm_backend_register_func_capture
- * @remark
- * TDM calls this function not only at the initial time, but also at the update
- * time when new output is connected.\n
- * A backend module doesn't need to implement this function if a hardware
- * doesn't have the capture device. Otherwise, a backend module @b SHOULD fill the
- * #tdm_caps_capture data. #tdm_caps_capture contains the hardware restriction
- * information which a capture device can handle. ie, format, size, etc.
- */
- tdm_error (*display_get_capture_capability)(tdm_backend_data *bdata, tdm_caps_capture *caps);
-
- /**
- * @brief Get a output array of a backend module
- * @param[in] bdata The backend module data
- * @param[out] count The count of outputs
- * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
- * @return A output array which is @b newly-allocated
- * @see tdm_backend_register_func_capture
- * @remark
- * A backend module @b SHOULD implement this function. TDM calls this function
- * not only at the initial time, but also at the update time when new output
- * is connected.\n
- * A backend module @b SHOULD return the @b newly-allocated array which contains
- * "tdm_output*" data. It will be freed in frontend.
- * @par Example
- * @code
- tdm_output**
- drm_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error)
- {
- tdm_drm_data *drm_data = bdata;
- tdm_drm_output_data *output_data = NULL;
- tdm_output **outputs;
- int i;
-
- (*count) = 0;
- LIST_FOR_EACH_ENTRY(output_data, &drm_data->output_list, link)
- (*count)++;
-
- if ((*count) == 0)
- {
- if (error) *error = TDM_ERROR_NONE;
- return NULL;
- }
-
- // will be freed in frontend
- outputs = calloc(*count, sizeof(tdm_drm_output_data*));
- if (!outputs)
- {
- (*count) = 0;
- if (error) *error = TDM_ERROR_OUT_OF_MEMORY;
- return NULL;
- }
-
- i = 0;
- LIST_FOR_EACH_ENTRY(output_data, &drm_data->output_list, link)
- outputs[i++] = output_data;
-
- if (error) *error = TDM_ERROR_NONE;
-
- return outputs;
- }
- * @endcode
- */
- tdm_output **(*display_get_outputs)(tdm_backend_data *bdata, int *count, tdm_error *error);
-
- /**
- * @brief Get the file descriptor of a backend module
- * @param[in] bdata The backend module data
- * @param[out] fd The fd of a backend module
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see display_handle_events() function of #tdm_func_display
- * @remark
- * A backend module can return epoll's fd which is watching the backend device one more fds.
- */
- tdm_error (*display_get_fd)(tdm_backend_data *bdata, int *fd);
-
- /**
- * @brief Handle the events which happens on the fd of a backend module
- * @param[in] bdata The backend module data
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*display_handle_events)(tdm_backend_data *bdata);
-
- /**
- * @brief Create a pp object of a backend module
- * @param[in] bdata The backend module data
- * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
- * @return A pp object
- * @see pp_destroy() function of #tdm_func_pp
- * @remark
- * A backend module doesn't need to implement this function if a hardware
- * doesn't have the memory-to-memory converting device.
- */
- tdm_pp* (*display_create_pp)(tdm_backend_data *bdata, tdm_error *error);
-
- /**
- * @brief Get the capabilities of a output object
- * @param[in] output A output object
- * @param[out] caps The capabilities of a output object
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @remark
- * A backend module @b SHOULD implement this function. TDM calls this function
- * not only at the initial time, but also at the update time when new output
- * is connected.\n
- * #tdm_caps_output contains connection status, modes, avaiable properties,
- * size restriction information, etc.
- */
- tdm_error (*output_get_capability)(tdm_output *output, tdm_caps_output *caps);
-
- /**
- * @brief Get a layer array of a output object
- * @param[in] output A output object
- * @param[out] count The count of layers
- * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
- * @return A layer array which is @b newly-allocated
- * @remark
- * A backend module @b SHOULD implement this function. TDM calls this function
- * not only at the initial time, but also at the update time when new output
- * is connected.\n
- * A backend module @b SHOULD return the @b newly-allocated array which contains
- * "tdm_layer*" data. It will be freed in frontend.
- */
- tdm_layer **(*output_get_layers)(tdm_output *output, int *count, tdm_error *error);
-
- /**
- * @brief Set the property which has a given id
- * @param[in] output A output object
- * @param[in] id The property id
- * @param[in] value The value
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_set_property)(tdm_output *output, unsigned int id, tdm_value value);
-
- /**
- * @brief Get the property which has a given id
- * @param[in] output A output object
- * @param[in] id The property id
- * @param[out] value The value
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_get_property)(tdm_output *output, unsigned int id, tdm_value *value);
-
- /**
- * @brief Wait for VBLANK
- * @param[in] output A output object
- * @param[in] interval vblank interval
- * @param[in] sync 0: asynchronous, 1:synchronous
- * @param[in] user_data The user data
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see output_set_vblank_handler, tdm_output_vblank_handler
- * @remark
- * A backend module @b SHOULD call a user vblank handler after interval vblanks.
- */
- tdm_error (*output_wait_vblank)(tdm_output *output, int interval, int sync, void *user_data);
-
- /**
- * @brief Set a user vblank handler
- * @param[in] output A output object
- * @param[in] func A user vblank handler
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_set_vblank_handler)(tdm_output *output, tdm_output_vblank_handler func);
-
- /**
- * @brief Commit changes for a output object
- * @param[in] output A output object
- * @param[in] sync 0: asynchronous, 1:synchronous
- * @param[in] user_data The user data
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see output_set_commit_handler, tdm_output_commit_handler
- * @remark
- * A backend module @b SHOULD call a user commit handler after all change of
- * a output object are applied.
- */
- tdm_error (*output_commit)(tdm_output *output, int sync, void *user_data);
-
- /**
- * @brief Set a user commit handler
- * @param[in] output A output object
- * @param[in] func A user commit handler
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_set_commit_handler)(tdm_output *output, tdm_output_commit_handler func);
-
- /**
- * @brief Set DPMS of a output object
- * @param[in] output A output object
- * @param[in] dpms_value DPMS value
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_set_dpms)(tdm_output *output, tdm_output_dpms dpms_value);
-
- /**
- * @brief Get DPMS of a output object
- * @param[in] output A output object
- * @param[out] dpms_value DPMS value
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_get_dpms)(tdm_output *output, tdm_output_dpms *dpms_value);
-
- /**
- * @brief Set one of available modes of a output object
- * @param[in] output A output object
- * @param[in] mode A output mode
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_set_mode)(tdm_output *output, const tdm_output_mode *mode);
-
- /**
- * @brief Get the mode of a output object
- * @param[in] output A output object
- * @param[out] mode A output mode
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*output_get_mode)(tdm_output *output, const tdm_output_mode **mode);
-
- /**
- * @brief Create a capture object of a output object
- * @param[in] output A output object
- * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
- * @return A capture object
- * @see capture_destroy() function of #tdm_func_capture
- * @remark
- * A backend module doesn't need to implement this function if a hardware
- * doesn't have the capture device.
- */
- tdm_capture *(*output_create_capture)(tdm_output *output, tdm_error *error);
-
- /**
- * @brief Get the capabilities of a layer object
- * @param[in] layer A layer object
- * @param[out] caps The capabilities of a layer object
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @remark
- * A backend module @b SHOULD implement this function. TDM calls this function
- * not only at the initial time, but also at the update time when new output
- * is connected.\n
- * #tdm_caps_layer contains avaiable formats/properties, zpos information, etc.
- */
- tdm_error (*layer_get_capability)(tdm_layer *layer, tdm_caps_layer *caps);
-
- /**
- * @brief Set the property which has a given id.
- * @param[in] layer A layer object
- * @param[in] id The property id
- * @param[in] value The value
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*layer_set_property)(tdm_layer *layer, unsigned int id, tdm_value value);
-
- /**
- * @brief Get the property which has a given id.
- * @param[in] layer A layer object
- * @param[in] id The property id
- * @param[out] value The value
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*layer_get_property)(tdm_layer *layer, unsigned int id, tdm_value *value);
-
- /**
- * @brief Set the geometry information to a layer object
- * @param[in] layer A layer object
- * @param[in] info The geometry information
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see output_commit() function of #tdm_func_display
- * @remark
- * A backend module would apply the geometry information when the output object
- * of a layer object is committed.
- */
- tdm_error (*layer_set_info)(tdm_layer *layer, tdm_info_layer *info);
-
- /**
- * @brief Get the geometry information to a layer object
- * @param[in] layer A layer object
- * @param[out] info The geometry information
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- */
- tdm_error (*layer_get_info)(tdm_layer *layer, tdm_info_layer *info);
-
- /**
- * @brief Set a TDM buffer to a layer object
- * @param[in] layer A layer object
- * @param[in] buffer A TDM buffer
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see output_commit() function of #tdm_func_display
- * @remark
- * A backend module would apply a TDM buffer when the output object
- * of a layer object is committed.
- */
- tdm_error (*layer_set_buffer)(tdm_layer *layer, tbm_surface_h buffer);
-
- /**
- * @brief Unset a TDM buffer from a layer object
- * @param[in] layer A layer object
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @remark
- * A backend module @b SHOULD hide the current showing buffer from screen.
- * If needed, cleanup a layer object resource.
- */
- tdm_error (*layer_unset_buffer)(tdm_layer *layer);
-
- /**
- * @brief Set the zpos for a VIDEO layer object
- * @param[in] layer A layer object
- * @param[in] zpos z-order
- * @return #TDM_ERROR_NONE if success. Otherwise, error value.
- * @see tdm_caps_layer, tdm_layer_capability
- * @remark
- * A backend module doesn't need to implement this function if a backend
- * module doesn't have VIDEO layers.\n
- * This function is for VIDEO layers.
- * GRAPHIC layers are non-changeable. The zpos of GRAPHIC layers starts
- * from 0. If there are 4 GRAPHIC layers, The zpos SHOULD be 0, 1, 2, 3.\n
- * But the zpos of VIDEO layer is changeable. And The zpos of VIDEO layers
- * is less than GRAPHIC layers or more than GRAPHIC layers.
- * ie, ..., -2, -1, 4, 5, ... (if 0 <= GRAPHIC layer's zpos < 4).
- * The zpos of VIDEO layers is @b relative. It doesn't need to start
- * from -1 or 4. Let's suppose that there are two VIDEO layers.
- * One has -2 zpos. Another has -4 zpos. Then -2 Video layer is higher
- * than -4 VIDEO layer.
- */
- tdm_error (*layer_set_video_pos)(tdm_layer *layer, int zpos);
-
- /**
- * @brief Create a capture object of a layer object
- * @param[in] output A output object
- * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
- * @return A capture object
- * @see capture_destroy() function of #tdm_func_capture
- * @remark
- * A backend module doesn't need to implement this function if a hardware
- * doesn't have the capture device.
- */
- tdm_capture *(*layer_create_capture)(tdm_layer *layer, tdm_error *error);
+typedef struct _tdm_func_display {
+ /**
+ * @brief Get the display capabilities of a backend module
+ * @param[in] bdata The backend module data
+ * @param[out] caps The display capabilities of a backend module
+ * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @remark
+ * A backend module @b SHOULD implement this function. TDM calls this function
+ * not only at the initial time, but also at the update time when new output
+ * is connected.\n
+ * If a hardware has the restriction of the number of max usable layer count,
+ * a backend module can set the max count to max_layer_count of #tdm_caps_display
+ * structure.
+ */
+ tdm_error (*display_get_capability)(tdm_backend_data *bdata, tdm_caps_display *caps);
+
+ /**
+ * @brief Get the pp capabilities of a backend module
+ * @param[in] bdata The backend module data
+ * @param[out] caps The pp capabilities of a backend module
+ * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @see tdm_backend_register_func_pp
+ * @remark
+ * TDM calls this function not only at the initial time, but also at the update
+ * time when new output is connected.\n
+ * A backend module doesn't need to implement this function if a hardware
+ * doesn't have the memory-to-memory converting device. Otherwise, a backend module
+ * @b SHOULD fill the #tdm_caps_pp data. #tdm_caps_pp contains the hardware
+ * restriction information which a converting device can handle. ie, format, size, etc.
+ */
+ tdm_error (*display_get_pp_capability)(tdm_backend_data *bdata, tdm_caps_pp *caps);
+
+ /**
+ * @brief Get the capture capabilities of a backend module
+ * @param[in] bdata The backend module data
+ * @param[out] caps The capture capabilities of a backend module
+ * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @see tdm_backend_register_func_capture
+ * @remark
+ * TDM calls this function not only at the initial time, but also at the update
+ * time when new output is connected.\n
+ * A backend module doesn't need to implement this function if a hardware
+ * doesn't have the capture device. Otherwise, a backend module @b SHOULD fill the
+ * #tdm_caps_capture data. #tdm_caps_capture contains the hardware restriction
+ * information which a capture device can handle. ie, format, size, etc.
+ */
+ tdm_error (*display_get_capture_capability)(tdm_backend_data *bdata, tdm_caps_capture *caps);
+
+ /**
+ * @brief Get a output array of a backend module
+ * @param[in] bdata The backend module data
+ * @param[out] count The count of outputs
+ * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @return A output array which is @b newly-allocated
+ * @see tdm_backend_register_func_capture
+ * @remark
+ * A backend module @b SHOULD implement this function. TDM calls this function
+ * not only at the initial time, but also at the update time when new output
+ * is connected.\n
+ * A backend module @b SHOULD return the @b newly-allocated array which contains
+ * "tdm_output*" data. It will be freed in frontend.
+ * @par Example
+ * @code
+ * tdm_output**
+ * drm_display_get_outputs(tdm_backend_data *bdata, int *count, tdm_error *error)
+ * {
+ * tdm_drm_data *drm_data = bdata;
+ * tdm_drm_output_data *output_data = NULL;
+ * tdm_output **outputs;
+ * int i;
+ *
+ * (*count) = 0;
+ * LIST_FOR_EACH_ENTRY(output_data, &drm_data->output_list, link)
+ * (*count)++;
+ *
+ * if ((*count) == 0)
+ * {
+ * if (error) *error = TDM_ERROR_NONE;
+ * return NULL;
+ * }
+ *
+ * // will be freed in frontend
+ * outputs = calloc(*count, sizeof(tdm_drm_output_data*));
+ * if (!outputs)
+ * {
+ * (*count) = 0;
+ * if (error) *error = TDM_ERROR_OUT_OF_MEMORY;
+ * return NULL;
+ * }
+ *
+ * i = 0;
+ * LIST_FOR_EACH_ENTRY(output_data, &drm_data->output_list, link)
+ * outputs[i++] = output_data;
+ *
+ * if (error) *error = TDM_ERROR_NONE;
+ *
+ * return outputs;
+ * }
+ * @endcode
+ */
+ tdm_output **(*display_get_outputs)(tdm_backend_data *bdata, int *count,
+ tdm_error *error);
+
+ /**
+ * @brief Get the file descriptor of a backend module
+ * @param[in] bdata The backend module data
+ * @param[out] fd The fd of a backend module
+ * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @see display_handle_events() function of #tdm_func_display
+ * @remark
+ * A backend module can return epoll's fd which is watching the backend device one more fds.
+ */
+ tdm_error (*display_get_fd)(tdm_backend_data *bdata, int *fd);
+
+ /**
+ * @brief Handle the events which happens on the fd of a backend module
+ * @param[in] bdata The backend module data
+ * @return #TDM_ERROR_NONE if success. Otherwise, error value.
+ */
+ tdm_error (*display_handle_events)(tdm_backend_data *bdata);
+
+ /**
+ * @brief Create a pp object of a backend module
+ * @param[in] bdata The backend module data
+ * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @return A pp object
+ * @see pp_destroy() function of #tdm_func_pp
+ * @remark
+ * A backend module doesn't need to implement this function if a hardware
+ * doesn't have the memory-to-memory converting device.
+ */
+ tdm_pp *(*display_create_pp)(tdm_backend_data *bdata, tdm_error *error);
+
+ /**
+ * @brief Create a virtual output object of a backend module
+ * @param[in] bdata The backend module data
+ * @param[in] name The output name
+ * @param[out] error #TDM_ERROR_NONE if success. Otherwise, error value.
+ * @return A tdm_voutput object
+ * @see voutput_destroy() function
+ * @remark
+ * A backend module doesn't need to implement this function if doesn't support virtual output.
+ */
+ tdm_voutput *(*voutput_create)(tdm_backend_data *bdata, const char *name, tdm_error *error);
+
+ void (*reserved2)(void);
+ void (*reserved3)(void);
+ void (*reserved4)(void);
+ void (*reserved5)(void);
+ void (*reserved6)(void);
+ void (*reserved7)(void);
+ void (*reserved8)(void);