【问题标题】:Create Swap Chain Failed创建交换链失败
【发布时间】:2012-09-27 10:08:34
【问题描述】:

我正在关注 DX 示例和 MSDN 参考,但我现在碰壁了。

我从 D3D11CreateDeviceAndSwapChain() 获得 E_InvalidArg 的 HRESULT。 我知道这是我通过的 IDXGIAdapter,因为如果我将其更改为 null,它就会起作用。

我无法弄清楚我的初始化有什么问题。也许有更好知识的人知道我做错了什么。这里是:

变量:

vector<IDXGIAdapter1*> vAdapters;
IDXGIAdapter1* selectedVAdapter; // Constructor inits this to null

方法:

void refreshVideoAdapters(){
    IDXGIAdapter1* pAdapter;
    IDXGIFactory1* pFactory=NULL;

    uint lastID=0;
    if(selectedVAdapter){
        DXGI_ADAPTER_DESC1* desc=NULL;
        selectedVAdapter->GetDesc1(desc);
        lastID=desc->DeviceId;
        releaseVideoAdapter();
    }

    if(FAILED(CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&pFactory))) return;

    for(uint i=0; pFactory->EnumAdapters1(i, &pAdapter)!=DXGI_ERROR_NOT_FOUND; i++){
        vAdapters.push_back(pAdapter);

        if(lastID){
            DXGI_ADAPTER_DESC1* desc=NULL;
            pAdapter->GetDesc1(desc);
            if(lastID==desc->DeviceId){
                selectedVAdapter=pAdapter;
                lastID=0;
            }
        }
    }

    if(pFactory) pFactory->Release();
}
void releaseVideoAdapter(){
    for(uint i=0; i<vAdapters.size(); i++){
        vAdapters[i]->Release();
        vAdapters[i]=NULL;
    }
    vAdapters.clear();
    selectedVAdapter=NULL;
}
IDXGIAdapter1* getVideoAdapter(){return selectedVAdapter;}
bool setVideoAdapter(uint num=0){
    if(num<vAdapters.size()){
        selectedVAdapter=vAdapters[num];
        return 1;
    }
    return 0;
}

通话的相关部分:

       ...
    D3D_FEATURE_LEVEL featureLevels[]={
        D3D_FEATURE_LEVEL_11_0,
        D3D_FEATURE_LEVEL_10_1,
        D3D_FEATURE_LEVEL_9_3,
    };
    uint featuresSize=ARRAYSIZE(featureLevels);

    D3D_DRIVER_TYPE driverTypes[]={
        D3D_DRIVER_TYPE_HARDWARE,
        D3D_DRIVER_TYPE_WARP,
        D3D_DRIVER_TYPE_REFERENCE,
    };
    uint driversSize=ARRAYSIZE(driverTypes);

    refreshVideoAdapters();
    setVideoAdapter();

    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory( &sd, sizeof( sd ) );
    sd.BufferCount = 1;
    sd.BufferDesc.Width = 42;
    sd.BufferDesc.Height = 42;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    sd.OutputWindow = hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;

    HRESULT success=D3D11CreateDeviceAndSwapChain(
        selectedVAdapter, driver, NULL, flag, featureLevels, featuresSize, 
        D3D11_SDK_VERSION, &sd, &swapChain, &deviceInterface,
        &selectedFeatureLevel, &deviceContext);

       ...

【问题讨论】:

    标签: c++ directx


    【解决方案1】:

    您没有显示整个 D3D11CXreateDeviceAndSwapChain() 调用,所以我只能猜测 - 您是否注意到 the docs 中的那一段?

    如果将 pAdapter 参数设置为非 NULL 值,则还必须设置 DriverType D3D_DRIVER_TYPE_UNKNOWN 值的参数。如果将 pAdapter 参数设置为 D3D_DRIVER_TYPE_HARDWARE 值的非 NULL 值和 DriverType 参数, D3D11CreateDeviceAndSwapChain 返回 E_INVALIDARG 的 HRESULT。

    很容易被那个困住,因为“嘿,我希望设备使用硬件支持”:-)

    【讨论】:

    • 哦。我没看到那张纸条。这就是杀了我的原因。 :D 如果我理解正确,IDXGIAdapter 代表显卡,对吗?如果手动选择显卡,为什么驱动程序不设置为硬件?
    • 这可能是有原因的,但我仍然在努力解决所有其他问题,所以我从来没有真正关心过“do-s”背后的“why-s” :-) 事实上,“做”总是一件好事,考虑到这意味着我必须弄清楚的选择更少:-)
    猜你喜欢
    • 2012-06-29
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2022-12-03
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多