panfrost: prepare pan_image_view for multiplanar formats

Signed-off-by: Italo Nicola <italonicola@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21109>
This commit is contained in:
Italo Nicola 2023-07-20 23:11:14 +00:00 committed by Marge Bot
parent 3fff7f3d0e
commit 9692815293
17 changed files with 203 additions and 104 deletions

View file

@ -1671,12 +1671,13 @@ panfrost_create_sampler_view_bo(struct panfrost_sampler_view *so,
so->base.swizzle_b,
so->base.swizzle_a,
},
.image = &prsrc->image,
.planes = {NULL},
.buf.offset = buf_offset,
.buf.size = buf_size,
};
panfrost_set_image_view_planes(&iview, texture);
unsigned size = (PAN_ARCH <= 5 ? pan_size(TEXTURE) : 0) +
GENX(panfrost_estimate_texture_payload_size)(&iview);

View file

@ -489,7 +489,7 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch,
rts[i].last_level = rts[i].first_level = surf->u.tex.level;
rts[i].first_layer = surf->u.tex.first_layer;
rts[i].last_layer = surf->u.tex.last_layer;
rts[i].image = &prsrc->image;
panfrost_set_image_view_planes(&rts[i], surf->texture);
rts[i].nr_samples =
surf->nr_samples ?: MAX2(surf->texture->nr_samples, 1);
memcpy(rts[i].swizzle, id_swz, sizeof(rts[i].swizzle));
@ -518,7 +518,7 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch,
zs->last_level = zs->first_level = surf->u.tex.level;
zs->first_layer = surf->u.tex.first_layer;
zs->last_layer = surf->u.tex.last_layer;
zs->image = &z_rsrc->image;
zs->planes[0] = &z_rsrc->image;
zs->nr_samples = surf->nr_samples ?: MAX2(surf->texture->nr_samples, 1);
memcpy(zs->swizzle, id_swz, sizeof(zs->swizzle));
fb->zs.view.zs = zs;
@ -535,7 +535,7 @@ panfrost_batch_to_fb_info(const struct panfrost_batch *batch,
s->last_level = s->first_level = surf->u.tex.level;
s->first_layer = surf->u.tex.first_layer;
s->last_layer = surf->u.tex.last_layer;
s->image = &s_rsrc->image;
s->planes[0] = &s_rsrc->image;
s->nr_samples = surf->nr_samples ?: MAX2(surf->texture->nr_samples, 1);
memcpy(s->swizzle, id_swz, sizeof(s->swizzle));
fb->zs.view.s = s;

View file

@ -1393,6 +1393,18 @@ panfrost_resource_get_internal_format(struct pipe_resource *rsrc)
return prsrc->image.layout.format;
}
void
panfrost_set_image_view_planes(struct pan_image_view *iview,
struct pipe_resource *texture)
{
struct panfrost_resource *prsrc_plane = (struct panfrost_resource *)texture;
for (int i = 0; i < MAX_IMAGE_PLANES && prsrc_plane; i++) {
iview->planes[i] = &prsrc_plane->image;
prsrc_plane = (struct panfrost_resource *)prsrc_plane->base.next;
}
}
static bool
panfrost_generate_mipmap(struct pipe_context *pctx, struct pipe_resource *prsrc,
enum pipe_format format, unsigned base_level,

View file

@ -143,6 +143,9 @@ void panfrost_resource_set_damage_region(struct pipe_screen *screen,
unsigned int nrects,
const struct pipe_box *rects);
void panfrost_set_image_view_planes(struct pan_image_view *iview,
struct pipe_resource *texture);
static inline enum mali_texture_dimension
panfrost_translate_texture_dimension(enum pipe_texture_target t)
{

View file

@ -48,4 +48,6 @@ typedef uint64_t mali_ptr;
*/
#define MAX_MIP_LEVELS (14)
#define MAX_IMAGE_PLANES (3)
#endif /* __PANFROST_JOB_H__ */

View file

@ -183,15 +183,15 @@ pan_blitter_is_ms(struct pan_blitter_views *views)
{
for (unsigned i = 0; i < views->rt_count; i++) {
if (views->dst_rts[i]) {
if (views->dst_rts[i]->image->layout.nr_samples > 1)
if (pan_image_view_get_nr_samples(views->dst_rts[i]) > 1)
return true;
}
}
if (views->dst_z && views->dst_z->image->layout.nr_samples > 1)
if (views->dst_z && pan_image_view_get_nr_samples(views->dst_z) > 1)
return true;
if (views->dst_s && views->dst_s->image->layout.nr_samples > 1)
if (views->dst_s && pan_image_view_get_nr_samples(views->dst_s) > 1)
return true;
return false;
@ -329,7 +329,7 @@ pan_blitter_get_blend_shaders(struct panfrost_device *dev, unsigned rt_count,
struct pan_blit_blend_shader_key key = {
.format = rts[i]->format,
.rt = i,
.nr_samples = rts[i]->image->layout.nr_samples,
.nr_samples = pan_image_view_get_nr_samples(rts[i]),
.type = blit_shader->blend_types[i],
};
@ -349,7 +349,7 @@ pan_blitter_get_blend_shaders(struct panfrost_device *dev, unsigned rt_count,
blend_state.rts[i] = (struct pan_blend_rt_state){
.format = rts[i]->format,
.nr_samples = rts[i]->image->layout.nr_samples,
.nr_samples = pan_image_view_get_nr_samples(rts[i]),
.equation =
{
.blend_enable = false,
@ -667,8 +667,8 @@ pan_blitter_get_key(struct pan_blitter_views *views)
assert(views->dst_z);
key.surfaces[0].loc = FRAG_RESULT_DEPTH;
key.surfaces[0].type = nir_type_float32;
key.surfaces[0].src_samples = views->src_z->image->layout.nr_samples;
key.surfaces[0].dst_samples = views->dst_z->image->layout.nr_samples;
key.surfaces[0].src_samples = pan_image_view_get_nr_samples(views->src_z);
key.surfaces[0].dst_samples = pan_image_view_get_nr_samples(views->dst_z);
key.surfaces[0].dim = views->src_z->dim;
key.surfaces[0].array =
views->src_z->first_layer != views->src_z->last_layer;
@ -678,8 +678,8 @@ pan_blitter_get_key(struct pan_blitter_views *views)
assert(views->dst_s);
key.surfaces[1].loc = FRAG_RESULT_STENCIL;
key.surfaces[1].type = nir_type_uint32;
key.surfaces[1].src_samples = views->src_s->image->layout.nr_samples;
key.surfaces[1].dst_samples = views->dst_s->image->layout.nr_samples;
key.surfaces[1].src_samples = pan_image_view_get_nr_samples(views->src_s);
key.surfaces[1].dst_samples = pan_image_view_get_nr_samples(views->dst_s);
key.surfaces[1].dim = views->src_s->dim;
key.surfaces[1].array =
views->src_s->first_layer != views->src_s->last_layer;
@ -696,8 +696,10 @@ pan_blitter_get_key(struct pan_blitter_views *views)
: util_format_is_pure_sint(views->src_rts[i]->format)
? nir_type_int32
: nir_type_float32;
key.surfaces[i].src_samples = views->src_rts[i]->image->layout.nr_samples;
key.surfaces[i].dst_samples = views->dst_rts[i]->image->layout.nr_samples;
key.surfaces[i].src_samples =
pan_image_view_get_nr_samples(views->src_rts[i]);
key.surfaces[i].dst_samples =
pan_image_view_get_nr_samples(views->dst_rts[i]);
key.surfaces[i].dim = views->src_rts[i]->dim;
key.surfaces[i].array =
views->src_rts[i]->first_layer != views->src_rts[i]->last_layer;
@ -1295,8 +1297,8 @@ pan_preload_emit_pre_frame_dcd(struct pan_pool *desc_pool,
pan_preload_emit_dcd(desc_pool, fb, zs, coords, tsd, dcd, always_write);
if (zs) {
enum pipe_format fmt = fb->zs.view.zs
? fb->zs.view.zs->image->layout.format
: fb->zs.view.s->image->layout.format;
? fb->zs.view.zs->planes[0]->layout.format
: fb->zs.view.s->planes[0]->layout.format;
bool always = false;
/* If we're dealing with a combined ZS resource and only one
@ -1422,7 +1424,12 @@ GENX(pan_blit_ctx_init)(struct panfrost_device *dev,
struct pan_image_view sviews[2] = {
{
.format = info->src.planes[0].format,
.image = info->src.planes[0].image,
.planes =
{
info->src.planes[0].image,
info->src.planes[1].image,
info->src.planes[2].image,
},
.dim =
info->src.planes[0].image->layout.dim == MALI_TEXTURE_DIMENSION_CUBE
? MALI_TEXTURE_DIMENSION_2D
@ -1443,7 +1450,12 @@ GENX(pan_blit_ctx_init)(struct panfrost_device *dev,
struct pan_image_view dview = {
.format = info->dst.planes[0].format,
.image = info->dst.planes[0].image,
.planes =
{
info->dst.planes[0].image,
info->dst.planes[1].image,
info->dst.planes[2].image,
},
.dim = info->dst.planes[0].image->layout.dim == MALI_TEXTURE_DIMENSION_1D
? MALI_TEXTURE_DIMENSION_1D
: MALI_TEXTURE_DIMENSION_2D,
@ -1508,7 +1520,7 @@ GENX(pan_blit_ctx_init)(struct panfrost_device *dev,
} else if (info->src.planes[1].format) {
sviews[1] = sviews[0];
sviews[1].format = info->src.planes[1].format;
sviews[1].image = info->src.planes[1].image;
sviews[1].planes[0] = info->src.planes[1].image;
}
ctx->rsd = pan_blit_get_rsd(dev, sviews, &dview);

View file

@ -44,7 +44,7 @@ struct pan_blit_info {
struct {
const struct pan_image *image;
enum pipe_format format;
} planes[2];
} planes[MAX_IMAGE_PLANES];
unsigned level;
struct {
int32_t x, y, z;

View file

@ -58,18 +58,20 @@ mod_to_block_fmt(uint64_t mod)
static enum mali_msaa
mali_sampling_mode(const struct pan_image_view *view)
{
if (view->image->layout.nr_samples > 1) {
assert(view->nr_samples == view->image->layout.nr_samples);
assert(view->image->layout.slices[0].surface_stride != 0);
unsigned nr_samples = pan_image_view_get_nr_samples(view);
if (nr_samples > 1) {
assert(view->nr_samples == nr_samples);
assert(view->planes[0]->layout.slices[0].surface_stride != 0);
return MALI_MSAA_LAYERED;
}
if (view->nr_samples > view->image->layout.nr_samples) {
assert(view->image->layout.nr_samples == 1);
if (view->nr_samples > nr_samples) {
assert(nr_samples == 1);
return MALI_MSAA_AVERAGE;
}
assert(view->nr_samples == view->image->layout.nr_samples);
assert(view->nr_samples == nr_samples);
assert(view->nr_samples == 1);
return MALI_MSAA_SINGLE;
@ -113,7 +115,7 @@ GENX(pan_select_crc_rt)(const struct pan_fb_info *fb, unsigned tile_size)
#if PAN_ARCH <= 6
if (fb->rt_count == 1 && fb->rts[0].view && !fb->rts[0].discard &&
fb->rts[0].view->image->layout.crc)
pan_image_view_has_crc(fb->rts[0].view))
return 0;
return -1;
@ -123,7 +125,7 @@ GENX(pan_select_crc_rt)(const struct pan_fb_info *fb, unsigned tile_size)
for (unsigned i = 0; i < fb->rt_count; i++) {
if (!fb->rts[i].view || fb->rts[0].discard ||
!fb->rts[i].view->image->layout.crc)
!pan_image_view_has_crc(fb->rts[i].view))
continue;
bool valid = *(fb->rts[i].crc_valid);
@ -199,6 +201,7 @@ pan_prepare_s(const struct pan_fb_info *fb, struct MALI_ZS_CRC_EXTENSION *ext)
if (!s)
return;
const struct pan_image *image = pan_image_view_get_zs_image(s);
unsigned level = s->first_level;
ext->s_msaa = mali_sampling_mode(s);
@ -206,16 +209,16 @@ pan_prepare_s(const struct pan_fb_info *fb, struct MALI_ZS_CRC_EXTENSION *ext)
struct pan_surface surf;
pan_iview_get_surface(s, 0, 0, 0, &surf);
assert(s->image->layout.modifier ==
assert(image->layout.modifier ==
DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ||
s->image->layout.modifier == DRM_FORMAT_MOD_LINEAR);
image->layout.modifier == DRM_FORMAT_MOD_LINEAR);
ext->s_writeback_base = surf.data;
ext->s_writeback_row_stride = s->image->layout.slices[level].row_stride;
ext->s_writeback_row_stride = image->layout.slices[level].row_stride;
ext->s_writeback_surface_stride =
(s->image->layout.nr_samples > 1)
? s->image->layout.slices[level].surface_stride
(pan_image_view_get_nr_samples(s) > 1)
? image->layout.slices[level].surface_stride
: 0;
ext->s_block_format = mod_to_block_fmt(s->image->layout.modifier);
ext->s_block_format = mod_to_block_fmt(image->layout.modifier);
ext->s_write_format = translate_s_format(s->format);
}
@ -227,6 +230,7 @@ pan_prepare_zs(const struct pan_fb_info *fb, struct MALI_ZS_CRC_EXTENSION *ext)
if (!zs)
return;
const struct pan_image *image = pan_image_view_get_zs_image(zs);
unsigned level = zs->first_level;
ext->zs_msaa = mali_sampling_mode(zs);
@ -234,9 +238,9 @@ pan_prepare_zs(const struct pan_fb_info *fb, struct MALI_ZS_CRC_EXTENSION *ext)
struct pan_surface surf;
pan_iview_get_surface(zs, 0, 0, 0, &surf);
UNUSED const struct pan_image_slice_layout *slice =
&zs->image->layout.slices[level];
&image->layout.slices[level];
if (drm_is_afbc(zs->image->layout.modifier)) {
if (drm_is_afbc(image->layout.modifier)) {
#if PAN_ARCH >= 9
ext->zs_writeback_base = surf.afbc.header;
ext->zs_writeback_row_stride = slice->row_stride;
@ -247,7 +251,7 @@ pan_prepare_zs(const struct pan_fb_info *fb, struct MALI_ZS_CRC_EXTENSION *ext)
#else
#if PAN_ARCH >= 6
ext->zs_afbc_row_stride =
pan_afbc_stride_blocks(zs->image->layout.modifier, slice->row_stride);
pan_afbc_stride_blocks(image->layout.modifier, slice->row_stride);
#else
ext->zs_block_format = MALI_BLOCK_FORMAT_AFBC;
ext->zs_afbc_body_size = 0x1000;
@ -259,21 +263,21 @@ pan_prepare_zs(const struct pan_fb_info *fb, struct MALI_ZS_CRC_EXTENSION *ext)
ext->zs_afbc_body = surf.afbc.body;
#endif
} else {
assert(zs->image->layout.modifier ==
assert(image->layout.modifier ==
DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ||
zs->image->layout.modifier == DRM_FORMAT_MOD_LINEAR);
image->layout.modifier == DRM_FORMAT_MOD_LINEAR);
/* TODO: Z32F(S8) support, which is always linear */
ext->zs_writeback_base = surf.data;
ext->zs_writeback_row_stride = zs->image->layout.slices[level].row_stride;
ext->zs_writeback_row_stride = image->layout.slices[level].row_stride;
ext->zs_writeback_surface_stride =
(zs->image->layout.nr_samples > 1)
? zs->image->layout.slices[level].surface_stride
(pan_image_view_get_nr_samples(zs) > 1)
? image->layout.slices[level].surface_stride
: 0;
}
ext->zs_block_format = mod_to_block_fmt(zs->image->layout.modifier);
ext->zs_block_format = mod_to_block_fmt(image->layout.modifier);
ext->zs_write_format = translate_zs_format(zs->format);
if (ext->zs_write_format == MALI_ZS_FORMAT_D24S8)
ext->s_writeback_base = ext->zs_writeback_base;
@ -289,10 +293,12 @@ pan_prepare_crc(const struct pan_fb_info *fb, int rt_crc,
assert(rt_crc < fb->rt_count);
const struct pan_image_view *rt = fb->rts[rt_crc].view;
const struct pan_image *image = pan_image_view_get_rt_image(rt);
const struct pan_image_slice_layout *slice =
&rt->image->layout.slices[rt->first_level];
&image->layout.slices[rt->first_level];
ext->crc_base =
rt->image->data.bo->ptr.gpu + rt->image->data.offset + slice->crc.offset;
image->data.bo->ptr.gpu + image->data.offset + slice->crc.offset;
ext->crc_row_stride = slice->crc.stride;
#if PAN_ARCH >= 7
@ -498,6 +504,8 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned idx, unsigned cbuf_offset,
return;
}
const struct pan_image *image = pan_image_view_get_rt_image(rt);
cfg->write_enable = true;
cfg->dithering_enable = true;
@ -505,29 +513,29 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned idx, unsigned cbuf_offset,
assert(rt->last_level == rt->first_level);
assert(rt->last_layer == rt->first_layer);
int row_stride = rt->image->layout.slices[level].row_stride;
int row_stride = image->layout.slices[level].row_stride;
/* Only set layer_stride for layered MSAA rendering */
unsigned layer_stride = (rt->image->layout.nr_samples > 1)
? rt->image->layout.slices[level].surface_stride
unsigned layer_stride = (pan_image_view_get_nr_samples(rt) > 1)
? image->layout.slices[level].surface_stride
: 0;
cfg->writeback_msaa = mali_sampling_mode(rt);
pan_rt_init_format(rt, cfg);
cfg->writeback_block_format = mod_to_block_fmt(rt->image->layout.modifier);
cfg->writeback_block_format = mod_to_block_fmt(image->layout.modifier);
struct pan_surface surf;
pan_iview_get_surface(rt, 0, 0, 0, &surf);
if (drm_is_afbc(rt->image->layout.modifier)) {
if (drm_is_afbc(image->layout.modifier)) {
#if PAN_ARCH >= 9
if (rt->image->layout.modifier & AFBC_FORMAT_MOD_YTR)
if (image->layout.modifier & AFBC_FORMAT_MOD_YTR)
cfg->afbc.yuv_transform = true;
cfg->afbc.wide_block = panfrost_afbc_is_wide(rt->image->layout.modifier);
cfg->afbc.wide_block = panfrost_afbc_is_wide(image->layout.modifier);
cfg->afbc.header = surf.afbc.header;
cfg->afbc.body_offset = surf.afbc.body - surf.afbc.header;
assert(surf.afbc.body >= surf.afbc.header);
@ -535,14 +543,13 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned idx, unsigned cbuf_offset,
cfg->afbc.compression_mode = pan_afbc_compression_mode(rt->format);
cfg->afbc.row_stride = row_stride;
#else
const struct pan_image_slice_layout *slice =
&rt->image->layout.slices[level];
const struct pan_image_slice_layout *slice = &image->layout.slices[level];
#if PAN_ARCH >= 6
cfg->afbc.row_stride =
pan_afbc_stride_blocks(rt->image->layout.modifier, slice->row_stride);
pan_afbc_stride_blocks(image->layout.modifier, slice->row_stride);
cfg->afbc.afbc_wide_block_enable =
panfrost_afbc_is_wide(rt->image->layout.modifier);
panfrost_afbc_is_wide(image->layout.modifier);
#else
cfg->afbc.chunk_size = 9;
cfg->afbc.sparse = true;
@ -552,12 +559,12 @@ pan_prepare_rt(const struct pan_fb_info *fb, unsigned idx, unsigned cbuf_offset,
cfg->afbc.header = surf.afbc.header;
cfg->afbc.body = surf.afbc.body;
if (rt->image->layout.modifier & AFBC_FORMAT_MOD_YTR)
if (image->layout.modifier & AFBC_FORMAT_MOD_YTR)
cfg->afbc.yuv_transform_enable = true;
#endif
} else {
assert(rt->image->layout.modifier == DRM_FORMAT_MOD_LINEAR ||
rt->image->layout.modifier ==
assert(image->layout.modifier == DRM_FORMAT_MOD_LINEAR ||
image->layout.modifier ==
DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED);
cfg->rgb.base = surf.data;
cfg->rgb.row_stride = row_stride;
@ -676,11 +683,11 @@ pan_fix_frame_shader_mode(enum mali_pre_post_frame_shader_mode mode,
static bool
pan_force_clean_write_rt(const struct pan_image_view *rt, unsigned tile_size)
{
if (!drm_is_afbc(rt->image->layout.modifier))
const struct pan_image *image = pan_image_view_get_rt_image(rt);
if (!drm_is_afbc(image->layout.modifier))
return false;
unsigned superblock =
panfrost_afbc_superblock_width(rt->image->layout.modifier);
unsigned superblock = panfrost_afbc_superblock_width(image->layout.modifier);
assert(superblock >= 16);
assert(tile_size <= 16 * 16);
@ -827,7 +834,7 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev,
continue;
cbuf_offset += pan_bytes_per_pixel_tib(fb->rts[i].view->format) *
tile_size * fb->rts[i].view->image->layout.nr_samples;
tile_size * pan_image_view_get_nr_samples(fb->rts[i].view);
if (i != crc_rt)
*(fb->rts[i].crc_valid) = false;
@ -870,6 +877,7 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev,
if (fb->rt_count && fb->rts[0].view) {
const struct pan_image_view *rt = fb->rts[0].view;
const struct pan_image *image = pan_image_view_get_rt_image(rt);
const struct util_format_description *desc =
util_format_description(rt->format);
@ -896,25 +904,26 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev,
cfg.color_write_enable = !fb->rts[0].discard;
cfg.color_writeback.base = surf.data;
cfg.color_writeback.row_stride =
rt->image->layout.slices[level].row_stride;
image->layout.slices[level].row_stride;
cfg.color_block_format = mod_to_block_fmt(rt->image->layout.modifier);
cfg.color_block_format = mod_to_block_fmt(image->layout.modifier);
assert(cfg.color_block_format == MALI_BLOCK_FORMAT_LINEAR ||
cfg.color_block_format ==
MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED);
if (rt->image->layout.crc) {
if (pan_image_view_has_crc(rt)) {
const struct pan_image_slice_layout *slice =
&rt->image->layout.slices[level];
&image->layout.slices[level];
cfg.crc_buffer.row_stride = slice->crc.stride;
cfg.crc_buffer.base = rt->image->data.bo->ptr.gpu +
rt->image->data.offset + slice->crc.offset;
cfg.crc_buffer.base =
image->data.bo->ptr.gpu + image->data.offset + slice->crc.offset;
}
}
if (fb->zs.view.zs) {
const struct pan_image_view *zs = fb->zs.view.zs;
const struct pan_image *image = pan_image_view_get_zs_image(zs);
unsigned level = zs->first_level;
struct pan_surface surf;
@ -922,9 +931,8 @@ GENX(pan_emit_fbd)(const struct panfrost_device *dev,
cfg.zs_write_enable = !fb->zs.discard.z;
cfg.zs_writeback.base = surf.data;
cfg.zs_writeback.row_stride =
zs->image->layout.slices[level].row_stride;
cfg.zs_block_format = mod_to_block_fmt(zs->image->layout.modifier);
cfg.zs_writeback.row_stride = image->layout.slices[level].row_stride;
cfg.zs_block_format = mod_to_block_fmt(image->layout.modifier);
assert(cfg.zs_block_format == MALI_BLOCK_FORMAT_LINEAR ||
cfg.zs_block_format == MALI_BLOCK_FORMAT_TILED_U_INTERLEAVED);

View file

@ -406,37 +406,38 @@ void
pan_iview_get_surface(const struct pan_image_view *iview, unsigned level,
unsigned layer, unsigned sample, struct pan_surface *surf)
{
const struct pan_image *image = pan_image_view_get_plane(iview, 0);
level += iview->first_level;
assert(level < iview->image->layout.nr_slices);
assert(level < image->layout.nr_slices);
layer += iview->first_layer;
bool is_3d = iview->image->layout.dim == MALI_TEXTURE_DIMENSION_3D;
const struct pan_image_slice_layout *slice =
&iview->image->layout.slices[level];
mali_ptr base = iview->image->data.bo->ptr.gpu + iview->image->data.offset;
bool is_3d = image->layout.dim == MALI_TEXTURE_DIMENSION_3D;
const struct pan_image_slice_layout *slice = &image->layout.slices[level];
mali_ptr base = image->data.bo->ptr.gpu + image->data.offset;
if (drm_is_afbc(iview->image->layout.modifier)) {
if (drm_is_afbc(image->layout.modifier)) {
assert(!sample);
if (is_3d) {
ASSERTED unsigned depth = u_minify(iview->image->layout.depth, level);
ASSERTED unsigned depth = u_minify(image->layout.depth, level);
assert(layer < depth);
surf->afbc.header =
base + slice->offset + (layer * slice->afbc.surface_stride);
surf->afbc.body = base + slice->offset + slice->afbc.header_size +
(slice->surface_stride * layer);
} else {
assert(layer < iview->image->layout.array_size);
surf->afbc.header = base + panfrost_texture_offset(
&iview->image->layout, level, layer, 0);
assert(layer < image->layout.array_size);
surf->afbc.header =
base + panfrost_texture_offset(&image->layout, level, layer, 0);
surf->afbc.body = surf->afbc.header + slice->afbc.header_size;
}
} else {
unsigned array_idx = is_3d ? 0 : layer;
unsigned surface_idx = is_3d ? layer : sample;
surf->data = base + panfrost_texture_offset(&iview->image->layout, level,
surf->data = base + panfrost_texture_offset(&image->layout, level,
array_idx, surface_idx);
}
}

View file

@ -183,7 +183,7 @@ GENX(panfrost_estimate_texture_payload_size)(const struct pan_image_view *iview)
unsigned elements = panfrost_texture_num_elements(
iview->first_level, iview->last_level, iview->first_layer,
iview->last_layer, iview->image->layout.nr_samples,
iview->last_layer, pan_image_view_get_nr_samples(iview),
iview->dim == MALI_TEXTURE_DIMENSION_CUBE);
return element_size * elements;
@ -458,11 +458,11 @@ static void
panfrost_emit_texture_payload(const struct pan_image_view *iview,
enum pipe_format format, void *payload)
{
const struct pan_image_layout *layout = &iview->image->layout;
const struct pan_image *base_image = pan_image_view_get_plane(iview, 0);
const struct pan_image_layout *layout = &base_image->layout;
ASSERTED const struct util_format_description *desc =
util_format_description(format);
mali_ptr base = iview->image->data.bo->ptr.gpu + iview->image->data.offset;
mali_ptr base = base_image->data.bo->ptr.gpu + base_image->data.offset;
if (iview->buf.size) {
assert(iview->dim == MALI_TEXTURE_DIMENSION_1D);
@ -548,7 +548,8 @@ GENX(panfrost_new_texture)(const struct panfrost_device *dev,
const struct pan_image_view *iview, void *out,
const struct panfrost_ptr *payload)
{
const struct pan_image_layout *layout = &iview->image->layout;
const struct pan_image *base_image = pan_image_view_get_plane(iview, 0);
const struct pan_image_layout *layout = &base_image->layout;
enum pipe_format format = iview->format;
uint32_t mali_format = dev->formats[format].hw;
unsigned char swizzle[4];

View file

@ -128,7 +128,9 @@ struct pan_image_view {
unsigned first_level, last_level;
unsigned first_layer, last_layer;
unsigned char swizzle[4];
const struct pan_image *image;
/* planes 1 and 2 are NULL for single plane formats */
const struct pan_image *planes[MAX_IMAGE_PLANES];
/* If EXT_multisampled_render_to_texture is used, this may be
* greater than image->layout.nr_samples. */
@ -141,6 +143,57 @@ struct pan_image_view {
} buf;
};
static inline const struct pan_image *
pan_image_view_get_plane(const struct pan_image_view *iview, uint32_t idx)
{
if (idx >= ARRAY_SIZE(iview->planes))
return NULL;
return iview->planes[idx];
}
static inline uint32_t
pan_image_view_get_nr_samples(const struct pan_image_view *iview)
{
/* All planes should have the same nr_samples value, so we
* just pick the first plane. */
const struct pan_image *image = pan_image_view_get_plane(iview, 0);
if (!image)
return 0;
return image->layout.nr_samples;
}
static inline const struct pan_image *
pan_image_view_get_rt_image(const struct pan_image_view *iview)
{
/* We only support rendering to plane 0 */
assert(pan_image_view_get_plane(iview, 1) == NULL);
return pan_image_view_get_plane(iview, 0);
}
static inline bool
pan_image_view_has_crc(const struct pan_image_view *iview)
{
const struct pan_image *image = pan_image_view_get_rt_image(iview);
if (!image)
return false;
return image->layout.crc;
}
static inline const struct pan_image *
pan_image_view_get_zs_image(const struct pan_image_view *iview)
{
/* We split depth/stencil combined formats, and end up with only
* singleplanar depth and stencil formats. */
assert(util_format_is_depth_or_stencil(iview->format));
assert(pan_image_view_get_plane(iview, 1) == NULL);
return pan_image_view_get_plane(iview, 0);
}
unsigned panfrost_compute_checksum_size(struct pan_image_slice_layout *slice,
unsigned width, unsigned height);

View file

@ -444,7 +444,7 @@ panvk_cmd_fb_info_set_subpass(struct panvk_cmd_buffer *cmdbuf)
memcpy(fbinfo->rts[cb].clear_value, clears[idx].color,
sizeof(fbinfo->rts[cb].clear_value));
fbinfo->nr_samples =
MAX2(fbinfo->nr_samples, view->pview.image->layout.nr_samples);
MAX2(fbinfo->nr_samples, pan_image_view_get_nr_samples(&view->pview));
}
if (subpass->zs_attachment.idx != VK_ATTACHMENT_UNUSED) {
@ -453,7 +453,7 @@ panvk_cmd_fb_info_set_subpass(struct panvk_cmd_buffer *cmdbuf)
util_format_description(view->pview.format);
fbinfo->nr_samples =
MAX2(fbinfo->nr_samples, view->pview.image->layout.nr_samples);
MAX2(fbinfo->nr_samples, pan_image_view_get_nr_samples(&view->pview));
if (util_format_has_depth(fdesc)) {
fbinfo->zs.clear.z = subpass->zs_attachment.clear;

View file

@ -243,8 +243,9 @@ panvk_per_arch(queue_submit)(struct vk_queue *vk_queue,
if (batch->fb.info) {
for (unsigned i = 0; i < batch->fb.info->attachment_count; i++) {
bos[bo_idx++] = batch->fb.info->attachments[i]
.iview->pview.image->data.bo->gem_handle;
const struct pan_image *image = pan_image_view_get_plane(
&batch->fb.info->attachments[i].iview->pview, 0);
bos[bo_idx++] = image->data.bo->gem_handle;
}
}

View file

@ -102,7 +102,7 @@ panvk_per_arch(CreateImageView)(VkDevice _device,
return vk_error(device, VK_ERROR_OUT_OF_HOST_MEMORY);
view->pview = (struct pan_image_view){
.image = &image->pimage,
.planes[0] = &image->pimage,
.format = vk_format_to_pipe_format(view->vk.view_format),
.dim = panvk_view_type_to_mali_tex_dim(view->vk.view_type),
.nr_samples = image->pimage.layout.nr_samples,

View file

@ -38,7 +38,12 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf,
{
.format = blitinfo->dst.planes[0].format,
.dim = MALI_TEXTURE_DIMENSION_2D,
.image = blitinfo->dst.planes[0].image,
.planes =
{
blitinfo->dst.planes[0].image,
blitinfo->dst.planes[1].image,
blitinfo->dst.planes[2].image,
},
.nr_samples = blitinfo->dst.planes[0].image->layout.nr_samples,
.first_level = blitinfo->dst.level,
.last_level = blitinfo->dst.level,
@ -93,7 +98,7 @@ panvk_meta_blit(struct panvk_cmd_buffer *cmdbuf,
/* TODO: don't force preloads of dst resources if unneeded */
views[1].format = blitinfo->dst.planes[1].format;
views[1].dim = MALI_TEXTURE_DIMENSION_2D;
views[1].image = blitinfo->dst.planes[1].image;
views[1].planes[0] = blitinfo->dst.planes[1].image;
views[1].nr_samples = blitinfo->dst.planes[1].image->layout.nr_samples;
views[1].first_level = blitinfo->dst.level;
views[1].last_level = blitinfo->dst.level;

View file

@ -325,7 +325,7 @@ panvk_meta_clear_color_img(struct panvk_cmd_buffer *cmdbuf,
struct pan_image_view view = {
.format = img->pimage.layout.format,
.dim = MALI_TEXTURE_DIMENSION_2D,
.image = &img->pimage,
.planes[0] = &img->pimage,
.nr_samples = img->pimage.layout.nr_samples,
.swizzle = {PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z,
PIPE_SWIZZLE_W},
@ -393,7 +393,7 @@ panvk_meta_clear_zs_img(struct panvk_cmd_buffer *cmdbuf,
struct pan_image_view view = {
.format = img->pimage.layout.format,
.dim = MALI_TEXTURE_DIMENSION_2D,
.image = &img->pimage,
.planes[0] = &img->pimage,
.nr_samples = img->pimage.layout.nr_samples,
.swizzle = {PIPE_SWIZZLE_X, PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z,
PIPE_SWIZZLE_W},

View file

@ -581,7 +581,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf,
.dim = src->pimage.layout.dim == MALI_TEXTURE_DIMENSION_CUBE
? MALI_TEXTURE_DIMENSION_2D
: src->pimage.layout.dim,
.image = &src->pimage,
.planes[0] = &src->pimage,
.nr_samples = src->pimage.layout.nr_samples,
.first_level = region->srcSubresource.mipLevel,
.last_level = region->srcSubresource.mipLevel,
@ -595,7 +595,7 @@ panvk_meta_copy_img2img(struct panvk_cmd_buffer *cmdbuf,
struct pan_image_view dstview = {
.format = key.dstfmt,
.dim = MALI_TEXTURE_DIMENSION_2D,
.image = &dst->pimage,
.planes[0] = &dst->pimage,
.nr_samples = dst->pimage.layout.nr_samples,
.first_level = region->dstSubresource.mipLevel,
.last_level = region->dstSubresource.mipLevel,
@ -1046,7 +1046,7 @@ panvk_meta_copy_buf2img(struct panvk_cmd_buffer *cmdbuf,
struct pan_image_view view = {
.format = key.imgfmt,
.dim = MALI_TEXTURE_DIMENSION_2D,
.image = &img->pimage,
.planes[0] = &img->pimage,
.nr_samples = img->pimage.layout.nr_samples,
.first_level = region->imageSubresource.mipLevel,
.last_level = region->imageSubresource.mipLevel,
@ -1504,7 +1504,7 @@ panvk_meta_copy_img2buf(struct panvk_cmd_buffer *cmdbuf,
.dim = img->pimage.layout.dim == MALI_TEXTURE_DIMENSION_CUBE
? MALI_TEXTURE_DIMENSION_2D
: img->pimage.layout.dim,
.image = &img->pimage,
.planes[0] = &img->pimage,
.nr_samples = img->pimage.layout.nr_samples,
.first_level = region->imageSubresource.mipLevel,
.last_level = region->imageSubresource.mipLevel,