unsigned nr_samples = surf->texture->nr_samples;
unsigned layer_stride = (nr_samples > 1) ? rsrc->layout.slices[level].surface_stride : 0;
- mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
if (layer_stride)
rt->writeback_msaa = MALI_MSAA_LAYERED;
panfrost_mfbd_rt_init_format(dev, surf, rt);
if (rsrc->layout.modifier == DRM_FORMAT_MOD_LINEAR) {
+ mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
+
if (version >= 7)
rt->bifrost_v7.writeback_block_format = MALI_BLOCK_FORMAT_V7_LINEAR;
else
rt->rgb.row_stride = row_stride;
rt->rgb.surface_stride = layer_stride;
} else if (rsrc->layout.modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED) {
+ mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
+
if (version >= 7)
rt->bifrost_v7.writeback_block_format = MALI_BLOCK_FORMAT_V7_TILED_U_INTERLEAVED;
else
rt->afbc.body_size = slice->afbc.body_size;
}
- rt->afbc.header = base;
- rt->afbc.body = base + slice->afbc.header_size;
+ panfrost_get_afbc_pointers(rsrc, level, first_layer,
+ &rt->afbc.header,
+ &rt->afbc.body);
if (rsrc->layout.modifier & AFBC_FORMAT_MOD_YTR)
rt->afbc.yuv_transform_enable = true;
unsigned first_layer = zs_surf->u.tex.first_layer;
assert(zs_surf->u.tex.last_layer == first_layer);
- mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
-
if (version < 7)
ext->zs_msaa = nr_samples > 1 ? MALI_MSAA_LAYERED : MALI_MSAA_SINGLE;
else
if (drm_is_afbc(rsrc->layout.modifier)) {
struct panfrost_slice *slice = &rsrc->layout.slices[level];
- ext->zs_afbc_header = base;
- ext->zs_afbc_body = base + slice->afbc.header_size;
+ panfrost_get_afbc_pointers(rsrc, level, first_layer,
+ &ext->zs_afbc_header,
+ &ext->zs_afbc_body);
if (version >= 7) {
ext->zs_block_format_v7 = MALI_BLOCK_FORMAT_V7_AFBC;
} else {
assert(rsrc->layout.modifier == DRM_FORMAT_MOD_ARM_16X16_BLOCK_U_INTERLEAVED ||
rsrc->layout.modifier == DRM_FORMAT_MOD_LINEAR);
+ mali_ptr base = panfrost_get_texture_address(rsrc, level, first_layer, 0);
+
/* TODO: Z32F(S8) support, which is always linear */
ext->zs_writeback_base = base;
array_idx, surface_idx);
}
+void
+panfrost_get_afbc_pointers(struct panfrost_resource *rsrc,
+ unsigned level, unsigned layer,
+ mali_ptr *header, mali_ptr *body)
+{
+ assert(drm_is_afbc(rsrc->layout.modifier));
+
+ struct panfrost_slice *slice = &rsrc->layout.slices[level];
+
+ if (rsrc->base.target == PIPE_TEXTURE_3D) {
+ *header = rsrc->bo->ptr.gpu + slice->offset +
+ (layer * slice->afbc.surface_stride);
+ *body = rsrc->bo->ptr.gpu + slice->offset +
+ slice->afbc.header_size +
+ (slice->surface_stride * layer);
+ } else {
+ *header = rsrc->bo->ptr.gpu +
+ panfrost_texture_offset(&rsrc->layout,
+ level, layer, 0);
+ *body = *header + slice->afbc.header_size;
+ }
+}
+
static void
panfrost_resource_set_stencil(struct pipe_resource *prsrc,
struct pipe_resource *stencil)