summaryrefslogtreecommitdiff
path: root/tools/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx')
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp16
-rw-r--r--tools/gfx/vulkan/render-vk.cpp25
2 files changed, 31 insertions, 10 deletions
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp
index fb9b3d143..e2629dc53 100644
--- a/tools/gfx/d3d12/render-d3d12.cpp
+++ b/tools/gfx/d3d12/render-d3d12.cpp
@@ -2840,11 +2840,15 @@ public:
size_t srcOffset,
size_t size) override
{
- SLANG_UNUSED(dst);
- SLANG_UNUSED(srcOffset);
- SLANG_UNUSED(src);
- SLANG_UNUSED(dstOffset);
- SLANG_UNUSED(size);
+ auto dstBuffer = static_cast<BufferResourceImpl*>(dst);
+ auto srcBuffer = static_cast<BufferResourceImpl*>(src);
+
+ m_commandBuffer->m_cmdList->CopyBufferRegion(
+ dstBuffer->m_resource.getResource(),
+ dstOffset,
+ srcBuffer->m_resource.getResource(),
+ srcOffset,
+ size);
}
virtual SLANG_NO_THROW void SLANG_MCALL uploadBufferData(
IBufferResource* dst,
@@ -3810,6 +3814,8 @@ static D3D12_RESOURCE_STATES _calcResourceState(IResource::Usage usage)
case Usage::ShaderResource: return D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE |
D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
case Usage::GenericRead: return D3D12_RESOURCE_STATE_GENERIC_READ;
+ case Usage::CopySource: return D3D12_RESOURCE_STATE_COPY_SOURCE;
+ case Usage::CopyDest: return D3D12_RESOURCE_STATE_COPY_DEST;
default: return D3D12_RESOURCE_STATES(0);
}
}
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 763cea089..d4396429b 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -3116,11 +3116,26 @@ public:
size_t srcOffset,
size_t size) override
{
- SLANG_UNUSED(dst);
- SLANG_UNUSED(srcOffset);
- SLANG_UNUSED(src);
- SLANG_UNUSED(dstOffset);
- SLANG_UNUSED(size);
+ auto& vkAPI = m_commandBuffer->m_renderer->m_api;
+
+ auto dstBuffer = static_cast<BufferResourceImpl*>(dst);
+ auto srcBuffer = static_cast<BufferResourceImpl*>(src);
+
+ VkBufferCopy copyRegion;
+ copyRegion.dstOffset = dstOffset;
+ copyRegion.srcOffset = srcOffset;
+ copyRegion.size = size;
+
+ // Note: Vulkan puts the source buffer first in the copy
+ // command, going against the dominant tradition for copy
+ // operations in C/C++.
+ //
+ vkAPI.vkCmdCopyBuffer(
+ m_commandBuffer->m_commandBuffer,
+ srcBuffer->m_buffer.m_buffer,
+ dstBuffer->m_buffer.m_buffer,
+ /* regionCount: */ 1,
+ &copyRegion);
}
virtual SLANG_NO_THROW void SLANG_MCALL
uploadBufferData(IBufferResource* buffer, size_t offset, size_t size, void* data) override