etnaviv: get addressing mode from tiling layout
authorJonathan Marek <jonathan@marek.ca>
Sat, 10 Aug 2019 20:44:07 +0000 (16:44 -0400)
committerJonathan Marek <jonathan@marek.ca>
Fri, 11 Oct 2019 11:26:52 +0000 (07:26 -0400)
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 <jonathan@marek.ca>
Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
src/gallium/drivers/etnaviv/etnaviv_resource.c
src/gallium/drivers/etnaviv/etnaviv_resource.h
src/gallium/drivers/etnaviv/etnaviv_texture.c
src/gallium/drivers/etnaviv/etnaviv_texture_state.c
src/gallium/drivers/etnaviv/etnaviv_transfer.c

index b03681cc5c0c7d0881b55e80ee4b5b1203246d29..6cd5eca29306edba9cc6e16f6eeebd46883af226 100644 (file)
@@ -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;
index 90e04f5159b95b954c5caf629464cdc49fc832c9..5beb8454afccd304a5bd2af17178307a3a4b8504 100644 (file)
@@ -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);
index 88ed970d660517516e4e9a207c44e6f4752e45e5..a38fd1c4a57057c8b46d8bc5eb217034a0aab0b9 100644 (file)
@@ -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);
       }
 
index 12c580176f33b1546930898e120bce30b2fc28cd..8bedb7ee8829d36af0270e5a6d9f44421f3aaae3 100644 (file)
@@ -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)
index de2d6ed9ba2aa91ba23df71296fdfdb039c02666..b203b1aadfb89d54ff31a1185565a040642eaf95 100644 (file)
@@ -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;