使用 D3D11 为 ID3D11VideoDevice 查询接口花费太多时间

问题描述 投票:0回答:0

作为问题,我使用d3d11设备查询ID3D11VideoDevice ptr,但是这个查询花费了将近32秒。

成员介绍:

ID3D11Device* m_Device;
ID3D11DeviceContext* m_DeviceContext;
IDXGISwapChain1* m_SwapChain;
ID3D10Multithread* p_mt = nullptr;
ID3D11VideoDevice* d3d11_video_device_ = nullptr;
ID3D11VideoContext* d3d11_video_context_ = nullptr;

下面是Create Device、SwapChain和video_device查询的过程:

D3D_FEATURE_LEVEL feature_levels_in[] = { D3D_FEATURE_LEVEL_11_1, D3D_FEATURE_LEVEL_11_0,
                                          D3D_FEATURE_LEVEL_10_1 };
D3D_FEATURE_LEVEL feature_levels_out;
hr = D3D11CreateDevice(nullptr, D3D_DRIVER_TYPE_HARDWARE, nullptr,
                           creation_flags, feature_levels_in,
                           sizeof(feature_levels_in) / sizeof(D3D_FEATURE_LEVEL),
                           D3D11_SDK_VERSION, &m_Device, &feature_levels_out,
                           &m_DeviceContext);
if (FAILED(hr)) {
    return false;
}


// SwapChain
RECT WindowRect;
GetClientRect(m_WindowHandle, &WindowRect);
UINT window_width_ = WindowRect.right - WindowRect.left;
UINT window_height_ = WindowRect.bottom - WindowRect.top;

DXGI_SWAP_CHAIN_DESC1 desc;
ZeroMemory(&desc, sizeof(DXGI_SWAP_CHAIN_DESC1));
desc.BufferCount = 2;
desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
desc.Height = window_height_;
desc.Width = window_width_;
desc.Scaling = DXGI_SCALING_STRETCH;
desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
desc.SampleDesc.Count = 1;
desc.SampleDesc.Quality = 0;
desc.SwapEffect = DXGI_SWAP_EFFECT_FLIP_SEQUENTIAL;
desc.Stereo = false;
desc.AlphaMode = DXGI_ALPHA_MODE_IGNORE;

CComPtr<IDXGIDevice2> dxgi_device;
hr = m_Device->QueryInterface(__uuidof(IDXGIDevice1),
                                   (void**)&dxgi_device);
if (FAILED(hr)) {
    return false;
}

Microsoft::WRL::ComPtr<IDXGIAdapter> adapter = nullptr;
Microsoft::WRL::ComPtr<IDXGIFactory2> factory = nullptr;

hr = dxgi_device->GetAdapter(&adapter);
if (FAILED(hr)) {
    return false;
}

hr = adapter->GetParent(IID_PPV_ARGS(&factory));
if (FAILED(hr)) {
    return false;
}

hr = factory->CreateSwapChainForHwnd(m_Device, m_WindowHandle, &desc, nullptr, nullptr, &m_SwapChain);
if (FAILED(hr)) {
    std::string message = std::system_category().message(hr);
    return false;
}

p_mt->Enter();
if (!d3d11_video_device_) {
    // this query option cost nearly 32 secs
    //hr = m_Device->QueryInterface(__uuidof(ID3D11VideoDevice),
    //                              (void**)&d3d11_video_device_);
    hr = m_Device->QueryInterface(&d3d11_video_device_);
    if (FAILED(hr)) {
        return Return;
    }
}

if (!d3d11_video_context_) {
    hr = m_DeviceContext->QueryInterface(__uuidof(ID3D11VideoContext),
                                         (void**)&d3d11_video_context_);
    if (FAILED(hr)) {
        return Return;
    }
}

我尝试使用其他查询方式,失败;

我想知道为什么这个查询过程耗时太多,如何减少?

c++ windows direct3d direct3d11 direct3d9
© www.soinside.com 2019 - 2024. All rights reserved.