summaryrefslogtreecommitdiffstats
path: root/tools/gfx
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gfx')
-rw-r--r--tools/gfx/cuda/render-cuda.cpp6
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp138
-rw-r--r--tools/gfx/debug-layer.cpp7
-rw-r--r--tools/gfx/debug-layer.h3
-rw-r--r--tools/gfx/immediate-renderer-base.cpp6
-rw-r--r--tools/gfx/vulkan/render-vk.cpp117
-rw-r--r--tools/gfx/vulkan/vk-api.h1
7 files changed, 188 insertions, 90 deletions
diff --git a/tools/gfx/cuda/render-cuda.cpp b/tools/gfx/cuda/render-cuda.cpp
index 2c3f1eb56..3e55242f0 100644
--- a/tools/gfx/cuda/render-cuda.cpp
+++ b/tools/gfx/cuda/render-cuda.cpp
@@ -1060,17 +1060,21 @@ public:
virtual SLANG_NO_THROW void SLANG_MCALL copyTexture(
ITextureResource* dst,
+ ResourceState dstState,
SubresourceRange dstSubresource,
ITextureResource::Offset3D dstOffset,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
{
SLANG_UNUSED(dst);
+ SLANG_UNUSED(dstState);
SLANG_UNUSED(dstSubresource);
SLANG_UNUSED(dstOffset);
SLANG_UNUSED(src);
+ SLANG_UNUSED(srcState);
SLANG_UNUSED(srcSubresource);
SLANG_UNUSED(srcOffset);
SLANG_UNUSED(extent);
@@ -1123,6 +1127,7 @@ public:
size_t dstOffset,
size_t dstSize,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
@@ -1131,6 +1136,7 @@ public:
SLANG_UNUSED(dstOffset);
SLANG_UNUSED(dstSize);
SLANG_UNUSED(src);
+ SLANG_UNUSED(srcState);
SLANG_UNUSED(srcSubresource);
SLANG_UNUSED(srcOffset);
SLANG_UNUSED(extent);
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp
index 8005f6d15..634fca03e 100644
--- a/tools/gfx/d3d12/render-d3d12.cpp
+++ b/tools/gfx/d3d12/render-d3d12.cpp
@@ -3954,9 +3954,11 @@ public:
}
virtual SLANG_NO_THROW void SLANG_MCALL copyTexture(
ITextureResource* dst,
+ ResourceState dstState,
SubresourceRange dstSubresource,
ITextureResource::Offset3D dstOffset,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
@@ -4247,10 +4249,13 @@ public:
size_t dstOffset,
size_t dstSize,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
{
+ assert(srcSubresource.mipLevelCount <= 1);
+
auto srcTexture = static_cast<TextureResourceImpl*>(src);
auto dstBuffer = static_cast<BufferResourceImpl*>(dst);
auto baseSubresourceIndex = D3DUtil::getSubresourceIndex(
@@ -4269,74 +4274,71 @@ public:
for (uint32_t layer = 0; layer < srcSubresource.layerCount; layer++)
{
- for (uint32_t mipId = 0; mipId < srcSubresource.mipLevelCount; mipId++)
+ // Get the footprint
+ D3D12_RESOURCE_DESC texDesc =
+ srcTexture->m_resource.getResource()->GetDesc();
+
+ D3D12_TEXTURE_COPY_LOCATION dstRegion = {};
+ dstRegion.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
+ dstRegion.pResource = dstBuffer->m_resource.getResource();
+ D3D12_PLACED_SUBRESOURCE_FOOTPRINT& footprint = dstRegion.PlacedFootprint;
+
+ D3D12_TEXTURE_COPY_LOCATION srcRegion = {};
+ srcRegion.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
+ srcRegion.SubresourceIndex = D3DUtil::getSubresourceIndex(
+ srcSubresource.mipLevel,
+ layer + srcSubresource.baseArrayLayer,
+ 0,
+ srcTexture->getDesc()->numMipLevels,
+ srcTexture->getDesc()->arraySize);
+ srcRegion.pResource = srcTexture->m_resource.getResource();
+
+ footprint.Offset = dstOffset;
+ footprint.Footprint.Format = texDesc.Format;
+ uint32_t mipLevel = srcSubresource.mipLevel;
+ if (extent.width != 0xFFFFFFFF)
{
- // Get the footprint
- D3D12_RESOURCE_DESC texDesc =
- srcTexture->m_resource.getResource()->GetDesc();
-
- D3D12_TEXTURE_COPY_LOCATION dstRegion = {};
- dstRegion.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
- dstRegion.pResource = dstBuffer->m_resource.getResource();
- D3D12_PLACED_SUBRESOURCE_FOOTPRINT& footprint = dstRegion.PlacedFootprint;
-
- D3D12_TEXTURE_COPY_LOCATION srcRegion = {};
- srcRegion.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX;
- srcRegion.SubresourceIndex = D3DUtil::getSubresourceIndex(
- mipId + srcSubresource.mipLevel,
- layer + srcSubresource.baseArrayLayer,
- 0,
- srcTexture->getDesc()->numMipLevels,
- srcTexture->getDesc()->arraySize);
- srcRegion.pResource = srcTexture->m_resource.getResource();
-
- footprint.Offset = 0;
- footprint.Footprint.Format = texDesc.Format;
- uint32_t mipLevel = mipId + srcSubresource.mipLevel;
- if (extent.width != 0xFFFFFFFF)
- {
- footprint.Footprint.Width = extent.width;
- }
- else
- {
- footprint.Footprint.Width =
- Math::Max(1, (textureSize.width >> mipLevel)) - srcOffset.x;
- }
- if (extent.height != 0xFFFFFFFF)
- {
- footprint.Footprint.Height = extent.height;
- }
- else
- {
- footprint.Footprint.Height =
- Math::Max(1, (textureSize.height >> mipLevel)) - srcOffset.y;
- }
- if (extent.depth != 0xFFFFFFFF)
- {
- footprint.Footprint.Depth = extent.depth;
- }
- else
- {
- footprint.Footprint.Depth =
- Math::Max(1, (textureSize.depth >> mipLevel)) - srcOffset.z;
- }
- footprint.Footprint.RowPitch = (UINT)D3DUtil::calcAligned(
- footprint.Footprint.Width * (UInt)formatInfo.blockSizeInBytes,
- (uint32_t)D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
-
- auto bufferSize = footprint.Footprint.RowPitch *
- footprint.Footprint.Height * footprint.Footprint.Depth;
-
- D3D12_BOX srcBox = {};
- srcBox.left = srcOffset.x;
- srcBox.top = srcOffset.y;
- srcBox.front = srcOffset.z;
- srcBox.right = srcOffset.x + extent.width;
- srcBox.bottom = srcOffset.y + extent.height;
- srcBox.back = srcOffset.z + extent.depth;
- m_commandBuffer->m_cmdList->CopyTextureRegion(
- &dstRegion, (UINT)dstOffset, 0, 0, &srcRegion, &srcBox);
+ footprint.Footprint.Width = extent.width;
+ }
+ else
+ {
+ footprint.Footprint.Width =
+ Math::Max(1, (textureSize.width >> mipLevel)) - srcOffset.x;
+ }
+ if (extent.height != 0xFFFFFFFF)
+ {
+ footprint.Footprint.Height = extent.height;
+ }
+ else
+ {
+ footprint.Footprint.Height =
+ Math::Max(1, (textureSize.height >> mipLevel)) - srcOffset.y;
+ }
+ if (extent.depth != 0xFFFFFFFF)
+ {
+ footprint.Footprint.Depth = extent.depth;
}
+ else
+ {
+ footprint.Footprint.Depth =
+ Math::Max(1, (textureSize.depth >> mipLevel)) - srcOffset.z;
+ }
+ footprint.Footprint.RowPitch = (UINT)D3DUtil::calcAligned(
+ footprint.Footprint.Width * (UInt)formatInfo.blockSizeInBytes,
+ (uint32_t)D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
+
+ auto bufferSize = footprint.Footprint.RowPitch *
+ footprint.Footprint.Height * footprint.Footprint.Depth;
+
+ D3D12_BOX srcBox = {};
+ srcBox.left = srcOffset.x;
+ srcBox.top = srcOffset.y;
+ srcBox.front = srcOffset.z;
+ srcBox.right = srcOffset.x + extent.width;
+ srcBox.bottom = srcOffset.y + extent.height;
+ srcBox.back = srcOffset.z + extent.depth;
+ m_commandBuffer->m_cmdList->CopyTextureRegion(
+ &dstRegion, 0, 0, 0, &srcRegion, &srcBox);
}
}
@@ -4377,7 +4379,7 @@ public:
auto aspect = Math::getLowestBit((int32_t)aspectMask);
aspectMask &= ~aspect;
auto planeIndex = D3DUtil::getPlaneSlice(d3dFormat, (TextureAspect)aspect);
- for (uint32_t layer = 0; layer < subresourceRange.baseArrayLayer; layer++)
+ for (uint32_t layer = 0; layer < subresourceRange.layerCount; layer++)
{
for (uint32_t mip = 0; mip < subresourceRange.mipLevelCount; mip++)
{
@@ -6046,7 +6048,7 @@ Result D3D12Device::createTextureResource(const ITextureResource::Desc& descIn,
for (int j = 0; j < numMipMaps; ++j)
{
- auto srcSubresource = initData[j];
+ auto srcSubresource = initData[subResourceIndex + j];
const D3D12_PLACED_SUBRESOURCE_FOOTPRINT& layout = layouts[j];
const D3D12_SUBRESOURCE_FOOTPRINT& footprint = layout.Footprint;
diff --git a/tools/gfx/debug-layer.cpp b/tools/gfx/debug-layer.cpp
index 83ef129c4..fa8fc6fda 100644
--- a/tools/gfx/debug-layer.cpp
+++ b/tools/gfx/debug-layer.cpp
@@ -1277,9 +1277,11 @@ void DebugResourceCommandEncoder::bufferBarrier(
void DebugResourceCommandEncoder::copyTexture(
ITextureResource* dst,
+ ResourceState dstState,
SubresourceRange dstSubresource,
ITextureResource::Offset3D dstOffset,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent)
@@ -1287,9 +1289,11 @@ void DebugResourceCommandEncoder::copyTexture(
SLANG_GFX_API_FUNC;
baseObject->copyTexture(
getInnerObj(dst),
+ dstState,
dstSubresource,
dstOffset,
getInnerObj(src),
+ srcState,
srcSubresource,
srcOffset,
extent);
@@ -1342,13 +1346,14 @@ void DebugResourceCommandEncoder::copyTextureToBuffer(
size_t dstOffset,
size_t dstSize,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent)
{
SLANG_GFX_API_FUNC;
baseObject->copyTextureToBuffer(
- getInnerObj(dst), dstOffset, dstSize, getInnerObj(src), srcSubresource, srcOffset, extent);
+ getInnerObj(dst), dstOffset, dstSize, getInnerObj(src), srcState, srcSubresource, srcOffset, extent);
}
void DebugResourceCommandEncoder::textureSubresourceBarrier(
diff --git a/tools/gfx/debug-layer.h b/tools/gfx/debug-layer.h
index 096c35147..04dafadf2 100644
--- a/tools/gfx/debug-layer.h
+++ b/tools/gfx/debug-layer.h
@@ -430,9 +430,11 @@ public:
ResourceState dst) override;
virtual SLANG_NO_THROW void SLANG_MCALL copyTexture(
ITextureResource* dst,
+ ResourceState dstState,
SubresourceRange dstSubresource,
ITextureResource::Offset3D dstOffset,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override;
@@ -461,6 +463,7 @@ public:
size_t dstOffset,
size_t dstSize,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override;
diff --git a/tools/gfx/immediate-renderer-base.cpp b/tools/gfx/immediate-renderer-base.cpp
index 912e20df1..ab2a51275 100644
--- a/tools/gfx/immediate-renderer-base.cpp
+++ b/tools/gfx/immediate-renderer-base.cpp
@@ -334,17 +334,21 @@ public:
virtual SLANG_NO_THROW void SLANG_MCALL copyTexture(
ITextureResource* dst,
+ ResourceState dstState,
SubresourceRange dstSubresource,
ITextureResource::Offset3D dstOffset,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
{
SLANG_UNUSED(dst);
+ SLANG_UNUSED(dstState);
SLANG_UNUSED(dstSubresource);
SLANG_UNUSED(dstOffset);
SLANG_UNUSED(src);
+ SLANG_UNUSED(srcState);
SLANG_UNUSED(srcSubresource);
SLANG_UNUSED(srcOffset);
SLANG_UNUSED(extent);
@@ -397,6 +401,7 @@ public:
size_t dstOffset,
size_t dstSize,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
@@ -405,6 +410,7 @@ public:
SLANG_UNUSED(dstOffset);
SLANG_UNUSED(dstSize);
SLANG_UNUSED(src);
+ SLANG_UNUSED(srcState);
SLANG_UNUSED(srcSubresource);
SLANG_UNUSED(srcOffset);
SLANG_UNUSED(extent);
diff --git a/tools/gfx/vulkan/render-vk.cpp b/tools/gfx/vulkan/render-vk.cpp
index 96e11eb27..9f5af2a1e 100644
--- a/tools/gfx/vulkan/render-vk.cpp
+++ b/tools/gfx/vulkan/render-vk.cpp
@@ -4502,23 +4502,54 @@ public:
m_commandBuffer = commandBuffer;
}
+ VkImageAspectFlags getAspectMask(TextureAspect aspect)
+ {
+ if (aspect == TextureAspect::Depth)
+ return VK_IMAGE_ASPECT_DEPTH_BIT;
+ if (aspect == TextureAspect::Stencil)
+ return VK_IMAGE_ASPECT_STENCIL_BIT;
+ return VK_IMAGE_ASPECT_COLOR_BIT;
+ }
+
virtual SLANG_NO_THROW void SLANG_MCALL copyTexture(
ITextureResource* dst,
+ ResourceState dstState,
SubresourceRange dstSubresource,
ITextureResource::Offset3D dstOffset,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
{
- SLANG_UNUSED(dst);
- SLANG_UNUSED(dstSubresource);
- SLANG_UNUSED(dstOffset);
- SLANG_UNUSED(src);
- SLANG_UNUSED(srcSubresource);
- SLANG_UNUSED(srcOffset);
- SLANG_UNUSED(extent);
- SLANG_UNIMPLEMENTED_X("copyTexture");
+ auto srcImage = static_cast<TextureResourceImpl*>(src);
+ auto srcDesc = srcImage->getDesc();
+ auto srcImageLayout = VulkanUtil::getImageLayoutFromState(srcState);
+ auto dstImage = static_cast<TextureResourceImpl*>(dst);
+ auto dstDesc = dstImage->getDesc();
+ auto dstImageLayout = VulkanUtil::getImageLayoutFromState(dstState);
+
+ for (Int layer = 0; layer < srcSubresource.layerCount; ++layer)
+ {
+ for (Int mipId = 0; mipId < srcSubresource.mipLevelCount; ++mipId)
+ {
+ VkImageCopy region = {};
+ region.srcSubresource.aspectMask = getAspectMask(srcSubresource.aspectMask);
+ region.srcSubresource.baseArrayLayer = layer + srcSubresource.baseArrayLayer;
+ region.srcSubresource.mipLevel = mipId + srcSubresource.mipLevel;
+ region.srcSubresource.layerCount = 1;
+ region.srcOffset = { (int32_t)srcOffset.x, (int32_t)srcOffset.y, (int32_t)srcOffset.z };
+ region.dstSubresource.aspectMask = getAspectMask(dstSubresource.aspectMask);
+ region.dstSubresource.baseArrayLayer = layer + dstSubresource.baseArrayLayer;
+ region.dstSubresource.mipLevel = mipId + dstSubresource.mipLevel;
+ region.dstSubresource.layerCount = 1;
+ region.dstOffset = { (int32_t)dstOffset.x, (int32_t)dstOffset.y, (int32_t)dstOffset.z };
+ region.extent = { (uint32_t)extent.width, (uint32_t)extent.height, (uint32_t)extent.depth };
+
+ auto& vkApi = m_commandBuffer->m_renderer->m_api;
+ vkApi.vkCmdCopyImage(m_commandBuffer->m_commandBuffer, srcImage->m_image, srcImageLayout, dstImage->m_image, dstImageLayout, 1, &region);
+ }
+ }
}
virtual SLANG_NO_THROW void SLANG_MCALL uploadTextureData(
@@ -4765,18 +4796,31 @@ public:
size_t dstOffset,
size_t dstSize,
ITextureResource* src,
+ ResourceState srcState,
SubresourceRange srcSubresource,
ITextureResource::Offset3D srcOffset,
ITextureResource::Size extent) override
{
- SLANG_UNUSED(dst);
- SLANG_UNUSED(dstOffset);
- SLANG_UNUSED(dstSize);
- SLANG_UNUSED(src);
- SLANG_UNUSED(srcSubresource);
- SLANG_UNUSED(srcOffset);
- SLANG_UNUSED(extent);
- SLANG_UNIMPLEMENTED_X("copyTextureToBuffer");
+ assert(srcSubresource.mipLevelCount <= 1);
+
+ auto image = static_cast<TextureResourceImpl*>(src);
+ auto desc = image->getDesc();
+ auto buffer = static_cast<BufferResourceImpl*>(dst);
+ auto srcImageLayout = VulkanUtil::getImageLayoutFromState(srcState);
+
+ VkBufferImageCopy region = {};
+ region.bufferOffset = dstOffset;
+ region.bufferRowLength = 0;
+ region.bufferImageHeight = 0;
+ region.imageSubresource.aspectMask = getAspectMask(srcSubresource.aspectMask);
+ region.imageSubresource.mipLevel = srcSubresource.mipLevel;
+ region.imageSubresource.baseArrayLayer = srcSubresource.baseArrayLayer;
+ region.imageSubresource.layerCount = srcSubresource.layerCount;
+ region.imageOffset = { (int32_t)srcOffset.x, (int32_t)srcOffset.y, (int32_t)srcOffset.z };
+ region.imageExtent = { uint32_t(extent.width), uint32_t(extent.height), uint32_t(extent.depth) };
+
+ auto& vkApi = m_commandBuffer->m_renderer->m_api;
+ vkApi.vkCmdCopyImageToBuffer(m_commandBuffer->m_commandBuffer, image->m_image, srcImageLayout, buffer->m_buffer.m_buffer, 1, &region);
}
virtual SLANG_NO_THROW void SLANG_MCALL textureSubresourceBarrier(
@@ -4785,11 +4829,39 @@ public:
ResourceState src,
ResourceState dst) override
{
- SLANG_UNUSED(texture);
- SLANG_UNUSED(subresourceRange);
- SLANG_UNUSED(src);
- SLANG_UNUSED(dst);
- SLANG_UNIMPLEMENTED_X("textureSubresourceBarrier");
+ ShortList<VkImageMemoryBarrier> barriers;
+ auto image = static_cast<TextureResourceImpl*>(texture);
+ auto desc = image->getDesc();
+
+ VkImageMemoryBarrier barrier = {};
+ barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ barrier.image = image->m_image;
+ barrier.oldLayout = translateImageLayout(src);
+ barrier.newLayout = translateImageLayout(dst);
+ barrier.subresourceRange.aspectMask = getAspectMask(subresourceRange.aspectMask);
+ barrier.subresourceRange.baseArrayLayer = subresourceRange.baseArrayLayer;
+ barrier.subresourceRange.baseMipLevel = subresourceRange.mipLevel;
+ barrier.subresourceRange.layerCount = subresourceRange.layerCount;
+ barrier.subresourceRange.levelCount = subresourceRange.mipLevelCount;
+ barrier.srcAccessMask = calcAccessFlags(src);
+ barrier.dstAccessMask = calcAccessFlags(dst);
+ barriers.add(barrier);
+
+ VkPipelineStageFlagBits srcStage = calcPipelineStageFlags(src, true);
+ VkPipelineStageFlagBits dstStage = calcPipelineStageFlags(dst, false);
+
+ auto& vkApi = m_commandBuffer->m_renderer->m_api;
+ vkApi.vkCmdPipelineBarrier(
+ m_commandBuffer->m_commandBuffer,
+ srcStage,
+ dstStage,
+ 0,
+ 0,
+ nullptr,
+ 0,
+ nullptr,
+ (uint32_t)barriers.getCount(),
+ barriers.getArrayView().getBuffer());
}
};
@@ -7061,6 +7133,9 @@ void VKDevice::_transitionImageLayout(
VkImageLayout oldLayout,
VkImageLayout newLayout)
{
+ if (oldLayout == newLayout)
+ return;
+
VkImageMemoryBarrier barrier = {};
barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
barrier.oldLayout = oldLayout;
diff --git a/tools/gfx/vulkan/vk-api.h b/tools/gfx/vulkan/vk-api.h
index 1d8cd66f6..72a6e73c8 100644
--- a/tools/gfx/vulkan/vk-api.h
+++ b/tools/gfx/vulkan/vk-api.h
@@ -96,6 +96,7 @@ namespace gfx {
x(vkCmdEndRenderPass) \
x(vkCmdPipelineBarrier) \
x(vkCmdCopyBufferToImage)\
+ x(vkCmdCopyImage) \
x(vkCmdCopyImageToBuffer) \
x(vkCmdPushConstants) \
x(vkCmdSetStencilReference) \