DirectX 11 IDXGISwapChain :: GetBuffer失败,带有DXGI_ERROR_INVALID_CALL

时间:2014-04-24 21:47:51

标签: c++ directx-11 managed-c++

我在DirectX11中创建设备和交换链,然后尝试获取后端缓冲区的纹理。创建步骤似乎有效但GetBuffer调用总是失败,错误DXGI_ERROR_INVALID_CALL(887a0001),无论我做什么。 以下是创建设备的代码:

    D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, D3D_FEATURE_LEVEL_9_1 };
    int numFeatureLevels = sizeof(featureLevels) / sizeof(featureLevels[0]);
    DXGI_SWAP_CHAIN_DESC swapChainDesc;
    ID3D11Device* pDevice;
    IDXGISwapChain* pSwapChain;
    D3D_FEATURE_LEVEL featureLevel;
    ID3D11DeviceContext* pContext;

    swapChainDesc.Windowed = TRUE;
    swapChainDesc.OutputWindow = (HWND)(void*)pWindowHandle;
    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_SEQUENTIAL;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.BufferCount = 2;
    swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    swapChainDesc.BufferDesc.Width = 0;
    swapChainDesc.BufferDesc.Height = 0;
    swapChainDesc.BufferDesc.RefreshRate.Numerator = 1;
    swapChainDesc.BufferDesc.RefreshRate.Denominator = 60;
    swapChainDesc.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
    swapChainDesc.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    swapChainDesc.BufferUsage = DXGI_USAGE_SHADER_INPUT|DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDesc.Flags = 0;

    err = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_DEBUG, featureLevels, numFeatureLevels, D3D11_SDK_VERSION,
        &swapChainDesc, &pSwapChain, &pDevice, &featureLevel, &pContext);

    if (!SUCCEEDED(err))
    {
        printf("D3D11CreateDeviceAndSwapChain failed with error %08x\n", err);
        return false;
    }

    m_pDevice = pDevice;
    m_pSwapChain = pSwapChain;
    m_pDeviceContext = pContext;
    m_featureLevel = featureLevel;

    ID3D11Texture2D* pTex = NULL;
    err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);
    if (!SUCCEEDED(err))
    {
        printf("GetBuffer failed with error %08x\n", err);
        return false;
    }

这是托管C ++,它被编译成DLL并从C#控件的OnCreateControl方法运行,该方法将Handle作为pWindowHandle传递给函数。

创建设备调用成功,给我FEATURE_LEVEL_11_0,但第二个printf函数始终打印错误887a0001。使用参考设备没有帮助。我链接到d3dx11.lib,d3d11.lib,dxgi.lib,dxguid.lib,d3dcompiler.lib,d3d10.lib和d3dx10.lib。 我尝试用IID_ID3D11Texture2D替换__uuidof并没有区别。 我在Windows 7和Microsoft DirectX SDK(2010年6月)上使用Visual Studio Express 2013 for Windows Desktop。所有x86和x64,调试和发布版本都存在同样的问题。我尝试启用详细调试输出也会失败;我试图通过控制面板中的DirectX属性强制它,将我的程序添加到可执行文件列表中,但在运行时没有打印任何额外的内容。

1 个答案:

答案 0 :(得分:1)

您刚刚错误地传递了最终参数。而不是:

err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)pTex);

您应该将指针传递给接口指针,如下所示:

err = m_pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&pTex);
                                                                    ^
                                                                    |