On Di, 2023-11-28 at 12:42 +0800, Xiang, Haihao wrote: > From: Artem Galin <artem.ga...@intel.com> > > User may choose the hardware via option vendor_id when multiple > hardwares are available. > > Signed-off-by: Artem Galin <artem.ga...@intel.com> > Signed-off-by: Haihao Xiang <haihao.xi...@intel.com> > --- > libavutil/hwcontext_d3d11va.c | 59 ++++++++++++++++++++++++++++++++++- > 1 file changed, 58 insertions(+), 1 deletion(-) > > diff --git a/libavutil/hwcontext_d3d11va.c b/libavutil/hwcontext_d3d11va.c > index cc8c97d2b6..2fd3561c88 100644 > --- a/libavutil/hwcontext_d3d11va.c > +++ b/libavutil/hwcontext_d3d11va.c > @@ -552,6 +552,47 @@ static void d3d11va_device_uninit(AVHWDeviceContext > *hwdev) > } > } > > +static int d3d11va_device_find_adapter_by_vendor_id(AVHWDeviceContext *ctx, > uint32_t flags, const char *vendor_id) > +{ > + HRESULT hr; > + IDXGIAdapter *adapter = NULL; > + IDXGIFactory2 *factory; > + int adapter_id = 0; > + long int id = strtol(vendor_id, NULL, 0); > + > + hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&factory); > + if (FAILED(hr)) { > + av_log(ctx, AV_LOG_ERROR, "CreateDXGIFactory returned error\n"); > + return -1; > + } > + > + while (IDXGIFactory2_EnumAdapters(factory, adapter_id++, &adapter) != > DXGI_ERROR_NOT_FOUND) { > + ID3D11Device* device = NULL; > + DXGI_ADAPTER_DESC adapter_desc; > + > + hr = mD3D11CreateDevice(adapter, D3D_DRIVER_TYPE_UNKNOWN, NULL, > flags, NULL, 0, D3D11_SDK_VERSION, &device, NULL, NULL); > + if (FAILED(hr)) { > + av_log(ctx, AV_LOG_DEBUG, "D3D11CreateDevice returned error, try > next adapter\n"); > + IDXGIAdapter_Release(adapter); > + continue; > + } > + > + hr = IDXGIAdapter2_GetDesc(adapter, &adapter_desc); > + ID3D11Device_Release(device); > + IDXGIAdapter_Release(adapter); > + if (FAILED(hr)) { > + av_log(ctx, AV_LOG_DEBUG, "IDXGIAdapter2_GetDesc returned error, > try next adapter\n"); > + continue; > + } else if (adapter_desc.VendorId == id) { > + IDXGIFactory2_Release(factory); > + return adapter_id - 1; > + } > + } > + > + IDXGIFactory2_Release(factory); > + return -1; > +} > + > static int d3d11va_device_create(AVHWDeviceContext *ctx, const char *device, > AVDictionary *opts, int flags) > { > @@ -563,6 +604,7 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, > const char *device, > UINT creationFlags = D3D11_CREATE_DEVICE_VIDEO_SUPPORT; > int is_debug = !!av_dict_get(opts, "debug", NULL, 0); > int ret; > + int adapter = -1; > > // (On UWP we can't check this.) > #if !HAVE_UWP > @@ -581,10 +623,25 @@ static int d3d11va_device_create(AVHWDeviceContext *ctx, > const char *device, > } > > if (device) { > + adapter = atoi(device); > + } else { > + AVDictionaryEntry *e = av_dict_get(opts, "vendor_id", NULL, 0); > + if (e && e->value) { > + adapter = d3d11va_device_find_adapter_by_vendor_id(ctx, > creationFlags, e->value); > + if (adapter < 0) { > + av_log(ctx, AV_LOG_ERROR, "Failed to find d3d11va adapter by > " > + "vendor id %s\n", e->value); > + return AVERROR_UNKNOWN; > + } > + } > + } > + > + if (adapter >= 0) { > IDXGIFactory2 *pDXGIFactory; > + > + av_log(ctx, AV_LOG_VERBOSE, "Selecting d3d11va adapter %d\n", > adapter); > hr = mCreateDXGIFactory(&IID_IDXGIFactory2, (void **)&pDXGIFactory); > if (SUCCEEDED(hr)) { > - int adapter = atoi(device); > if (FAILED(IDXGIFactory2_EnumAdapters(pDXGIFactory, adapter, > &pAdapter))) > pAdapter = NULL; > IDXGIFactory2_Release(pDXGIFactory);
I'll merge this patchset if there are no more comments for v2 Thanks Haihao _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".