aboutsummaryrefslogtreecommitdiff
path: root/demo/d3d12/bufferD3D12.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'demo/d3d12/bufferD3D12.cpp')
-rw-r--r--demo/d3d12/bufferD3D12.cpp118
1 files changed, 118 insertions, 0 deletions
diff --git a/demo/d3d12/bufferD3D12.cpp b/demo/d3d12/bufferD3D12.cpp
new file mode 100644
index 0000000..b7954ea
--- /dev/null
+++ b/demo/d3d12/bufferD3D12.cpp
@@ -0,0 +1,118 @@
+/* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
+* NVIDIA CORPORATION and its licensors retain all intellectual property
+* and proprietary rights in and to this software, related documentation
+* and any modifications thereto. Any use, reproduction, disclosure or
+* distribution of this software and related documentation without an express
+* license agreement from NVIDIA CORPORATION is strictly prohibited. */
+
+
+#include <NvCoDx12HelperUtil.h>
+#include <external/D3D12/include/d3dx12.h>
+
+#include "bufferD3D12.h"
+
+#include <vector>
+
+namespace FlexSample {
+
+int IndexBufferD3D12::init(const RenderStateD3D12& state, int stride, ptrdiff_t numIndices, const void* sysMem)
+{
+ assert(sysMem);
+ assert(stride == 4);
+ const size_t bufferSize = stride * numIndices;
+
+ {
+ ComPtr<ID3D12Resource> resource;
+ CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT);
+ D3D12_RESOURCE_DESC resourceDesc(CD3DX12_RESOURCE_DESC::Buffer(bufferSize));
+ if (sysMem)
+ {
+ NV_RETURN_ON_FAIL(state.m_device->CreateCommittedResource(&defaultHeapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
+ IID_PPV_ARGS(&resource)));
+ NV_RETURN_ON_FAIL(state.m_scopeManager->upload(state.m_commandList, sysMem, resource.Get(), D3D12_RESOURCE_STATE_COMMON));
+ }
+ else
+ {
+ NV_RETURN_ON_FAIL(state.m_device->CreateCommittedResource(&defaultHeapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_COMMON, nullptr,
+ IID_PPV_ARGS(&resource)));
+ }
+ setResource(resource.Get(), D3D12_RESOURCE_STATE_COMMON);
+ }
+
+ memset(&m_indexBufferView, 0, sizeof(m_indexBufferView));
+ m_indexBufferView.BufferLocation = m_resource->GetGPUVirtualAddress();
+ m_indexBufferView.SizeInBytes = UINT(bufferSize);
+ m_indexBufferView.Format = DXGI_FORMAT_R32_UINT;
+ return NV_OK;
+}
+
+int VertexBufferD3D12::init(const RenderStateD3D12& state, int stride, ptrdiff_t numElements, const void* sysMem, D3D12_RESOURCE_FLAGS resourceFlags)
+{
+ if (!sysMem)
+ {
+ memset(&m_vertexBufferView, 0, sizeof(m_vertexBufferView));
+ return NV_OK;
+ }
+
+ size_t bufferSize = size_t(numElements * stride);
+
+ {
+ CD3DX12_HEAP_PROPERTIES defaultHeapProps(D3D12_HEAP_TYPE_DEFAULT);
+ D3D12_RESOURCE_DESC resourceDesc(CD3DX12_RESOURCE_DESC::Buffer(bufferSize, resourceFlags));
+ ComPtr<ID3D12Resource> resource;
+
+ if (sysMem)
+ {
+ NV_RETURN_ON_FAIL(state.m_device->CreateCommittedResource(&defaultHeapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_COPY_DEST, nullptr,
+ IID_PPV_ARGS(&resource)));
+ NV_RETURN_ON_FAIL(state.m_scopeManager->upload(state.m_commandList, sysMem, resource.Get(), D3D12_RESOURCE_STATE_COMMON));
+ }
+ else
+ {
+ NV_RETURN_ON_FAIL(state.m_device->CreateCommittedResource(&defaultHeapProps, D3D12_HEAP_FLAG_NONE, &resourceDesc, D3D12_RESOURCE_STATE_COMMON, nullptr,
+ IID_PPV_ARGS(&resource)));
+ }
+ setResource(resource.Get(), D3D12_RESOURCE_STATE_COMMON);
+ }
+
+ {
+ memset(&m_vertexBufferView, 0, sizeof(m_vertexBufferView));
+ m_vertexBufferView.BufferLocation = m_resource->GetGPUVirtualAddress();
+ m_vertexBufferView.SizeInBytes = UINT(bufferSize);
+ m_vertexBufferView.StrideInBytes = stride;
+ }
+
+ return NV_OK;
+}
+
+int VertexBufferD3D12::init(const RenderStateD3D12& state, int srcStride, int dstStride, ptrdiff_t numElements, const void* sysMem, D3D12_RESOURCE_FLAGS resourceFlags)
+{
+ if (srcStride == dstStride || sysMem == nullptr)
+ {
+ return init(state, dstStride, numElements, sysMem, resourceFlags);
+ }
+ else
+ {
+ if (srcStride == 4 * 4 && dstStride == 4 * 3)
+ {
+ std::vector<uint32_t> buf(numElements * 3);
+ uint32_t* dst = &buf.front();
+ const uint32_t* src = (const uint32_t*)sysMem;
+
+ for (ptrdiff_t i = 0; i < numElements; i++, dst += 3, src += 4)
+ {
+ dst[0] = src[0];
+ dst[1] = src[1];
+ dst[2] = src[2];
+ }
+
+ return init(state, dstStride, numElements, &buf.front(), resourceFlags);
+ }
+ }
+
+ assert(!"Unhandled conversion");
+ return NV_FAIL;
+}
+
+
+} // namespace FlexSample