X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Ftdm_private.h;h=4b23a4aa399151559dd4ef9bc1f8750e619b96f6;hb=0ffceb298b9a177f773475c5211d79d1c1a91d75;hp=eb6f6d665171c0684f099f3342a837988dd61931;hpb=a8733f4923a4e6d2847f236314fff9d1973bc786;p=platform%2Fcore%2Fuifw%2Flibtdm.git diff --git a/src/tdm_private.h b/src/tdm_private.h index eb6f6d6..4b23a4a 100644 --- a/src/tdm_private.h +++ b/src/tdm_private.h @@ -53,7 +53,9 @@ #include #include #include +#include +#include #include #include @@ -80,6 +82,7 @@ enum { TDM_DEBUG_THREAD = (1 << 2), TDM_DEBUG_SERVER = (1 << 3), TDM_DEBUG_VBLANK = (1 << 4), + TDM_DEBUG_COMMIT = (1 << 5), }; extern int tdm_debug_module; @@ -107,21 +110,31 @@ enum { TDM_DUMP_FLAG_LAYER = (1 << 0), TDM_DUMP_FLAG_PP = (1 << 1), TDM_DUMP_FLAG_CAPTURE = (1 << 2), + TDM_DUMP_FLAG_WINDOW = (1 << 3), }; #define TDM_DUMP_DIR "/tmp" +typedef enum { + TDM_COMMIT_TYPE_NONE, + TDM_COMMIT_TYPE_OUTPUT, + TDM_COMMIT_TYPE_LAYER, +} tdm_commit_type; + typedef struct _tdm_private_display tdm_private_display; typedef struct _tdm_private_output tdm_private_output; typedef struct _tdm_private_layer tdm_private_layer; +typedef struct _tdm_private_hwc_window tdm_private_hwc_window; typedef struct _tdm_private_pp tdm_private_pp; typedef struct _tdm_private_capture tdm_private_capture; typedef struct _tdm_private_loop tdm_private_loop; typedef struct _tdm_private_server tdm_private_server; typedef struct _tdm_private_thread tdm_private_thread; typedef struct _tdm_private_vblank_handler tdm_private_vblank_handler; -typedef struct _tdm_private_commit_handler tdm_private_commit_handler; +typedef struct _tdm_private_output_commit_handler tdm_private_output_commit_handler; +typedef struct _tdm_private_layer_commit_handler tdm_private_layer_commit_handler; typedef struct _tdm_private_change_handler tdm_private_change_handler; +typedef struct _tdm_private_layer_buffer tdm_private_layer_buffer; struct _tdm_private_display { pthread_mutex_t lock; @@ -141,6 +154,7 @@ struct _tdm_private_display { tdm_func_display func_display; tdm_func_output func_output; tdm_func_layer func_layer; + tdm_func_hwc_window func_hwc_window; tdm_func_pp func_pp; tdm_func_capture func_capture; @@ -161,6 +175,14 @@ struct _tdm_private_display { /* output order */ tdm_output **outputs; + + /* calling a output commit per a vblank */ + int commit_per_vblank; + tdm_commit_type commit_type; + + int hwc_enable; + + int print_fps; }; struct _tdm_private_output { @@ -184,9 +206,16 @@ struct _tdm_private_output { int regist_dpms_cb; struct list_head layer_list; + struct list_head hwc_window_list; struct list_head capture_list; struct list_head vblank_handler_list; - struct list_head commit_handler_list; + struct list_head output_commit_handler_list; + + /* for layer commit */ + struct list_head layer_commit_handler_list; + struct list_head pending_commit_handler_list; + tdm_vblank *vblank; + int layer_waiting_vblank; /* seperate list for multi-thread*/ struct list_head change_handler_list_main; @@ -209,16 +238,37 @@ struct _tdm_private_layer { tdm_caps_layer caps; tdm_layer *layer_backend; - tbm_surface_h pending_buffer; - tbm_surface_h waiting_buffer; - tbm_surface_h showing_buffer; + /* When a buffer is set to a layer, it will be stored to waiting_buffer. + * And when a layer is committed, it will be moved to committed_buffer. + * Finally when a commit handler is called, it will be moved to showing_buffer. + */ + tdm_private_layer_buffer *waiting_buffer; + tdm_private_layer_buffer *committed_buffer; /* for output_commit */ + tdm_private_layer_buffer *showing_buffer; tbm_surface_queue_h buffer_queue; struct list_head capture_list; unsigned int usable; + unsigned int committing; + + double fps_stamp; + unsigned int fps_count; }; +struct _tdm_private_hwc_window { + struct list_head link; + + int index; + uint32_t zpos; + + tdm_private_display *private_display; + tdm_private_output *private_output; + + tdm_hwc_window *hwc_window_backend; +}; + + struct _tdm_private_pp { struct list_head link; @@ -298,13 +348,15 @@ struct _tdm_private_vblank_handler { struct list_head link; tdm_private_output *private_output; + int interval; + int sync; tdm_output_vblank_handler func; void *user_data; pid_t owner_tid; }; -struct _tdm_private_commit_handler { +struct _tdm_private_output_commit_handler { struct list_head link; tdm_private_output *private_output; @@ -314,6 +366,16 @@ struct _tdm_private_commit_handler { pid_t owner_tid; }; +struct _tdm_private_layer_commit_handler { + struct list_head link; + + tdm_private_layer *private_layer; + tdm_layer_commit_handler func; + void *user_data; + + tdm_private_layer_buffer *committed_buffer; /* for layer_commit */ +}; + struct _tdm_private_change_handler { struct list_head link; @@ -324,6 +386,11 @@ struct _tdm_private_change_handler { pid_t owner_tid; }; +struct _tdm_private_layer_buffer { + tbm_surface_h buffer; + struct list_head link; +}; + typedef struct _tdm_buffer_info { tbm_surface_h buffer; @@ -344,6 +411,12 @@ typedef struct _tdm_pp_private_buffer { struct list_head commit_link; } tdm_pp_private_buffer; +typedef struct _tdm_capture_private_buffer { + tbm_surface_h buffer; + struct list_head link; + struct list_head commit_link; +} tdm_capture_private_buffer; + int tdm_display_check_module_abi(tdm_private_display *private_display, int abimaj, int abimin); @@ -366,6 +439,24 @@ tdm_output_cb_status(tdm_output *output_backend, tdm_output_conn_status status, void tdm_output_cb_dpms(tdm_output *output_backend, tdm_output_dpms dpms, void *user_data); +tdm_error +tdm_output_wait_vblank_add_front(tdm_output *output, int interval, int sync, + tdm_output_vblank_handler func, void *user_data); +tdm_error +tdm_output_commit_internal(tdm_output *output, int sync, tdm_output_commit_handler func, void *user_data); +tdm_error +tdm_output_get_dpms_internal(tdm_output *output, tdm_output_dpms *dpms_value); + +void +tdm_output_remove_vblank_handler_internal(tdm_output *output, tdm_output_vblank_handler func, void *user_data); +void +tdm_output_remove_commit_handler_internal(tdm_output *output, tdm_output_commit_handler func, void *user_data); +void +tdm_layer_remove_commit_handler_internal(tdm_layer *layer, tdm_layer_commit_handler func, void *user_data); + +void +tdm_layer_committed(tdm_private_layer *private_layer, tdm_private_layer_buffer **committed_buffer); + void tdm_pp_cb_done(tdm_pp *pp_backend, tbm_surface_h src, tbm_surface_h dst, void *user_data); @@ -374,6 +465,14 @@ tdm_capture_cb_done(tdm_capture *capture_backend, tbm_surface_h buffer, void *user_data); tdm_error tdm_vblank_cb_vblank_SW(tdm_vblank *vblank, double vblank_stamp); +tdm_error +tdm_vblank_set_add_front(tdm_vblank *vblank, unsigned int add_front); +tdm_error +tdm_vblank_set_resource(tdm_vblank *vblank, struct wl_resource *resource); +tdm_error +tdm_vblank_set_client_vblank_fps(unsigned int pid, const char *name, unsigned int fps); +void +tdm_vblank_get_vblank_list_information(tdm_display *dpy, char *reply, int *len); void tdm_output_call_change_handler_internal(tdm_private_output *private_output, @@ -387,6 +486,11 @@ tdm_pp_create_internal(tdm_private_display *private_display, tdm_error *error); void tdm_pp_destroy_internal(tdm_private_pp *private_pp); +tdm_hwc_window * +tdm_hwc_window_create_internal(tdm_private_output *private_output, tdm_error *error); +tdm_error +tdm_hwc_window_destroy_internal(tdm_private_hwc_window * private_hwc_window); + tdm_private_capture * tdm_capture_create_output_internal(tdm_private_output *private_output, tdm_error *error); @@ -420,6 +524,8 @@ tdm_error tdm_event_loop_dispatch(tdm_private_display *private_display); void tdm_event_loop_flush(tdm_private_display *private_display); +tdm_error +tdm_event_loop_trace_enable(tdm_private_display *private_display, unsigned int enable); typedef enum { TDM_THREAD_CB_NONE, @@ -508,6 +614,8 @@ tdm_error tdm_server_init(tdm_private_loop *private_loop); void tdm_server_deinit(tdm_private_loop *private_loop); +const char* +tdm_server_get_client_name(pid_t pid); char * tdm_helper_dump_make_directory(const char *path, char *reply, int *len); @@ -518,6 +626,10 @@ tdm_helper_get_time(void); extern pthread_mutex_t tdm_mutex_check_lock; extern int tdm_mutex_locked; +extern const char *tdm_mutex_lock_func; +extern int tdm_mutex_lock_line; +extern const char *tdm_mutex_unlock_func; +extern int tdm_mutex_unlock_line; extern int tdm_dump_enable; extern char *tdm_debug_dump_dir; @@ -527,6 +639,10 @@ extern char *tdm_debug_dump_dir; TDM_INFO("mutex unlock"); \ pthread_mutex_lock(&tdm_mutex_check_lock); \ tdm_mutex_locked = 0; \ + tdm_mutex_lock_func = NULL; \ + tdm_mutex_lock_line = 0; \ + tdm_mutex_unlock_func = __FUNCTION__; \ + tdm_mutex_unlock_line = __LINE__; \ pthread_mutex_unlock(&tdm_mutex_check_lock); \ pthread_mutex_unlock(l); \ } while (0) @@ -546,6 +662,10 @@ extern char *tdm_debug_dump_dir; else { \ pthread_mutex_lock(&tdm_mutex_check_lock); \ tdm_mutex_locked = 1; \ + tdm_mutex_lock_func = __FUNCTION__; \ + tdm_mutex_lock_line = __LINE__; \ + tdm_mutex_unlock_func = NULL; \ + tdm_mutex_unlock_line = 0; \ pthread_mutex_unlock(&tdm_mutex_check_lock); \ } \ } while (0) @@ -557,6 +677,10 @@ extern char *tdm_debug_dump_dir; pthread_mutex_lock(l); \ pthread_mutex_lock(&tdm_mutex_check_lock); \ tdm_mutex_locked = 1; \ + tdm_mutex_lock_func = __FUNCTION__; \ + tdm_mutex_lock_line = __LINE__; \ + tdm_mutex_unlock_func = NULL; \ + tdm_mutex_unlock_line = 0; \ pthread_mutex_unlock(&tdm_mutex_check_lock); \ } while (0) #endif //TDM_CONFIG_MUTEX_TIMEOUT @@ -587,10 +711,41 @@ tdm_error tdm_display_enable_path(const char *path); tdm_error tdm_display_enable_ttrace_vblank(tdm_display *dpy, tdm_output *output, int enable); +tdm_error +tdm_display_enable_commit_per_vblank(tdm_private_display *private_display, int enable); +tdm_error +tdm_display_enable_fps(tdm_private_display *private_display, int enable); void tdm_monitor_server_command(tdm_display *dpy, const char *options, char *reply, int *len); + + +#define TDM_WAYLAND_LOGGER ((WAYLAND_VERSION_MAJOR == 1) && (WAYLAND_VERSION_MINOR > 11)) + +#if !TDM_WAYLAND_LOGGER +#ifndef WL_CLOSURE_MAX_ARGS +#define WL_CLOSURE_MAX_ARGS 20 +#endif + +struct wl_closure { + int count; + const struct wl_message *message; + uint32_t opcode; + uint32_t sender_id; + union wl_argument args[WL_CLOSURE_MAX_ARGS]; + struct wl_list link; + struct wl_proxy *proxy; + struct wl_array extra[0]; +}; +#endif /* TDM_WAYLAND_LOGGER */ + +struct argument_details { + char type; + int nullable; +}; + + #ifdef __cplusplus } #endif