summaryrefslogtreecommitdiffstats
path: root/tools/gfx/d3d12/render-d3d12.cpp
diff options
context:
space:
mode:
authorlucy96chen <47800040+lucy96chen@users.noreply.github.com>2022-01-25 10:26:29 -0800
committerGitHub <noreply@github.com>2022-01-25 10:26:29 -0800
commit6528b1c7f32d8e2c8de8f4e1dd386533cd14b8f1 (patch)
treec38fede39e51ae21d840aabe24212d711f522f1e /tools/gfx/d3d12/render-d3d12.cpp
parent7cff340b10b27f82781335093759bbdc19cd2865 (diff)
Add implementations for resolveResource() to D3D12 and Vulkan backends (#2094)
* Added implementations for resolveResource to both D3D and Vulkan backends * Simple test for resolving a multisampled resource written and confirmed to run successfully for D3D12 * Fixed a bug preventing MSAA from working in Vulkan * Changed test format to RGBA32 Float (because swiftshader)
Diffstat (limited to 'tools/gfx/d3d12/render-d3d12.cpp')
-rw-r--r--tools/gfx/d3d12/render-d3d12.cpp39
1 files changed, 34 insertions, 5 deletions
diff --git a/tools/gfx/d3d12/render-d3d12.cpp b/tools/gfx/d3d12/render-d3d12.cpp
index e0c324d34..1b146bc4e 100644
--- a/tools/gfx/d3d12/render-d3d12.cpp
+++ b/tools/gfx/d3d12/render-d3d12.cpp
@@ -4314,15 +4314,44 @@ public:
virtual SLANG_NO_THROW void SLANG_MCALL resolveResource(
ITextureResource* source,
+ ResourceState sourceState,
SubresourceRange sourceRange,
ITextureResource* dest,
+ ResourceState destState,
SubresourceRange destRange) override
{
- SLANG_UNUSED(source);
- SLANG_UNUSED(sourceRange);
- SLANG_UNUSED(dest);
- SLANG_UNUSED(destRange);
- SLANG_UNIMPLEMENTED_X("resolveResource");
+ auto srcTexture = static_cast<TextureResourceImpl*>(source);
+ auto srcDesc = srcTexture->getDesc();
+ auto dstTexture = static_cast<TextureResourceImpl*>(dest);
+ auto dstDesc = dstTexture->getDesc();
+
+ for (uint32_t layer = 0; layer < sourceRange.layerCount; ++layer)
+ {
+ for (uint32_t mip = 0; mip < sourceRange.mipLevelCount; ++mip)
+ {
+ auto srcSubresourceIndex = D3DUtil::getSubresourceIndex(
+ mip + sourceRange.mipLevel,
+ layer + sourceRange.baseArrayLayer,
+ 0,
+ srcDesc->numMipLevels,
+ srcDesc->arraySize);
+ auto dstSubresourceIndex = D3DUtil::getSubresourceIndex(
+ mip + destRange.mipLevel,
+ layer + destRange.baseArrayLayer,
+ 0,
+ dstDesc->numMipLevels,
+ dstDesc->arraySize);
+
+ DXGI_FORMAT format = D3DUtil::getMapFormat(srcDesc->format);
+
+ m_commandBuffer->m_cmdList->ResolveSubresource(
+ dstTexture->m_resource.getResource(),
+ dstSubresourceIndex,
+ srcTexture->m_resource.getResource(),
+ srcSubresourceIndex,
+ format);
+ }
+ }
}
virtual SLANG_NO_THROW void SLANG_MCALL copyTextureToBuffer(