Mesa (main): mesa/st: Account for YUV color space and range.

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri Jun 17 18:12:39 UTC 2022


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

Author: Andres Calderon Jaramillo <andrescj at chromium.org>
Date:   Sat May 21 23:27:34 2022 +0000

mesa/st: Account for YUV color space and range.

This patch plumbs the YUV color space and range provided through
EGL_EXT_image_dma_buf_import all the way to nir_lower_tex().

NIR already accounts for the YUV color space courtesy of commit
d8fdb8da. However, the color space was wired only for i965/i915 (see
6c11a799) and not for Gallium.

Tested-by: Andres Calderon Jaramillo <andrescj at chromium.org>
Reviewed-by: Rob Clark <robdclark at chromium.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16651>

---

 src/gallium/frontends/dri/dri_screen.c  |  3 +++
 src/gallium/include/frontend/api.h      |  6 ++++++
 src/mesa/main/mtypes.h                  | 16 ++++++++++++++++
 src/mesa/state_tracker/st_cb_eglimage.c | 17 +++++++++++++++++
 src/mesa/state_tracker/st_program.c     |  3 +++
 src/mesa/state_tracker/st_program.h     | 17 +++++++++++++++++
 6 files changed, 62 insertions(+)

diff --git a/src/gallium/frontends/dri/dri_screen.c b/src/gallium/frontends/dri/dri_screen.c
index f331057fdcb..ffc5a50adeb 100644
--- a/src/gallium/frontends/dri/dri_screen.c
+++ b/src/gallium/frontends/dri/dri_screen.c
@@ -747,6 +747,9 @@ dri_get_egl_image(struct st_manager *smapi,
       stimg->internalformat = driGLFormatToSizedInternalGLFormat(mesa_format);
    }
 
+   stimg->yuv_color_space = img->yuv_color_space;
+   stimg->yuv_range = img->sample_range;
+
    return TRUE;
 }
 
diff --git a/src/gallium/include/frontend/api.h b/src/gallium/include/frontend/api.h
index c7aab405159..57a6a453e1f 100644
--- a/src/gallium/include/frontend/api.h
+++ b/src/gallium/include/frontend/api.h
@@ -187,6 +187,12 @@ struct st_egl_image
    unsigned layer;
    /* GL internal format. */
    unsigned internalformat;
+
+   /* one of __DRI_YUV_COLOR_SPACE_* */
+   unsigned yuv_color_space;
+
+   /* one of __DRI_YUV_RANGE_* */
+   unsigned yuv_range;
 };
 
 /**
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 4fa389d7e00..670a40ee545 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -893,6 +893,16 @@ struct gl_sampler_object
    struct util_dynarray Handles;
 };
 
+/**
+ * YUV color space that should be used to sample textures backed by YUV
+ * images.
+ */
+enum gl_texture_yuv_color_space
+{
+   GL_TEXTURE_YUV_COLOR_SPACE_REC601,
+   GL_TEXTURE_YUV_COLOR_SPACE_REC709,
+   GL_TEXTURE_YUV_COLOR_SPACE_REC2020,
+};
 
 /**
  * Texture object state.  Contains the array of mipmap images, border color,
@@ -1009,6 +1019,12 @@ struct gl_texture_object
     */
    enum pipe_format surface_format;
 
+   /* If surface_based is true and surface_format is a YUV format, these
+    * settings should be used to convert from YUV to RGB.
+    */
+   enum gl_texture_yuv_color_space yuv_color_space;
+   bool yuv_full_range;
+
    /* When non-negative, samplers should use this level instead of the level
     * range specified by the GL state.
     *
diff --git a/src/mesa/state_tracker/st_cb_eglimage.c b/src/mesa/state_tracker/st_cb_eglimage.c
index 0768db8cf7c..0912c35f5ae 100644
--- a/src/mesa/state_tracker/st_cb_eglimage.c
+++ b/src/mesa/state_tracker/st_cb_eglimage.c
@@ -25,6 +25,7 @@
  *    Chia-I Wu <olv at lunarg.com>
  */
 
+#include <GL/internal/dri_interface.h>
 #include "main/errors.h"
 #include "main/texobj.h"
 #include "main/teximage.h"
@@ -382,6 +383,22 @@ st_bind_egl_image(struct gl_context *ctx,
       st->screen->resource_changed(st->screen, texImage->pt);
 
    texObj->surface_format = stimg->format;
+
+   switch (stimg->yuv_color_space) {
+   case __DRI_YUV_COLOR_SPACE_ITU_REC709:
+      texObj->yuv_color_space = GL_TEXTURE_YUV_COLOR_SPACE_REC709;
+      break;
+   case __DRI_YUV_COLOR_SPACE_ITU_REC2020:
+      texObj->yuv_color_space = GL_TEXTURE_YUV_COLOR_SPACE_REC2020;
+      break;
+   default:
+      texObj->yuv_color_space = GL_TEXTURE_YUV_COLOR_SPACE_REC601;
+      break;
+   }
+
+   if (stimg->yuv_range == __DRI_YUV_FULL_RANGE)
+      texObj->yuv_full_range = true;
+
    texObj->level_override = stimg->level;
    texObj->layer_override = stimg->layer;
 
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index 159658a2b8a..3cd167ab095 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -1020,6 +1020,9 @@ st_create_fp_variant(struct st_context *st,
       options.lower_yuv_external = key->external.lower_yuv;
       options.lower_yu_yv_external = key->external.lower_yu_yv;
       options.lower_y41x_external = key->external.lower_y41x;
+      options.bt709_external = key->external.bt709;
+      options.bt2020_external = key->external.bt2020;
+      options.yuv_full_range_external = key->external.yuv_full_range;
       NIR_PASS_V(state.ir.nir, nir_lower_tex, &options);
       finalize = true;
       need_lower_tex_src_plane = true;
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index da2b9aaf7bc..c9d1676625e 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -56,6 +56,9 @@ struct st_external_sampler_key
    GLuint lower_yuv;
    GLuint lower_yu_yv;
    GLuint lower_y41x;
+   GLuint bt709;
+   GLuint bt2020;
+   GLuint yuv_full_range;
 };
 
 static inline struct st_external_sampler_key
@@ -125,6 +128,20 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
                 format);
          break;
       }
+
+      switch (stObj->yuv_color_space) {
+      case GL_TEXTURE_YUV_COLOR_SPACE_REC601:
+         break;
+      case GL_TEXTURE_YUV_COLOR_SPACE_REC709:
+         key.bt709 |= (1 << unit);
+         break;
+      case GL_TEXTURE_YUV_COLOR_SPACE_REC2020:
+         key.bt2020 |= (1 << unit);
+         break;
+      }
+
+      if (stObj->yuv_full_range)
+         key.yuv_full_range |= (1 << unit);
    }
 
    return key;



More information about the mesa-commit mailing list