etnaviv: move render compatible handling from surface to resource

So it can be reused from different places in the driver when
etna_surface is gone.

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/35406>
This commit is contained in:
Lucas Stach 2025-06-08 20:16:31 +02:00 committed by Marge Bot
parent d479573f8e
commit 9ee9b109ca
3 changed files with 39 additions and 41 deletions

View file

@ -81,7 +81,7 @@ static uint64_t etna_resource_modifier(struct etna_resource *rsc)
return layout_to_modifier(rsc->layout);
}
bool
static bool
etna_resource_is_render_compatible(struct pipe_screen *pscreen,
struct etna_resource *rsc)
{
@ -106,6 +106,40 @@ etna_resource_is_render_compatible(struct pipe_screen *pscreen,
return true;
}
struct etna_resource *
etna_resource_get_render_compatible(struct pipe_context *pctx,
struct pipe_resource *prsc)
{
struct etna_context *ctx = etna_context(pctx);
struct etna_screen *screen = ctx->screen;
struct etna_resource *res = etna_resource(prsc);
bool need_multitiled = screen->specs.pe_multitiled;
bool want_supertiled = screen->specs.can_supertile;
struct pipe_resource templat;
unsigned layout;
if (res->render)
return etna_resource(res->render);
if (etna_resource_is_render_compatible(pctx->screen, res))
return res;
layout = ETNA_LAYOUT_TILED;
if (need_multitiled)
layout |= ETNA_LAYOUT_BIT_MULTI;
if (want_supertiled)
layout |= ETNA_LAYOUT_BIT_SUPER;
templat = *prsc;
templat.bind &= (PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_RENDER_TARGET |
PIPE_BIND_BLENDABLE);
res->render = etna_resource_alloc(pctx->screen, layout,
DRM_FORMAT_MOD_LINEAR, &templat);
assert(res->render);
return etna_resource(res->render);
}
static bool
etna_resource_can_use_ts(struct etna_screen *screen,
struct etna_resource *rsc)

View file

@ -281,9 +281,9 @@ etna_resource_hw_tileable(bool use_blt, const struct pipe_resource *pres)
util_format_get_blocksize(pres->format) == 4;
}
bool
etna_resource_is_render_compatible(struct pipe_screen *pscreen,
struct etna_resource *rsc);
struct etna_resource *
etna_resource_get_render_compatible(struct pipe_context *pctx,
struct pipe_resource *prsc);
/* returns TRUE if resource TS buffer is exposed externally */
static inline bool

View file

@ -38,49 +38,13 @@
#include "drm-uapi/drm_fourcc.h"
static struct etna_resource *
etna_render_handle_incompatible(struct pipe_context *pctx,
struct pipe_resource *prsc)
{
struct etna_context *ctx = etna_context(pctx);
struct etna_screen *screen = ctx->screen;
struct etna_resource *res = etna_resource(prsc);
bool need_multitiled = screen->specs.pe_multitiled;
bool want_supertiled = screen->specs.can_supertile;
struct pipe_resource templat;
unsigned layout;
if (res->render)
return etna_resource(res->render);
if (etna_resource_is_render_compatible(pctx->screen, res))
return res;
layout = ETNA_LAYOUT_TILED;
if (need_multitiled)
layout |= ETNA_LAYOUT_BIT_MULTI;
if (want_supertiled)
layout |= ETNA_LAYOUT_BIT_SUPER;
templat = *prsc;
templat.bind &= (PIPE_BIND_DEPTH_STENCIL | PIPE_BIND_RENDER_TARGET |
PIPE_BIND_BLENDABLE);
res->render = etna_resource_alloc(pctx->screen, layout,
DRM_FORMAT_MOD_LINEAR, &templat);
assert(res->render);
return etna_resource(res->render);
}
static struct pipe_surface *
etna_create_surface(struct pipe_context *pctx, struct pipe_resource *prsc,
const struct pipe_surface *templat)
{
struct etna_context *ctx = etna_context(pctx);
struct etna_screen *screen = ctx->screen;
unsigned layer = templat->first_layer;
unsigned level = templat->level;
struct etna_resource *rsc = etna_render_handle_incompatible(pctx, prsc);
struct etna_resource *rsc = etna_resource_get_render_compatible(pctx, prsc);
struct etna_resource_level *lev = &rsc->levels[level];
struct etna_surface *surf = CALLOC_STRUCT(etna_surface);