首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectCompute CreateBuffer失败,错误为0x80070057 (E_INVALIDARG)

DirectCompute CreateBuffer失败,错误为0x80070057 (E_INVALIDARG)
EN

Stack Overflow用户
提问于 2019-08-06 13:07:57
回答 1查看 1.4K关注 0票数 2

我试图在GPU内存中创建一个缓冲区来从CPU上传数据。GPU访问将是只读的。数据将用作计算机着色器的输入缓冲区。

CreateBuffer()失败,错误为0x80070057 (E_INVALIDARG)。我读了这些文档,然后再读一遍,没有发现是哪个参数导致了失败。

下面是我的代码中的一个摘录,其中我标记了失败:

代码语言:javascript
复制
    HRESULT hr = S_OK;

    RECT rc;
    GetClientRect( g_hWnd, &rc );
    UINT width = rc.right - rc.left;
    UINT height = rc.bottom - rc.top;

    UINT createDeviceFlags = 0;
#ifdef _DEBUG
    createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG;
#endif

    D3D_DRIVER_TYPE driverTypes[] =
    {
#ifdef WARP
      D3D_DRIVER_TYPE_REFERENCE,
#else
      D3D_DRIVER_TYPE_HARDWARE,        
#endif
    };
    UINT numDriverTypes = sizeof( driverTypes ) / sizeof( driverTypes[0] );

    DXGI_SWAP_CHAIN_DESC sd;
    ZeroMemory( &sd, sizeof( sd ) );
    sd.BufferCount = 1;
    sd.BufferDesc.Width = width;
    sd.BufferDesc.Height = height;
    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    sd.BufferDesc.RefreshRate.Numerator = 60;
    sd.BufferDesc.RefreshRate.Denominator = 1;
    sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT | DXGI_USAGE_UNORDERED_ACCESS | DXGI_USAGE_SHADER_INPUT;
    sd.OutputWindow = g_hWnd;
    sd.SampleDesc.Count = 1;
    sd.SampleDesc.Quality = 0;
    sd.Windowed = TRUE;


    D3D_FEATURE_LEVEL FeatureLevels =   D3D_FEATURE_LEVEL_11_0;

    for( UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++ )
    {
        g_driverType = driverTypes[driverTypeIndex];
        hr = D3D11CreateDeviceAndSwapChain( NULL, g_driverType, NULL, createDeviceFlags, &FeatureLevels,1,
                                            D3D11_SDK_VERSION, &sd, &g_pSwapChain, &g_pd3dDevice, NULL, &g_pImmediateContext );
        if( SUCCEEDED( hr ) )
            break;
    }
    if( FAILED( hr ) )
        return hr;


    // check if GPU supports doubles
    D3D11_FEATURE_DATA_DOUBLES fdDoubleSupport;
    g_pd3dDevice->CheckFeatureSupport( D3D11_FEATURE_DOUBLES, &fdDoubleSupport, sizeof(fdDoubleSupport) );
    GPUcanDoDoubles = fdDoubleSupport.DoublePrecisionFloatShaderOps;


    D3D11_BUFFER_DESC desc;
    BYTE Data[200];
    D3D11_SUBRESOURCE_DATA InitData;
    desc.BindFlags           = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE;
    desc.Usage               = D3D11_USAGE_DYNAMIC;
    desc.CPUAccessFlags      = D3D11_CPU_ACCESS_WRITE;
    desc.ByteWidth           = 200;
    desc.MiscFlags           = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED;
    desc.StructureByteStride = 2;
    InitData.pSysMem = Data;
    hr = g_pd3dDevice->CreateBuffer(&desc, &InitData, &g_pcbFractal);    // <== E_INVALIARG here

    // Create constant buffer
    D3D11_BUFFER_DESC Desc;
    Desc.Usage = D3D11_USAGE_DYNAMIC;
    Desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;
    Desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
    Desc.MiscFlags = 0;
    Desc.ByteWidth = ((( (GPUcanDoDoubles) ? sizeof(MandelConstantsDoubles) : sizeof(MandelConstantsNoDoubles) ) + 15)/16)*16; // must be multiple of 16 bytes
    hr = g_pd3dDevice->CreateBuffer( &Desc, NULL, &g_pcbFractal);        // This one succeed

任何帮助都很感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 23:36:24

启用Direct3D 11设备调试并查看调试输出窗口可以回答您的问题:

D3D11错误: ID3D11Device::CreateBuffer:当使用指定的MiscFlag D3D11_RESOURCE_MISC_BUFFER_STRUCTURED创建缓冲区时,StructureByteStride必须大于零,不大于2048年,倍数为4。STATE_CREATION错误#2097339: CREATEBUFFER_INVALIDSTRUCTURESTRIDE

如果你解决了这个问题,你会得到:

D3D11错误: ID3D11Device::CreateBuffer: D3D11_USAGE_DYNAMIC资源不能绑定到图形管道的某些部分,但必须至少设置一个BindFlags位。BindFlags位(0x88)具有以下设置: D3D11_BIND_STREAM_OUTPUT (0)、D3D11_BIND_RENDER_TARGET (0)、D3D11_BIND_DEPTH_STENCIL (0)、D3D11_BIND_UNORDERED_ACCESS (1)。STATE_CREATION错误#64: CREATEBUFFER_INVALIDBINDFLAGS

这基本上是告诉你你不能把D3D11_USAGE_DYNAMICD3D11_BIND_UNORDERED_ACCESS结合起来

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57376813

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档