gallium/st: lower NV21 to R8_B8G8 instead of G8_B8R8
authorItalo Nicola <italonicola@collabora.com>
Mon, 10 Jul 2023 23:09:44 +0000 (23:09 +0000)
committerMarge Bot <emma+marge@anholt.net>
Fri, 11 Aug 2023 18:43:38 +0000 (18:43 +0000)
When NV21 lowering with hardware sampling and shader CSC was added, the
incorrect PIPE_FORMAT_G8_B8R8_UNORM was used. That format is supposed to
represent vulkan NV12 instead.

This commit introduces PIPE_FORMAT_R8_B8G8_UNORM, which correctly describes the
gallium mapping for YUV CSC, with R as Y, instead of G as Y.

Fixes: 26e3be513dc ("gallium/st: add support for PIPE_FORMAT_NV21 and PIPE_FORMAT_G8_B8R8_420")
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24266>

src/gallium/frontends/dri/dri2.c
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_atom_texture.c
src/mesa/state_tracker/st_cb_eglimage.c
src/mesa/state_tracker/st_program.h
src/mesa/state_tracker/st_sampler_view.c
src/panfrost/lib/pan_format.c
src/util/format/u_format.csv
src/util/format/u_format_table.py
src/util/format/u_formats.h

index 8b7e929..8238730 100644 (file)
@@ -890,11 +890,11 @@ static const struct dri2_format_mapping r8_g8b8_mapping = {
      { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88 } }
 };
 
-static const struct dri2_format_mapping g8_b8r8_mapping = {
+static const struct dri2_format_mapping r8_b8g8_mapping = {
    DRM_FORMAT_NV21,
    __DRI_IMAGE_FORMAT_NONE,
    __DRI_IMAGE_COMPONENTS_Y_UV,
-   PIPE_FORMAT_G8_B8R8_420_UNORM,
+   PIPE_FORMAT_R8_B8G8_420_UNORM,
    2,
    { { 0, 0, 0, __DRI_IMAGE_FORMAT_R8 },
      { 1, 1, 1, __DRI_IMAGE_FORMAT_GR88 } }
@@ -959,7 +959,7 @@ dri2_create_image_from_winsys(__DRIscreen *_screen,
                                     PIPE_BIND_SAMPLER_VIEW))
       tex_usage |= PIPE_BIND_SAMPLER_VIEW;
 
-   /* For NV12, see if we have support for sampling r8_b8g8 */
+   /* For NV12, see if we have support for sampling r8_g8b8 */
    if (!tex_usage && map->pipe_format == PIPE_FORMAT_NV12 &&
        pscreen->is_format_supported(pscreen, PIPE_FORMAT_R8_G8B8_420_UNORM,
                                     screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
@@ -967,11 +967,11 @@ dri2_create_image_from_winsys(__DRIscreen *_screen,
       tex_usage |= PIPE_BIND_SAMPLER_VIEW;
    }
 
-   /* For NV21, see if we have support for sampling g8_b8r8 */
+   /* For NV21, see if we have support for sampling r8_b8g8 */
    if (!tex_usage && map->pipe_format == PIPE_FORMAT_NV21 &&
-       pscreen->is_format_supported(pscreen, PIPE_FORMAT_G8_B8R8_420_UNORM,
+       pscreen->is_format_supported(pscreen, PIPE_FORMAT_R8_B8G8_420_UNORM,
                                     screen->target, 0, 0, PIPE_BIND_SAMPLER_VIEW)) {
-      map = &g8_b8r8_mapping;
+      map = &r8_b8g8_mapping;
       tex_usage |= PIPE_BIND_SAMPLER_VIEW;
    }
 
index c34d275..4cad8b0 100644 (file)
@@ -270,7 +270,7 @@ update_shader_samplers(struct st_context *st,
             break;
          FALLTHROUGH;
       case PIPE_FORMAT_NV21:
-         if (stObj->pt->format == PIPE_FORMAT_G8_B8R8_420_UNORM)
+         if (stObj->pt->format == PIPE_FORMAT_R8_B8G8_420_UNORM)
             /* no additional views needed */
             break;
          FALLTHROUGH;
index a923f05..6121e18 100644 (file)
@@ -187,7 +187,7 @@ st_get_sampler_views(struct st_context *st,
                pipe->create_sampler_view(pipe, stObj->pt->next, &tmpl);
          break;
       case PIPE_FORMAT_NV21:
-         if (stObj->pt->format == PIPE_FORMAT_G8_B8R8_420_UNORM)
+         if (stObj->pt->format == PIPE_FORMAT_R8_B8G8_420_UNORM)
             /* no additional views needed */
             break;
 
index 41ce901..e5054ab 100644 (file)
@@ -181,8 +181,8 @@ is_nv12_as_r8_g8b8_supported(struct pipe_screen *screen, struct st_egl_image *ou
    }
 
    if (out->format == PIPE_FORMAT_NV21 &&
-       out->texture->format == PIPE_FORMAT_G8_B8R8_420_UNORM &&
-       screen->is_format_supported(screen, PIPE_FORMAT_G8_B8R8_420_UNORM,
+       out->texture->format == PIPE_FORMAT_R8_B8G8_420_UNORM &&
+       screen->is_format_supported(screen, PIPE_FORMAT_R8_B8G8_420_UNORM,
                                    PIPE_TEXTURE_2D,
                                    out->texture->nr_samples,
                                    out->texture->nr_storage_samples,
@@ -366,10 +366,8 @@ st_bind_egl_image(struct gl_context *ctx,
       switch (stimg->format) {
       case PIPE_FORMAT_NV12:
       case PIPE_FORMAT_NV21:
-         if (stimg->texture->format == PIPE_FORMAT_R8_G8B8_420_UNORM) {
-            texFormat = MESA_FORMAT_R8G8B8X8_UNORM;
-            texObj->RequiredTextureImageUnits = 1;
-         } else if (stimg->texture->format == PIPE_FORMAT_G8_B8R8_420_UNORM) {
+         if (stimg->texture->format == PIPE_FORMAT_R8_G8B8_420_UNORM ||
+             stimg->texture->format == PIPE_FORMAT_R8_B8G8_420_UNORM) {
             texFormat = MESA_FORMAT_R8G8B8X8_UNORM;
             texObj->RequiredTextureImageUnits = 1;
          } else {
index 7028083..e212abc 100644 (file)
@@ -97,7 +97,7 @@ st_get_external_sampler_key(struct st_context *st, struct gl_program *prog)
          key.lower_nv12 |= (1 << unit);
          break;
       case PIPE_FORMAT_NV21:
-         if (stObj->pt->format == PIPE_FORMAT_G8_B8R8_420_UNORM) {
+         if (stObj->pt->format == PIPE_FORMAT_R8_B8G8_420_UNORM) {
             key.lower_yuv |= (1 << unit);
             break;
          }
index 7359009..0b7b57a 100644 (file)
@@ -387,8 +387,8 @@ st_get_sampler_view_format(const struct st_context *st,
       }
       FALLTHROUGH;
    case PIPE_FORMAT_NV21:
-      if (texObj->pt->format == PIPE_FORMAT_G8_B8R8_420_UNORM) {
-         format = PIPE_FORMAT_G8_B8R8_420_UNORM;
+      if (texObj->pt->format == PIPE_FORMAT_R8_B8G8_420_UNORM) {
+         format = PIPE_FORMAT_R8_B8G8_420_UNORM;
          break;
       }
       FALLTHROUGH;
index 00dc8a7..fb4d740 100644 (file)
@@ -193,7 +193,7 @@ const struct panfrost_format GENX(panfrost_pipe_format)[PIPE_FORMAT_COUNT] = {
    FMT_YUV(R8B8_R8G8_UNORM, YUYV8, VYUA, NO_SWAP, CO_SITED, _T__),
    FMT_YUV(B8R8_G8R8_UNORM, VYUY8, VUYA, SWAP,    CO_SITED, _T__),
    FMT_YUV(R8_G8B8_420_UNORM, Y8_UV8_420, YUVA, NO_SWAP, CO_SITED, _T__),
-   FMT_YUV(G8_B8R8_420_UNORM, Y8_UV8_420, YVUA, NO_SWAP, CO_SITED, _T__),
+   FMT_YUV(R8_B8G8_420_UNORM, Y8_UV8_420, YVUA, NO_SWAP, CO_SITED, _T__),
    FMT_YUV(R8_G8_B8_420_UNORM, Y8_U8_V8_420, YUVA, NO_SWAP, CO_SITED, _T__),
    FMT_YUV(R8_B8_G8_420_UNORM, Y8_U8_V8_420, YVUA, NO_SWAP, CO_SITED, _T__),
 #endif
index c82eeac..fca8110 100644 (file)
@@ -406,6 +406,7 @@ PIPE_FORMAT_Y8_400_UNORM          , other  , 1, 1, 1,  un8,     ,     ,     , x0
 # RGB version of NV12 and YV12 for hardware that supports sampling from
 # multiplane textures but needs color-space conversion in the shader.
 PIPE_FORMAT_R8_G8B8_420_UNORM     , planar2, 1, 1, 1,  un8,     ,     ,     , xyzw, rgb
+PIPE_FORMAT_R8_B8G8_420_UNORM     , planar2, 1, 1, 1,  un8,     ,     ,     , xyzw, rgb
 PIPE_FORMAT_G8_B8R8_420_UNORM     , planar2, 1, 1, 1,  un8,     ,     ,     , xyzw, rgb
 PIPE_FORMAT_R8_G8_B8_420_UNORM    , planar3, 1, 1, 1,  un8,     ,     ,     , xyzw, rgb
 PIPE_FORMAT_R8_B8_G8_420_UNORM    , planar3, 1, 1, 1,  un8,     ,     ,     , xyzw, rgb
index 1cd66a9..26b58ee 100644 (file)
@@ -113,6 +113,7 @@ def has_access(format):
         'y16_u16v16_422_unorm',
         'y16_u16_v16_444_unorm',
         'r8_g8b8_420_unorm',
+        'r8_b8g8_420_unorm',
         'g8_b8r8_420_unorm',
         'r8_g8_b8_420_unorm',
         'r8_b8_g8_420_unorm',
index f705d12..22fb414 100644 (file)
@@ -511,6 +511,7 @@ enum pipe_format {
    PIPE_FORMAT_XYUV,
 
    PIPE_FORMAT_R8_G8B8_420_UNORM,
+   PIPE_FORMAT_R8_B8G8_420_UNORM,
    PIPE_FORMAT_G8_B8R8_420_UNORM,
    PIPE_FORMAT_R8_G8_B8_420_UNORM,
    PIPE_FORMAT_R8_B8_G8_420_UNORM,