diff --git a/src/gallium/drivers/d3d12/d3d12_format.c b/src/gallium/drivers/d3d12/d3d12_format.c index 60a47215b14..ff11cab1b49 100644 --- a/src/gallium/drivers/d3d12/d3d12_format.c +++ b/src/gallium/drivers/d3d12/d3d12_format.c @@ -28,12 +28,20 @@ #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(BITS1, TYPE1, BITS2, TYPE2) \ +#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) \ + 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(FMT, SNORM) @@ -107,7 +115,7 @@ 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) \ @@ -121,14 +129,14 @@ 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,12 +166,39 @@ 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) { return formats[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) { diff --git a/src/gallium/drivers/d3d12/d3d12_format.h b/src/gallium/drivers/d3d12/d3d12_format.h index 962335731a5..ace42ad914d 100644 --- a/src/gallium/drivers/d3d12/d3d12_format.h +++ b/src/gallium/drivers/d3d12/d3d12_format.h @@ -36,6 +36,9 @@ extern "C" { 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);