From ccc032b749e38d9dac714a371ff8dce6b8dadde1 Mon Sep 17 00:00:00 2001 From: turanszkij Date: Wed, 13 Dec 2017 13:07:13 +0000 Subject: [PATCH] implemented copytexture functions dx12 --- WickedEngine/DeferredRenderableComponent.cpp | 2 + WickedEngine/ForwardRenderableComponent.cpp | 3 + .../TiledDeferredRenderableComponent.cpp | 3 + .../TiledForwardRenderableComponent.cpp | 3 + WickedEngine/wiGraphicsDevice_DX12.cpp | 71 +++++++++++++++++++ 5 files changed, 82 insertions(+) diff --git a/WickedEngine/DeferredRenderableComponent.cpp b/WickedEngine/DeferredRenderableComponent.cpp index 76a4cb533..35c0d38e6 100644 --- a/WickedEngine/DeferredRenderableComponent.cpp +++ b/WickedEngine/DeferredRenderableComponent.cpp @@ -131,6 +131,8 @@ void DeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) wiRenderer::DrawWorld(wiRenderer::getCamera(), getTessellationEnabled(), threadID, SHADERTYPE_DEFERRED, rtReflection.GetTexture(), getHairParticlesEnabled(), true); } + GPUResource* dsv[] = { rtGBuffer.depth->GetTexture() }; + wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_WRITE, RESOURCE_STATE_COPY_SOURCE, threadID); rtLinearDepth.Activate(threadID); { fx.blendFlag = BLENDMODE_OPAQUE; diff --git a/WickedEngine/ForwardRenderableComponent.cpp b/WickedEngine/ForwardRenderableComponent.cpp index d49a90caf..b0bde0281 100644 --- a/WickedEngine/ForwardRenderableComponent.cpp +++ b/WickedEngine/ForwardRenderableComponent.cpp @@ -110,6 +110,9 @@ void ForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) rtMain.Deactivate(threadID); wiRenderer::UpdateGBuffer(rtMain.GetTextureResolvedMSAA(threadID, 0), rtMain.GetTextureResolvedMSAA(threadID, 1), nullptr, nullptr, nullptr, threadID); + GPUResource* dsv[] = { rtMain.depth->GetTexture() }; + wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_WRITE, RESOURCE_STATE_COPY_SOURCE, threadID); + dtDepthCopy.CopyFrom(*rtMain.depth, threadID); rtLinearDepth.Activate(threadID); { diff --git a/WickedEngine/TiledDeferredRenderableComponent.cpp b/WickedEngine/TiledDeferredRenderableComponent.cpp index 4af48f42f..bce95b187 100644 --- a/WickedEngine/TiledDeferredRenderableComponent.cpp +++ b/WickedEngine/TiledDeferredRenderableComponent.cpp @@ -42,6 +42,9 @@ void TiledDeferredRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } + GPUResource* dsv[] = { rtGBuffer.depth->GetTexture() }; + wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_WRITE, RESOURCE_STATE_COPY_SOURCE, threadID); + rtLinearDepth.Activate(threadID); { fx.blendFlag = BLENDMODE_OPAQUE; fx.sampleFlag = SAMPLEMODE_CLAMP; diff --git a/WickedEngine/TiledForwardRenderableComponent.cpp b/WickedEngine/TiledForwardRenderableComponent.cpp index f05b0528c..76907684c 100644 --- a/WickedEngine/TiledForwardRenderableComponent.cpp +++ b/WickedEngine/TiledForwardRenderableComponent.cpp @@ -34,6 +34,9 @@ void TiledForwardRenderableComponent::RenderScene(GRAPHICSTHREAD threadID) } wiProfiler::GetInstance().EndRange(threadID); + GPUResource* dsv[] = { rtMain.depth->GetTexture() }; + wiRenderer::GetDevice()->TransitionBarrier(dsv, ARRAYSIZE(dsv), RESOURCE_STATE_DEPTH_WRITE, RESOURCE_STATE_COPY_SOURCE, threadID); + dtDepthCopy.CopyFrom(*rtMain.depth, threadID); rtLinearDepth.Activate(threadID); { diff --git a/WickedEngine/wiGraphicsDevice_DX12.cpp b/WickedEngine/wiGraphicsDevice_DX12.cpp index 5ba40cf8c..80bed0efe 100644 --- a/WickedEngine/wiGraphicsDevice_DX12.cpp +++ b/WickedEngine/wiGraphicsDevice_DX12.cpp @@ -3519,9 +3519,78 @@ namespace wiGraphicsTypes } void GraphicsDevice_DX12::CopyTexture2D(Texture2D* pDst, Texture2D* pSrc, GRAPHICSTHREAD threadID) { + D3D12_RESOURCE_STATES currentState = _ConvertResourceStates(pDst->resourceState[threadID]); + D3D12_RESOURCE_STATES requiredState = D3D12_RESOURCE_STATE_COPY_DEST; + if (currentState != requiredState) + { + D3D12_RESOURCE_BARRIER barrier = {}; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = pDst->resource_DX12; + barrier.Transition.StateBefore = currentState; + barrier.Transition.StateAfter = requiredState; + barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + GetDirectCommandList(threadID)->ResourceBarrier(1, &barrier); + } + + GetDirectCommandList(threadID)->CopyResource(pDst->resource_DX12, pSrc->resource_DX12); + + if (currentState != requiredState) + { + D3D12_RESOURCE_BARRIER barrier = {}; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = pDst->resource_DX12; + barrier.Transition.StateBefore = requiredState; + barrier.Transition.StateAfter = currentState; + barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + GetDirectCommandList(threadID)->ResourceBarrier(1, &barrier); + } } void GraphicsDevice_DX12::CopyTexture2D_Region(Texture2D* pDst, UINT dstMip, UINT dstX, UINT dstY, Texture2D* pSrc, UINT srcMip, GRAPHICSTHREAD threadID) { + D3D12_RESOURCE_DESC dst_desc = pDst->resource_DX12->GetDesc(); + D3D12_RESOURCE_DESC src_desc = pSrc->resource_DX12->GetDesc(); + + D3D12_TEXTURE_COPY_LOCATION dst = {}; + dst.pResource = pDst->resource_DX12; + dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + dst.SubresourceIndex = D3D12CalcSubresource(dstMip, 0, 0, dst_desc.MipLevels, dst_desc.DepthOrArraySize); + + D3D12_TEXTURE_COPY_LOCATION src = {}; + src.pResource = pSrc->resource_DX12; + src.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; + src.SubresourceIndex = D3D12CalcSubresource(srcMip, 0, 0, src_desc.MipLevels, src_desc.DepthOrArraySize); + + + + D3D12_RESOURCE_STATES currentState = _ConvertResourceStates(pDst->resourceState[threadID]); + D3D12_RESOURCE_STATES requiredState = D3D12_RESOURCE_STATE_COPY_DEST; + if (currentState != requiredState) + { + D3D12_RESOURCE_BARRIER barrier = {}; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = pDst->resource_DX12; + barrier.Transition.StateBefore = currentState; + barrier.Transition.StateAfter = requiredState; + barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + GetDirectCommandList(threadID)->ResourceBarrier(1, &barrier); + } + + GetDirectCommandList(threadID)->CopyTextureRegion(&dst, dstX, dstY, 0, &src, nullptr); + + if (currentState != requiredState) + { + D3D12_RESOURCE_BARRIER barrier = {}; + barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; + barrier.Transition.pResource = pDst->resource_DX12; + barrier.Transition.StateBefore = requiredState; + barrier.Transition.StateAfter = currentState; + barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + GetDirectCommandList(threadID)->ResourceBarrier(1, &barrier); + } } void GraphicsDevice_DX12::MSAAResolve(Texture2D* pDst, Texture2D* pSrc, GRAPHICSTHREAD threadID) { @@ -3705,6 +3774,8 @@ namespace wiGraphicsTypes barriers[i].Transition.StateBefore = _ConvertResourceStates(stateBefore); barriers[i].Transition.StateAfter = _ConvertResourceStates(stateAfter); barriers[i].Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; + + resources[i]->resourceState[threadID] = stateAfter; } GetDirectCommandList(threadID)->ResourceBarrier(NumBarriers, barriers); }