mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 01:50:10 +01:00
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:
parent
90a6947632
commit
24a6693ece
10 changed files with 63 additions and 22 deletions
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue