etnaviv: move TS meta into etna_resource_level

Handle imports/exports always deal with one specific level of
a resource, so the shared TS metadata should also be per level.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19964>
This commit is contained in:
Lucas Stach
2022-11-16 20:47:13 +01:00
committed by Marge Bot
parent 97aec88c79
commit 49d2f9f918
4 changed files with 44 additions and 39 deletions

View File

@@ -262,7 +262,7 @@ etna_blit_clear_color_blt(struct pipe_context *pctx, struct pipe_surface *dst,
/* update clear color in SW meta area of the buffer if TS is exported */
if (unlikely(new_clear_value != surf->level->clear_value &&
etna_resource_ext_ts(etna_resource(dst->texture))))
etna_resource(dst->texture)->ts_meta->v0.clear_value = new_clear_value;
surf->level->ts_meta->v0.clear_value = new_clear_value;
etna_resource_level_ts_mark_valid(surf->level);
ctx->dirty |= ETNA_DIRTY_TS | ETNA_DIRTY_DERIVE_TS;

View File

@@ -90,6 +90,7 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
struct etna_resource *rsc, uint64_t modifier)
{
struct etna_screen *screen = etna_screen(pscreen);
struct etna_resource_level *lvl = &rsc->levels[0];
struct pipe_resource *prsc = &rsc->base;
size_t tile_size, ts_size, ts_bo_size, ts_layer_stride, ts_data_offset = 0;
uint8_t ts_mode = TS_MODE_128B;
@@ -122,8 +123,7 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
* if we want to use it or not.
*/
if (ts_compress_fmt >= 0 &&
(rsc->layout != ETNA_LAYOUT_LINEAR ||
rsc->levels[0].stride % 256 == 0))
(rsc->layout != ETNA_LAYOUT_LINEAR || lvl->stride % 256 == 0))
ts_mode = TS_MODE_256B;
else
ts_mode = TS_MODE_128B;
@@ -132,7 +132,7 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
tile_size = etna_screen_get_tile_size(screen, ts_mode, prsc->nr_samples > 1);
layers = prsc->target == PIPE_TEXTURE_3D ? prsc->depth0 : prsc->array_size;
ts_layer_stride = align(DIV_ROUND_UP(rsc->levels[0].layer_stride,
ts_layer_stride = align(DIV_ROUND_UP(lvl->layer_stride,
tile_size * 8 / screen->specs.bits_per_tile),
0x100 * screen->specs.pixel_pipes);
ts_size = ts_bo_size = ts_layer_stride * layers;
@@ -181,20 +181,20 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen,
return false;
}
rsc->levels[0].ts_offset = ts_data_offset;
rsc->levels[0].ts_layer_stride = ts_layer_stride;
rsc->levels[0].ts_size = ts_size;
rsc->levels[0].ts_mode = ts_mode;
rsc->levels[0].ts_compress_fmt = ts_compress_fmt;
lvl->ts_offset = ts_data_offset;
lvl->ts_layer_stride = ts_layer_stride;
lvl->ts_size = ts_size;
lvl->ts_mode = ts_mode;
lvl->ts_compress_fmt = ts_compress_fmt;
/* fill software meta */
if (modifier & VIVANTE_MOD_TS_MASK) {
rsc->ts_meta = etna_bo_map(rsc->ts_bo);
rsc->ts_meta->version = 0;
rsc->ts_meta->v0.data_size = ts_size;
rsc->ts_meta->v0.data_offset = ts_data_offset;
rsc->ts_meta->v0.layer_stride = ts_layer_stride;
rsc->ts_meta->v0.comp_format = ts_format_to_drmfourcc(rsc->levels[0].ts_compress_fmt);
lvl->ts_meta = etna_bo_map(rsc->ts_bo);
lvl->ts_meta->version = 0;
lvl->ts_meta->v0.data_size = ts_size;
lvl->ts_meta->v0.data_offset = ts_data_offset;
lvl->ts_meta->v0.layer_stride = ts_layer_stride;
lvl->ts_meta->v0.comp_format = ts_format_to_drmfourcc(ts_compress_fmt);
}
return true;
}
@@ -606,6 +606,7 @@ static void etna_resource_finish_ts_import(struct etna_screen *screen,
{
struct etna_resource *ts_rsc = etna_resource(rsc->base.next);
uint64_t ts_modifier = rsc->modifier & VIVANTE_MOD_TS_MASK;
struct etna_resource_level *lvl = &rsc->levels[0];
uint8_t ts_mode = 0;
if (ts_rsc->bo == rsc->bo)
@@ -616,7 +617,6 @@ static void etna_resource_finish_ts_import(struct etna_screen *screen,
ts_mode = TS_MODE_256B;
rsc->ts_bo = etna_bo_ref(ts_rsc->bo);
rsc->ts_meta = etna_bo_map(rsc->ts_bo) + ts_rsc->levels[0].offset;
rsc->ts_scanout = ts_rsc->scanout;
ts_rsc->scanout = NULL;
@@ -625,13 +625,14 @@ static void etna_resource_finish_ts_import(struct etna_screen *screen,
* change over the lifetime of the resource, so might need to look this up
* at a few other places. For now it's not an issue, as buffers with shared
* TS get re-imported all the time. */
rsc->levels[0].ts_compress_fmt = drmfourcc_to_ts_format(rsc->ts_meta->v0.comp_format);
rsc->levels[0].ts_offset = ts_rsc->levels[0].offset + rsc->ts_meta->v0.data_offset;
rsc->levels[0].ts_layer_stride = rsc->ts_meta->v0.layer_stride;
rsc->levels[0].clear_value = rsc->ts_meta->v0.clear_value;
rsc->levels[0].ts_size = rsc->ts_meta->v0.data_size;
rsc->levels[0].ts_mode = ts_mode;
etna_resource_level_ts_mark_valid(&rsc->levels[0]);
lvl->ts_meta = etna_bo_map(rsc->ts_bo) + ts_rsc->levels[0].offset;
lvl->ts_compress_fmt = drmfourcc_to_ts_format(lvl->ts_meta->v0.comp_format);
lvl->ts_offset = ts_rsc->levels[0].offset + lvl->ts_meta->v0.data_offset;
lvl->ts_layer_stride = lvl->ts_meta->v0.layer_stride;
lvl->clear_value = lvl->ts_meta->v0.clear_value;
lvl->ts_size = lvl->ts_meta->v0.data_size;
lvl->ts_mode = ts_mode;
etna_resource_level_ts_mark_valid(lvl);
etna_resource_destroy(&screen->base, rsc->base.next);
rsc->base.next = NULL;
@@ -745,6 +746,7 @@ etna_resource_get_handle(struct pipe_screen *pscreen,
bool wants_ts = etna_resource_ext_ts(rsc) &&
handle->plane >= util_format_get_num_planes(prsc->format);
struct renderonly_scanout *scanout;
struct etna_resource_level *lvl;
struct etna_bo *bo;
if (handle->plane && !wants_ts) {
@@ -761,18 +763,18 @@ etna_resource_get_handle(struct pipe_screen *pscreen,
/* Scanout is always attached to the base resource */
scanout = rsc->scanout;
lvl = &rsc->levels[0];
if (wants_ts) {
handle->stride = DIV_ROUND_UP(rsc->levels[0].stride,
etna_screen_get_tile_size(screen,
rsc->levels[0].ts_mode,
false)
* 8 /screen->specs.bits_per_tile);
handle->offset = rsc->levels[0].ts_offset - rsc->ts_meta->v0.data_offset;
handle->stride = DIV_ROUND_UP(lvl->stride,
etna_screen_get_tile_size(screen, lvl->ts_mode, false)
* 8 / screen->specs.bits_per_tile);
handle->offset = lvl->ts_offset - lvl->ts_meta->v0.data_offset;
scanout = rsc->ts_scanout;
bo = rsc->ts_bo;
} else {
handle->stride = rsc->levels[0].stride;
handle->offset = rsc->levels[0].offset;
handle->stride = lvl->stride;
handle->offset = lvl->offset;
scanout = rsc->scanout;
bo = rsc->bo;
}
@@ -809,6 +811,7 @@ etna_resource_get_param(struct pipe_screen *pscreen,
struct etna_resource *rsc = etna_resource(prsc);
bool wants_ts = etna_resource_ext_ts(rsc) &&
plane >= util_format_get_num_planes(prsc->format);
struct etna_resource_level *lvl;
if (param == PIPE_RESOURCE_PARAM_NPLANES) {
if (etna_resource_ext_ts(rsc)) {
@@ -833,23 +836,24 @@ etna_resource_get_param(struct pipe_screen *pscreen,
rsc = etna_resource(cur);
}
lvl = &rsc->levels[0];
switch (param) {
case PIPE_RESOURCE_PARAM_STRIDE:
if (wants_ts) {
*value = DIV_ROUND_UP(rsc->levels[0].stride,
etna_screen_get_tile_size(screen,
rsc->levels[0].ts_mode,
*value = DIV_ROUND_UP(lvl->stride,
etna_screen_get_tile_size(screen, lvl->ts_mode,
prsc->nr_samples > 1)
* 8 / screen->specs.bits_per_tile);
} else {
*value = rsc->levels[0].stride;
*value = lvl->stride;
}
return true;
case PIPE_RESOURCE_PARAM_OFFSET:
if (wants_ts)
*value = rsc->levels[0].ts_offset - rsc->ts_meta->v0.data_offset;
*value = lvl->ts_offset - lvl->ts_meta->v0.data_offset;
else
*value = rsc->levels[0].offset;
*value = lvl->offset;
return true;
case PIPE_RESOURCE_PARAM_MODIFIER:
*value = etna_resource_modifier(rsc);

View File

@@ -70,6 +70,8 @@ struct etna_resource_level {
uint8_t ts_mode;
int8_t ts_compress_fmt; /* COLOR_COMPRESSION_FORMAT_* (-1 = disable) */
struct etna_ts_sw_meta *ts_meta; /* metadata for shared TS */
/* keep track if we have done some per block patching */
bool patched;
struct util_dynarray *patch_offsets;
@@ -159,7 +161,6 @@ struct etna_resource {
struct etna_bo *bo; /* Surface video memory */
struct etna_bo *ts_bo; /* Tile status video memory */
struct renderonly_scanout *ts_scanout; /* display compatible TS */
struct etna_ts_sw_meta *ts_meta; /* metadata for shared TS */
struct etna_resource_level levels[ETNA_NUM_LOD];

View File

@@ -346,7 +346,7 @@ etna_blit_clear_color_rs(struct pipe_context *pctx, struct pipe_surface *dst,
/* update clear color in SW meta area of the buffer if TS is exported */
if (unlikely(new_clear_value != surf->level->clear_value &&
etna_resource_ext_ts(etna_resource(dst->texture))))
etna_resource(dst->texture)->ts_meta->v0.clear_value = new_clear_value;
surf->level->ts_meta->v0.clear_value = new_clear_value;
etna_resource_level_ts_mark_valid(surf->level);
ctx->dirty |= ETNA_DIRTY_TS | ETNA_DIRTY_DERIVE_TS;