Skip to content

Commit 53a221c

Browse files
rmaderppaalanen
authored andcommitted
libweston/linux-dmabuf: create surface feedback on demand
Unconditionally creating a surface feedback for each surface creates unnecessary overhead and noise in the logs. Thus create it when the first surface feedback resource for a surface is requested and delete it again once all those resources have been destroyed. Signed-off-by: Robert Mader <[email protected]>
1 parent 34f7e01 commit 53a221c

File tree

2 files changed

+62
-41
lines changed

2 files changed

+62
-41
lines changed

libweston/compositor.c

+2-34
Original file line numberDiff line numberDiff line change
@@ -4189,62 +4189,30 @@ static const struct wl_surface_interface surface_interface = {
41894189
surface_damage_buffer
41904190
};
41914191

4192-
static int
4193-
create_surface_dmabuf_feedback(struct weston_compositor *ec,
4194-
struct weston_surface *surface)
4195-
{
4196-
struct weston_dmabuf_feedback_tranche *tranche;
4197-
dev_t main_device = ec->default_dmabuf_feedback->main_device;
4198-
uint32_t flags = 0;
4199-
4200-
surface->dmabuf_feedback = weston_dmabuf_feedback_create(main_device);
4201-
if (!surface->dmabuf_feedback)
4202-
return -1;
4203-
4204-
tranche = weston_dmabuf_feedback_tranche_create(surface->dmabuf_feedback,
4205-
ec->dmabuf_feedback_format_table,
4206-
main_device, flags,
4207-
RENDERER_PREF);
4208-
if (!tranche) {
4209-
weston_dmabuf_feedback_destroy(surface->dmabuf_feedback);
4210-
surface->dmabuf_feedback = NULL;
4211-
return -1;
4212-
}
4213-
4214-
return 0;
4215-
}
4216-
42174192
static void
42184193
compositor_create_surface(struct wl_client *client,
42194194
struct wl_resource *resource, uint32_t id)
42204195
{
42214196
struct weston_compositor *ec = wl_resource_get_user_data(resource);
42224197
struct weston_surface *surface;
4223-
int ret;
42244198

42254199
surface = weston_surface_create(ec);
42264200
if (surface == NULL)
42274201
goto err;
42284202

4229-
if (ec->default_dmabuf_feedback) {
4230-
ret = create_surface_dmabuf_feedback(ec, surface);
4231-
if (ret < 0)
4232-
goto err_dmabuf_feedback;
4233-
}
4234-
42354203
surface->resource =
42364204
wl_resource_create(client, &wl_surface_interface,
42374205
wl_resource_get_version(resource), id);
42384206
if (surface->resource == NULL)
4239-
goto err_dmabuf_feedback;
4207+
goto err_res;
42404208
wl_resource_set_implementation(surface->resource, &surface_interface,
42414209
surface, destroy_surface);
42424210

42434211
wl_signal_emit(&ec->create_surface_signal, surface);
42444212

42454213
return;
42464214

4247-
err_dmabuf_feedback:
4215+
err_res:
42484216
weston_surface_destroy(surface);
42494217
err:
42504218
wl_resource_post_no_memory(resource);

libweston/linux-dmabuf.c

+60-7
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,7 @@ weston_dmabuf_feedback_destroy(struct weston_dmabuf_feedback *dmabuf_feedback)
684684
wl_resource_for_each_safe(res, res_tmp, &dmabuf_feedback->resource_list) {
685685
wl_list_remove(wl_resource_get_link(res));
686686
wl_list_init(wl_resource_get_link(res));
687+
wl_resource_set_user_data(res, NULL);
687688
}
688689

689690
free(dmabuf_feedback);
@@ -786,6 +787,7 @@ weston_dmabuf_feedback_send_all(struct weston_dmabuf_feedback *dmabuf_feedback,
786787
{
787788
struct wl_resource *res;
788789

790+
assert(!wl_list_empty(&dmabuf_feedback->resource_list));
789791
wl_resource_for_each(res, &dmabuf_feedback->resource_list)
790792
weston_dmabuf_feedback_send(dmabuf_feedback,
791793
format_table, res, false);
@@ -794,7 +796,16 @@ weston_dmabuf_feedback_send_all(struct weston_dmabuf_feedback *dmabuf_feedback,
794796
static void
795797
dmabuf_feedback_resource_destroy(struct wl_resource *resource)
796798
{
799+
struct weston_surface *surface =
800+
wl_resource_get_user_data(resource);
801+
797802
wl_list_remove(wl_resource_get_link(resource));
803+
804+
if (surface &&
805+
wl_list_empty(&surface->dmabuf_feedback->resource_list)) {
806+
weston_dmabuf_feedback_destroy(surface->dmabuf_feedback);
807+
surface->dmabuf_feedback = NULL;
808+
}
798809
}
799810

800811
static void
@@ -810,7 +821,8 @@ zwp_linux_dmabuf_feedback_implementation = {
810821

811822
static struct wl_resource *
812823
dmabuf_feedback_resource_create(struct wl_resource *dmabuf_resource,
813-
struct wl_client *client, uint32_t dmabuf_feedback_id)
824+
struct wl_client *client, uint32_t dmabuf_feedback_id,
825+
struct weston_surface *surface)
814826
{
815827
struct wl_resource *dmabuf_feedback_res;
816828
uint32_t version;
@@ -826,7 +838,7 @@ dmabuf_feedback_resource_create(struct wl_resource *dmabuf_resource,
826838
wl_list_init(wl_resource_get_link(dmabuf_feedback_res));
827839
wl_resource_set_implementation(dmabuf_feedback_res,
828840
&zwp_linux_dmabuf_feedback_implementation,
829-
NULL, dmabuf_feedback_resource_destroy);
841+
surface, dmabuf_feedback_resource_destroy);
830842

831843
return dmabuf_feedback_res;
832844
}
@@ -842,7 +854,8 @@ linux_dmabuf_get_default_feedback(struct wl_client *client,
842854

843855
dmabuf_feedback_resource =
844856
dmabuf_feedback_resource_create(dmabuf_resource,
845-
client, dmabuf_feedback_id);
857+
client, dmabuf_feedback_id,
858+
NULL);
846859
if (!dmabuf_feedback_resource) {
847860
wl_resource_post_no_memory(dmabuf_resource);
848861
return;
@@ -853,22 +866,55 @@ linux_dmabuf_get_default_feedback(struct wl_client *client,
853866
dmabuf_feedback_resource, true);
854867
}
855868

869+
static int
870+
create_surface_dmabuf_feedback(struct weston_compositor *ec,
871+
struct weston_surface *surface)
872+
{
873+
struct weston_dmabuf_feedback_tranche *tranche;
874+
dev_t main_device = ec->default_dmabuf_feedback->main_device;
875+
uint32_t flags = 0;
876+
877+
surface->dmabuf_feedback = weston_dmabuf_feedback_create(main_device);
878+
if (!surface->dmabuf_feedback)
879+
return -1;
880+
881+
tranche = weston_dmabuf_feedback_tranche_create(surface->dmabuf_feedback,
882+
ec->dmabuf_feedback_format_table,
883+
main_device, flags,
884+
RENDERER_PREF);
885+
if (!tranche) {
886+
weston_dmabuf_feedback_destroy(surface->dmabuf_feedback);
887+
surface->dmabuf_feedback = NULL;
888+
return -1;
889+
}
890+
891+
return 0;
892+
}
893+
856894
static void
857895
linux_dmabuf_get_per_surface_feedback(struct wl_client *client,
858896
struct wl_resource *dmabuf_resource,
859897
uint32_t dmabuf_feedback_id,
860898
struct wl_resource *surface_resource)
861899
{
900+
struct weston_compositor *compositor =
901+
wl_resource_get_user_data(dmabuf_resource);
862902
struct weston_surface *surface =
863903
wl_resource_get_user_data(surface_resource);
864904
struct wl_resource *dmabuf_feedback_resource;
905+
int ret;
865906

866907
dmabuf_feedback_resource =
867908
dmabuf_feedback_resource_create(dmabuf_resource,
868-
client, dmabuf_feedback_id);
869-
if (!dmabuf_feedback_resource) {
870-
wl_resource_post_no_memory(dmabuf_resource);
871-
return;
909+
client, dmabuf_feedback_id,
910+
surface);
911+
if (!dmabuf_feedback_resource)
912+
goto err;
913+
914+
if (!surface->dmabuf_feedback) {
915+
ret = create_surface_dmabuf_feedback(compositor, surface);
916+
if (ret < 0)
917+
goto err_feedback;
872918
}
873919

874920
/* Surface dma-buf feedback is dynamic and may need to be resent to
@@ -879,6 +925,13 @@ linux_dmabuf_get_per_surface_feedback(struct wl_client *client,
879925
weston_dmabuf_feedback_send(surface->dmabuf_feedback,
880926
surface->compositor->dmabuf_feedback_format_table,
881927
dmabuf_feedback_resource, true);
928+
return;
929+
930+
err_feedback:
931+
wl_resource_set_user_data(dmabuf_feedback_resource, NULL);
932+
wl_resource_destroy(dmabuf_feedback_resource);
933+
err:
934+
wl_resource_post_no_memory(dmabuf_resource);
882935
}
883936

884937
/** Get the linux_dmabuf_buffer from a wl_buffer resource

0 commit comments

Comments
 (0)