diff --git a/libobs-d3d11/d3d11-subsystem.cpp b/libobs-d3d11/d3d11-subsystem.cpp index 7c4024d69..c224e7f4d 100644 --- a/libobs-d3d11/d3d11-subsystem.cpp +++ b/libobs-d3d11/d3d11-subsystem.cpp @@ -18,6 +18,8 @@ #include #include #include +#include +#include #include #include "d3d11-subsystem.hpp" @@ -227,6 +229,21 @@ const static D3D_FEATURE_LEVEL featureLevels[] = D3D_FEATURE_LEVEL_9_3, }; +static const char *blacklisted_nv12_geforce_gpus[] = { + "8100", + "8200", + "8300", + "8400", + "8500", + "8600", + "8800", + "9300", + "9400", + "9500", + "9600", + "9800" +}; + void gs_device::InitDevice(uint32_t adapterIdx) { wstring adapterName; @@ -244,11 +261,10 @@ void gs_device::InitDevice(uint32_t adapterIdx) adapterName = (adapter->GetDesc(&desc) == S_OK) ? desc.Description : L""; - char *adapterNameUTF8; + BPtr adapterNameUTF8; os_wcs_to_utf8_ptr(adapterName.c_str(), 0, &adapterNameUTF8); blog(LOG_INFO, "Loading up D3D11 on adapter %s (%" PRIu32 ")", - adapterNameUTF8, adapterIdx); - bfree(adapterNameUTF8); + adapterNameUTF8.Get(), adapterIdx); hr = D3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, createFlags, featureLevels, @@ -266,6 +282,15 @@ void gs_device::InitDevice(uint32_t adapterIdx) nv12Supported = false; + /* don't use on blacklisted adapters */ + if (astrstri(adapterNameUTF8, "geforce") != nullptr) { + for (const char *old_gpu : blacklisted_nv12_geforce_gpus) { + if (astrstri(adapterNameUTF8, old_gpu) != nullptr) { + return; + } + } + } + ComQIPtr d3d11_1(device); if (!d3d11_1) { return;