implemented copytexture functions dx12

This commit is contained in:
turanszkij
2017-12-13 13:07:13 +00:00
parent 545b00f3d1
commit ccc032b749
5 changed files with 82 additions and 0 deletions
@@ -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;
@@ -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); {
@@ -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;
@@ -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); {
+71
View File
@@ -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);
}