mirror of
https://github.com/mpv-player/mpv.git
synced 2025-12-27 05:10:20 +00:00
vo_gpu/d3d11: add helpers for getting names for DXGI formats & CSPs
Additionally, define the few enum values that are currently missing in mingw-w64 headers.
This commit is contained in:
@@ -63,6 +63,170 @@ static bool load_d3d11_functions(struct mp_log *log)
|
||||
return true;
|
||||
}
|
||||
|
||||
#define D3D11_DXGI_ENUM(prefix, define) { case prefix ## define: return #define; }
|
||||
|
||||
static const char *d3d11_get_format_name(DXGI_FORMAT fmt)
|
||||
{
|
||||
switch (fmt) {
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, UNKNOWN);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32A32_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32A32_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32A32_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32A32_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32B32_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16B16A16_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16B16A16_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16B16A16_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16B16A16_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16B16A16_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16B16A16_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G32_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32G8X24_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, D32_FLOAT_S8X24_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32_FLOAT_X8X24_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, X32_TYPELESS_G8X24_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R10G10B10A2_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R10G10B10A2_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R10G10B10A2_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R11G11B10_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8B8A8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8B8A8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8B8A8_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8B8A8_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8B8A8_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8B8A8_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16G16_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, D32_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R32_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R24G8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, D24_UNORM_S8_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R24_UNORM_X8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, X24_TYPELESS_G8_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16_FLOAT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, D16_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R16_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8_UINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8_SINT);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, A8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R1_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R9G9B9E5_SHAREDEXP);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R8G8_B8G8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, G8R8_G8B8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC1_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC1_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC1_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC2_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC2_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC2_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC3_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC3_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC3_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC4_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC4_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC4_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC5_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC5_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC5_SNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B5G6R5_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B5G5R5A1_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B8G8R8A8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B8G8R8X8_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, R10G10B10_XR_BIAS_A2_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B8G8R8A8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B8G8R8A8_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B8G8R8X8_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B8G8R8X8_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC6H_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC6H_UF16);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC6H_SF16);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC7_TYPELESS);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC7_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, BC7_UNORM_SRGB);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, AYUV);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, Y410);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, Y416);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, NV12);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, P010);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, P016);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, 420_OPAQUE);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, YUY2);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, Y210);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, Y216);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, NV11);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, AI44);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, IA44);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, P8);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, A8P8);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, B4G4R4A4_UNORM);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, P208);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, V208);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, V408);
|
||||
D3D11_DXGI_ENUM(DXGI_FORMAT_, FORCE_UINT);
|
||||
default:
|
||||
return "<Unknown>";
|
||||
}
|
||||
}
|
||||
|
||||
static const char *d3d11_get_csp_name(DXGI_COLOR_SPACE_TYPE csp)
|
||||
{
|
||||
switch (csp) {
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_FULL_G22_NONE_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_FULL_G10_NONE_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_STUDIO_G22_NONE_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_STUDIO_G22_NONE_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RESERVED);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_FULL_G22_NONE_P709_X601);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G22_LEFT_P601);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_FULL_G22_LEFT_P601);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G22_LEFT_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_FULL_G22_LEFT_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G22_LEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_FULL_G22_LEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_FULL_G2084_NONE_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G2084_LEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_STUDIO_G2084_NONE_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G22_TOPLEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G2084_TOPLEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_FULL_G22_NONE_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_GHLG_TOPLEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_FULL_GHLG_TOPLEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_STUDIO_G24_NONE_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, RGB_STUDIO_G24_NONE_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G24_LEFT_P709);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G24_LEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, YCBCR_STUDIO_G24_TOPLEFT_P2020);
|
||||
D3D11_DXGI_ENUM(DXGI_COLOR_SPACE_, CUSTOM);
|
||||
default:
|
||||
return "<Unknown>";
|
||||
}
|
||||
}
|
||||
|
||||
static bool query_output_format_and_colorspace(struct mp_log *log,
|
||||
IDXGISwapChain *swapchain,
|
||||
DXGI_FORMAT *out_fmt,
|
||||
@@ -104,11 +268,13 @@ static bool query_output_format_and_colorspace(struct mp_log *log,
|
||||
|
||||
monitor_name = mp_to_utf8(NULL, desc.DeviceName);
|
||||
|
||||
mp_verbose(log, "Queried output: %s, %ldx%ld @ %d bits, colorspace: %d\n",
|
||||
mp_verbose(log, "Queried output: %s, %ldx%ld @ %d bits, colorspace: %s (%d)\n",
|
||||
monitor_name,
|
||||
desc.DesktopCoordinates.right - desc.DesktopCoordinates.left,
|
||||
desc.DesktopCoordinates.bottom - desc.DesktopCoordinates.top,
|
||||
desc.BitsPerColor, desc.ColorSpace);
|
||||
desc.BitsPerColor,
|
||||
d3d11_get_csp_name(desc.ColorSpace),
|
||||
desc.ColorSpace);
|
||||
|
||||
*out_cspace = desc.ColorSpace;
|
||||
|
||||
@@ -499,6 +665,7 @@ static bool configure_created_swapchain(struct mp_log *log,
|
||||
DXGI_FORMAT probed_format = DXGI_FORMAT_UNKNOWN;
|
||||
DXGI_FORMAT selected_format = DXGI_FORMAT_UNKNOWN;
|
||||
DXGI_COLOR_SPACE_TYPE probed_colorspace;
|
||||
const char *format_name = NULL;
|
||||
|
||||
query_output_format_and_colorspace(log, swapchain,
|
||||
&probed_format,
|
||||
@@ -509,10 +676,11 @@ static bool configure_created_swapchain(struct mp_log *log,
|
||||
requested_format :
|
||||
(probed_format != DXGI_FORMAT_UNKNOWN ?
|
||||
probed_format : DXGI_FORMAT_R8G8B8A8_UNORM);
|
||||
format_name = d3d11_get_format_name(selected_format);
|
||||
|
||||
mp_verbose(log, "Selected swapchain format %d, attempting "
|
||||
mp_verbose(log, "Selected swapchain format %s (%d), attempting "
|
||||
"to utilize it.\n",
|
||||
selected_format);
|
||||
format_name, selected_format);
|
||||
|
||||
return update_swapchain_format(log, swapchain, selected_format);
|
||||
}
|
||||
|
||||
@@ -28,6 +28,12 @@
|
||||
#define D3D_FEATURE_LEVEL_12_0 (0xc000)
|
||||
#define D3D_FEATURE_LEVEL_12_1 (0xc100)
|
||||
|
||||
#define DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P709 ((DXGI_COLOR_SPACE_TYPE)20)
|
||||
#define DXGI_COLOR_SPACE_RGB_STUDIO_G24_NONE_P2020 ((DXGI_COLOR_SPACE_TYPE)21)
|
||||
#define DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P709 ((DXGI_COLOR_SPACE_TYPE)22)
|
||||
#define DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_LEFT_P2020 ((DXGI_COLOR_SPACE_TYPE)23)
|
||||
#define DXGI_COLOR_SPACE_YCBCR_STUDIO_G24_TOPLEFT_P2020 ((DXGI_COLOR_SPACE_TYPE)24)
|
||||
|
||||
struct d3d11_device_opts {
|
||||
// Enable the debug layer (D3D11_CREATE_DEVICE_DEBUG)
|
||||
bool debug;
|
||||
|
||||
Reference in New Issue
Block a user