[PATCH 16/19] etnaviv: GC7000: Factor out incompatible texture handling logic

Wladimir J. van der Laan laanwj at gmail.com
Mon Oct 30 16:17:02 UTC 2017


This will be shared with the texture descriptor path.

Signed-off-by: Wladimir J. van der Laan <laanwj at gmail.com>
---
 src/gallium/drivers/etnaviv/etnaviv_texture.c | 40 +++++++++++++++++----------
 src/gallium/drivers/etnaviv/etnaviv_texture.h |  5 ++++
 2 files changed, 30 insertions(+), 15 deletions(-)

diff --git a/src/gallium/drivers/etnaviv/etnaviv_texture.c b/src/gallium/drivers/etnaviv/etnaviv_texture.c
index 335a2df..55942a9 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_texture.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_texture.c
@@ -164,22 +164,10 @@ etna_resource_sampler_compatible(struct etna_resource *res)
    return true;
 }
 
-static struct pipe_sampler_view *
-etna_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
-                         const struct pipe_sampler_view *so)
+struct etna_resource *
+etna_texture_handle_incompatible(struct pipe_context *pctx, struct pipe_resource *prsc)
 {
-   struct etna_sampler_view *sv = CALLOC_STRUCT(etna_sampler_view);
    struct etna_resource *res = etna_resource(prsc);
-   struct etna_context *ctx = etna_context(pctx);
-   const uint32_t format = translate_texture_format(so->format);
-   const bool ext = !!(format & EXT_FORMAT);
-   const uint32_t swiz = get_texture_swiz(so->format, so->swizzle_r,
-                                          so->swizzle_g, so->swizzle_b,
-                                          so->swizzle_a);
-
-   if (!sv)
-      return NULL;
-
    if (!etna_resource_sampler_compatible(res)) {
       /* The original resource is not compatible with the sampler.
        * Allocate an appropriately tiled texture. */
@@ -194,11 +182,33 @@ etna_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
       }
 
       if (!res->texture) {
-         free(sv);
          return NULL;
       }
       res = etna_resource(res->texture);
    }
+   return res;
+}
+
+static struct pipe_sampler_view *
+etna_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
+                         const struct pipe_sampler_view *so)
+{
+   struct etna_sampler_view *sv = CALLOC_STRUCT(etna_sampler_view);
+   struct etna_context *ctx = etna_context(pctx);
+   const uint32_t format = translate_texture_format(so->format);
+   const bool ext = !!(format & EXT_FORMAT);
+   const uint32_t swiz = get_texture_swiz(so->format, so->swizzle_r,
+                                          so->swizzle_g, so->swizzle_b,
+                                          so->swizzle_a);
+
+   if (!sv)
+      return NULL;
+
+   struct etna_resource *res = etna_texture_handle_incompatible(pctx, prsc);
+   if (!res) {
+      free(sv);
+      return NULL;
+   }
 
    sv->base = *so;
    pipe_reference_init(&sv->base.reference, 1);
diff --git a/src/gallium/drivers/etnaviv/etnaviv_texture.h b/src/gallium/drivers/etnaviv/etnaviv_texture.h
index a7a67fc..9d1789e 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_texture.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_texture.h
@@ -72,4 +72,9 @@ etna_sampler_view(struct pipe_sampler_view *view)
 void
 etna_texture_init(struct pipe_context *pctx);
 
+/* If the original resource is not compatible with the sampler.  Allocate
+ * an appropriately tiled texture. */
+struct etna_resource *
+etna_texture_handle_incompatible(struct pipe_context *pctx, struct pipe_resource *prsc);
+
 #endif
-- 
2.7.4



More information about the etnaviv mailing list