mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
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:
parent
d479573f8e
commit
9ee9b109ca
3 changed files with 39 additions and 41 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue