d3d12: Generate a pipe format -> typeless mapping table too
authorJesse Natalie <jenatali@microsoft.com>
Wed, 17 Nov 2021 23:41:39 +0000 (15:41 -0800)
committerMarge Bot <emma+marge@anholt.net>
Fri, 19 Nov 2021 22:54:46 +0000 (22:54 +0000)
Reviewed-by: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13054>

src/gallium/drivers/d3d12/d3d12_format.c
src/gallium/drivers/d3d12/d3d12_format.h

index 60a4721..ff11cab 100644 (file)
 #include "util/u_math.h"
 #include "util/compiler.h"
 
-#define MAP_FORMAT(BITS, TYPE) \
+#define MAP_FORMAT_NO_TYPELESS(BITS, TYPE) \
    [PIPE_FORMAT_ ## BITS ## _ ## TYPE] = DXGI_FORMAT_ ## BITS ## _ ## TYPE,
+#define MAP_FORMAT2_NO_TYPELESS(BITS1, TYPE1, BITS2, TYPE2) \
+   [PIPE_FORMAT_ ## BITS1 ## _ ## TYPE1] = DXGI_FORMAT_ ## BITS2 ## _ ## TYPE2,
 
+#define MAP_FORMAT(BITS, TYPE) MAP_FORMAT_NO_TYPELESS(BITS, TYPE)
 #define MAP_FORMAT2(BITS1, TYPE1, BITS2, TYPE2) \
-   [PIPE_FORMAT_ ## BITS1 ## _ ## TYPE1] = DXGI_FORMAT_ ## BITS2 ## _ ## TYPE2,
+   MAP_FORMAT2_NO_TYPELESS(BITS1, TYPE1, BITS2, TYPE2)
+
+#define MAP_FORMAT_CUSTOM_TYPELESS(BITS, TYPE, TYPELESS_BITS) \
+   MAP_FORMAT(BITS, TYPE)
+#define MAP_FORMAT2_CUSTOM_TYPELESS(BITS1, TYPE1, BITS2, TYPE2) \
+   MAP_FORMAT2(BITS1, TYPE1, BITS2, TYPE2)
 
 #define MAP_FORMAT_NORM(FMT) \
    MAP_FORMAT(FMT, UNORM) \
    MAP_FORMAT_INT(R16G16B16A16) \
    MAP_FORMAT_FLOAT(R16G16B16A16) \
 \
-   MAP_FORMAT(A8, UNORM) \
+   MAP_FORMAT_CUSTOM_TYPELESS(A8, UNORM, R8) \
    MAP_EMU_FORMAT_NO_ALPHA(8, UNORM) \
    MAP_EMU_FORMAT(8, SNORM) \
    MAP_EMU_FORMAT(8, SINT) \
    MAP_EMU_FORMAT(32, UINT) \
    MAP_EMU_FORMAT(32, FLOAT) \
 \
-   MAP_FORMAT2(R9G9B9E5, FLOAT, R9G9B9E5, SHAREDEXP) \
-   MAP_FORMAT(R11G11B10, FLOAT) \
-   MAP_FORMAT(R10G10B10A2, UINT) \
-   MAP_FORMAT(R10G10B10A2, UNORM) \
+   MAP_FORMAT2_NO_TYPELESS(R9G9B9E5, FLOAT, R9G9B9E5, SHAREDEXP) \
+   MAP_FORMAT_NO_TYPELESS(R11G11B10, FLOAT) \
+   MAP_FORMAT_NO_TYPELESS(R10G10B10A2, UINT) \
+   MAP_FORMAT_NO_TYPELESS(R10G10B10A2, UNORM) \
 \
-   MAP_FORMAT(B5G6R5, UNORM) \
-   MAP_FORMAT(B5G5R5A1, UNORM) \
-   MAP_FORMAT2(B5G5R5X1, UNORM, B5G5R5A1, UNORM) \
+   MAP_FORMAT_NO_TYPELESS(B5G6R5, UNORM) \
+   MAP_FORMAT_NO_TYPELESS(B5G5R5A1, UNORM) \
+   MAP_FORMAT2_NO_TYPELESS(B5G5R5X1, UNORM, B5G5R5A1, UNORM) \
 \
    MAP_FORMAT2(DXT1, RGB, BC1, UNORM) \
    MAP_FORMAT2(DXT1, RGBA, BC1, UNORM) \
@@ -158,6 +166,27 @@ static const DXGI_FORMAT formats[PIPE_FORMAT_COUNT] = {
    FORMAT_TABLE()
 };
 
+#undef MAP_FORMAT
+#undef MAP_FORMAT2
+#undef MAP_FORMAT_CUSTOM_TYPELESS
+#undef MAP_FORMAT2_CUSTOM_TYPELESS
+
+#define MAP_FORMAT(BITS, TYPE) \
+   [PIPE_FORMAT_ ## BITS ## _ ## TYPE] = DXGI_FORMAT_ ## BITS ## _TYPELESS,
+
+#define MAP_FORMAT2(BITS1, TYPE1, BITS2, TYPE2) \
+   [PIPE_FORMAT_ ## BITS1 ## _ ## TYPE1] = DXGI_FORMAT_ ## BITS2 ## _TYPELESS,
+
+#define MAP_FORMAT_CUSTOM_TYPELESS(BITS1, TYPE, BITS2) \
+   MAP_FORMAT2(BITS1, TYPE, BITS2, TYPELESS)
+
+#define MAP_FORMAT2_CUSTOM_TYPELESS(BITS1, TYPE1, BITS2, TYPE2) \
+   MAP_FORMAT2(BITS1, TYPE1, BITS2, TYPELESS)
+
+static const DXGI_FORMAT typeless_formats[PIPE_FORMAT_COUNT] = {
+   FORMAT_TABLE()
+};
+
 DXGI_FORMAT
 d3d12_get_format(enum pipe_format format)
 {
@@ -165,6 +194,12 @@ d3d12_get_format(enum pipe_format format)
 }
 
 DXGI_FORMAT
+d3d12_get_typeless_format(enum pipe_format format)
+{
+   return typeless_formats[format];
+}
+
+DXGI_FORMAT
 d3d12_get_resource_rt_format(enum pipe_format f)
 {
    switch (f) {
index 9623357..ace42ad 100644 (file)
@@ -37,6 +37,9 @@ DXGI_FORMAT
 d3d12_get_format(enum pipe_format format);
 
 DXGI_FORMAT
+d3d12_get_typeless_format(enum pipe_format format);
+
+DXGI_FORMAT
 d3d12_get_resource_srv_format(enum pipe_format f, enum pipe_texture_target target);
 
 DXGI_FORMAT