DirectCompute CreateBufferはエラー0x80070057で失敗しました(E_INVALIDARG) -- c++ フィールド と directx フィールド と directcompute フィールド 関連 問題

DirectCompute CreateBuffer fails with error 0x80070057 (E_INVALIDARG)












2
vote

問題

日本語

GPUメモリにバッファを作成してCPUからデータをアップロードしようとしています。 GPUアクセスはreadonlyになります。データは計算シェーダ用の入力バッファとして使用されます。

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

あらゆる助けがあります。

英語

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() 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 

Any help appreciated.

</div
        
 
 

回答リスト

0
 
vote
vote
ベストアンサー
 

Direct3D 11デバッグデバッグとデバッグ出力ウィンドウを見るあなたの質問に答えます:

D3D11エラー:: CreateBuffer :: CreateBuffer:MiscFlag D3D11_Resource_Misc_Buffer_Structuredを指定してバッファを作成する場合、StructureByTestrideはゼロより大きく、2048以下、および4の倍数でなければなりません。[STATE_CREATION ERROR#2097339:CreateBuffer_InValidStructRide]

それを解決したら、次の手順を実行します。

D3D11エラー:ID3D11Device :: CreateBuffer:D3D11_USAGE_DYNAMYリソースをグラフィックパイプラインの特定の部分にバインドすることはできませんが、少なくとも1つのBINDFLAGSビットセットが必要です。 BINDFLAGS BITS(0x88)には、次の設定があります.D3D11_BIND_STREAM_OUTPUT(0)、D3D11_BIND_RENDER_TARGET(0)、D3D11_BIND_DEPTH_STENCIL(0)、D3D11_BIND_UNORDED_ARCESS_ARCESS(1)。 [STATE_CREATIONエラー#64:CREATEBUFFER_INVALIDBINDFLAGS]

基本的にあなたが D3D11_USAGE_DYNAMIC 9988777669

に組み合わせることができないと言っている

 

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

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 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]

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

</div
 
 

関連する質問

0  DirectX / DirectCompute Error 0x80070057(E_INVALIDARG)による障害障害  ( Directx directcompute createbuffer failure with error 0x80070057 e invalidarg ) 
GPUメモリにバッファを作成してCPUからデータをアップロードしようとしています。 GPUアクセスはreadonlyになります。データは計算シェーダ用の入力バッファとして使用されます。 createBuffer()はエラー0x80070057(E_InV...

17  詳細なDirectX 11チュートリアルはどこで見つけることができますか? [閉まっている]  ( Where can i find some in depth directx 11 tutorials ) 
この質問はスタックオーバーフローガイドラインを満たしていません。現在答えを受け付けていません。 この質問を改善したいですか? ...

2  DirectX11 Radix Sort  ( Directx11 radix sort ) 
DirectX11で効率的な基数ソートを実装するのに苦労しています。 私はすぐに256K以下の項目を並べ替える必要があります。 その場である必要はありません。 CUDA / OpenCLを使用することはオプションではありません。 私はそれがほぼ働いていますが...

2  NumThreads(1,1,1)を含む計算シェーダは極端に遅く動作します  ( Compute shader with numthreads 1 1 1 runs extremly slow ) 
F#とSharpDXを.NETラッパーとして、DirectXプログラミングを学び始めています。テストケースとして、Mandelbrotセットをレンダリングします。計算は2つの計算シェーダを使用して行われます。 最初のシェーダは各ピクセルの深さを計算します(関...

0  畳み込みフィルタは間違った色の値を出力します  ( Convolution filter outputs wrong color values ) 
指令を学び始め、学習目的で、テクスチャをぼかした単純な畳み込みフィルタを作りたいです。テクスチャをぼかすために次の計算シェーダを書いた: <事前> <コード> Texture2D<float4> inputTex; RWTexture2D<float4> ou...

0  DirectCompute Shader(HLSL)には奇妙な配列サイズがあります  ( Directcompute shader hlsl has strange array size ) 
計算シェーダが船舶の配列を保存する方法で苦労しています。 次のシェーダコードがあります(問題を再現する単純なミニマリストの例): <事前> <コード> cbuffer TCstParams : register(b0) { int IntValu...

0  チャンネルごとの8ビット、チャンネルごとの16ビットのサポートがあります。  ( Is there support for 8bits per channel and 16bits per channel uav in a compute s ) 
計算シェーダに取り組んでいます。それはいくつかのテクスチャをUAVとして出力する必要があります。いくつかのそれらのいくつかは8ビットのコンポーネントを持ち、いくつかはチャンネルごとに16ビットを持っています。この行を検討してください: <事前> <コード> R...

4  頂点バッファを使用して、Compute Shaderの結果をVertex Shader W / Oにフィードできますか?  ( How can i feed compute shader results into vertex shader w o using a vertex buff ) 
詳細に入る前に私は問題を概説したい: Computeシェーダ(CS)の出力を保存するためにRWStructuredBuffersを使用します。頂点およびピクセルシェーダはRWSTRUCTURUDENBURFERSから読み取られないため、StructureDB...

2  DirectCompute CreateBufferはエラー0x80070057で失敗しました(E_INVALIDARG)  ( Directcompute createbuffer fails with error 0x80070057 e invalidarg ) 
GPUメモリにバッファを作成してCPUからデータをアップロードしようとしています。 GPUアクセスはreadonlyになります。データは計算シェーダ用の入力バッファとして使用されます。 createBuffer()はエラー0x80070057(E_InVa...

7  HLSLバッファストライドとスレッド - ここで何が起こっているの?  ( Hlsl buffer stride and threading what is happening here ) 
DirectCompute Technologiesには本当に新しいことがあり、密集しているMSDNのWebサイト上の文書から学びました。 4 x 4行列と4 x n行列を取り入れ、乗算結果を返します。しかし、コードで遊んでいる時間を過ごした後、私は理解し...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有