summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjsmall-nvidia <jsmall@nvidia.com>2019-03-21 11:54:35 -0400
committerTim Foley <tfoleyNV@users.noreply.github.com>2019-03-21 08:54:35 -0700
commit0e5b8ded11a2d425c2d3b2d5ed24ec6d8471ad87 (patch)
treea321f4656e521ca8d7009d4df9b91209ab7e695d
parentfb29281b9061eb5e9b75d1362f2c824d01a8b3d4 (diff)
Fix intemittent crash on dx12. (#919)
Due to if a resource was initialized with data, the actual resource constructed might be larger, for alignment issues. This led to a memcpy potentially copying from after the allocated source data and therefore a crash. Now only copies the non aligned amount of data.
-rw-r--r--tools/gfx/render-d3d12.cpp8
1 files changed, 4 insertions, 4 deletions
diff --git a/tools/gfx/render-d3d12.cpp b/tools/gfx/render-d3d12.cpp
index 5483e7e4b..b1842673e 100644
--- a/tools/gfx/render-d3d12.cpp
+++ b/tools/gfx/render-d3d12.cpp
@@ -453,7 +453,7 @@ protected:
/// Blocks until gpu has completed all work
void releaseFrameResources();
- Result createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, D3D12Resource& uploadResource, D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut);
+ Result createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, size_t srcDataSize, D3D12Resource& uploadResource, D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut);
void beginRender();
@@ -709,7 +709,7 @@ static void _initBufferResourceDesc(size_t bufferSize, D3D12_RESOURCE_DESC& out)
out.Flags = D3D12_RESOURCE_FLAG_NONE;
}
-Result D3D12Renderer::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, D3D12Resource& uploadResource, D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut)
+Result D3D12Renderer::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, const void* srcData, size_t srcDataSize, D3D12Resource& uploadResource, D3D12_RESOURCE_STATES finalState, D3D12Resource& resourceOut)
{
const size_t bufferSize = size_t(resourceDesc.Width);
@@ -750,7 +750,7 @@ Result D3D12Renderer::createBuffer(const D3D12_RESOURCE_DESC& resourceDesc, cons
ID3D12Resource* dxUploadResource = uploadResource.getResource();
SLANG_RETURN_ON_FAIL(dxUploadResource->Map(0, &readRange, reinterpret_cast<void**>(&dstData)));
- ::memcpy(dstData, srcData, bufferSize);
+ ::memcpy(dstData, srcData, srcDataSize);
dxUploadResource->Unmap(0, nullptr);
m_commandList->CopyBufferRegion(resourceOut, 0, uploadResource, 0, bufferSize);
@@ -2062,7 +2062,7 @@ Result D3D12Renderer::createBufferResource(Resource::Usage initialUsage, const B
case Style::ResourceBacked:
{
const D3D12_RESOURCE_STATES initialState = _calcResourceState(initialUsage);
- SLANG_RETURN_ON_FAIL(createBuffer(bufferDesc, initData, buffer->m_uploadResource, initialState, buffer->m_resource));
+ SLANG_RETURN_ON_FAIL(createBuffer(bufferDesc, initData, srcDesc.sizeInBytes, buffer->m_uploadResource, initialState, buffer->m_resource));
break;
}
default: