From 066947816433c1a09a53af644512b8039769e277 Mon Sep 17 00:00:00 2001 From: Junseok Kim Date: Thu, 23 May 2024 09:39:56 +0900 Subject: [PATCH 01/16] screen: add wtz_screen_set_opaque_region request callback Change-Id: I299750529260c82a90a4d17e470397629a58baa4 --- include/libds-tizen/screen.h | 12 +++++++ src/meson.build | 1 + src/screen/screen.c | 75 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) diff --git a/include/libds-tizen/screen.h b/include/libds-tizen/screen.h index 11a39ab..092e6ac 100644 --- a/include/libds-tizen/screen.h +++ b/include/libds-tizen/screen.h @@ -2,6 +2,7 @@ #define LIBDS_TIZEN_SCREEN_H #include +#include #include #ifdef __cplusplus @@ -9,6 +10,7 @@ extern "C" { #endif struct ds_tizen_screen; +struct ds_tizen_screen_opaque_region; struct ds_tizen_splitscreen; struct ds_tizen_splitscreen_region; @@ -18,6 +20,12 @@ enum ds_tizen_screen_capability DS_TIZEN_SCREEN_CAPABILITY_SPLITSCREEN, }; +WL_EXPORT pixman_region32_t +ds_tizen_screen_opaque_region_get_opaque_region(struct ds_tizen_screen_opaque_region *opaque_region); + +WL_EXPORT uint32_t +ds_tizen_screen_opaque_region_get_serial(struct ds_tizen_screen_opaque_region *opaque_region); + WL_EXPORT struct ds_tizen_screen * ds_tizen_screen_create(struct wl_display *display); @@ -34,6 +42,10 @@ ds_tizen_screen_add_get_splitscreen_listener( struct ds_tizen_screen *screen, struct wl_listener *listener); +WL_EXPORT void +ds_tizen_screen_add_set_opaque_region_listener( + struct ds_tizen_screen *screen, + struct wl_listener *listener); WL_EXPORT void ds_tizen_splitscreen_add_destroy_listener( diff --git a/src/meson.build b/src/meson.build index 2e0d09d..de0b18e 100644 --- a/src/meson.build +++ b/src/meson.build @@ -135,6 +135,7 @@ lib_libds_tizen = shared_library('ds-tizen', libds_tizen_files, include_directories('./video'), include_directories('./blender'), include_directories('./blur'), + include_directories('./screen'), ], version: meson.project_version(), c_args: [ '-DKEYLAYOUT_DIR="@0@"'.format(keylayout_dir) ], diff --git a/src/screen/screen.c b/src/screen/screen.c index 6ba8442..4021ed4 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -1,15 +1,28 @@ #include #include #include +#include #include #include + #include +#include #include "util.h" #include "libds-tizen/screen.h" #define TIZEN_SCREEN_VERSION 1 +struct ds_tizen_screen_opaque_region +{ + struct ds_tizen_screen *screen; + + struct wl_list link; // ds_tizen_screen::opaque_region_list + + pixman_region32_t region; + uint32_t serial; +}; + struct ds_tizen_screen { struct wl_global *global; @@ -21,12 +34,14 @@ struct ds_tizen_screen struct wl_array capabilities; uint32_t splitscreen_capability; + struct wl_list opaque_region_list; // list of ds_tizen_screen_opaque_region bool splitscreen_enabled; struct { struct wl_signal destroy; struct wl_signal get_splitscreen; + struct wl_signal set_opaque_region; } events; }; @@ -187,6 +202,43 @@ screen_handle_get_splitscreen(struct wl_client *client, } static void +screen_handle_set_opaque_region(struct wl_client *client, + struct wl_resource *screen_client_resource, + struct wl_resource *region_resource, + uint32_t serial) +{ + struct ds_tizen_screen_opaque_region *opaque_region; + struct ds_tizen_screen_client *screen_client; + struct ds_tizen_screen *screen; + pixman_region32_t *region; + + screen_client = wl_resource_get_user_data(screen_client_resource); + + screen = screen_client->screen; + + opaque_region = calloc(1, sizeof *opaque_region); + if (!opaque_region) { + ds_err("calloc() failed."); + wl_resource_post_no_memory(screen_client_resource); + return; + } + opaque_region->screen = screen; + opaque_region->serial = serial; + pixman_region32_init(&opaque_region->region); + + if (region_resource) { + region = ds_region_from_resource(region_resource); + pixman_region32_copy(&opaque_region->region, region); + } + + wl_list_insert(&screen->opaque_region_list, &opaque_region->link); + + ds_inf("wtz_screen set opaque region, region:%p, serial:%u", opaque_region, serial); + + wl_signal_emit(&screen->events.set_opaque_region, opaque_region); +} + +static void screen_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource) { @@ -197,6 +249,7 @@ static const struct wtz_screen_interface screen_impl = { .destroy = screen_handle_destroy, .get_splitscreen = screen_handle_get_splitscreen, + .set_opaque_region = screen_handle_set_opaque_region, }; static void @@ -266,6 +319,18 @@ screen_handle_display_destroy(struct wl_listener *listener, void *data) free(screen); } +WL_EXPORT pixman_region32_t +ds_tizen_screen_opaque_region_get_opaque_region(struct ds_tizen_screen_opaque_region *opaque_region) +{ + return opaque_region->region; +} + +WL_EXPORT uint32_t +ds_tizen_screen_opaque_region_get_serial(struct ds_tizen_screen_opaque_region *opaque_region) +{ + return opaque_region->serial; +} + WL_EXPORT struct ds_tizen_screen * ds_tizen_screen_create(struct wl_display *display) { @@ -286,6 +351,7 @@ ds_tizen_screen_create(struct wl_display *display) } wl_list_init(&screen->clients); + wl_list_init(&screen->opaque_region_list); screen->destroy.notify = screen_handle_display_destroy; wl_display_add_destroy_listener(display, &screen->destroy); @@ -294,6 +360,7 @@ ds_tizen_screen_create(struct wl_display *display) wl_signal_init(&screen->events.destroy); wl_signal_init(&screen->events.get_splitscreen); + wl_signal_init(&screen->events.set_opaque_region); ds_inf("Global created: tizen_screen(%p)", screen); @@ -347,6 +414,14 @@ ds_tizen_screen_add_get_splitscreen_listener( } WL_EXPORT void +ds_tizen_screen_add_set_opaque_region_listener( + struct ds_tizen_screen *screen, + struct wl_listener *listener) +{ + wl_signal_add(&screen->events.set_opaque_region, listener); +} + +WL_EXPORT void ds_tizen_splitscreen_add_destroy_listener( struct ds_tizen_splitscreen *splitscreen, struct wl_listener *listener) -- 2.7.4 From 7f0257792c365f168a5b51212cbc14e3583fce49 Mon Sep 17 00:00:00 2001 From: Junseok Kim Date: Tue, 4 Jun 2024 20:09:55 +0900 Subject: [PATCH 02/16] Revert "screen: add wtz_screen_set_opaque_region request callback" This reverts commit e511fc05afa2bf1098a133ab9eb7fd646faa58c4. Change-Id: Ifeb3b6ce3d43e3e2ebe00f7e343c9416c7fa6520 --- include/libds-tizen/screen.h | 12 ------- src/meson.build | 1 - src/screen/screen.c | 75 -------------------------------------------- 3 files changed, 88 deletions(-) diff --git a/include/libds-tizen/screen.h b/include/libds-tizen/screen.h index 092e6ac..11a39ab 100644 --- a/include/libds-tizen/screen.h +++ b/include/libds-tizen/screen.h @@ -2,7 +2,6 @@ #define LIBDS_TIZEN_SCREEN_H #include -#include #include #ifdef __cplusplus @@ -10,7 +9,6 @@ extern "C" { #endif struct ds_tizen_screen; -struct ds_tizen_screen_opaque_region; struct ds_tizen_splitscreen; struct ds_tizen_splitscreen_region; @@ -20,12 +18,6 @@ enum ds_tizen_screen_capability DS_TIZEN_SCREEN_CAPABILITY_SPLITSCREEN, }; -WL_EXPORT pixman_region32_t -ds_tizen_screen_opaque_region_get_opaque_region(struct ds_tizen_screen_opaque_region *opaque_region); - -WL_EXPORT uint32_t -ds_tizen_screen_opaque_region_get_serial(struct ds_tizen_screen_opaque_region *opaque_region); - WL_EXPORT struct ds_tizen_screen * ds_tizen_screen_create(struct wl_display *display); @@ -42,10 +34,6 @@ ds_tizen_screen_add_get_splitscreen_listener( struct ds_tizen_screen *screen, struct wl_listener *listener); -WL_EXPORT void -ds_tizen_screen_add_set_opaque_region_listener( - struct ds_tizen_screen *screen, - struct wl_listener *listener); WL_EXPORT void ds_tizen_splitscreen_add_destroy_listener( diff --git a/src/meson.build b/src/meson.build index de0b18e..2e0d09d 100644 --- a/src/meson.build +++ b/src/meson.build @@ -135,7 +135,6 @@ lib_libds_tizen = shared_library('ds-tizen', libds_tizen_files, include_directories('./video'), include_directories('./blender'), include_directories('./blur'), - include_directories('./screen'), ], version: meson.project_version(), c_args: [ '-DKEYLAYOUT_DIR="@0@"'.format(keylayout_dir) ], diff --git a/src/screen/screen.c b/src/screen/screen.c index 4021ed4..6ba8442 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -1,28 +1,15 @@ #include #include #include -#include #include #include - #include -#include #include "util.h" #include "libds-tizen/screen.h" #define TIZEN_SCREEN_VERSION 1 -struct ds_tizen_screen_opaque_region -{ - struct ds_tizen_screen *screen; - - struct wl_list link; // ds_tizen_screen::opaque_region_list - - pixman_region32_t region; - uint32_t serial; -}; - struct ds_tizen_screen { struct wl_global *global; @@ -34,14 +21,12 @@ struct ds_tizen_screen struct wl_array capabilities; uint32_t splitscreen_capability; - struct wl_list opaque_region_list; // list of ds_tizen_screen_opaque_region bool splitscreen_enabled; struct { struct wl_signal destroy; struct wl_signal get_splitscreen; - struct wl_signal set_opaque_region; } events; }; @@ -202,43 +187,6 @@ screen_handle_get_splitscreen(struct wl_client *client, } static void -screen_handle_set_opaque_region(struct wl_client *client, - struct wl_resource *screen_client_resource, - struct wl_resource *region_resource, - uint32_t serial) -{ - struct ds_tizen_screen_opaque_region *opaque_region; - struct ds_tizen_screen_client *screen_client; - struct ds_tizen_screen *screen; - pixman_region32_t *region; - - screen_client = wl_resource_get_user_data(screen_client_resource); - - screen = screen_client->screen; - - opaque_region = calloc(1, sizeof *opaque_region); - if (!opaque_region) { - ds_err("calloc() failed."); - wl_resource_post_no_memory(screen_client_resource); - return; - } - opaque_region->screen = screen; - opaque_region->serial = serial; - pixman_region32_init(&opaque_region->region); - - if (region_resource) { - region = ds_region_from_resource(region_resource); - pixman_region32_copy(&opaque_region->region, region); - } - - wl_list_insert(&screen->opaque_region_list, &opaque_region->link); - - ds_inf("wtz_screen set opaque region, region:%p, serial:%u", opaque_region, serial); - - wl_signal_emit(&screen->events.set_opaque_region, opaque_region); -} - -static void screen_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource) { @@ -249,7 +197,6 @@ static const struct wtz_screen_interface screen_impl = { .destroy = screen_handle_destroy, .get_splitscreen = screen_handle_get_splitscreen, - .set_opaque_region = screen_handle_set_opaque_region, }; static void @@ -319,18 +266,6 @@ screen_handle_display_destroy(struct wl_listener *listener, void *data) free(screen); } -WL_EXPORT pixman_region32_t -ds_tizen_screen_opaque_region_get_opaque_region(struct ds_tizen_screen_opaque_region *opaque_region) -{ - return opaque_region->region; -} - -WL_EXPORT uint32_t -ds_tizen_screen_opaque_region_get_serial(struct ds_tizen_screen_opaque_region *opaque_region) -{ - return opaque_region->serial; -} - WL_EXPORT struct ds_tizen_screen * ds_tizen_screen_create(struct wl_display *display) { @@ -351,7 +286,6 @@ ds_tizen_screen_create(struct wl_display *display) } wl_list_init(&screen->clients); - wl_list_init(&screen->opaque_region_list); screen->destroy.notify = screen_handle_display_destroy; wl_display_add_destroy_listener(display, &screen->destroy); @@ -360,7 +294,6 @@ ds_tizen_screen_create(struct wl_display *display) wl_signal_init(&screen->events.destroy); wl_signal_init(&screen->events.get_splitscreen); - wl_signal_init(&screen->events.set_opaque_region); ds_inf("Global created: tizen_screen(%p)", screen); @@ -414,14 +347,6 @@ ds_tizen_screen_add_get_splitscreen_listener( } WL_EXPORT void -ds_tizen_screen_add_set_opaque_region_listener( - struct ds_tizen_screen *screen, - struct wl_listener *listener) -{ - wl_signal_add(&screen->events.set_opaque_region, listener); -} - -WL_EXPORT void ds_tizen_splitscreen_add_destroy_listener( struct ds_tizen_splitscreen *splitscreen, struct wl_listener *listener) -- 2.7.4 From 0aadcf3312caf8629f2c3c7ed1bd11f565dd8f72 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Tue, 9 Jul 2024 17:36:35 +0900 Subject: [PATCH 03/16] blur: Support wtz_blur_rectangle protocol Support create_rectangle request and Remove set_region request Change-Id: I673d777e55fdd3a270b97c87ca1ada757ad6c96b --- include/libds-tizen/blur.h | 22 ++++- src/blur/blur.c | 194 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 214 insertions(+), 2 deletions(-) diff --git a/include/libds-tizen/blur.h b/include/libds-tizen/blur.h index 84fe80f..8112908 100644 --- a/include/libds-tizen/blur.h +++ b/include/libds-tizen/blur.h @@ -11,18 +11,20 @@ extern "C" { struct ds_tizen_blur_manager; struct ds_tizen_blur; +struct ds_tizen_blur_rectangle; enum ds_tizen_blur_state_field { DS_TIZEN_BLUR_STATE_NONE = 0, - DS_TIZEN_BLUR_STATE_REGION = (1 << 0), + DS_TIZEN_BLUR_STATE_REGION = (1 << 0),//temporary DS_TIZEN_BLUR_STATE_RADIUS = (1 << 1), + DS_TIZEN_BLUR_STATE_RECTANGLE = (1 << 2), }; struct ds_tizen_blur_state { enum ds_tizen_blur_state_field committed; - pixman_region32_t region; + pixman_region32_t region; //temporary uint32_t radius; }; @@ -55,6 +57,22 @@ ds_tizen_blur_get_surface(struct ds_tizen_blur *blur); struct ds_tizen_blur_state * ds_tizen_blur_get_state(struct ds_tizen_blur *blur); +void +ds_tizen_blur_add_new_rectangle_listener(struct ds_tizen_blur *blur, + struct wl_listener *listener); + +void +ds_tizen_blur_rectangle_add_destroy_listener(struct ds_tizen_blur_rectangle *blur_rectangle, + struct wl_listener *listener); + +void +ds_tizen_blur_rectangle_get_geometry(struct ds_tizen_blur_rectangle *blur_rectangle, + int *x, int *y, int *width, int *height); + +void +ds_tizen_blur_rectangle_get_corner_radius(struct ds_tizen_blur_rectangle *blur_rectangle, + int *rx, int *ry); + #ifdef __cplusplus } #endif diff --git a/src/blur/blur.c b/src/blur/blur.c index e15840f..fd3768b 100644 --- a/src/blur/blur.c +++ b/src/blur/blur.c @@ -48,6 +48,8 @@ struct ds_tizen_blur struct wl_resource *resource; struct wl_client *wl_client; + struct wl_list rectangles; + struct ds_tizen_blur_state current, pending; struct ds_surface *surface; @@ -60,6 +62,34 @@ struct ds_tizen_blur struct { struct wl_signal commit; struct wl_signal destroy; + struct wl_signal new_rectangle; + } events; +}; + +struct ds_tizen_blur_rectangle +{ + struct wl_list link; //rectangles + + struct wl_resource *resource; + struct wl_client *wl_client; + + struct ds_tizen_blur *blur; + + bool pending; + + int x; + int y; + int width; + int height; + int rx; + int ry; + + struct { + struct wl_listener blur_destroy; + } listener; + + struct { + struct wl_signal destroy; } events; }; @@ -141,6 +171,38 @@ ds_tizen_blur_get_state(struct ds_tizen_blur *blur) return &blur->current; } +WL_EXPORT void +ds_tizen_blur_add_new_rectangle_listener(struct ds_tizen_blur *blur, + struct wl_listener *listener) +{ + wl_signal_add(&blur->events.new_rectangle, listener); +} + +WL_EXPORT void +ds_tizen_blur_rectangle_add_destroy_listener(struct ds_tizen_blur_rectangle *blur_rectangle, + struct wl_listener *listener) +{ + wl_signal_add(&blur_rectangle->events.destroy, listener); +} + +WL_EXPORT void +ds_tizen_blur_rectangle_get_geometry(struct ds_tizen_blur_rectangle *blur_rectangle, + int *x, int *y, int *width, int *height) +{ + if (x) *x = blur_rectangle->x; + if (y) *y = blur_rectangle->y; + if (width) *width = blur_rectangle->width; + if (height) *height = blur_rectangle->height; +} + +WL_EXPORT void +ds_tizen_blur_rectangle_get_corner_radius(struct ds_tizen_blur_rectangle *blur_rectangle, + int *rx, int *ry) +{ + if (rx) *rx = blur_rectangle->rx; + if (ry) *ry = blur_rectangle->ry; +} + static void blur_manager_handle_display_destroy(struct wl_listener *listener, void *data) { @@ -194,10 +256,129 @@ blur_handle_set_radius(struct wl_client *client, struct wl_resource *resource, blur->pending.committed |= DS_TIZEN_BLUR_STATE_RADIUS; } +static void +blur_rectangle_handle_destroy(struct wl_client *client, struct wl_resource *resource) +{ + wl_resource_destroy(resource); +} + +static const struct wtz_blur_rectangle_interface blur_rectangle_impl = { + blur_rectangle_handle_destroy, +}; + +static void +blur_rectangle_destroy(struct ds_tizen_blur_rectangle *blur_rectangle) +{ + ds_inf("blur_rectangle_destroy (blur_rectangle:%p)", blur_rectangle); + + wl_signal_emit(&blur_rectangle->events.destroy, blur_rectangle); + + if (blur_rectangle->listener.blur_destroy.notify) + wl_list_remove(&blur_rectangle->listener.blur_destroy.link); + + if (blur_rectangle->blur) + wl_list_remove(&blur_rectangle->link); + + free(blur_rectangle); +} + +static void +blur_rectangle_handle_resource_destroy(struct wl_resource *resource) +{ + struct ds_tizen_blur_rectangle *blur_rectangle; + + blur_rectangle = wl_resource_get_user_data(resource); + + ds_inf("blur_rectangle_handle_resource_destroy (blur_rectangle:%p)", blur_rectangle); + + if (blur_rectangle->blur) { + blur_rectangle->resource = NULL; + blur_rectangle->pending = true; + blur_rectangle->blur->pending.committed |= DS_TIZEN_BLUR_STATE_RECTANGLE; + return; + } + + blur_rectangle_destroy(blur_rectangle); +} + +static void +blur_rectangle_handle_blur_destroy(struct wl_listener *listener, void *data) +{ + struct ds_tizen_blur_rectangle *blur_rectangle; + + blur_rectangle = wl_container_of(listener, blur_rectangle, listener.blur_destroy); + + blur_rectangle->listener.blur_destroy.notify = NULL; + wl_list_remove(&blur_rectangle->listener.blur_destroy.link); + + blur_rectangle->blur = NULL; + wl_list_remove(&blur_rectangle->link); + + if (!blur_rectangle->resource) + blur_rectangle_destroy(blur_rectangle); +} + +static void +blur_handle_create_rectangle(struct wl_client *wl_client, struct wl_resource *resource, + uint32_t id, int32_t x, int32_t y, + int32_t width, int32_t height, int32_t rx, int32_t ry) +{ + struct ds_tizen_blur *blur; + struct ds_tizen_blur_rectangle *blur_rectangle; + + ds_inf("tizen_blur: create_rectangle"); + + blur = wl_resource_get_user_data(resource); + if (!blur) { + wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, + "invalid blur resource:%u", + (unsigned int)wl_resource_get_id(resource)); + return; + } + + blur_rectangle = calloc(1, sizeof *blur_rectangle); + if (blur_rectangle == NULL) { + ds_err("calloc() failed. tizen_blur_rectangle"); + wl_client_post_no_memory(wl_client); + return; + } + + blur_rectangle->resource = wl_resource_create(wl_client, &wtz_blur_rectangle_interface, + wl_resource_get_version(resource), id); + if (blur_rectangle->resource == NULL) { + ds_err("tizen_blur_rectangle : wl_resource_create() failed."); + free(blur_rectangle); + wl_client_post_no_memory(wl_client); + return; + } + + wl_resource_set_implementation(blur_rectangle->resource, &blur_rectangle_impl, blur_rectangle, + blur_rectangle_handle_resource_destroy); + + blur_rectangle->listener.blur_destroy.notify = blur_rectangle_handle_blur_destroy; + ds_tizen_blur_add_destroy_listener(blur, &blur_rectangle->listener.blur_destroy); + + blur_rectangle->x = x; + blur_rectangle->y = y; + blur_rectangle->width = width; + blur_rectangle->height = height; + blur_rectangle->rx = rx; + blur_rectangle->ry = ry; + + blur_rectangle->blur = blur; + wl_list_insert(&blur->rectangles, &blur_rectangle->link); + + wl_signal_init(&blur_rectangle->events.destroy); + + blur_rectangle->pending = true; + blur->pending.committed |= DS_TIZEN_BLUR_STATE_RECTANGLE; +} + static const struct wtz_blur_interface blur_impl = { blur_handle_destroy, blur_handle_set_region, blur_handle_set_radius, + blur_handle_create_rectangle, }; static void @@ -239,6 +420,7 @@ static void blur_handle_surface_commit(struct wl_listener *listener, void *data) { struct ds_tizen_blur *blur; + struct ds_tizen_blur_rectangle *blur_rectangle, *tmp; blur = wl_container_of(listener, blur, listener.surface_commit); @@ -247,6 +429,15 @@ blur_handle_surface_commit(struct wl_listener *listener, void *data) return; } + wl_list_for_each_safe(blur_rectangle, tmp, &blur->rectangles, link) { + if (!blur_rectangle->pending) continue; + + if (blur_rectangle->resource) + wl_signal_emit(&blur->events.new_rectangle, blur_rectangle); + else + blur_rectangle_destroy(blur_rectangle); + } + if (blur->pending.committed == DS_TIZEN_BLUR_STATE_NONE) { blur->current.committed = DS_TIZEN_BLUR_STATE_NONE; return; @@ -359,8 +550,11 @@ blur_manager_handle_get_blur(struct wl_client *wl_client, blur->surface = surface; + wl_list_init(&blur->rectangles); + wl_signal_init(&blur->events.destroy); wl_signal_init(&blur->events.commit); + wl_signal_init(&blur->events.new_rectangle); wl_signal_emit(&client->blur_manager->events.new_blur, blur); } -- 2.7.4 From 1ca3353a7f4a9db03a3607d32cfdbb22579fd872 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Wed, 24 Jul 2024 15:57:06 +0900 Subject: [PATCH 04/16] dpms: Add wl_signal_emit in _tizen_dpms_client_cb_destroy() Change-Id: I5f1b95b4bd645a812a53b0f012bc215928bc956a --- src/dpms/dpms.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dpms/dpms.c b/src/dpms/dpms.c index 5bedcee..47d4bdb 100644 --- a/src/dpms/dpms.c +++ b/src/dpms/dpms.c @@ -241,6 +241,7 @@ _tizen_dpms_client_cb_destroy(struct wl_resource *resource) dpms->binded = false; dpms->res = NULL; } + wl_signal_emit(&dpms->events.destroy, dpms); } static void -- 2.7.4 From f80c7112a34a6d55681299159f442ebdb2bcbb33 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Thu, 25 Jul 2024 10:57:32 +0900 Subject: [PATCH 05/16] dpms: Move wl_signal_emit for consistency Change-Id: Id1d7dfeabb9f636c79d47bbca906b25be445d66a --- src/dpms/dpms.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dpms/dpms.c b/src/dpms/dpms.c index 47d4bdb..518f2be 100644 --- a/src/dpms/dpms.c +++ b/src/dpms/dpms.c @@ -178,8 +178,14 @@ static void _tizen_dpms_manager_handle_destroy(struct wl_client *client, struct wl_resource *resource) { + struct ds_tizen_dpms *dpms; + + dpms = wl_resource_get_user_data(resource); + ds_inf("tizen_dpms_manager cb_destroy (res:%p)", resource); wl_resource_destroy(resource); + + wl_signal_emit(&dpms->events.destroy, dpms); } static void @@ -241,7 +247,6 @@ _tizen_dpms_client_cb_destroy(struct wl_resource *resource) dpms->binded = false; dpms->res = NULL; } - wl_signal_emit(&dpms->events.destroy, dpms); } static void -- 2.7.4 From 3ad69f63a797eab56e0ce1ea5ad099936af60c5d Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Tue, 30 Jul 2024 17:43:22 +0900 Subject: [PATCH 06/16] renderer: Fix dangling pointer Change-Id: I9e11e2a45170130d1b941d43b4011d1e5083caa9 --- src/renderer/renderer.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index f1e0e84..b87e65e 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -286,8 +286,7 @@ _tizen_renderer_client_handle_destroy(struct wl_resource *resource) wl_list_for_each_safe(info, tmp, &client->infos, link) { wl_signal_emit(&client->events.destroy, info); - wl_list_remove(&info->link); - free(info); + wl_resource_destroy(info->resource); } wl_list_remove(&client->link); -- 2.7.4 From 21d0340ac493702b349111c59cc8021be8f073cf Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Wed, 31 Jul 2024 18:43:03 +0900 Subject: [PATCH 07/16] hwc: Add commit_feedback destroy when client destroyed Change-Id: I4959d3ae0dd604ba4c6084427e98eeddad8a8f53 --- src/hwc/hwc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/hwc/hwc.c b/src/hwc/hwc.c index 7346911..3a15a2e 100644 --- a/src/hwc/hwc.c +++ b/src/hwc/hwc.c @@ -31,6 +31,8 @@ struct ds_tizen_hwc_client struct wl_resource *resource; struct wl_client *wl_client; + struct wl_list feedbacks; + struct { struct wl_signal destroy; } events; @@ -52,6 +54,8 @@ struct ds_tizen_hwc_commit_feedback struct { struct wl_signal destroy; } events; + + struct wl_list link; }; static void @@ -86,6 +90,8 @@ _hwc_commit_feedback_cb_resource_destroy(struct wl_resource *commit_feedback_res wl_signal_emit(&commit_feedback->events.destroy, commit_feedback); + wl_list_remove(&commit_feedback->link); + free(commit_feedback); } @@ -132,6 +138,8 @@ hwc_handle_create_commit_feedback(struct wl_client *client, wl_signal_init(&commit_feedback->events.destroy); wl_signal_emit(&hwc_client->hwc->events.new_commit_feedback, commit_feedback); + + wl_list_insert(&hwc_client->feedbacks, &commit_feedback->link); } static void @@ -151,11 +159,15 @@ static void _tizen_hwc_client_handle_resource_destroy(struct wl_resource *resource) { struct ds_tizen_hwc_client *client; + struct ds_tizen_hwc_commit_feedback *commit_feedback, *tmp; client = wl_resource_get_user_data(resource); ds_inf("_tizen_hwc_client_handle_destroy (client:%p)", client); + wl_list_for_each_safe(commit_feedback, tmp, &client->feedbacks, link) + wl_resource_destroy(commit_feedback->resource); + wl_list_remove(&client->link); free(client); } @@ -191,6 +203,8 @@ hwc_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(hwc_client->resource, &hwc_impl, hwc_client, _tizen_hwc_client_handle_resource_destroy); + wl_list_init(&hwc_client->feedbacks); + wl_signal_init(&hwc_client->events.destroy); wl_list_insert(&hwc->clients, &hwc_client->link); -- 2.7.4 From 4890f9e609e4709c6d0a2ad370ab0c73371f53b5 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Mon, 12 Aug 2024 11:32:37 +0900 Subject: [PATCH 08/16] tbm_server: Inlucde tbm_bufmgr_internal header Change-Id: I9052096372839f039fdf1403aa20d1ddae351cd2 --- src/tbm_server/tbm_server.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/tbm_server/tbm_server.c b/src/tbm_server/tbm_server.c index 77570fc..24ccbb5 100644 --- a/src/tbm_server/tbm_server.c +++ b/src/tbm_server/tbm_server.c @@ -3,6 +3,7 @@ #include #include +#include #include #include "shared/pixel_format.h" -- 2.7.4 From a63a38293741566d3ed80687aee31443aefe14f9 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Wed, 14 Aug 2024 12:25:54 +0900 Subject: [PATCH 09/16] blur: Fix missing reset pending flag of blur_rectangle Change-Id: I22a2557cde98951337747765365cabd5efe26326 --- src/blur/blur.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/blur/blur.c b/src/blur/blur.c index fd3768b..4cd3886 100644 --- a/src/blur/blur.c +++ b/src/blur/blur.c @@ -432,6 +432,8 @@ blur_handle_surface_commit(struct wl_listener *listener, void *data) wl_list_for_each_safe(blur_rectangle, tmp, &blur->rectangles, link) { if (!blur_rectangle->pending) continue; + blur_rectangle->pending = false; + if (blur_rectangle->resource) wl_signal_emit(&blur->events.new_rectangle, blur_rectangle); else -- 2.7.4 From ae90ddaf4f1d68f3fc182d251d5c49e74cfd6b32 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Wed, 7 Aug 2024 17:26:08 +0900 Subject: [PATCH 10/16] memory_flusher: Add flusher version check Change-Id: If33ac0dc8f0d6ec9edf9b6acdeb50a3e5a6494c1 --- include/libds-tizen/memory_flusher.h | 4 ++++ src/memory_flusher/memory_flusher.c | 13 +++++++++++++ 2 files changed, 17 insertions(+) diff --git a/include/libds-tizen/memory_flusher.h b/include/libds-tizen/memory_flusher.h index 0b72425..7a9ec2a 100644 --- a/include/libds-tizen/memory_flusher.h +++ b/include/libds-tizen/memory_flusher.h @@ -42,6 +42,10 @@ void ds_tizen_memory_flusher_info_send_free_flush( struct ds_tizen_memory_flusher_info *info); +bool +ds_tizen_memory_flusher_info_supported_free_flush( + struct ds_tizen_memory_flusher_info *info); + #ifdef __cplusplus } #endif diff --git a/src/memory_flusher/memory_flusher.c b/src/memory_flusher/memory_flusher.c index 499e05d..5222687 100644 --- a/src/memory_flusher/memory_flusher.c +++ b/src/memory_flusher/memory_flusher.c @@ -139,9 +139,22 @@ WL_EXPORT void ds_tizen_memory_flusher_info_send_free_flush( struct ds_tizen_memory_flusher_info *info) { + if (ds_tizen_memory_flusher_info_supported_free_flush(info)) + return; + tizen_surface_shm_flusher_send_free_flush(info->resource); } +WL_EXPORT bool +ds_tizen_memory_flusher_info_supported_free_flush( + struct ds_tizen_memory_flusher_info *info) +{ + if (wl_resource_get_version(info->resource) < TIZEN_SURFACE_SHM_FLUSHER_FREE_FLUSH_SINCE_VERSION) + return false; + + return true; +} + static struct ds_tizen_memory_flusher_info * tizen_memory_flusher_client_find_info(struct ds_tizen_memory_flusher_client *client, struct ds_surface *surface) -- 2.7.4 From 188548e348f8f929e3b2d6d9d23efb3327efc5c7 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Thu, 8 Aug 2024 14:36:46 +0900 Subject: [PATCH 11/16] memory_flusher: Remove useless version check Change-Id: I3ba16fa8dcba630eaa4beaa73f9be0c76c0e5aea --- src/memory_flusher/memory_flusher.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/memory_flusher/memory_flusher.c b/src/memory_flusher/memory_flusher.c index 5222687..378794f 100644 --- a/src/memory_flusher/memory_flusher.c +++ b/src/memory_flusher/memory_flusher.c @@ -139,9 +139,6 @@ WL_EXPORT void ds_tizen_memory_flusher_info_send_free_flush( struct ds_tizen_memory_flusher_info *info) { - if (ds_tizen_memory_flusher_info_supported_free_flush(info)) - return; - tizen_surface_shm_flusher_send_free_flush(info->resource); } -- 2.7.4 From c124bd86fe332c84e3073f04f07fc896b1755669 Mon Sep 17 00:00:00 2001 From: Changyeon Lee Date: Thu, 22 Aug 2024 11:52:04 +0900 Subject: [PATCH 12/16] blur: Support wtz_blur_behind protocol Change-Id: I8d05b48842718f28af03c7d5191fa095eab4901e --- include/libds-tizen/blur.h | 39 ++++++-- src/blur/blur.c | 238 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 267 insertions(+), 10 deletions(-) diff --git a/include/libds-tizen/blur.h b/include/libds-tizen/blur.h index 8112908..e66dcbd 100644 --- a/include/libds-tizen/blur.h +++ b/include/libds-tizen/blur.h @@ -12,6 +12,7 @@ extern "C" { struct ds_tizen_blur_manager; struct ds_tizen_blur; struct ds_tizen_blur_rectangle; +struct ds_tizen_blur_behind; enum ds_tizen_blur_state_field { DS_TIZEN_BLUR_STATE_NONE = 0, @@ -28,19 +29,27 @@ struct ds_tizen_blur_state uint32_t radius; }; +enum ds_tizen_blur_behind_state_field { + DS_TIZEN_BLUR_BEHIND_STATE_NONE = 0, + DS_TIZEN_BLUR_BEHIND_STATE_RADIUS = (1 << 0), +}; + +struct ds_tizen_blur_behind_state +{ + enum ds_tizen_blur_behind_state_field committed; + + uint32_t radius; +}; + struct ds_tizen_blur_manager * ds_tizen_blur_manager_create(struct wl_display *display); void -ds_tizen_blur_manager_add_destroy_listener(struct ds_tizen_blur_manager *blur, +ds_tizen_blur_manager_add_destroy_listener(struct ds_tizen_blur_manager *blur_manager, struct wl_listener *listener); void -ds_tizen_blur_manager_add_destroy_listener(struct ds_tizen_blur_manager *blur, - struct wl_listener *listener); - -void -ds_tizen_blur_manager_add_new_blur_listener(struct ds_tizen_blur_manager *blur, +ds_tizen_blur_manager_add_new_blur_listener(struct ds_tizen_blur_manager *blur_manager, struct wl_listener *listener); void @@ -73,6 +82,24 @@ void ds_tizen_blur_rectangle_get_corner_radius(struct ds_tizen_blur_rectangle *blur_rectangle, int *rx, int *ry); +void +ds_tizen_blur_manager_add_new_blur_behind_listener(struct ds_tizen_blur_manager *blur, + struct wl_listener *listener); + +void +ds_tizen_blur_behind_add_destroy_listener(struct ds_tizen_blur_behind *blur_behind, + struct wl_listener *listener); + +void +ds_tizen_blur_behind_add_commit_listener(struct ds_tizen_blur_behind *blur_behind, + struct wl_listener *listener); + +struct ds_surface * +ds_tizen_blur_behind_get_surface(struct ds_tizen_blur_behind *blur_behind); + +struct ds_tizen_blur_behind_state * +ds_tizen_blur_behind_get_state(struct ds_tizen_blur_behind *blur_behind); + #ifdef __cplusplus } #endif diff --git a/src/blur/blur.c b/src/blur/blur.c index 4cd3886..36e1d4c 100644 --- a/src/blur/blur.c +++ b/src/blur/blur.c @@ -26,6 +26,7 @@ struct ds_tizen_blur_manager struct { struct wl_signal destroy; struct wl_signal new_blur; + struct wl_signal new_blur_behind; } events; }; @@ -93,6 +94,26 @@ struct ds_tizen_blur_rectangle } events; }; +struct ds_tizen_blur_behind +{ + struct wl_resource *resource; + struct wl_client *wl_client; + + struct ds_tizen_blur_behind_state current, pending; + + struct ds_surface *surface; + struct ds_addon surface_addon; + + struct { + struct wl_listener surface_commit; + } listener; + + struct { + struct wl_signal commit; + struct wl_signal destroy; + } events; +}; + static void blur_manager_handle_display_destroy(struct wl_listener *listener, void *data); static void @@ -125,6 +146,7 @@ ds_tizen_blur_manager_create(struct wl_display *display) wl_signal_init(&blur_manager->events.destroy); wl_signal_init(&blur_manager->events.new_blur); + wl_signal_init(&blur_manager->events.new_blur_behind); ds_inf("Global created: tizen_blur_manager(%p)", blur_manager); @@ -132,17 +154,17 @@ ds_tizen_blur_manager_create(struct wl_display *display) } WL_EXPORT void -ds_tizen_blur_manager_add_destroy_listener(struct ds_tizen_blur_manager *blur, +ds_tizen_blur_manager_add_destroy_listener(struct ds_tizen_blur_manager *blur_manager, struct wl_listener *listener) { - wl_signal_add(&blur->events.destroy, listener); + wl_signal_add(&blur_manager->events.destroy, listener); } WL_EXPORT void -ds_tizen_blur_manager_add_new_blur_listener(struct ds_tizen_blur_manager *blur, +ds_tizen_blur_manager_add_new_blur_listener(struct ds_tizen_blur_manager *blur_manager, struct wl_listener *listener) { - wl_signal_add(&blur->events.new_blur, listener); + wl_signal_add(&blur_manager->events.new_blur, listener); } WL_EXPORT void @@ -203,6 +225,39 @@ ds_tizen_blur_rectangle_get_corner_radius(struct ds_tizen_blur_rectangle *blur_r if (ry) *ry = blur_rectangle->ry; } +WL_EXPORT void +ds_tizen_blur_manager_add_new_blur_behind_listener(struct ds_tizen_blur_manager *blur_manager, + struct wl_listener *listener) +{ + wl_signal_add(&blur_manager->events.new_blur_behind, listener); +} + +WL_EXPORT void +ds_tizen_blur_behind_add_destroy_listener(struct ds_tizen_blur_behind *blur_behind, + struct wl_listener *listener) +{ + wl_signal_add(&blur_behind->events.destroy, listener); +} + +WL_EXPORT void +ds_tizen_blur_behind_add_commit_listener(struct ds_tizen_blur_behind *blur_behind, + struct wl_listener *listener) +{ + wl_signal_add(&blur_behind->events.commit, listener); +} + +WL_EXPORT struct ds_surface * +ds_tizen_blur_behind_get_surface(struct ds_tizen_blur_behind *blur_behind) +{ + return blur_behind->surface; +} + +WL_EXPORT struct ds_tizen_blur_behind_state * +ds_tizen_blur_behind_get_state(struct ds_tizen_blur_behind *blur_behind) +{ + return &blur_behind->current; +} + static void blur_manager_handle_display_destroy(struct wl_listener *listener, void *data) { @@ -562,6 +617,180 @@ blur_manager_handle_get_blur(struct wl_client *wl_client, } static void +blur_behind_destroy(struct ds_tizen_blur_behind *blur_behind) +{ + ds_inf("blur_behind_destroy (blur_behind:%p)", blur_behind); + + wl_signal_emit(&blur_behind->events.destroy, blur_behind); + + if (blur_behind->surface) { + wl_list_remove(&blur_behind->listener.surface_commit.link); + ds_addon_finish(&blur_behind->surface_addon); + } + + free(blur_behind); +} + +static void +blur_behind_handle_resource_destroy(struct wl_resource *resource) +{ + struct ds_tizen_blur_behind *blur_behind; + + blur_behind = wl_resource_get_user_data(resource); + + ds_inf("blur_behind_handle_resource_destroy (blur_behind:%p)", blur_behind); + + if (blur_behind->surface) { + blur_behind->resource = NULL; + return; + } + + blur_behind_destroy(blur_behind); +} + +static void +blur_behind_handle_surface_commit(struct wl_listener *listener, void *data) +{ + struct ds_tizen_blur_behind *blur_behind; + + blur_behind = wl_container_of(listener, blur_behind, listener.surface_commit); + + if (!blur_behind->resource) { + blur_behind_destroy(blur_behind); + return; + } + + if (blur_behind->pending.committed == DS_TIZEN_BLUR_BEHIND_STATE_NONE) { + blur_behind->current.committed = DS_TIZEN_BLUR_BEHIND_STATE_NONE; + return; + } + + if (blur_behind->pending.committed & DS_TIZEN_BLUR_BEHIND_STATE_RADIUS) + blur_behind->current.radius = blur_behind->pending.radius; + + blur_behind->current.committed = blur_behind->pending.committed; + blur_behind->pending.committed = DS_TIZEN_BLUR_BEHIND_STATE_NONE; + + wl_signal_emit(&blur_behind->events.commit, blur_behind); +} + +static void +blur_behind_handle_surface_destroy(struct ds_addon *addon) +{ + struct ds_tizen_blur_behind *blur_behind; + + blur_behind = wl_container_of(addon, blur_behind, surface_addon); + + wl_list_remove(&blur_behind->listener.surface_commit.link); + + ds_addon_finish(&blur_behind->surface_addon); + blur_behind->surface = NULL; + + if (!blur_behind->resource) + blur_behind_destroy(blur_behind); +} + +static struct ds_addon_interface blur_behind_addon_impl = { + .name = "ds_tizen_blur_behind", + .destroy = blur_behind_handle_surface_destroy, +}; + +static struct ds_tizen_blur_behind * +blur_behind_client_get_from_surface(struct ds_tizen_blur_client *client, struct ds_surface *surface) +{ + struct ds_addon *addon; + struct ds_tizen_blur_behind *blur_behind; + + addon = ds_addon_find(&surface->addons, client, &blur_behind_addon_impl); + if (!addon) return NULL; + + return wl_container_of(addon, blur_behind, surface_addon); +} + +static void +blur_behind_handle_destroy(struct wl_client *client, struct wl_resource *resource) +{ + wl_resource_destroy(resource); +} + +static void +blur_behind_handle_set_radius(struct wl_client *client, struct wl_resource *resource, + uint32_t radius) +{ + struct ds_tizen_blur_behind *blur_behind; + + blur_behind = wl_resource_get_user_data(resource); + + blur_behind->pending.radius = radius; + blur_behind->pending.committed |= DS_TIZEN_BLUR_BEHIND_STATE_RADIUS; +} + +static const struct wtz_blur_behind_interface blur_behind_impl = { + blur_behind_handle_destroy, + blur_behind_handle_set_radius, +}; + +static void +blur_manager_handle_get_blur_behind(struct wl_client *wl_client, + struct wl_resource *resource, + uint32_t id, struct wl_resource *surface_resource) +{ + struct ds_tizen_blur_client *client; + struct ds_surface *surface; + struct ds_tizen_blur_behind *blur_behind; + + ds_inf("tizen_blur: get_blur"); + + client = wl_resource_get_user_data(resource); + + surface = ds_surface_from_resource(surface_resource); + if (!surface) { + wl_resource_post_error(resource, WL_DISPLAY_ERROR_INVALID_OBJECT, + "invalid wl_surface resource:%u", + (unsigned int)wl_resource_get_id(surface_resource)); + return; + } + + blur_behind = blur_behind_client_get_from_surface(client, surface); + if (blur_behind) { + wl_resource_post_error(resource, WTZ_BLUR_MANAGER_ERROR_BLUR_EXISTS, + "blend object already exists"); + return; + } + + blur_behind = calloc(1, sizeof *blur_behind); + if (blur_behind == NULL) { + ds_err("calloc() failed. tizen_blur"); + wl_client_post_no_memory(wl_client); + return; + } + + blur_behind->resource = wl_resource_create(wl_client, &wtz_blur_behind_interface, + wl_resource_get_version(resource), id); + if (blur_behind->resource == NULL) { + ds_err("tizen_blur : wl_resource_create() failed."); + free(blur_behind); + wl_client_post_no_memory(wl_client); + return; + } + + wl_resource_set_implementation(blur_behind->resource, &blur_behind_impl, blur_behind, + blur_behind_handle_resource_destroy); + + ds_addon_init(&blur_behind->surface_addon, &surface->addons, client, &blur_behind_addon_impl); + + blur_behind->listener.surface_commit.notify = blur_behind_handle_surface_commit; + ds_surface_add_commit_listener(surface, &blur_behind->listener.surface_commit); + + blur_behind->surface = surface; + + wl_signal_init(&blur_behind->events.destroy); + wl_signal_init(&blur_behind->events.commit); + + wl_signal_emit(&client->blur_manager->events.new_blur_behind, blur_behind); +} + +static void blur_manager_handle_destroy(struct wl_client *wl_client, struct wl_resource *resource) { @@ -572,6 +801,7 @@ static const struct wtz_blur_manager_interface blur_manager_impl = { blur_manager_handle_destroy, blur_manager_handle_get_blur, + blur_manager_handle_get_blur_behind, }; static void -- 2.7.4 From 256205a90777ff97b9d805522a47f0512bb58c1c Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Tue, 13 Aug 2024 13:57:29 +0900 Subject: [PATCH 13/16] Improve wl_signal_emit() func call when children destroyed - AS-IS if we try to add listener to info (child) using add_destroy_listener() func, listener is added to client (parent) rather than info. for this reason, when info is destroyed, client's destroy signal is emitted, so all added listeners recive signal. - TO-BE client don't have info's destroy signal and info have its own destroy signal. so, when info is destroyed, info emits its own destroy signal. Change-Id: Ida00bfc4d0bcb51c6df462281413ecf8d8024be0 --- src/display_policy/display_policy.c | 16 ++++++++-------- src/global_resource/global_resource.c | 18 +++++++++--------- src/memory_flusher/memory_flusher.c | 18 +++++++++--------- src/renderer/renderer.c | 18 +++++++++--------- src/screen_rotation/screen_rotation.c | 16 ++++++++-------- 5 files changed, 43 insertions(+), 43 deletions(-) diff --git a/src/display_policy/display_policy.c b/src/display_policy/display_policy.c index e278888..558e741 100644 --- a/src/display_policy/display_policy.c +++ b/src/display_policy/display_policy.c @@ -33,10 +33,6 @@ struct ds_tizen_display_policy_client struct wl_list infos; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; // ds_tizen_display_policy::clients }; @@ -48,6 +44,10 @@ struct ds_tizen_display_policy_info int32_t brightness_value; + struct { + struct wl_signal destroy; + } events; + struct wl_list link; // ds_tizen_display_policy_client::infos }; @@ -117,7 +117,7 @@ ds_tizen_display_policy_info_add_destroy_listener( struct ds_tizen_display_policy_info *info, struct wl_listener *listener) { - wl_signal_add(&info->client->events.destroy, listener); + wl_signal_add(&info->events.destroy, listener); } WL_EXPORT struct ds_surface * @@ -177,6 +177,8 @@ tizen_display_policy_client_get_info(struct ds_tizen_display_policy_client *clie info->client = client; info->surface = surface; + wl_signal_init(&info->events.destroy); + wl_list_insert(&client->infos, &info->link); return info; @@ -256,7 +258,7 @@ _tizen_display_policy_client_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_display_policy_client_handle_destroy (client:%p)", client); wl_list_for_each_safe(info, tmp, &client->infos, link) { - wl_signal_emit(&client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -299,7 +301,5 @@ display_policy_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &display_policy_impl, client, _tizen_display_policy_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&display_policy->clients, &client->link); } diff --git a/src/global_resource/global_resource.c b/src/global_resource/global_resource.c index 3c15f23..4a05c60 100644 --- a/src/global_resource/global_resource.c +++ b/src/global_resource/global_resource.c @@ -35,10 +35,6 @@ struct ds_tizen_global_resource_client struct wl_list infos; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; // ds_tizen_global_resource::clients }; @@ -52,6 +48,10 @@ struct ds_tizen_global_resource_info uint32_t universal_id; + struct { + struct wl_signal destroy; + } events; + struct wl_list link; // ds_tizen_global_resource_client::infos }; @@ -122,7 +122,7 @@ ds_tizen_global_resource_info_add_destroy_listener( struct ds_tizen_global_resource_info *info, struct wl_listener *listener) { - wl_signal_add(&info->client->events.destroy, listener); + wl_signal_add(&info->events.destroy, listener); } WL_EXPORT struct ds_surface * @@ -174,6 +174,8 @@ tizen_global_resource_client_get_info( info->client = client; info->surface = surface; + wl_signal_init(&info->events.destroy); + wl_list_insert(&client->infos, &info->link); return info; @@ -215,7 +217,7 @@ _tizen_surface_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_surface_handle_destroy (info:%p)", info); - wl_signal_emit(&info->client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -296,7 +298,7 @@ _tizen_global_resource_client_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_global_resource_client_handle_destroy (client:%p)", client); wl_list_for_each_safe(info, tmp, &client->infos, link) { - wl_signal_emit(&info->client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -339,7 +341,5 @@ resource_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &surface_impl, client, _tizen_global_resource_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&global_resource->clients, &client->link); } diff --git a/src/memory_flusher/memory_flusher.c b/src/memory_flusher/memory_flusher.c index 378794f..9e8e407 100644 --- a/src/memory_flusher/memory_flusher.c +++ b/src/memory_flusher/memory_flusher.c @@ -33,10 +33,6 @@ struct ds_tizen_memory_flusher_client struct wl_list infos; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; // ds_tizen_memory_flusher::clients }; @@ -48,6 +44,10 @@ struct ds_tizen_memory_flusher_info struct ds_surface *surface; + struct { + struct wl_signal destroy; + } events; + struct wl_list link; // ds_tizen_memory_flusher_client::infos }; @@ -118,7 +118,7 @@ ds_tizen_memory_flusher_info_add_destroy_listener( struct ds_tizen_memory_flusher_info *info, struct wl_listener *listener) { - wl_signal_add(&info->client->events.destroy, listener); + wl_signal_add(&info->events.destroy, listener); } WL_EXPORT struct ds_surface * @@ -185,6 +185,8 @@ tizen_memory_flusher_client_get_info(struct ds_tizen_memory_flusher_client *clie info->client = client; info->surface = surface; + wl_signal_init(&info->events.destroy); + wl_list_insert(&client->infos, &info->link); return info; @@ -226,7 +228,7 @@ _tizen_memory_flusher_info_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_memory_flusher_info_handle_destroy (info:%p)", info); - wl_signal_emit(&info->client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -302,7 +304,7 @@ _tizen_memory_flusher_client_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_memory_flusher_client_handle_destroy (client:%p)", client); wl_list_for_each_safe(info, tmp, &client->infos, link) { - wl_signal_emit(&client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -345,7 +347,5 @@ memory_flusher_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &memory_flusher_impl, client, _tizen_memory_flusher_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&memory_flusher->clients, &client->link); } diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index b87e65e..bcd320d 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -33,10 +33,6 @@ struct ds_tizen_renderer_client struct wl_list infos; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; // ds_tizen_renderer::clients }; @@ -48,6 +44,10 @@ struct ds_tizen_renderer_info struct ds_surface *surface; + struct { + struct wl_signal destroy; + } events; + struct wl_list link; // ds_tizen_renderer_client::infos }; @@ -118,7 +118,7 @@ ds_tizen_renderer_info_add_destroy_listener( struct ds_tizen_renderer_info *info, struct wl_listener *listener) { - wl_signal_add(&info->client->events.destroy, listener); + wl_signal_add(&info->events.destroy, listener); } WL_EXPORT struct ds_surface * @@ -168,6 +168,8 @@ tizen_renderer_client_get_info(struct ds_tizen_renderer_client *client, info->client = client; info->surface = surface; + wl_signal_init(&info->events.destroy); + wl_list_insert(&client->infos, &info->link); return info; @@ -209,7 +211,7 @@ _tizen_renderer_info_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_renderer_info_handle_destroy (info:%p)", info); - wl_signal_emit(&info->client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -285,7 +287,7 @@ _tizen_renderer_client_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_renderer_client_handle_destroy (client:%p)", client); wl_list_for_each_safe(info, tmp, &client->infos, link) { - wl_signal_emit(&client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_resource_destroy(info->resource); } @@ -327,7 +329,5 @@ renderer_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &renderer_impl, client, _tizen_renderer_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&renderer->clients, &client->link); } diff --git a/src/screen_rotation/screen_rotation.c b/src/screen_rotation/screen_rotation.c index e4ddb6b..656347e 100644 --- a/src/screen_rotation/screen_rotation.c +++ b/src/screen_rotation/screen_rotation.c @@ -33,10 +33,6 @@ struct ds_tizen_screen_rotation_client struct wl_list infos; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; // ds_tizen_screen_rotation::clients }; @@ -46,6 +42,10 @@ struct ds_tizen_screen_rotation_info struct ds_surface *surface; + struct { + struct wl_signal destroy; + } events; + struct wl_list link; // ds_tizen_screen_rotation_client::infos }; @@ -118,7 +118,7 @@ ds_tizen_screen_rotation_info_add_destroy_listener( struct ds_tizen_screen_rotation_info *info, struct wl_listener *listener) { - wl_signal_add(&info->client->events.destroy, listener); + wl_signal_add(&info->events.destroy, listener); } WL_EXPORT struct ds_surface * @@ -169,6 +169,8 @@ tizen_screen_rotation_client_get_info(struct ds_tizen_screen_rotation_client *cl info->client = client; info->surface = surface; + wl_signal_init(&info->events.destroy); + wl_list_insert(&client->infos, &info->link); return info; @@ -245,7 +247,7 @@ _tizen_screen_rotation_client_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_screen_rotation_client_handle_destroy (client:%p)", client); wl_list_for_each_safe(info, tmp, &client->infos, link) { - wl_signal_emit(&client->events.destroy, info); + wl_signal_emit(&info->events.destroy, info); wl_list_remove(&info->link); free(info); } @@ -288,7 +290,5 @@ screen_rotation_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &screen_rotation_impl, client, _tizen_screen_rotation_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&screen_rotation->clients, &client->link); } -- 2.7.4 From 0570e1b3eb92bc2d1baef020740632b0e2b83029 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Tue, 13 Aug 2024 14:00:31 +0900 Subject: [PATCH 14/16] Remove unused _client's destroy signal Change-Id: Id652668f5aa989062ca598431da522881e26a265 --- src/blender/blender.c | 6 ------ src/blur/blur.c | 6 ------ src/hwc/hwc.c | 6 ------ src/remote_surface/remote_surface.c | 6 ------ src/screen/screen.c | 6 ------ 5 files changed, 30 deletions(-) diff --git a/src/blender/blender.c b/src/blender/blender.c index c651cac..0096c7c 100644 --- a/src/blender/blender.c +++ b/src/blender/blender.c @@ -35,10 +35,6 @@ struct ds_tizen_blender_client struct wl_resource *resource; struct wl_client *wl_client; - - struct { - struct wl_signal destroy; - } events; }; struct ds_tizen_blend @@ -407,7 +403,5 @@ blender_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &blender_impl, client, blender_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&blender->clients, &client->link); } diff --git a/src/blur/blur.c b/src/blur/blur.c index 36e1d4c..c3132aa 100644 --- a/src/blur/blur.c +++ b/src/blur/blur.c @@ -38,10 +38,6 @@ struct ds_tizen_blur_client struct wl_resource *resource; struct wl_client *wl_client; - - struct { - struct wl_signal destroy; - } events; }; struct ds_tizen_blur @@ -848,7 +844,5 @@ blur_manager_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_resource_set_implementation(client->resource, &blur_manager_impl, client, blur_manager_client_handle_destroy); - wl_signal_init(&client->events.destroy); - wl_list_insert(&blur_manager->clients, &client->link); } diff --git a/src/hwc/hwc.c b/src/hwc/hwc.c index 3a15a2e..837798a 100644 --- a/src/hwc/hwc.c +++ b/src/hwc/hwc.c @@ -33,10 +33,6 @@ struct ds_tizen_hwc_client struct wl_list feedbacks; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; }; @@ -205,8 +201,6 @@ hwc_bind(struct wl_client *wl_client, void *data, uint32_t version, wl_list_init(&hwc_client->feedbacks); - wl_signal_init(&hwc_client->events.destroy); - wl_list_insert(&hwc->clients, &hwc_client->link); } diff --git a/src/remote_surface/remote_surface.c b/src/remote_surface/remote_surface.c index b9aaa36..337f397 100644 --- a/src/remote_surface/remote_surface.c +++ b/src/remote_surface/remote_surface.c @@ -42,10 +42,6 @@ struct ds_tizen_remote_surface_client struct { struct wl_listener surface_destroy; } listener; - - struct { - struct wl_signal destroy; - } events; }; struct ds_tizen_remote_surface_provider @@ -966,8 +962,6 @@ remote_surface_manager_bind(struct wl_client *wl_client, void *data, uint32_t ve wl_resource_set_implementation(remote_client->resource, &remote_surface_manager_impl, remote_client, tizen_remote_surface_client_handle_resource_destroy); - - wl_signal_init(&remote_client->events.destroy); } static void diff --git a/src/screen/screen.c b/src/screen/screen.c index 6ba8442..cca5127 100644 --- a/src/screen/screen.c +++ b/src/screen/screen.c @@ -37,10 +37,6 @@ struct ds_tizen_screen_client struct wl_resource *resource; struct wl_client *client; - struct { - struct wl_signal destroy; - } events; - struct wl_list link; // ds_tizen_screen::clients }; @@ -246,8 +242,6 @@ screen_bind(struct wl_client *wl_client, void *data, uint32_t version, // send the capabilities of the screen wtz_screen_send_capabilities(screen_client->resource, &screen->capabilities); - wl_signal_init(&screen_client->events.destroy); - wl_list_insert(&screen->clients, &screen_client->link); } -- 2.7.4 From 436636e480b4ab79709b85d59a4c16c0784bdfd5 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Tue, 3 Sep 2024 11:53:12 +0900 Subject: [PATCH 15/16] renderer: Fix resource overwriting when renderer_surface get AS-IS - finds the info corresponding to renderer_client and ds_surface, and then overwrites info->resource with new wl_resource TO-BE - creates a new info each time and allocates a wl_resource Change-Id: If76f2905c26b695c65270c963e0e2837561cdd0e --- src/renderer/renderer.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index bcd320d..18848d2 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -57,14 +57,6 @@ static void renderer_handle_display_destroy(struct wl_listener *listener, static void renderer_bind(struct wl_client *wl_client, void *data, uint32_t version, uint32_t id); -static struct ds_tizen_renderer_info *tizen_renderer_client_find_info( - struct ds_tizen_renderer_client *client, - struct ds_surface *surface); - -static struct ds_tizen_renderer_info *tizen_renderer_client_get_info( - struct ds_tizen_renderer_client *client, - struct ds_surface *surface); - WL_EXPORT struct ds_tizen_renderer * ds_tizen_renderer_create(struct wl_display *display) { @@ -230,24 +222,27 @@ renderer_handle_get_renderer_surface(struct wl_client *wl_client, client = wl_resource_get_user_data(resource); surface = ds_surface_from_resource(surface_resource); - info = tizen_renderer_client_get_info(client, surface); + info = calloc(1, sizeof *info); if (info == NULL) { - ds_err("tizen_renderer_client_get_info() failed."); + ds_err("tizen_renderer_surface: calloc() failed."); wl_client_post_no_memory(wl_client); return; } + info->client = client; + info->surface = surface; info->resource = wl_resource_create(wl_client, &tizen_renderer_surface_interface, wl_resource_get_version(resource), id); if (info->resource == NULL) { ds_err("tizen_renderer : wl_resource_create() failed."); - wl_list_remove(&info->link); free(info); wl_client_post_no_memory(wl_client); return; } + wl_list_insert(&client->infos, &info->link); + wl_resource_set_implementation(info->resource, &renderer_surface_impl, info, _tizen_renderer_info_handle_destroy); -- 2.7.4 From 2dc5b8dadf0c0ab5674c1e8491187e10ce356a81 Mon Sep 17 00:00:00 2001 From: TaeHyeon Jeong Date: Wed, 4 Sep 2024 10:33:31 +0900 Subject: [PATCH 16/16] renderer: Seperate info's lifecycle from client AS-IS - when the renderer_client is removed, the info is also erased TO-BE - regardless of the renderer_client's destruction, the info is maintained Change-Id: I4af548b3f1c71b06183b09882095705fac31bb82 --- src/renderer/renderer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/renderer.c b/src/renderer/renderer.c index 18848d2..62e6869 100644 --- a/src/renderer/renderer.c +++ b/src/renderer/renderer.c @@ -282,8 +282,8 @@ _tizen_renderer_client_handle_destroy(struct wl_resource *resource) ds_inf("_tizen_renderer_client_handle_destroy (client:%p)", client); wl_list_for_each_safe(info, tmp, &client->infos, link) { - wl_signal_emit(&info->events.destroy, info); - wl_resource_destroy(info->resource); + info->client = NULL; + wl_list_remove(&info->link); } wl_list_remove(&client->link); -- 2.7.4