tdm_virtual: support hwc mode
[platform/core/uifw/libtdm.git] / backends / virtual / tdm_virtual.h
index 0a5c377..cc36d58 100644 (file)
@@ -52,12 +52,50 @@ tdm_output *virtual_voutput_get_output(tdm_voutput *voutput, tdm_error *error);
 tdm_error virtual_voutput_set_commit_func(tdm_voutput *voutput,  tdm_voutput_commit_handler commit_func);
 tdm_error virtual_voutput_commit_done(tdm_voutput *voutput);
 
+tdm_hwc *virtual_output_get_hwc(tdm_output *output, tdm_error *error);
+tdm_hwc_window *virtual_hwc_create_window(tdm_hwc *hwc, tdm_error *error);
+tdm_error virtual_hwc_get_video_supported_formats(tdm_output *output, const tbm_format **formats, int *count);
+tdm_error virtual_hwc_get_capabilities(tdm_hwc *hwc, tdm_hwc_capability *capabilities);
+tdm_error virtual_hwc_get_available_properties(tdm_hwc *hwc, const tdm_prop **props, int *count);
+tbm_surface_queue_h virtual_hwc_get_client_target_buffer_queue(tdm_hwc *hwc, tdm_error *error);
+tdm_error virtual_hwc_set_client_target_buffer(tdm_hwc *hwc, tbm_surface_h buffer, tdm_region damage);
+tdm_error virtual_hwc_validate(tdm_hwc *hwc, tdm_hwc_window **composited_wnds, uint32_t num_wnds, uint32_t *num_types);
+tdm_error virtual_hwc_get_changed_composition_types(tdm_hwc *hwc, uint32_t *num_elements, tdm_hwc_window **hwc_wnds, tdm_hwc_window_composition *composition_types);
+tdm_error virtual_hwc_accept_validation(tdm_hwc *hwc);
+tdm_error virtual_hwc_commit(tdm_hwc *hwc, int sync, void *user_data);
+tdm_error virtual_hwc_set_commit_handler(tdm_hwc *hwc, tdm_hwc_commit_handler func);
+
+void virtual_hwc_window_destroy(tdm_hwc_window *hwc_window);
+tdm_error virtual_hwc_window_set_composition_type(tdm_hwc_window *hwc_window, tdm_hwc_window_composition composition_type);
+tdm_error virtual_hwc_window_set_buffer_damage(tdm_hwc_window *hwc_window, tdm_region damage);
+tdm_error virtual_hwc_window_set_info(tdm_hwc_window *hwc_window, tdm_hwc_window_info *info);
+tdm_error virtual_hwc_window_set_buffer(tdm_hwc_window *hwc_window, tbm_surface_h surface);
+tdm_error virtual_hwc_window_set_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value value);
+tdm_error virtual_hwc_window_get_property(tdm_hwc_window *hwc_window, unsigned int id, tdm_value *value);
+tdm_error virtual_hwc_window_get_constraints(tdm_hwc_window *hwc_window, int *constraints);
+tdm_error virtual_hwc_window_set_name(tdm_hwc_window *hwc_window, const char *name);
+
 tdm_error virtual_layer_get_capability(tdm_layer *layer, tdm_caps_layer *caps);
 tdm_error virtual_layer_set_info(tdm_layer *layer, tdm_info_layer *info);
 tdm_error virtual_layer_get_info(tdm_layer *layer, tdm_info_layer *info);
 tdm_error virtual_layer_set_buffer(tdm_layer *layer, tbm_surface_h buffer);
 tdm_error virtual_layer_unset_buffer(tdm_layer *layer);
 
+#define C(b,m)              (((b) >> (m)) & 0xFF)
+#define B(c,s)              ((((unsigned int)(c)) & 0xff) << (s))
+#define FOURCC(a,b,c,d)     (B(d,24) | B(c,16) | B(b,8) | B(a,0))
+#define FOURCC_STR(id)      C(id,0), C(id,8), C(id,16), C(id,24)
+
+#define IS_RGB(format)      (format == TBM_FORMAT_XRGB8888 || format == TBM_FORMAT_ARGB8888 || \
+                             format == TBM_FORMAT_XBGR8888 || format == TBM_FORMAT_ABGR8888)
+
+#define RETURN_IF_FAIL(cond) { \
+       if (!(cond)) { \
+               TDM_ERR("'%s' failed", #cond); \
+               return; \
+       } \
+}
+
 #define RETURN_VAL_IF_FAIL(cond, val) {\
        if (!(cond)) {\
                TDM_ERR("'%s' failed", #cond);\
@@ -72,16 +110,140 @@ tdm_error virtual_layer_unset_buffer(tdm_layer *layer);
        }\
 }
 
-typedef struct _tdm_virtual_data {
+typedef struct _tdm_virtual_data tdm_virtual_data;
+typedef struct _tdm_virtual_output_data tdm_virtual_output_data;
+typedef struct _tdm_virtual_hwc_data tdm_virtual_hwc_data;
+typedef struct _tdm_virtual_hwc_window_data tdm_virtual_hwc_window_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_data {
        tdm_display *dpy;
+       int hwc_mode;
 
        int pipe[2];
 
        struct list_head voutput_list;
        struct list_head output_list;
        struct list_head buffer_list;
-} tdm_virtual_data;
+};
 
-void tdm_virtual_display_destroy_output_list(tdm_virtual_data *virtual_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;
+
+       /* hwc data */
+       int hwc_enable;
+       tdm_virtual_hwc_data *hwc_data;
+};
+
+struct _tdm_virtual_hwc_data {
+       tdm_virtual_hwc_window_data *target_hwc_window;
+
+       int need_validate;
+       int need_target_window;
+       int need_set_crtc;
+
+       int target_window_zpos;
 
+       tdm_virtual_output_data *output_data;
+       struct list_head hwc_window_list;
+
+       tdm_hwc_commit_handler commit_func;
+};
+
+struct _tdm_virtual_hwc_window_data {
+       struct list_head link;
+
+       tdm_virtual_hwc_data *hwc_data;
+
+       tdm_hwc_window_info info;
+       tbm_surface_h surface;
+       tdm_hwc_window_composition client_type;
+       tdm_hwc_window_composition validated_type;
+       int lzpos;
+
+       char name[TDM_NAME_LEN];
+};
+
+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;
+};
+
+struct _tdm_virtual_event_data {
+       struct list_head link;
+
+       tdm_virtual_event_type type;
+       tdm_virtual_output_data *output_data;
+       void *user_data;
+};
+
+void tdm_virtual_display_destroy_output_list(tdm_virtual_data *virtual_data);
+tdm_virtual_layer_data *virtual_output_data_get_layer_data(tdm_virtual_output_data *output_data, int layer_zpos);
+tdm_error    virtual_hwc_initailize_target_window(tdm_hwc *hwc_data, int width, int height);
 #endif /* _TDM_VIRTUAL_H_ */