From 5b4a155d2ba1a2bf070b8c539a6f3bf9b1086e2f Mon Sep 17 00:00:00 2001 From: Christian Gmeiner Date: Fri, 18 Jan 2019 10:54:07 +0100 Subject: [PATCH] etnaviv: extend etna_resource with an addressing mode Defines how sampler (and pixel pipes) needs to access the data represented with a resource. The used default is mode is ETNA_ADDRESSING_MODE_TILED. Signed-off-by: Christian Gmeiner Reviewed-by: Lucas Stach --- src/gallium/drivers/etnaviv/etnaviv_resource.c | 17 +++++++++++------ src/gallium/drivers/etnaviv/etnaviv_resource.h | 9 ++++++++- src/gallium/drivers/etnaviv/etnaviv_texture.c | 1 + src/gallium/drivers/etnaviv/etnaviv_transfer.c | 3 ++- 4 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c index c0091288030..9a7ebf3064e 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c @@ -188,7 +188,8 @@ static bool is_rs_align(struct etna_screen *screen, /* Create a new resource object, using the given template info */ struct pipe_resource * etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout, - uint64_t modifier, const struct pipe_resource *templat) + enum etna_resource_addressing_mode mode, uint64_t modifier, + const struct pipe_resource *templat) { struct etna_screen *screen = etna_screen(pscreen); struct etna_resource *rsc; @@ -280,6 +281,7 @@ etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout, rsc->base.nr_samples = nr_samples; rsc->layout = layout; rsc->halign = halign; + rsc->addressing_mode = mode; pipe_reference_init(&rsc->base.reference, 1); list_inithead(&rsc->list); @@ -316,12 +318,14 @@ etna_resource_create(struct pipe_screen *pscreen, { struct etna_screen *screen = etna_screen(pscreen); - /* Figure out what tiling to use -- for now, assume that texture cannot be linear. - * there is a capability LINEAR_TEXTURE_SUPPORT (supported on gc880 and - * gc2000 at least), but not sure how it works. + /* Figure out what tiling and address mode to use -- for now, assume that + * texture cannot be linear. there is a capability LINEAR_TEXTURE_SUPPORT + * (supported on gc880 and gc2000 at least), but not sure how it works. * Buffers always have LINEAR layout. */ unsigned layout = ETNA_LAYOUT_LINEAR; + enum etna_resource_addressing_mode mode = ETNA_ADDRESSING_MODE_TILED; + if (etna_resource_sampler_only(templat)) { /* The buffer is only used for texturing, so create something * directly compatible with the sampler. Such a buffer can @@ -364,7 +368,7 @@ etna_resource_create(struct pipe_screen *pscreen, layout = ETNA_LAYOUT_LINEAR; /* modifier is only used for scanout surfaces, so safe to use LINEAR here */ - return etna_resource_alloc(pscreen, layout, DRM_FORMAT_MOD_LINEAR, templat); + return etna_resource_alloc(pscreen, layout, mode, DRM_FORMAT_MOD_LINEAR, templat); } enum modifier_priority { @@ -445,7 +449,7 @@ etna_resource_create_modifiers(struct pipe_screen *pscreen, tmpl.bind |= PIPE_BIND_SCANOUT; return etna_resource_alloc(pscreen, modifier_to_layout(modifier), - modifier, &tmpl); + ETNA_ADDRESSING_MODE_TILED, modifier, &tmpl); } static void @@ -518,6 +522,7 @@ etna_resource_from_handle(struct pipe_screen *pscreen, rsc->seqno = 1; rsc->layout = modifier_to_layout(handle->modifier); rsc->halign = TEXTURE_HALIGN_FOUR; + rsc->addressing_mode = ETNA_ADDRESSING_MODE_TILED; level->width = tmpl->width0; diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h b/src/gallium/drivers/etnaviv/etnaviv_resource.h index 11ccf8f7bcb..75aa80b3d7a 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.h +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h @@ -49,6 +49,11 @@ struct etna_resource_level { bool ts_valid; }; +enum etna_resource_addressing_mode { + ETNA_ADDRESSING_MODE_TILED = 0, + ETNA_ADDRESSING_MODE_LINEAR, +}; + /* status of queued up but not flushed reads and write operations. * In _transfer_map() we need to know if queued up rendering needs * to be flushed to preserve the order of cpu and gpu access. */ @@ -66,6 +71,7 @@ struct etna_resource { /* only lod 0 used for non-texture buffers */ /* Layout for surface (tiled, multitiled, split tiled, ...) */ enum etna_surface_layout layout; + enum etna_resource_addressing_mode addressing_mode; /* Horizontal alignment for texture unit (TEXTURE_HALIGN_*) */ unsigned halign; struct etna_bo *bo; /* Surface video memory */ @@ -155,7 +161,8 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen, struct pipe_resource * etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout, - uint64_t modifier, const struct pipe_resource *templat); + enum etna_resource_addressing_mode mode, uint64_t modifier, + const struct pipe_resource *templat); void etna_resource_screen_init(struct pipe_screen *pscreen); diff --git a/src/gallium/drivers/etnaviv/etnaviv_texture.c b/src/gallium/drivers/etnaviv/etnaviv_texture.c index 72ef00bcb26..3993e31cec1 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_texture.c +++ b/src/gallium/drivers/etnaviv/etnaviv_texture.c @@ -203,6 +203,7 @@ etna_texture_handle_incompatible(struct pipe_context *pctx, struct pipe_resource PIPE_BIND_BLENDABLE); res->texture = etna_resource_alloc(pctx->screen, ETNA_LAYOUT_TILED, + ETNA_ADDRESSING_MODE_TILED, DRM_FORMAT_MOD_LINEAR, &templat); } diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c index 30ae3bfc39d..0294697af28 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c @@ -208,7 +208,8 @@ etna_transfer_map(struct pipe_context *pctx, struct pipe_resource *prsc, templ.bind = PIPE_BIND_RENDER_TARGET; trans->rsc = etna_resource_alloc(pctx->screen, ETNA_LAYOUT_LINEAR, - DRM_FORMAT_MOD_LINEAR, &templ); + ETNA_ADDRESSING_MODE_TILED, DRM_FORMAT_MOD_LINEAR, + &templ); if (!trans->rsc) { slab_free(&ctx->transfer_pool, trans); return NULL; -- 2.30.2