前景
之前我用directx写上传堆上传给默认堆Index,但是我发现数据无法被GPU读取
void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer)
{
ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize),
D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(defaultBuffer.GetAddressOf())
));
ComPtr<ID3D12Resource> upLoadBuffer;
ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize), D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr, IID_PPV_ARGS(upLoadBuffer.GetAddressOf())));
D3D12_SUBRESOURCE_DATA subResourceData{};
subResourceData.pData = data;
subResourceData.RowPitch = byteSize;
subResourceData.SlicePitch = subResourceData.RowPitch;
UpdateSubresources(m_CommandList.Get(), defaultBuffer.Get(), upLoadBuffer.Get(),
0, 0, 1, &subResourceData);
m_CommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(defaultBuffer.Get(),
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
}
问题所在
原来数据复制给了upLoadBuffer但是还没有传递给默认堆的时候这个函数就结束了,上传堆就没了
解决
将上传堆和索引数据设置在类中,而不要放在临时的栈中,或者直接在这里就执行excuate
createIndexBuffer();
ID3D12CommandList* pCommandLists[] = { m_CommandList.Get() };
m_CommandQueue->ExecuteCommandLists(_countof(pCommandLists), pCommandLists);
waitForFinish();
void HelloTriangle::createIndexBuffer()
{
UINT indices[] = {
// 前
0, 1, 2,
0, 2, 3,
// 后
4, 6, 5,
4, 7, 6,
// 左
4, 5, 1,
4, 1, 0,
// 右
3, 2, 6,
3, 6, 7,
// 上
1, 5, 6,
1, 6, 2,
// 下
4, 0, 3,
4, 3, 7
};
UINT indexBufferSize = m_IndexBufferSize = sizeof(indices);
createDefaultBuffer(indices, indexBufferSize, m_IndexBuffer, m_UploadBuffer);
}
void HelloTriangle::createDefaultBuffer(const void* data, const UINT byteSize, ComPtr<ID3D12Resource>& defaultBuffer,
ComPtr<ID3D12Resource>& upLoad)
{
ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize),
D3D12_RESOURCE_STATE_COPY_DEST, nullptr, IID_PPV_ARGS(defaultBuffer.GetAddressOf())
));
ThrowIfFiled(m_Device->CreateCommittedResource(&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE, &CD3DX12_RESOURCE_DESC::Buffer(byteSize), D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr, IID_PPV_ARGS(upLoad.GetAddressOf())));
D3D12_SUBRESOURCE_DATA subResourceData{};
subResourceData.pData = data;
subResourceData.RowPitch = byteSize;
subResourceData.SlicePitch = subResourceData.RowPitch;
UpdateSubresources(m_CommandList.Get(), defaultBuffer.Get(), upLoad.Get(),
0, 0, 1, &subResourceData);
m_CommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(defaultBuffer.Get(),
D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
ThrowIfFiled(m_CommandList->Close());
}