From c5a01854df6602d536eb18c21d4663056f66bee7 Mon Sep 17 00:00:00 2001 From: Erik Faye-Lund Date: Tue, 9 Aug 2022 13:22:59 +0200 Subject: [PATCH] gallium/u_transfer_helper: clean up boolean flags Whenever we add or remove a flag here, we need to update a bunch of drivers in a fragile way. Moving to flags here instead should make this a bit easier to maintain in the future. Reviewed-by: Alyssa Rosenzweig Reviewed-by: Vasily Khoruzhick Reviewed-by: Mike Blumenkrantz Reviewed-by: Juan A. Suarez Reviewed-by: Yonggang Luo Reviewed-by: Kenneth Graunke Part-of: --- src/gallium/auxiliary/util/u_transfer_helper.c | 16 ++++++---------- src/gallium/auxiliary/util/u_transfer_helper.h | 17 +++++++++++------ src/gallium/drivers/asahi/agx_pipe.c | 6 ++++-- src/gallium/drivers/crocus/crocus_resource.c | 10 ++++++++-- .../drivers/freedreno/freedreno_resource.c | 5 ++++- src/gallium/drivers/iris/iris_resource.c | 5 ++++- src/gallium/drivers/lima/lima_resource.c | 4 +--- src/gallium/drivers/panfrost/pan_resource.c | 5 +++-- src/gallium/drivers/v3d/v3d_resource.c | 6 +++--- src/gallium/drivers/vc4/vc4_resource.c | 4 +--- src/gallium/drivers/zink/zink_resource.c | 4 +++- 11 files changed, 48 insertions(+), 34 deletions(-) diff --git a/src/gallium/auxiliary/util/u_transfer_helper.c b/src/gallium/auxiliary/util/u_transfer_helper.c index 10ee3003424..06b9d46c8dc 100644 --- a/src/gallium/auxiliary/util/u_transfer_helper.c +++ b/src/gallium/auxiliary/util/u_transfer_helper.c @@ -553,20 +553,16 @@ u_transfer_helper_transfer_unmap(struct pipe_context *pctx, struct u_transfer_helper * u_transfer_helper_create(const struct u_transfer_vtbl *vtbl, - bool separate_z32s8, - bool separate_stencil, - bool fake_rgtc, - bool msaa_map, - bool z24_in_z32f) + enum u_transfer_helper_flags flags) { struct u_transfer_helper *helper = calloc(1, sizeof(*helper)); helper->vtbl = vtbl; - helper->separate_z32s8 = separate_z32s8; - helper->separate_stencil = separate_stencil; - helper->fake_rgtc = fake_rgtc; - helper->msaa_map = msaa_map; - helper->z24_in_z32f = z24_in_z32f; + helper->separate_z32s8 = flags & U_TRANSFER_HELPER_SEPARATE_Z32S8; + helper->separate_stencil = flags & U_TRANSFER_HELPER_SEPARATE_STENCIL; + helper->fake_rgtc = flags & U_TRANSFER_HELPER_FAKE_RGTC; + helper->msaa_map = flags & U_TRANSFER_HELPER_MSAA_MAP; + helper->z24_in_z32f = flags & U_TRANSFER_HELPER_Z24_IN_Z32F; return helper; } diff --git a/src/gallium/auxiliary/util/u_transfer_helper.h b/src/gallium/auxiliary/util/u_transfer_helper.h index d62d8a19848..430deffeb04 100644 --- a/src/gallium/auxiliary/util/u_transfer_helper.h +++ b/src/gallium/auxiliary/util/u_transfer_helper.h @@ -98,6 +98,14 @@ struct u_transfer_vtbl { struct pipe_resource *(*get_stencil)(struct pipe_resource *prsc); }; +enum u_transfer_helper_flags { + U_TRANSFER_HELPER_SEPARATE_Z32S8 = (1 << 0), + U_TRANSFER_HELPER_SEPARATE_STENCIL = (1 << 1), + U_TRANSFER_HELPER_FAKE_RGTC = (1 << 2), + U_TRANSFER_HELPER_MSAA_MAP = (1 << 3), + U_TRANSFER_HELPER_Z24_IN_Z32F = (1 << 4), +}; + struct pipe_resource *u_transfer_helper_resource_create( struct pipe_screen *pscreen, const struct pipe_resource *templ); @@ -121,12 +129,9 @@ void u_transfer_helper_transfer_unmap(struct pipe_context *pctx, struct u_transfer_helper; -struct u_transfer_helper * u_transfer_helper_create(const struct u_transfer_vtbl *vtbl, - bool separate_z32s8, - bool separate_stencil, - bool fake_rgtc, - bool msaa_map, - bool z24_in_z32f); +struct u_transfer_helper * +u_transfer_helper_create(const struct u_transfer_vtbl *vtbl, + enum u_transfer_helper_flags flags); void u_transfer_helper_destroy(struct u_transfer_helper *helper); diff --git a/src/gallium/drivers/asahi/agx_pipe.c b/src/gallium/drivers/asahi/agx_pipe.c index 7f3dd07e498..389b11f2150 100644 --- a/src/gallium/drivers/asahi/agx_pipe.c +++ b/src/gallium/drivers/asahi/agx_pipe.c @@ -1217,8 +1217,10 @@ agx_screen_create(struct sw_winsys *winsys) screen->resource_create = u_transfer_helper_resource_create; screen->resource_destroy = u_transfer_helper_resource_destroy; screen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, - true, true, false, true, - true); + U_TRANSFER_HELPER_SEPARATE_Z32S8 | + U_TRANSFER_HELPER_SEPARATE_STENCIL | + U_TRANSFER_HELPER_MSAA_MAP | + U_TRANSFER_HELPER_Z24_IN_Z32F); agx_internal_shaders(&agx_screen->dev); diff --git a/src/gallium/drivers/crocus/crocus_resource.c b/src/gallium/drivers/crocus/crocus_resource.c index c35b63079c2..8e9d7dae093 100644 --- a/src/gallium/drivers/crocus/crocus_resource.c +++ b/src/gallium/drivers/crocus/crocus_resource.c @@ -2007,9 +2007,15 @@ crocus_init_screen_resource_functions(struct pipe_screen *pscreen) pscreen->resource_destroy = u_transfer_helper_resource_destroy; pscreen->memobj_create_from_handle = crocus_memobj_create_from_handle; pscreen->memobj_destroy = crocus_memobj_destroy; + + enum u_transfer_helper_flags transfer_flags = U_TRANSFER_HELPER_MSAA_MAP; + if (screen->devinfo.ver >= 6) { + transfer_flags |= U_TRANSFER_HELPER_SEPARATE_Z32S8 | + U_TRANSFER_HELPER_SEPARATE_STENCIL; + } + pscreen->transfer_helper = - u_transfer_helper_create(&transfer_vtbl, screen->devinfo.ver >= 6, - screen->devinfo.ver >= 6, false, true, false); + u_transfer_helper_create(&transfer_vtbl, transfer_flags); } void diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index 9b4a136d6ab..eb189b091e9 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -1666,7 +1666,10 @@ fd_resource_screen_init(struct pipe_screen *pscreen) pscreen->resource_destroy = u_transfer_helper_resource_destroy; pscreen->transfer_helper = - u_transfer_helper_create(&transfer_vtbl, true, false, fake_rgtc, true, false); + u_transfer_helper_create(&transfer_vtbl, + U_TRANSFER_HELPER_SEPARATE_Z32S8 | + U_TRANSFER_HELPER_MSAA_MAP | + (fake_rgtc ? U_TRANSFER_HELPER_FAKE_RGTC : 0)); if (!screen->layout_resource_for_modifier) screen->layout_resource_for_modifier = fd_layout_resource_for_modifier; diff --git a/src/gallium/drivers/iris/iris_resource.c b/src/gallium/drivers/iris/iris_resource.c index c5b36176ca7..69487876aba 100644 --- a/src/gallium/drivers/iris/iris_resource.c +++ b/src/gallium/drivers/iris/iris_resource.c @@ -2693,7 +2693,10 @@ iris_init_screen_resource_functions(struct pipe_screen *pscreen) pscreen->memobj_create_from_handle = iris_memobj_create_from_handle; pscreen->memobj_destroy = iris_memobj_destroy; pscreen->transfer_helper = - u_transfer_helper_create(&transfer_vtbl, true, true, false, true, false); + u_transfer_helper_create(&transfer_vtbl, + U_TRANSFER_HELPER_SEPARATE_Z32S8 | + U_TRANSFER_HELPER_SEPARATE_STENCIL | + U_TRANSFER_HELPER_MSAA_MAP); } void diff --git a/src/gallium/drivers/lima/lima_resource.c b/src/gallium/drivers/lima/lima_resource.c index 10c471424f9..11fa075ed00 100644 --- a/src/gallium/drivers/lima/lima_resource.c +++ b/src/gallium/drivers/lima/lima_resource.c @@ -934,9 +934,7 @@ lima_resource_screen_init(struct lima_screen *screen) screen->base.resource_get_param = lima_resource_get_param; screen->base.set_damage_region = lima_resource_set_damage_region; screen->base.transfer_helper = u_transfer_helper_create(&transfer_vtbl, - false, false, - false, true, - false); + U_TRANSFER_HELPER_MSAA_MAP); } void diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c index b673af74370..228e4520135 100644 --- a/src/gallium/drivers/panfrost/pan_resource.c +++ b/src/gallium/drivers/panfrost/pan_resource.c @@ -1461,8 +1461,9 @@ panfrost_resource_screen_init(struct pipe_screen *pscreen) pscreen->resource_get_handle = panfrost_resource_get_handle; pscreen->resource_get_param = panfrost_resource_get_param; pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, - true, false, - fake_rgtc, true, false); + U_TRANSFER_HELPER_SEPARATE_Z32S8 | + U_TRANSFER_HELPER_MSAA_MAP | + (fake_rgtc ? U_TRANSFER_HELPER_FAKE_RGTC : 0)); } void panfrost_resource_screen_destroy(struct pipe_screen *pscreen) diff --git a/src/gallium/drivers/v3d/v3d_resource.c b/src/gallium/drivers/v3d/v3d_resource.c index b85983c23f5..c9753751676 100644 --- a/src/gallium/drivers/v3d/v3d_resource.c +++ b/src/gallium/drivers/v3d/v3d_resource.c @@ -1178,9 +1178,9 @@ v3d_resource_screen_init(struct pipe_screen *pscreen) pscreen->resource_get_param = v3d_resource_get_param; pscreen->resource_destroy = u_transfer_helper_resource_destroy; pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, - true, false, - true, true, - false); + U_TRANSFER_HELPER_SEPARATE_Z32S8 | + U_TRANSFER_HELPER_FAKE_RGTC | + U_TRANSFER_HELPER_MSAA_MAP); } void diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c index d9b80a51700..ab918a05cce 100644 --- a/src/gallium/drivers/vc4/vc4_resource.c +++ b/src/gallium/drivers/vc4/vc4_resource.c @@ -1138,9 +1138,7 @@ vc4_resource_screen_init(struct pipe_screen *pscreen) pscreen->resource_get_param = vc4_resource_get_param; pscreen->resource_destroy = vc4_resource_destroy; pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, - false, false, - false, true, - false); + U_TRANSFER_HELPER_MSAA_MAP); /* Test if the kernel has GET_TILING; it will return -EINVAL if the * ioctl does not exist, but -ENOENT if we pass an impossible handle. diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index b65bbedf0bd..a0fd5400632 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -2270,7 +2270,9 @@ zink_screen_resource_init(struct pipe_screen *pscreen) pscreen->resource_create_with_modifiers = zink_resource_create_with_modifiers; pscreen->resource_create_drawable = zink_resource_create_drawable; pscreen->resource_destroy = zink_resource_destroy; - pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, true, true, false, false, !screen->have_D24_UNORM_S8_UINT); + pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, + U_TRANSFER_HELPER_SEPARATE_Z32S8 | U_TRANSFER_HELPER_SEPARATE_STENCIL | + (!screen->have_D24_UNORM_S8_UINT ? U_TRANSFER_HELPER_Z24_IN_Z32F : 0)); if (screen->info.have_KHR_external_memory_fd || screen->info.have_KHR_external_memory_win32) { pscreen->resource_get_handle = zink_resource_get_handle;