Mesa (main): panfrost: Simplify how image_layout_init is called
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Apr 26 18:19:26 UTC 2022
Module: Mesa
Branch: main
Commit: 52f8f7d6c9bf4ea943403ad5a83889f09a6fe812
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=52f8f7d6c9bf4ea943403ad5a83889f09a6fe812
Author: Alyssa Rosenzweig <alyssa at collabora.com>
Date: Tue Apr 19 17:54:57 2022 -0400
panfrost: Simplify how image_layout_init is called
Rather than using it as a catch-all initialize, use it to fill in derived from
fields from a partially initialized image_layout. This is easier to understand
and, more importantly, easier to unit test.
Signed-off-by: Alyssa Rosenzweig <alyssa at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/15991>
---
src/gallium/drivers/panfrost/pan_resource.c | 44 +++++++++++++++++----------
src/panfrost/lib/pan_layout.c | 47 +++++++++++------------------
src/panfrost/lib/pan_texture.h | 20 ++++++------
src/panfrost/vulkan/panvk_image.c | 21 ++++++++-----
4 files changed, 68 insertions(+), 64 deletions(-)
diff --git a/src/gallium/drivers/panfrost/pan_resource.c b/src/gallium/drivers/panfrost/pan_resource.c
index 928a63abb80..a6e77b6e117 100644
--- a/src/gallium/drivers/panfrost/pan_resource.c
+++ b/src/gallium/drivers/panfrost/pan_resource.c
@@ -89,12 +89,20 @@ panfrost_resource_from_handle(struct pipe_screen *pscreen,
.line_stride = whandle->stride,
};
- bool valid = pan_image_layout_init(&rsc->image.layout, mod,
- templat->format, dim,
- prsc->width0, prsc->height0,
- prsc->depth0, prsc->array_size,
- MAX2(prsc->nr_samples, 1), 1,
- crc_mode, &explicit_layout);
+ rsc->image.layout = (struct pan_image_layout) {
+ .modifier = mod,
+ .format = templat->format,
+ .dim = dim,
+ .width = prsc->width0,
+ .height = prsc->height0,
+ .depth = prsc->depth0,
+ .array_size = prsc->array_size,
+ .nr_samples = MAX2(prsc->nr_samples, 1),
+ .nr_slices = 1,
+ .crc_mode = crc_mode
+ };
+
+ bool valid = pan_image_layout_init(&rsc->image.layout, &explicit_layout);
if (!valid) {
FREE(rsc);
@@ -501,16 +509,20 @@ panfrost_resource_setup(struct panfrost_device *dev,
if (fmt == PIPE_FORMAT_Z32_FLOAT_S8X24_UINT)
fmt = PIPE_FORMAT_Z32_FLOAT;
- ASSERTED bool valid =
- pan_image_layout_init(&pres->image.layout,
- chosen_mod, fmt, dim,
- pres->base.width0,
- pres->base.height0,
- pres->base.depth0,
- pres->base.array_size,
- MAX2(pres->base.nr_samples, 1),
- pres->base.last_level + 1,
- crc_mode, NULL);
+ pres->image.layout = (struct pan_image_layout) {
+ .modifier = chosen_mod,
+ .format = fmt,
+ .dim = dim,
+ .width = pres->base.width0,
+ .height = pres->base.height0,
+ .depth = pres->base.depth0,
+ .array_size = pres->base.array_size,
+ .nr_samples = MAX2(pres->base.nr_samples, 1),
+ .nr_slices = pres->base.last_level + 1,
+ .crc_mode = crc_mode
+ };
+
+ ASSERTED bool valid = pan_image_layout_init(&pres->image.layout, NULL);
assert(valid);
}
diff --git a/src/panfrost/lib/pan_layout.c b/src/panfrost/lib/pan_layout.c
index ffc57478ff7..77842bec5e6 100644
--- a/src/panfrost/lib/pan_layout.c
+++ b/src/panfrost/lib/pan_layout.c
@@ -179,44 +179,27 @@ panfrost_texture_offset(const struct pan_image_layout *layout,
bool
pan_image_layout_init(struct pan_image_layout *layout,
- uint64_t modifier,
- enum pipe_format format,
- enum mali_texture_dimension dim,
- unsigned width, unsigned height, unsigned depth,
- unsigned array_size, unsigned nr_samples,
- unsigned nr_slices, enum pan_image_crc_mode crc_mode,
const struct pan_image_explicit_layout *explicit_layout)
{
/* Explicit stride only work with non-mipmap, non-array; single-sample
* 2D image, and in-band CRC can't be used.
*/
if (explicit_layout &&
- (depth > 1 || nr_samples > 1 || array_size > 1 ||
- dim != MALI_TEXTURE_DIMENSION_2D || nr_slices > 1 ||
- crc_mode == PAN_IMAGE_CRC_INBAND))
+ (layout->depth > 1 || layout->nr_samples > 1 ||
+ layout->array_size > 1 || layout->dim != MALI_TEXTURE_DIMENSION_2D ||
+ layout->nr_slices > 1 || layout->crc_mode == PAN_IMAGE_CRC_INBAND))
return false;
/* Mandate 64 byte alignement */
if (explicit_layout && (explicit_layout->offset & 63))
return false;
- layout->crc_mode = crc_mode;
- layout->modifier = modifier;
- layout->format = format;
- layout->dim = dim;
- layout->width = width;
- layout->height = height;
- layout->depth = depth;
- layout->array_size = array_size;
- layout->nr_samples = nr_samples;
- layout->nr_slices = nr_slices;
-
- unsigned bytes_per_pixel = util_format_get_blocksize(format);
+ unsigned bytes_per_pixel = util_format_get_blocksize(layout->format);
/* MSAA is implemented as a 3D texture with z corresponding to the
* sample #, horrifyingly enough */
- assert(depth == 1 || nr_samples == 1);
+ assert(layout->depth == 1 || layout->nr_samples == 1);
bool afbc = drm_is_afbc(layout->modifier);
bool linear = layout->modifier == DRM_FORMAT_MOD_LINEAR;
@@ -225,13 +208,17 @@ pan_image_layout_init(struct pan_image_layout *layout,
unsigned oob_crc_offset = 0;
unsigned offset = explicit_layout ? explicit_layout->offset : 0;
struct pan_block_size block_size =
- panfrost_block_size(layout->modifier, format);
+ panfrost_block_size(layout->modifier, layout->format);
+
+ unsigned width = layout->width;
+ unsigned height = layout->height;
+ unsigned depth = layout->depth;
- for (unsigned l = 0; l < nr_slices; ++l) {
+ for (unsigned l = 0; l < layout->nr_slices; ++l) {
struct pan_image_slice_layout *slice = &layout->slices[l];
- unsigned effective_width = ALIGN_POT(util_format_get_nblocksx(format, width), block_size.width);
- unsigned effective_height = ALIGN_POT(util_format_get_nblocksy(format, height), block_size.height);
+ unsigned effective_width = ALIGN_POT(util_format_get_nblocksx(layout->format, width), block_size.width);
+ unsigned effective_height = ALIGN_POT(util_format_get_nblocksy(layout->format, height), block_size.height);
/* Align levels to cache-line as a performance improvement for
* linear/tiled and as a requirement for AFBC */
@@ -289,7 +276,7 @@ pan_image_layout_init(struct pan_image_layout *layout,
}
unsigned slice_full_size =
- slice_one_size * depth * nr_samples;
+ slice_one_size * depth * layout->nr_samples;
slice->surface_stride = slice_one_size;
@@ -299,11 +286,11 @@ pan_image_layout_init(struct pan_image_layout *layout,
slice->size = slice_full_size;
/* Add a checksum region if necessary */
- if (crc_mode != PAN_IMAGE_CRC_NONE) {
+ if (layout->crc_mode != PAN_IMAGE_CRC_NONE) {
slice->crc.size =
panfrost_compute_checksum_size(slice, width, height);
- if (crc_mode == PAN_IMAGE_CRC_INBAND) {
+ if (layout->crc_mode == PAN_IMAGE_CRC_INBAND) {
slice->crc.offset = offset;
offset += slice->crc.size;
slice->size += slice->crc.size;
@@ -323,7 +310,7 @@ pan_image_layout_init(struct pan_image_layout *layout,
if (explicit_layout)
layout->data_size = offset;
else
- layout->data_size = ALIGN_POT(layout->array_stride * array_size, 4096);
+ layout->data_size = ALIGN_POT(layout->array_stride * layout->array_size, 4096);
layout->crc_size = oob_crc_offset;
return true;
diff --git a/src/panfrost/lib/pan_texture.h b/src/panfrost/lib/pan_texture.h
index 8b18e2d40d6..a2febecce3d 100644
--- a/src/panfrost/lib/pan_texture.h
+++ b/src/panfrost/lib/pan_texture.h
@@ -96,15 +96,20 @@ struct pan_image_layout {
unsigned nr_samples;
enum mali_texture_dimension dim;
unsigned nr_slices;
- struct pan_image_slice_layout slices[MAX_MIP_LEVELS];
unsigned array_size;
- unsigned array_stride;
- unsigned data_size;
-
enum pan_image_crc_mode crc_mode;
+
+ /* The remaining fields may be derived from the above by calling
+ * pan_image_layout_init
+ */
+
+ struct pan_image_slice_layout slices[MAX_MIP_LEVELS];
+
/* crc_size != 0 only if crc_mode == OOB otherwise CRC words are
* counted in data_size */
unsigned crc_size;
+ unsigned data_size;
+ unsigned array_stride;
};
struct pan_image_mem {
@@ -222,13 +227,6 @@ struct pan_image_explicit_layout {
bool
pan_image_layout_init(struct pan_image_layout *layout,
- uint64_t modifier,
- enum pipe_format format,
- enum mali_texture_dimension dim,
- unsigned width, unsigned height, unsigned depth,
- unsigned array_size, unsigned nr_samples,
- unsigned nr_slices,
- enum pan_image_crc_mode crc_mode,
const struct pan_image_explicit_layout *explicit_layout);
struct pan_surface {
diff --git a/src/panfrost/vulkan/panvk_image.c b/src/panfrost/vulkan/panvk_image.c
index f7791f9d3d6..c0ef0d43427 100644
--- a/src/panfrost/vulkan/panvk_image.c
+++ b/src/panfrost/vulkan/panvk_image.c
@@ -75,13 +75,20 @@ panvk_image_create(VkDevice _device,
if (!image)
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
- pan_image_layout_init(&image->pimage.layout, modifier,
- vk_format_to_pipe_format(image->vk.format),
- panvk_image_type_to_mali_tex_dim(image->vk.image_type),
- image->vk.extent.width, image->vk.extent.height,
- image->vk.extent.depth, image->vk.array_layers,
- image->vk.samples, image->vk.mip_levels,
- PAN_IMAGE_CRC_NONE, NULL);
+ image->pimage.layout = (struct pan_image_layout) {
+ .modifier = modifier,
+ .format = vk_format_to_pipe_format(image->vk.format),
+ .dim = panvk_image_type_to_mali_tex_dim(image->vk.image_type),
+ .width = image->vk.extent.width,
+ .height = image->vk.extent.height,
+ .depth = image->vk.extent.depth,
+ .array_size = image->vk.array_layers,
+ .nr_samples = image->vk.samples,
+ .nr_slices = image->vk.mip_levels,
+ .crc_mode = PAN_IMAGE_CRC_NONE
+ };
+
+ pan_image_layout_init(&image->pimage.layout, NULL);
*pImage = panvk_image_to_handle(image);
return VK_SUCCESS;
More information about the mesa-commit
mailing list