obs-qsv11: Set preference for encode to iGPU in case of i+i

This commit is contained in:
cmlin2 2020-05-29 19:30:39 -07:00 committed by jp9000
parent f6043061c0
commit 477199ef2c
3 changed files with 84 additions and 0 deletions

View File

@ -63,6 +63,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <string>
#include <atomic>
#include <intrin.h>
#include <d3d11.h>
#include <dxgi1_2.h>
#define do_log(level, format, ...) \
blog(level, "[qsv encoder: '%s'] " format, "msdk_impl", ##__VA_ARGS__)
@ -71,6 +73,74 @@ mfxIMPL impl = MFX_IMPL_HARDWARE_ANY;
mfxVersion ver = {{0, 1}}; // for backward compatibility
std::atomic<bool> is_active{false};
bool prefer_igpu_enc(int *iGPUIndex)
{
IDXGIAdapter *pAdapter;
int adapterIndex = 0;
bool hasIGPU = false;
bool hasDGPU = false;
bool isDG1Primary = false;
HMODULE hDXGI = LoadLibrary(L"dxgi.dll");
if (hDXGI == NULL) {
return false;
}
typedef HRESULT(WINAPI * LPCREATEDXGIFACTORY)(REFIID riid,
void **ppFactory);
LPCREATEDXGIFACTORY pCreateDXGIFactory =
(LPCREATEDXGIFACTORY)GetProcAddress(hDXGI,
"CreateDXGIFactory1");
if (pCreateDXGIFactory == NULL) {
pCreateDXGIFactory = (LPCREATEDXGIFACTORY)GetProcAddress(
hDXGI, "CreateDXGIFactory");
if (pCreateDXGIFactory == NULL) {
FreeLibrary(hDXGI);
return false;
}
}
IDXGIFactory *pFactory = NULL;
if (FAILED((*pCreateDXGIFactory)(__uuidof(IDXGIFactory),
(void **)(&pFactory)))) {
FreeLibrary(hDXGI);
return false;
}
while (SUCCEEDED(pFactory->EnumAdapters(adapterIndex, &pAdapter))) {
DXGI_ADAPTER_DESC AdapterDesc = {};
if (SUCCEEDED(pAdapter->GetDesc(&AdapterDesc))) {
if (AdapterDesc.VendorId == 0x8086) {
if (AdapterDesc.DedicatedVideoMemory <=
512 * 1024 * 1024) {
hasIGPU = true;
if (iGPUIndex != NULL) {
*iGPUIndex = adapterIndex;
}
} else {
hasDGPU = true;
}
if ((AdapterDesc.DeviceId == 0x4905) ||
(AdapterDesc.DeviceId == 0x4906) ||
(AdapterDesc.DeviceId == 0x4907)) {
if (adapterIndex == 0) {
isDG1Primary = true;
}
}
}
}
adapterIndex++;
pAdapter->Release();
}
pFactory->Release();
FreeLibrary(hDXGI);
return hasIGPU && hasDGPU && isDG1Primary;
}
void qsv_encoder_version(unsigned short *major, unsigned short *minor)
{
*major = ver.Major;
@ -79,6 +149,13 @@ void qsv_encoder_version(unsigned short *major, unsigned short *minor)
qsv_t *qsv_encoder_open(qsv_param_t *pParams)
{
mfxIMPL impl_list[4] = {MFX_IMPL_HARDWARE, MFX_IMPL_HARDWARE2,
MFX_IMPL_HARDWARE3, MFX_IMPL_HARDWARE4};
int igpu_index = -1;
if (prefer_igpu_enc(&igpu_index)) {
impl = impl_list[igpu_index];
}
QSV_Encoder_Internal *pEncoder = new QSV_Encoder_Internal(impl, ver);
mfxStatus sts = pEncoder->Open(pParams);
if (sts != MFX_ERR_NONE) {

View File

@ -136,6 +136,7 @@ int qsv_encoder_encode_tex(qsv_t *, uint64_t, uint32_t, uint64_t, uint64_t *,
int qsv_encoder_headers(qsv_t *, uint8_t **pSPS, uint8_t **pPPS,
uint16_t *pnSPS, uint16_t *pnPPS);
enum qsv_cpu_platform qsv_get_cpu_platform();
bool prefer_igpu_enc(int *iGPUIndex);
#ifdef __cplusplus
}

View File

@ -666,6 +666,12 @@ static void *obs_qsv_create_tex(obs_data_t *settings, obs_encoder_t *encoder)
return obs_encoder_create_rerouted(encoder, "obs_qsv11_soft");
}
if (prefer_igpu_enc(NULL)) {
blog(LOG_INFO,
">>> prefer iGPU encoding, fall back to old qsv encoder");
return obs_encoder_create_rerouted(encoder, "obs_qsv11_soft");
}
blog(LOG_INFO, ">>> new qsv encoder");
return obs_qsv_create(settings, encoder);
}