2016-08-11 20 views
1

私のWindows 10をバージョン1607にアップデートしました。これには、追加のD3Dデバッグレイヤの検査が含まれています。私の頂点バッファの更新コードは、更新前の警告/エラーなしで働いたが、CopyBufferRegionを呼び出すときに、今、私はエラーを取得しています:頂点バッファを更新すると、デバッグレイヤのエラーが発生する

Resource state (0xAC3: D3D12_RESOURCE_STATE_GENERIC_READ) of resource (0x000001DB301B9750:'') (subresource: 0) is invalid for use as a destination buffer. Expected State Bits: 0x400: D3D12_RESOURCE_STATE_COPY_DEST, Actual State: 0xAC3: D3D12_RESOURCE_STATE_GENERIC_READ

私が欲しかった状態(D3D12_RESOURCE_STATE_COPY_DEST)にvbを移行した場合は、私が代わりのようなエラーが出ますこれは:

D3D12 ERROR: ID3D12CommandList::ResourceBarrier: Certain heaps are restricted to certain D3D12_RESOURCE_STATES states, and cannot be changed. D3D12_HEAP_TYPE_UPLOAD requires D3D12_RESOURCE_STATE_GENERIC_READ. D3D12_HEAP_TYPE_READBACK requires D3D12_RESOURCE_STATE_COPY_DEST. [ RESOURCE_MANIPULATION ERROR #741: RESOURCE_BARRIER_INVALID_HEAP]

ここに私のコードです。これは、必要に応じて、バッファのサイズを変更し、データの頂点頂点バッファとアップロードを作成します。

void ae3d::VertexBuffer::UploadVB(void* faces, void* vertices, unsigned ibSize) 
{ 
    D3D12_HEAP_PROPERTIES uploadProp = {}; 
    uploadProp.Type = D3D12_HEAP_TYPE_UPLOAD; 
    uploadProp.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; 
    uploadProp.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; 
    uploadProp.CreationNodeMask = 1; 
    uploadProp.VisibleNodeMask = 1; 

    D3D12_RESOURCE_DESC bufferProp = {}; 
    bufferProp.Alignment = 0; 
    bufferProp.DepthOrArraySize = 1; 
    bufferProp.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; 
    bufferProp.Flags = D3D12_RESOURCE_FLAG_NONE; 
    bufferProp.Format = DXGI_FORMAT_UNKNOWN; 
    bufferProp.Height = 1; 
    bufferProp.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; 
    bufferProp.MipLevels = 1; 
    bufferProp.SampleDesc.Count = 1; 
    bufferProp.SampleDesc.Quality = 0; 
    bufferProp.Width = ibOffset + ibSize; 

    // this branch resizes the buffer and causes validation errors. 
    if (vb != nullptr && bufferProp.Width <= sizeBytes) 
    { 
     ID3D12Resource* stagingBuffer = nullptr; 

     HRESULT hr = GfxDeviceGlobal::device->CreateCommittedResource(&uploadProp, D3D12_HEAP_FLAG_NONE, &bufferProp, 
      D3D12_RESOURCE_STATE_GENERIC_READ, nullptr, IID_PPV_ARGS(&stagingBuffer)); 
     AE3D_CHECK_D3D(hr, "Failed to create vertex staging resource"); 

     char* vbUploadPtr = nullptr; 
     hr = stagingBuffer->Map(0, nullptr, reinterpret_cast<void**>(&vbUploadPtr)); 
     if (FAILED(hr)) 
     { 
      ae3d::System::Assert(false, "Unable to map vertex staging buffer!\n"); 
      return; 
     } 

     memcpy_s(vbUploadPtr, ibOffset, vertices, ibOffset); 
     memcpy_s(vbUploadPtr + ibOffset, ibSize, faces, ibSize); 

     stagingBuffer->Unmap(0, nullptr); 


     // vb state is invalid at this point, needs D3D12_RESOURCE_STATE_COPY_DEST 
     GfxDeviceGlobal::graphicsCommandList->CopyBufferRegion(vb, 0, stagingBuffer, 0, ibOffset + ibSize); 

     Global::frameVBUploads.push_back(stagingBuffer); 
     sizeBytes = ibOffset + ibSize; 

     return; 
    } 

    sizeBytes = ibOffset + ibSize; 

    HRESULT hr = GfxDeviceGlobal::device->CreateCommittedResource(
     &uploadProp, 
     D3D12_HEAP_FLAG_NONE, 
     &bufferProp, 
     D3D12_RESOURCE_STATE_GENERIC_READ, 
     nullptr, 
     IID_PPV_ARGS(&vb)); 
    if (FAILED(hr)) 
    { 
     ae3d::System::Assert(false, "Unable to create vertex buffer!\n"); 
     return; 
    } 

    Global::vbs.push_back(vb); 

    char* vbUploadPtr = nullptr; 
    hr = vb->Map(0, nullptr, reinterpret_cast<void**>(&vbUploadPtr)); 
    if (FAILED(hr)) 
    { 
     ae3d::System::Assert(false, "Unable to map vertex buffer!\n"); 
     return; 
    } 

    memcpy_s(vbUploadPtr, ibOffset, vertices, ibOffset); 
    memcpy_s(vbUploadPtr + ibOffset, ibSize, faces, ibSize); 
    vb->Unmap(0, nullptr); 
} 

私はこれらのデバッグ層のエラーを修正するにはどうすればよいですか?

答えて

1

アップロードバッファはD3D12_RESOURCE_STATE_GENERIC_READ状態(link)にしかなりません。 D3D12_RESOURCE_STATE_COPY_DEST状態のデフォルトバッファを作成する必要があります。次に、CPU上にアップロードヒープをマッピングした後、アップロードバッファの内容をID3D12GraphicsCommandList::CopyBufferRegion()メソッドでgpuのデフォルトバッファにコピーすることができます。後でデフォルトバッファを使用可能な状態に移行し、gpuがコピーを実行した時点でアップロードヒープがまだ存在することを忘れないでください。

+0

ありがとうございますが、私の質問のコードにそれをどのように適用するかについてもう少し具体的になるかもしれませんか?具体的には、バッファとヒープの作成パラメータ。私はまた、デフォルトのバッファの作成を理解していない、私は現在のコードのバッファのいずれかを置き換えるか、新しいバッファを作成する必要がありますか? – SurvivalMachine

+0

[here](https://github.com/d3dcoder/d3d12book/blob/master/Common/d3dUtil.cpp#L38)の例があります。基本的には、2つのバッファが必要です。デフォルトは、頂点バッファがもう必要なくなり、アップロードする必要があります。 – nikitablack

関連する問題