DirectCompute CreateBuffer失败,错误为0x80070057(E_INVALIDARG) [英] DirectCompute CreateBuffer fails with error 0x80070057 (E_INVALIDARG)

查看:1519
本文介绍了DirectCompute CreateBuffer失败,错误为0x80070057(E_INVALIDARG)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在GPU内存中创建缓冲区以从CPU上传数据. GPU访问将是只读的.数据将用作计算着色器的输入缓冲区.

I'm trying to create a buffer in GPU memory to upload data from CPU. GPU access will be readonly. Data will be used as an input buffer for a compute shader.

CreateBuffer()失败,错误0x80070057(E_INVALIDARG).我阅读了文档,然后再次阅读,而没有发现导致失败的参数.

CreateBuffer() fails with error 0x80070057 (E_INVALIDARG). I read the docs and read it again without discovering which argument cause the failure.

这是我的代码摘录,其中我标记了失败:

Here is an extract from my code where I marked the failure:

    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

任何帮助表示赞赏.

推荐答案

启用

Enabling Direct3D 11 Device Debugging and looking at the debug output window answers your question:

D3D11错误:ID3D11Device :: CreateBuffer:当创建具有指定的MiscFlag D3D11_RESOURCE_MISC_BUFFER_STRUCTURED的缓冲区时,StructureByteStride必须大于零,不大于2048,并且是4的倍数. >

D3D11 ERROR: ID3D11Device::CreateBuffer: When creating a buffer with the MiscFlag D3D11_RESOURCE_MISC_BUFFER_STRUCTURED specified, the StructureByteStride must be greater than zero, no greater than 2048, and a multiple of 4. [ STATE_CREATION ERROR #2097339: CREATEBUFFER_INVALIDSTRUCTURESTRIDE]

如果您修复此问题,则会得到:

If you fix that, you get:

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 ERROR: ID3D11Device::CreateBuffer: A D3D11_USAGE_DYNAMIC Resource cannot be bound to certain parts of the graphics pipeline, but must have at least one BindFlags bit set. The BindFlags bits (0x88) have the following settings: D3D11_BIND_STREAM_OUTPUT (0), D3D11_BIND_RENDER_TARGET (0), D3D11_BIND_DEPTH_STENCIL (0), D3D11_BIND_UNORDERED_ACCESS (1). [ STATE_CREATION ERROR #64: CREATEBUFFER_INVALIDBINDFLAGS]

基本上是在告诉您不能将D3D11_USAGE_DYNAMICD3D11_BIND_UNORDERED_ACCESS

Which is basically telling you that you can't combine D3D11_USAGE_DYNAMIC with D3D11_BIND_UNORDERED_ACCESS

这篇关于DirectCompute CreateBuffer失败,错误为0x80070057(E_INVALIDARG)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆