gallivm: Support G8B8_G8R8_422_UNORM and B8G8_R8G8_422_UNORM
authorFaith Ekstrand <faith.ekstrand@collabora.com>
Thu, 10 Aug 2023 21:24:08 +0000 (16:24 -0500)
committerMarge Bot <emma+marge@anholt.net>
Mon, 14 Aug 2023 23:44:19 +0000 (23:44 +0000)
Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24619>

src/gallium/auxiliary/gallivm/lp_bld_format_yuv.c
src/gallium/auxiliary/gallivm/lp_bld_sample_soa.c

index b47972a..bd6091b 100644 (file)
@@ -526,6 +526,42 @@ rgrb_to_rgba_aos(struct gallivm_state *gallivm,
 }
 
 /**
+ * Convert from <n x i32> packed GB_GR to <4n x i8> RGBA AoS
+ */
+static LLVMValueRef
+gbgr_to_rgba_aos(struct gallivm_state *gallivm,
+                 unsigned n,
+                 LLVMValueRef packed,
+                 LLVMValueRef i)
+{
+   LLVMValueRef r, g, b;
+   LLVMValueRef rgba;
+
+   yuyv_to_yuv_soa(gallivm, n, packed, i, &g, &b, &r);
+   rgba = rgb_to_rgba_aos(gallivm, n, r, g, b);
+
+   return rgba;
+}
+
+/**
+ * Convert from <n x i32> packed BG_RG to <4n x i8> RGBA AoS
+ */
+static LLVMValueRef
+bgrg_to_rgba_aos(struct gallivm_state *gallivm,
+                 unsigned n,
+                 LLVMValueRef packed,
+                 LLVMValueRef i)
+{
+   LLVMValueRef r, g, b;
+   LLVMValueRef rgba;
+
+   uyvy_to_yuv_soa(gallivm, n, packed, i, &g, &b, &r);
+   rgba = rgb_to_rgba_aos(gallivm, n, r, g, b);
+
+   return rgba;
+}
+
+/**
  * @param n  is the number of pixels processed
  * @param packed  is a <n x i32> vector with the packed YUYV blocks
  * @param i  is a <n x i32> vector with the x pixel coordinate (0 or 1)
@@ -579,6 +615,12 @@ lp_build_fetch_subsampled_rgba_aos(struct gallivm_state *gallivm,
    case PIPE_FORMAT_R8G8_R8B8_UNORM:
       rgba = rgrb_to_rgba_aos(gallivm, n, packed, i);
       break;
+   case PIPE_FORMAT_G8B8_G8R8_UNORM:
+      rgba = gbgr_to_rgba_aos(gallivm, n, packed, i);
+      break;
+   case PIPE_FORMAT_B8G8_R8G8_UNORM:
+      rgba = bgrg_to_rgba_aos(gallivm, n, packed, i);
+      break;
    default:
       assert(0);
       rgba =  LLVMGetUndef(LLVMVectorType(LLVMInt8TypeInContext(gallivm->context), 4*n));
index d512c96..28c498c 100644 (file)
@@ -2877,6 +2877,8 @@ lp_build_clamp_border_color(struct lp_build_sample_context *bld,
          case PIPE_FORMAT_G8R8_G8B8_UNORM:
          case PIPE_FORMAT_G8R8_B8R8_UNORM:
          case PIPE_FORMAT_R8G8_R8B8_UNORM:
+         case PIPE_FORMAT_G8B8_G8R8_UNORM:
+         case PIPE_FORMAT_B8G8_R8G8_UNORM:
          case PIPE_FORMAT_R1_UNORM: /* doesn't make sense but ah well */
             min_clamp = vec4_bld.zero;
             max_clamp = vec4_bld.one;