/*
* This file is part of libplacebo.
*
* libplacebo is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* libplacebo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with libplacebo. If not, see .
*/
#include
#include "utils.h"
// D3D11.3 message IDs, not present in mingw-w64 v9
#define D3D11_MESSAGE_ID_CREATE_FENCE (0x30020c)
#define D3D11_MESSAGE_ID_DESTROY_FENCE (0x30020a)
#ifdef PL_HAVE_DXGI_DEBUG
static enum pl_log_level log_level_override(unsigned int id)
{
switch (id) {
// These warnings can happen when a pl_timer is used too often before a
// blocking pl_swapchain_swap_buffers() or pl_gpu_finish(), overflowing
// its internal ring buffer and causing older query objects to be reused
// before their results are read. This is expected behavior, so reduce
// the log level to PL_LOG_TRACE to prevent log spam.
case D3D11_MESSAGE_ID_QUERY_BEGIN_ABANDONING_PREVIOUS_RESULTS:
case D3D11_MESSAGE_ID_QUERY_END_ABANDONING_PREVIOUS_RESULTS:
return PL_LOG_TRACE;
// D3D11 writes log messages every time an object is created or
// destroyed. That results in a lot of log spam, so force PL_LOG_TRACE.
#define OBJ_LIFETIME_MESSAGES(obj) \
case D3D11_MESSAGE_ID_CREATE_ ## obj: \
case D3D11_MESSAGE_ID_DESTROY_ ## obj
OBJ_LIFETIME_MESSAGES(CONTEXT):
OBJ_LIFETIME_MESSAGES(BUFFER):
OBJ_LIFETIME_MESSAGES(TEXTURE1D):
OBJ_LIFETIME_MESSAGES(TEXTURE2D):
OBJ_LIFETIME_MESSAGES(TEXTURE3D):
OBJ_LIFETIME_MESSAGES(SHADERRESOURCEVIEW):
OBJ_LIFETIME_MESSAGES(RENDERTARGETVIEW):
OBJ_LIFETIME_MESSAGES(DEPTHSTENCILVIEW):
OBJ_LIFETIME_MESSAGES(VERTEXSHADER):
OBJ_LIFETIME_MESSAGES(HULLSHADER):
OBJ_LIFETIME_MESSAGES(DOMAINSHADER):
OBJ_LIFETIME_MESSAGES(GEOMETRYSHADER):
OBJ_LIFETIME_MESSAGES(PIXELSHADER):
OBJ_LIFETIME_MESSAGES(INPUTLAYOUT):
OBJ_LIFETIME_MESSAGES(SAMPLER):
OBJ_LIFETIME_MESSAGES(BLENDSTATE):
OBJ_LIFETIME_MESSAGES(DEPTHSTENCILSTATE):
OBJ_LIFETIME_MESSAGES(RASTERIZERSTATE):
OBJ_LIFETIME_MESSAGES(QUERY):
OBJ_LIFETIME_MESSAGES(PREDICATE):
OBJ_LIFETIME_MESSAGES(COUNTER):
OBJ_LIFETIME_MESSAGES(COMMANDLIST):
OBJ_LIFETIME_MESSAGES(CLASSINSTANCE):
OBJ_LIFETIME_MESSAGES(CLASSLINKAGE):
OBJ_LIFETIME_MESSAGES(COMPUTESHADER):
OBJ_LIFETIME_MESSAGES(UNORDEREDACCESSVIEW):
OBJ_LIFETIME_MESSAGES(VIDEODECODER):
OBJ_LIFETIME_MESSAGES(VIDEOPROCESSORENUM):
OBJ_LIFETIME_MESSAGES(VIDEOPROCESSOR):
OBJ_LIFETIME_MESSAGES(DECODEROUTPUTVIEW):
OBJ_LIFETIME_MESSAGES(PROCESSORINPUTVIEW):
OBJ_LIFETIME_MESSAGES(PROCESSOROUTPUTVIEW):
OBJ_LIFETIME_MESSAGES(DEVICECONTEXTSTATE):
OBJ_LIFETIME_MESSAGES(FENCE):
return PL_LOG_TRACE;
#undef OBJ_LIFETIME_MESSAGES
// Don't force the log level of any other messages. It will be mapped
// from the D3D severity code instead.
default:
return PL_LOG_NONE;
}
}
#endif
void pl_d3d11_flush_message_queue(struct d3d11_ctx *ctx, const char *header)
{
#ifdef PL_HAVE_DXGI_DEBUG
if (!ctx->iqueue)
return;
static const enum pl_log_level severity_map[] = {
[DXGI_INFO_QUEUE_MESSAGE_SEVERITY_CORRUPTION] = PL_LOG_FATAL,
[DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR] = PL_LOG_ERR,
[DXGI_INFO_QUEUE_MESSAGE_SEVERITY_WARNING] = PL_LOG_WARN,
[DXGI_INFO_QUEUE_MESSAGE_SEVERITY_INFO] = PL_LOG_DEBUG,
[DXGI_INFO_QUEUE_MESSAGE_SEVERITY_MESSAGE] = PL_LOG_DEBUG,
};
enum pl_log_level header_printed = PL_LOG_NONE;
// After the storage limit is reached and ID3D11InfoQueue::ClearStoredMessages
// is called message counter seems to be initialized to -1 which is quite big
// number if we read it as uint64_t. Any subsequent call to the
// ID3D11InfoQueue::GetNumStoredMessages will be off by one.
// Use ID3D11InfoQueue_GetNumStoredMessagesAllowedByRetrievalFilter without
// any filter set, which seem to be unaffected by this bug and return correct
// number of messages.
// IDXGIInfoQueue seems to be unaffected, but keep the same way of retrival
uint64_t messages = IDXGIInfoQueue_GetNumStoredMessagesAllowedByRetrievalFilters(ctx->iqueue, DXGI_DEBUG_ALL);
// Just to be on the safe side, check also for the mentioned -1 value...
if (!messages || messages == UINT64_C(-1))
return;
uint64_t discarded =
IDXGIInfoQueue_GetNumMessagesDiscardedByMessageCountLimit(ctx->iqueue, DXGI_DEBUG_ALL);
if (discarded > ctx->last_discarded) {
PL_WARN(ctx, "%s:", header);
header_printed = PL_LOG_WARN;
// Notify number of messages skipped due to the message count limit
PL_WARN(ctx, " (skipped %"PRIu64" debug layer messages)",
discarded - ctx->last_discarded);
ctx->last_discarded = discarded;
}
// Copy debug layer messages to libplacebo's log output
for (uint64_t i = 0; i < messages; i++) {
SIZE_T len;
if (FAILED(IDXGIInfoQueue_GetMessage(ctx->iqueue, DXGI_DEBUG_ALL, i, NULL, &len)))
goto error;
pl_grow((void *) ctx->d3d11, &ctx->dxgi_msg, len);
DXGI_INFO_QUEUE_MESSAGE *dxgi_msg = ctx->dxgi_msg;
if (FAILED(IDXGIInfoQueue_GetMessage(ctx->iqueue, DXGI_DEBUG_ALL, i, dxgi_msg, &len)))
goto error;
enum pl_log_level level = PL_LOG_NONE;
if (IsEqualGUID(&dxgi_msg->Producer, &DXGI_DEBUG_D3D11))
level = log_level_override(dxgi_msg->ID);
if (level == PL_LOG_NONE)
level = severity_map[dxgi_msg->Severity];
if (pl_msg_test(ctx->log, level)) {
// If the header hasn't been printed, or it was printed for a lower
// log level than the current message, print it (again)
if (header_printed == PL_LOG_NONE || header_printed > level) {
PL_MSG(ctx, level, "%s:", header);
pl_log_stack_trace(ctx->log, level);
header_printed = level;
}
PL_MSG(ctx, level, " %d: %.*s", (int) dxgi_msg->ID,
(int) dxgi_msg->DescriptionByteLength, dxgi_msg->pDescription);
}
if (dxgi_msg->Severity <= DXGI_INFO_QUEUE_MESSAGE_SEVERITY_ERROR)
pl_debug_abort();
}
error:
IDXGIInfoQueue_ClearStoredMessages(ctx->iqueue, DXGI_DEBUG_ALL);
#endif
}
HRESULT pl_d3d11_check_device_removed(struct d3d11_ctx *ctx, HRESULT hr)
{
// This can be called before we have a device
if (!ctx->dev)
return hr;
switch (hr) {
case DXGI_ERROR_DEVICE_HUNG:
case DXGI_ERROR_DEVICE_RESET:
case DXGI_ERROR_DRIVER_INTERNAL_ERROR:
ctx->is_failed = true;
break;
case D3DDDIERR_DEVICEREMOVED:
case DXGI_ERROR_DEVICE_REMOVED:
hr = ID3D11Device_GetDeviceRemovedReason(ctx->dev);
ctx->is_failed = true;
break;
}
if (ctx->is_failed)
PL_ERR(ctx, "Device lost!");
return hr;
}
HRESULT pl_d3d11_after_error(struct d3d11_ctx *ctx, HRESULT hr)
{
hr = pl_d3d11_check_device_removed(ctx, hr);
pl_d3d11_flush_message_queue(ctx, "After error");
return hr;
}
struct dll_version pl_get_dll_version(const wchar_t *name)
{
void *data = NULL;
struct dll_version ret = {0};
DWORD size = GetFileVersionInfoSizeW(name, &(DWORD) {0});
if (!size)
goto error;
data = pl_alloc(NULL, size);
if (!GetFileVersionInfoW(name, 0, size, data))
goto error;
VS_FIXEDFILEINFO *ffi;
UINT ffi_len;
if (!VerQueryValueW(data, L"\\", (void**)&ffi, &ffi_len))
goto error;
if (ffi_len < sizeof(*ffi))
goto error;
ret = (struct dll_version) {
.major = HIWORD(ffi->dwFileVersionMS),
.minor = LOWORD(ffi->dwFileVersionMS),
.build = HIWORD(ffi->dwFileVersionLS),
.revision = LOWORD(ffi->dwFileVersionLS),
};
error:
pl_free(data);
return ret;
}
wchar_t *pl_from_utf8(void *ctx, const char *str)
{
int count = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
pl_assert(count > 0);
wchar_t *ret = pl_calloc_ptr(ctx, count, ret);
MultiByteToWideChar(CP_UTF8, 0, str, -1, ret, count);
return ret;
}
char *pl_to_utf8(void *ctx, const wchar_t *str)
{
int count = WideCharToMultiByte(CP_UTF8, 0, str, -1, NULL, 0, NULL, NULL);
pl_assert(count > 0);
char *ret = pl_calloc_ptr(ctx, count, ret);
WideCharToMultiByte(CP_UTF8, 0, str, -1, ret, count, NULL, NULL);
return ret;
}
static const char *hresult_str(HRESULT hr)
{
switch (hr) {
#define CASE(name) case name: return #name
CASE(S_OK);
CASE(S_FALSE);
CASE(E_ABORT);
CASE(E_ACCESSDENIED);
CASE(E_FAIL);
CASE(E_HANDLE);
CASE(E_INVALIDARG);
CASE(E_NOINTERFACE);
CASE(E_NOTIMPL);
CASE(E_OUTOFMEMORY);
CASE(E_POINTER);
CASE(E_UNEXPECTED);
CASE(DXGI_ERROR_ACCESS_DENIED);
CASE(DXGI_ERROR_ACCESS_LOST);
CASE(DXGI_ERROR_CANNOT_PROTECT_CONTENT);
CASE(DXGI_ERROR_DEVICE_HUNG);
CASE(DXGI_ERROR_DEVICE_REMOVED);
CASE(DXGI_ERROR_DEVICE_RESET);
CASE(DXGI_ERROR_DRIVER_INTERNAL_ERROR);
CASE(DXGI_ERROR_FRAME_STATISTICS_DISJOINT);
CASE(DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE);
CASE(DXGI_ERROR_INVALID_CALL);
CASE(DXGI_ERROR_MORE_DATA);
CASE(DXGI_ERROR_NAME_ALREADY_EXISTS);
CASE(DXGI_ERROR_NONEXCLUSIVE);
CASE(DXGI_ERROR_NOT_CURRENTLY_AVAILABLE);
CASE(DXGI_ERROR_NOT_FOUND);
CASE(DXGI_ERROR_REMOTE_CLIENT_DISCONNECTED);
CASE(DXGI_ERROR_REMOTE_OUTOFMEMORY);
CASE(DXGI_ERROR_RESTRICT_TO_OUTPUT_STALE);
CASE(DXGI_ERROR_SDK_COMPONENT_MISSING);
CASE(DXGI_ERROR_SESSION_DISCONNECTED);
CASE(DXGI_ERROR_UNSUPPORTED);
CASE(DXGI_ERROR_WAIT_TIMEOUT);
CASE(DXGI_ERROR_WAS_STILL_DRAWING);
#undef CASE
default:
return "Unknown error";
}
}
static char *format_error(void *ctx, DWORD error)
{
wchar_t *wstr;
if (!FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, error,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
(LPWSTR)&wstr, 0, NULL))
{
return NULL;
}
// Trim any trailing newline from the message
for (int i = wcslen(wstr) - 1; i >= 0; i--) {
if (wstr[i] != '\r' && wstr[i] != '\n') {
wstr[i + 1] = '\0';
break;
}
}
char *str = pl_to_utf8(ctx, wstr);
LocalFree(wstr);
return str;
}
char *pl_hresult_to_str_buf(char *buf, size_t buf_size, HRESULT hr)
{
char *fmsg = format_error(NULL, hr);
const char *code = hresult_str(hr);
if (fmsg) {
snprintf(buf, buf_size, "%s (%s, 0x%08lx)", fmsg, code, hr);
} else {
snprintf(buf, buf_size, "%s, 0x%08lx", code, hr);
}
pl_free(fmsg);
return buf;
}
#define D3D11_DXGI_ENUM(prefix, define) { case prefix ## define: return #define; }
const char *pl_get_dxgi_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);
}
return "";
}
const char *pl_get_dxgi_csp_name(DXGI_COLOR_SPACE_TYPE csp)
{
switch ((int) 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);
}
return "";
}