u_transfer_helper: add a new option for handling z24 stored in z32

It might be possible to combine this with the other merge to avoid
the overheads of making a temp copy.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15516>
This commit is contained in:
Dave Airlie 2022-03-23 14:59:42 +10:00 committed by Marge Bot
parent 90a6947632
commit 24a6693ece
10 changed files with 63 additions and 22 deletions

View file

@ -37,6 +37,7 @@ struct u_transfer_helper {
bool separate_stencil; /**< separate stencil for all formats */
bool fake_rgtc;
bool msaa_map;
bool z24_in_z32f; /* the z24 values are stored in a z32 - translate them. */
};
static inline bool need_interleave_path(struct u_transfer_helper *helper,
@ -46,6 +47,9 @@ static inline bool need_interleave_path(struct u_transfer_helper *helper,
return true;
if (helper->separate_z32s8 && format == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)
return true;
/* this isn't interleaving, but still needs conversions on that path. */
if (helper->z24_in_z32f && format == PIPE_FORMAT_Z24X8_UNORM)
return true;
return false;
}
@ -298,6 +302,7 @@ u_transfer_helper_transfer_map(struct pipe_context *pctx,
width, height);
break;
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
assert(!helper->z24_in_z32f);
util_format_z24_unorm_s8_uint_pack_separate(trans->staging,
ptrans->stride,
trans->ptr,
@ -424,11 +429,22 @@ flush_region(struct pipe_context *pctx, struct pipe_transfer *ptrans,
ptrans->stride,
width, height);
break;
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
/* just do a strided 32-bit copy for depth; s8 can become garbage x8 */
util_format_z32_unorm_unpack_z_32unorm(dst, trans->trans->stride,
case PIPE_FORMAT_Z24X8_UNORM:
util_format_z24x8_unorm_unpack_z_float(dst, trans->trans->stride,
src, ptrans->stride,
width, height);
break;
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
if (helper->z24_in_z32f) {
util_format_z24_unorm_s8_uint_unpack_z_float(dst, trans->trans->stride,
src, ptrans->stride,
width, height);
} else {
/* just do a strided 32-bit copy for depth; s8 can become garbage x8 */
util_format_z32_unorm_unpack_z_32unorm(dst, trans->trans->stride,
src, ptrans->stride,
width, height);
}
FALLTHROUGH;
case PIPE_FORMAT_X24S8_UINT:
dst = (uint8_t *)trans->ptr2 +
@ -537,7 +553,8 @@ u_transfer_helper_create(const struct u_transfer_vtbl *vtbl,
bool separate_z32s8,
bool separate_stencil,
bool fake_rgtc,
bool msaa_map)
bool msaa_map,
bool z24_in_z32f)
{
struct u_transfer_helper *helper = calloc(1, sizeof(*helper));
@ -546,6 +563,7 @@ u_transfer_helper_create(const struct u_transfer_vtbl *vtbl,
helper->separate_stencil = separate_stencil;
helper->fake_rgtc = fake_rgtc;
helper->msaa_map = msaa_map;
helper->z24_in_z32f = z24_in_z32f;
return helper;
}
@ -594,6 +612,8 @@ u_transfer_helper_deinterleave_transfer_map(struct pipe_context *pctx,
ptrans->stride = util_format_get_stride(format, box->width);
ptrans->layer_stride = ptrans->stride * box->height;
bool has_stencil = util_format_is_depth_and_stencil(format);
trans->staging = malloc(ptrans->layer_stride);
if (!trans->staging)
goto fail;
@ -603,8 +623,10 @@ u_transfer_helper_deinterleave_transfer_map(struct pipe_context *pctx,
if (!trans->ptr)
goto fail;
trans->ptr2 = helper->vtbl->transfer_map(pctx, prsc, level,
usage | PIPE_MAP_STENCIL_ONLY, box, &trans->trans2);
trans->ptr2 = NULL;
if (has_stencil)
trans->ptr2 = helper->vtbl->transfer_map(pctx, prsc, level,
usage | PIPE_MAP_STENCIL_ONLY, box, &trans->trans2);
if (needs_pack(usage)) {
switch (prsc->format) {
case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
@ -620,13 +642,29 @@ u_transfer_helper_deinterleave_transfer_map(struct pipe_context *pctx,
width, height);
break;
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
util_format_z24_unorm_s8_uint_pack_separate(trans->staging,
ptrans->stride,
trans->ptr,
trans->trans->stride,
trans->ptr2,
trans->trans2->stride,
width, height);
if (helper->z24_in_z32f) {
util_format_z24_unorm_s8_uint_pack_separate_z32(trans->staging,
ptrans->stride,
trans->ptr,
trans->trans->stride,
trans->ptr2,
trans->trans2->stride,
width, height);
} else {
util_format_z24_unorm_s8_uint_pack_separate(trans->staging,
ptrans->stride,
trans->ptr,
trans->trans->stride,
trans->ptr2,
trans->trans2->stride,
width, height);
}
break;
case PIPE_FORMAT_Z24X8_UNORM:
assert(helper->z24_in_z32f);
util_format_z24x8_unorm_pack_z_float(trans->staging, ptrans->stride,
trans->ptr, trans->trans->stride,
width, height);
break;
default:
unreachable("Unexpected format");

View file

@ -125,7 +125,8 @@ struct u_transfer_helper * u_transfer_helper_create(const struct u_transfer_vtbl
bool separate_z32s8,
bool separate_stencil,
bool fake_rgtc,
bool msaa_map);
bool msaa_map,
bool z24_in_z32f);
void u_transfer_helper_destroy(struct u_transfer_helper *helper);

View file

@ -1177,7 +1177,7 @@ 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, true, false, true, false);
agx_internal_shaders(&agx_screen->dev);

View file

@ -2009,7 +2009,7 @@ crocus_init_screen_resource_functions(struct pipe_screen *pscreen)
pscreen->memobj_destroy = crocus_memobj_destroy;
pscreen->transfer_helper =
u_transfer_helper_create(&transfer_vtbl, screen->devinfo.ver >= 6,
screen->devinfo.ver >= 6, false, true);
screen->devinfo.ver >= 6, false, true, false);
}
void

View file

@ -1627,7 +1627,7 @@ 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);
u_transfer_helper_create(&transfer_vtbl, true, false, fake_rgtc, true, false);
if (!screen->layout_resource_for_modifier)
screen->layout_resource_for_modifier = fd_layout_resource_for_modifier;

View file

@ -2635,7 +2635,7 @@ 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);
u_transfer_helper_create(&transfer_vtbl, true, true, false, true, false);
}
void

View file

@ -1372,7 +1372,7 @@ panfrost_resource_screen_init(struct pipe_screen *pscreen)
pscreen->resource_get_param = panfrost_resource_get_param;
pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl,
true, false,
fake_rgtc, true);
fake_rgtc, true, false);
}
void
panfrost_resource_screen_destroy(struct pipe_screen *pscreen)

View file

@ -1179,7 +1179,8 @@ v3d_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,
true, true);
true, true,
false);
}
void

View file

@ -1139,7 +1139,8 @@ vc4_resource_screen_init(struct pipe_screen *pscreen)
pscreen->resource_destroy = vc4_resource_destroy;
pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl,
false, false,
false, true);
false, true,
false);
/* 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.

View file

@ -1924,7 +1924,7 @@ zink_screen_resource_init(struct pipe_screen *pscreen)
pscreen->resource_create = zink_resource_create;
pscreen->resource_create_with_modifiers = zink_resource_create_with_modifiers;
pscreen->resource_destroy = zink_resource_destroy;
pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, true, true, false, false);
pscreen->transfer_helper = u_transfer_helper_create(&transfer_vtbl, true, true, false, false, false);
if (screen->info.have_KHR_external_memory_fd) {
pscreen->resource_get_handle = zink_resource_get_handle;