Mesa (master): broadcom/vc4: Add support for YUV textures using unaccelerated blits.

Eric Anholt anholt at kemper.freedesktop.org
Fri Feb 23 16:44:23 UTC 2018


Module: Mesa
Branch: master
Commit: bc3d16e633fd27b05dfdcda0b7efb000b2c35ed6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=bc3d16e633fd27b05dfdcda0b7efb000b2c35ed6

Author: Eric Anholt <eric at anholt.net>
Date:   Thu Feb 22 17:43:21 2018 -0800

broadcom/vc4: Add support for YUV textures using unaccelerated blits.

Previously we would assertion fail about having no hardware format.  This
is enough to get kmscube -M nv12-2img working.

---

 src/gallium/drivers/vc4/vc4_blit.c     | 29 +++++++++++++++++++++++++++++
 src/gallium/drivers/vc4/vc4_resource.c |  6 ++++--
 src/gallium/drivers/vc4/vc4_state.c    |  3 ++-
 3 files changed, 35 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_blit.c b/src/gallium/drivers/vc4/vc4_blit.c
index 7f4c76968e..f23f74c8f1 100644
--- a/src/gallium/drivers/vc4/vc4_blit.c
+++ b/src/gallium/drivers/vc4/vc4_blit.c
@@ -184,6 +184,32 @@ vc4_blitter_save(struct vc4_context *vc4)
 }
 
 static bool
+vc4_yuv_blit(struct pipe_context *pctx, const struct pipe_blit_info *info)
+{
+        struct vc4_resource *src = vc4_resource(info->src.resource);
+        struct vc4_resource *dst = vc4_resource(info->dst.resource);
+        bool ok;
+
+        if (src->tiled)
+                return false;
+        if (src->base.format != PIPE_FORMAT_R8_UNORM &&
+            src->base.format != PIPE_FORMAT_R8G8_UNORM)
+                return false;
+
+        /* YUV blits always turn raster-order to tiled */
+        assert(dst->base.format == src->base.format);
+        assert(dst->tiled);
+
+        /* Do an immediate SW fallback, since the render blit path
+         * would just recurse.
+         */
+        ok = util_try_blit_via_copy_region(pctx, info);
+        assert(ok); (void)ok;
+
+        return true;
+}
+
+static bool
 vc4_render_blit(struct pipe_context *ctx, struct pipe_blit_info *info)
 {
         struct vc4_context *vc4 = vc4_context(ctx);
@@ -218,6 +244,9 @@ vc4_blit(struct pipe_context *pctx, const struct pipe_blit_info *blit_info)
 {
         struct pipe_blit_info info = *blit_info;
 
+        if (vc4_yuv_blit(pctx, blit_info))
+                return;
+
         if (vc4_tile_blit(pctx, blit_info))
                 return;
 
diff --git a/src/gallium/drivers/vc4/vc4_resource.c b/src/gallium/drivers/vc4/vc4_resource.c
index 202f62c8f0..eee17472fc 100644
--- a/src/gallium/drivers/vc4/vc4_resource.c
+++ b/src/gallium/drivers/vc4/vc4_resource.c
@@ -564,8 +564,10 @@ get_resource_texture_format(struct pipe_resource *prsc)
                 if (prsc->nr_samples > 1) {
                         return ~0;
                 } else {
-                        assert(format == VC4_TEXTURE_TYPE_RGBA8888);
-                        return VC4_TEXTURE_TYPE_RGBA32R;
+                        if (format == VC4_TEXTURE_TYPE_RGBA8888)
+                                return VC4_TEXTURE_TYPE_RGBA32R;
+                        else
+                                return ~0;
                 }
         }
 
diff --git a/src/gallium/drivers/vc4/vc4_state.c b/src/gallium/drivers/vc4/vc4_state.c
index 7bc87b0c4e..c85618789a 100644
--- a/src/gallium/drivers/vc4/vc4_state.c
+++ b/src/gallium/drivers/vc4/vc4_state.c
@@ -581,7 +581,8 @@ vc4_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *prsc,
          */
         if ((cso->u.tex.first_level &&
              (cso->u.tex.first_level != cso->u.tex.last_level)) ||
-            rsc->vc4_format == VC4_TEXTURE_TYPE_RGBA32R) {
+            rsc->vc4_format == VC4_TEXTURE_TYPE_RGBA32R ||
+            rsc->vc4_format == ~0) {
                 struct vc4_resource *shadow_parent = rsc;
                 struct pipe_resource tmpl = {
                         .target = prsc->target,




More information about the mesa-commit mailing list