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

C++ DirectCompute CreateBuffer失败,错误为0x80070057(E_INVALIDARG),c++,directx,directcompute,C++,Directx,Directcompute,我试图在GPU内存中创建一个缓冲区,从CPU上传数据。GPU访问将是只读的。数据将用作计算着色器的输入缓冲区 CreateBuffer()失败,错误为0x80070057(E_INVALIDARG)。我读了文档,又读了一遍,没有发现是哪个参数导致了失败 以下是我标记失败的代码摘录: HRESULT hr = S_OK; RECT rc; GetClientRect( g_hWnd, &rc ); UINT width = rc.right - rc.le

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

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

以下是我标记失败的代码摘录:

    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
HRESULT hr=S_正常;
RECT-rc;
GetClientRect(g_hWnd和rc);
UINT宽度=右钢筋混凝土-左钢筋混凝土;
UINT高度=钢筋混凝土底部-钢筋混凝土顶部;
UINT createDeviceFlags=0;
#ifdef_调试
createDeviceFlags |=D3D11_创建_设备_调试;
#恩迪夫
D3D_驱动程序_类型驱动程序类型[]=
{
#ifdef翘曲
D3D驱动程序类型参考,
#否则
D3D_驱动器_类型_硬件,
#恩迪夫
};
UINT numDriverTypes=sizeof(driverTypes)/sizeof(driverTypes[0]);
DXGI交换链描述sd;
零内存(&sd,sizeof(sd));
sd.BufferCount=1;
sd.BufferDesc.Width=宽度;
sd.BufferDesc.Height=高度;
sd.BufferDesc.Format=DXGI_Format_R8G8B8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator=60;
sd.BufferDesc.RefreshRate.Denominor=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_特征_等级特征等级=D3D_特征_等级_11_0;
对于(UINT driverTypeIndex=0;driverTypeIndexCheckFeatureSupport(D3D11_FEATURE_Double和fdDoubleSupport,sizeof(fdDoubleSupport));
GPUcanDoDoubles=fdDoubleSupport.DoublePrecisionFloatShaderOps;
D3D11_BUFFER_DESC DESC;
字节数据[200];
D3D11_子资源_数据初始化数据;
desc.BindFlags=D3D11_BIND_UNORDERED_ACCESS|D3D11_BIND_SHADER_RESOURCE;
描述用法=D3D11\u用法\u动态;
desc.CPUAccessFlags=D3D11\u CPU\u访问\u写入;
描述字节宽度=200;
desc.miscsflags=D3D11\u资源\u其他缓冲区\u结构化;
desc.StructureByteStride=2;
InitData.psysem=数据;
hr=g_pd3dDevice->CreateBuffer(&desc,&InitData,&g_pcbFractal);//CreateBuffer(&Desc,NULL,&g_pcbFractal);//这一次成功了
感谢您的帮助。

启用并查看“调试输出”窗口可以回答您的问题:

D3D11错误:ID3D11Device::CreateBuffer:使用指定的MiscFlag D3D11_RESOURCE_MISC_buffer_STRUCTURED创建缓冲区时,StructureByteStride必须大于零,不大于2048,并且是4的倍数。[状态#创建错误#2097339:CREATEBUFFER(U INVALIDSTRUCTURESTRIDE]

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

D3D11错误:ID3D11Device::CreateBuffer:D3D11_USAGE_动态资源无法绑定到图形管道的某些部分,但必须至少设置一个BindFlags位。BindFlags位(0x88)具有以下设置:D3D11_BIND_STREAM_输出(0)、D3D11_BIND_RENDER_目标(0)、D3D11_BIND_DEPTH_模具(0)、D3D11_BIND_无序访问(1)。[状态#创建错误#64:CREATEBUFFER"INVALIDBINDFLAGS]

这基本上告诉您不能将
D3D11\u用法\u动态
D3D11\u绑定\u无序访问

(a)打开Direct3D调试设备并查看输出。(b) 始终检查返回结果的所有函数的HRESULT。忽略
void
返回值是安全的。