From e7e02435a88ec3262c556f56d2e279753b81f2dd Mon Sep 17 00:00:00 2001 From: Jonathan Marek Date: Sat, 10 Aug 2019 16:44:07 -0400 Subject: [PATCH] etnaviv: get addressing mode from tiling layout Remove the "addressing_mode" state, which is currently set incorrectly, and instead deduce the addressing mode from the tiling layout. Signed-off-by: Jonathan Marek Reviewed-by: Christian Gmeiner --- src/gallium/drivers/etnaviv/etnaviv_resource.c | 17 +++++------------ src/gallium/drivers/etnaviv/etnaviv_resource.h | 9 +-------- src/gallium/drivers/etnaviv/etnaviv_texture.c | 1 - .../drivers/etnaviv/etnaviv_texture_state.c | 2 +- src/gallium/drivers/etnaviv/etnaviv_transfer.c | 3 +-- 5 files changed, 8 insertions(+), 24 deletions(-) diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.c b/src/gallium/drivers/etnaviv/etnaviv_resource.c index b03681cc5c0..6cd5eca2930 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.c +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.c @@ -204,8 +204,7 @@ 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, - enum etna_resource_addressing_mode mode, uint64_t modifier, - const struct pipe_resource *templat) + uint64_t modifier, const struct pipe_resource *templat) { struct etna_screen *screen = etna_screen(pscreen); struct etna_resource *rsc; @@ -299,7 +298,6 @@ 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); @@ -340,13 +338,11 @@ etna_resource_create(struct pipe_screen *pscreen, { struct etna_screen *screen = etna_screen(pscreen); - /* 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. + /* Figure out what tiling to use -- we always use tiled layouts, + * except for scanout/dmabuf (which don't go through this path) * 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 @@ -390,7 +386,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, mode, DRM_FORMAT_MOD_LINEAR, templat); + return etna_resource_alloc(pscreen, layout, DRM_FORMAT_MOD_LINEAR, templat); } enum modifier_priority { @@ -470,8 +466,7 @@ etna_resource_create_modifiers(struct pipe_screen *pscreen, */ tmpl.bind |= PIPE_BIND_SCANOUT; - return etna_resource_alloc(pscreen, modifier_to_layout(modifier), - ETNA_ADDRESSING_MODE_TILED, modifier, &tmpl); + return etna_resource_alloc(pscreen, modifier_to_layout(modifier), modifier, &tmpl); } static void @@ -550,8 +545,6 @@ 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; level->height = tmpl->height0; diff --git a/src/gallium/drivers/etnaviv/etnaviv_resource.h b/src/gallium/drivers/etnaviv/etnaviv_resource.h index 90e04f5159b..5beb8454afc 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_resource.h +++ b/src/gallium/drivers/etnaviv/etnaviv_resource.h @@ -60,11 +60,6 @@ struct etna_resource_level { struct util_dynarray *patch_offsets; }; -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. */ @@ -82,7 +77,6 @@ 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 */ @@ -169,8 +163,7 @@ etna_screen_resource_alloc_ts(struct pipe_screen *pscreen, struct pipe_resource * etna_resource_alloc(struct pipe_screen *pscreen, unsigned layout, - enum etna_resource_addressing_mode mode, uint64_t modifier, - const struct pipe_resource *templat); + 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 88ed970d660..a38fd1c4a57 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_texture.c +++ b/src/gallium/drivers/etnaviv/etnaviv_texture.c @@ -224,7 +224,6 @@ 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_texture_state.c b/src/gallium/drivers/etnaviv/etnaviv_texture_state.c index 12c580176f3..8bedb7ee882 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_texture_state.c +++ b/src/gallium/drivers/etnaviv/etnaviv_texture_state.c @@ -161,7 +161,7 @@ etna_create_sampler_view_state(struct pipe_context *pctx, struct pipe_resource * break; } - if (res->addressing_mode == ETNA_ADDRESSING_MODE_LINEAR) { + if (res->layout == ETNA_LAYOUT_LINEAR && !util_format_is_compressed(so->format)) { sv->TE_SAMPLER_CONFIG0 |= VIVS_TE_SAMPLER_CONFIG0_ADDRESSING_MODE(TEXTURE_ADDRESSING_MODE_LINEAR); for (int lod = 0; lod <= res->base.last_level; ++lod) diff --git a/src/gallium/drivers/etnaviv/etnaviv_transfer.c b/src/gallium/drivers/etnaviv/etnaviv_transfer.c index de2d6ed9ba2..b203b1aadfb 100644 --- a/src/gallium/drivers/etnaviv/etnaviv_transfer.c +++ b/src/gallium/drivers/etnaviv/etnaviv_transfer.c @@ -254,8 +254,7 @@ 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, - ETNA_ADDRESSING_MODE_TILED, DRM_FORMAT_MOD_LINEAR, - &templ); + DRM_FORMAT_MOD_LINEAR, &templ); if (!trans->rsc) { slab_free(&ctx->transfer_pool, trans); return NULL;