X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=backends%2Fvirtual%2Ftdm_virtual_display.c;h=89f07691837392276e8dd9e82988355d7168e754;hb=ceeb07117433a7aaecc0041df8162f43fd8e06de;hp=ea3f5af3a6d6c6b5c1d6871c28630ae23658d89d;hpb=398989bae0addb8c17264d1bee02509fafcd101d;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/backends/virtual/tdm_virtual_display.c b/backends/virtual/tdm_virtual_display.c index ea3f5af..89f0769 100644 --- a/backends/virtual/tdm_virtual_display.c +++ b/backends/virtual/tdm_virtual_display.c @@ -4,98 +4,12 @@ #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: @@ -103,8 +17,20 @@ _tdm_virtual_display_cb_event(tdm_virtual_output_data *output_data, tdm_virtual_ 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; @@ -343,6 +269,9 @@ virtual_output_get_capability(tdm_output *output, tdm_caps_output *caps) 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)); @@ -361,6 +290,13 @@ virtual_output_get_layers(tdm_output *output, int *count, tdm_error *error) 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)++; @@ -566,10 +502,20 @@ tdm_error 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; @@ -604,6 +550,45 @@ virtual_output_set_status_handler(tdm_output *output, 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) { @@ -875,6 +860,9 @@ virtual_display_voutput_create(tdm_backend_data *bdata, const char *name, tdm_er 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: @@ -1005,3 +993,18 @@ virtual_voutput_commit_done(tdm_voutput *voutput) 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; +} +