#include "tdm_virtual.h"
-typedef struct _tdm_virtual_output_data tdm_virtual_output_data;
-typedef struct _tdm_virtual_voutput_data tdm_virtual_voutput_data;
-typedef struct _tdm_virtual_layer_data tdm_virtual_layer_data;
-typedef struct _tdm_virtual_event_data tdm_virtual_event_data;
-
-typedef enum {
- TDM_VIRTUAL_EVENT_TYPE_WAIT,
- TDM_VIRTUAL_EVENT_TYPE_COMMIT,
- TDM_VIRTUAL_EVENT_TYPE_VCOMMIT,
-} tdm_virtual_event_type;
-
-struct _tdm_virtual_event_data {
- struct list_head link;
-
- tdm_virtual_event_type type;
- tdm_virtual_output_data *output_data;
- void *user_data;
-};
-
-struct _tdm_virtual_output_data {
- struct list_head link;
-
- /* data which are fixed at initializing */
- tdm_virtual_data *virtual_data;
- tdm_virtual_voutput_data *voutput_data;
-
- char name[TDM_NAME_LEN]; /* output name */
- uint32_t pipe;
- tdm_output_type connector_type;
- struct list_head layer_list;
- tdm_virtual_layer_data *primary_layer;
-
- tdm_output_dpms dpms;
-
- /* not fixed data below */
- tdm_output_vblank_handler vblank_func;
- tdm_output_commit_handler commit_func;
- void *commit_user_data;
-
- tdm_output_conn_status status;
- tdm_output_status_handler status_func;
- void *status_user_data;
-
- int mode_changed;
- const tdm_output_mode *current_mode;
-
- tdm_event_loop_source *timer;
- unsigned int timer_waiting;
- struct list_head timer_event_list;
-};
-
-struct _tdm_virtual_voutput_data {
- struct list_head link;
-
- /* data which are fixed at initializing */
- tdm_virtual_data *virtual_data;
- tdm_virtual_output_data *output_data;
-
- char name[TDM_NAME_LEN]; /* output name */
-
- tdm_voutput_commit_handler vcommit_func;
-
- tdm_output_mode *output_modes;
- int mode_count;
-
- unsigned int mmwidth;
- unsigned int mmheight;
-};
-
-
-struct _tdm_virtual_layer_data {
- struct list_head link;
-
- /* data which are fixed at initializing */
- tdm_virtual_data *virtual_data;
- tdm_virtual_output_data *output_data;
- tdm_layer_capability capabilities;
- int zpos;
-
- /* not fixed data below */
- tdm_info_layer info;
- int info_changed;
-
- tbm_surface_h display_buffer;
- int display_buffer_changed;
-};
-
static void
_tdm_virtual_display_cb_event(tdm_virtual_output_data *output_data, tdm_virtual_event_data *event_data,
unsigned int sequence, unsigned int tv_sec, unsigned int tv_usec)
{
tdm_virtual_voutput_data *voutput_data = NULL;
+ tdm_virtual_hwc_data *hwc_data;
switch (event_data->type) {
case TDM_VIRTUAL_EVENT_TYPE_WAIT:
output_data->vblank_func(output_data, sequence, tv_sec, tv_usec, event_data->user_data);
break;
case TDM_VIRTUAL_EVENT_TYPE_COMMIT:
- if (output_data->commit_func)
- output_data->commit_func(output_data, sequence, tv_sec, tv_usec, event_data->user_data);
+ if (output_data->hwc_enable) {
+ hwc_data = output_data->hwc_data;
+ if (!hwc_data) {
+ TDM_ERR("no hwc_data");
+ break;
+ }
+
+ if (hwc_data->commit_func)
+ hwc_data->commit_func(hwc_data, sequence,
+ tv_sec, tv_usec,
+ event_data->user_data);
+ } else
+ if (output_data->commit_func)
+ output_data->commit_func(output_data, sequence, tv_sec, tv_usec, event_data->user_data);
break;
case TDM_VIRTUAL_EVENT_TYPE_VCOMMIT:
voutput_data = output_data->voutput_data;
caps->prop_count = 0;
+ if (output_data->virtual_data->hwc_mode)
+ caps->capabilities |= TDM_OUTPUT_CAPABILITY_HWC;
+
return TDM_ERROR_NONE;
failed_get:
memset(caps, 0, sizeof(tdm_caps_output));
RETURN_VAL_IF_FAIL(output_data, NULL);
RETURN_VAL_IF_FAIL(count, NULL);
+ if (output_data->virtual_data->hwc_mode) {
+ TDM_INFO("layers aren't supported in HWC mode");
+ *count = 0;
+ ret = TDM_ERROR_NONE;
+ goto failed_get;
+ }
+
*count = 0;
LIST_FOR_EACH_ENTRY(layer_data, &output_data->layer_list, link)
(*count)++;
virtual_output_set_mode(tdm_output *output, const tdm_output_mode *mode)
{
tdm_virtual_output_data *output_data = output;
+ tdm_error ret = TDM_ERROR_NONE;
RETURN_VAL_IF_FAIL(output_data, TDM_ERROR_INVALID_PARAMETER);
RETURN_VAL_IF_FAIL(mode, TDM_ERROR_INVALID_PARAMETER);
+ /* create or replace the target_window when the output mode is set */
+ if (output_data->virtual_data->hwc_mode) {
+ ret = virtual_hwc_initailize_target_window(output_data->hwc_data, mode->hdisplay, mode->vdisplay);
+ if (ret != TDM_ERROR_NONE) {
+ TDM_ERR("create target hwc window failed (%d)", ret);
+ return ret;
+ }
+ }
+
output_data->current_mode = mode;
output_data->mode_changed = 1;
return TDM_ERROR_NONE;
}
+tdm_hwc *
+virtual_output_get_hwc(tdm_output *output, tdm_error *error)
+{
+ tdm_virtual_hwc_data *hwc_data = NULL;
+ tdm_virtual_output_data *output_data = output;
+
+ if (!output_data) {
+ TDM_ERR("invalid params");
+ if (error)
+ *error = TDM_ERROR_INVALID_PARAMETER;
+ return NULL;
+ }
+
+ if (output_data->hwc_data) {
+ TDM_INFO("hwc_data already exists");
+ if (error)
+ *error = TDM_ERROR_NONE;
+ return output_data->hwc_data;
+ }
+
+ hwc_data = calloc(1, sizeof(tdm_virtual_hwc_data));
+ if (!hwc_data) {
+ TDM_ERR("alloc failed");
+ if (error)
+ *error = TDM_ERROR_OUT_OF_MEMORY;
+ return NULL;
+ }
+ hwc_data->output_data = output_data;
+
+ LIST_INITHEAD(&hwc_data->hwc_window_list);
+
+ output_data->hwc_data = hwc_data;
+
+ if (error)
+ *error = TDM_ERROR_NONE;
+
+ return hwc_data;
+}
+
tdm_error
virtual_voutput_set_available_mode(tdm_voutput *voutput, const tdm_output_mode *modes, int count)
{
TDM_DBG("virtual output create(%s)(%p)(%p)", output_data->name, voutput_data, output_data);
+ if (output_data->virtual_data->hwc_mode)
+ output_data->hwc_enable = 1;
+
return voutput_data;
create_fail:
return TDM_ERROR_NONE;
}
+tdm_virtual_layer_data *
+virtual_output_data_get_layer_data(tdm_virtual_output_data *output_data, int layer_zpos)
+{
+ tdm_virtual_layer_data *l = NULL;
+
+ RETURN_VAL_IF_FAIL(output_data, NULL);
+
+ LIST_FOR_EACH_ENTRY(l, &output_data->layer_list, link) {
+ if (l->zpos == layer_zpos)
+ return l;
+ }
+
+ return NULL;
+}
+