summaryrefslogtreecommitdiffstats
path: root/Graphics/GraphicsEngineVulkan
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2018-12-01 04:20:46 +0000
committerEgor Yusov <egor.yusov@gmail.com>2018-12-01 04:20:46 +0000
commit1303ae5da64c35a56768edecdf60d57f7a2fe628 (patch)
treeb240850db3f521a636bdd71435a9aafda99a89c5 /Graphics/GraphicsEngineVulkan
parentImproved type safety of different flag types (diff)
downloadDiligentCore-1303ae5da64c35a56768edecdf60d57f7a2fe628.tar.gz
DiligentCore-1303ae5da64c35a56768edecdf60d57f7a2fe628.zip
Added explicit state transition flags to SetRenderTargets method
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
-rw-r--r--Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h21
-rw-r--r--Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp58
-rw-r--r--Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp2
-rw-r--r--Graphics/GraphicsEngineVulkan/src/SwapChainVkImpl.cpp4
4 files changed, 62 insertions, 23 deletions
diff --git a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h
index 8678f2af..8dd9b730 100644
--- a/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h
+++ b/Graphics/GraphicsEngineVulkan/include/DeviceContextVkImpl.h
@@ -73,7 +73,11 @@ public:
virtual void SetBlendFactors(const float* pBlendFactors = nullptr)override final;
- virtual void SetVertexBuffers( Uint32 StartSlot, Uint32 NumBuffersSet, IBuffer **ppBuffers, Uint32* pOffsets, SET_VERTEX_BUFFERS_FLAGS Flags )override final;
+ virtual void SetVertexBuffers( Uint32 StartSlot,
+ Uint32 NumBuffersSet,
+ IBuffer** ppBuffers,
+ Uint32* pOffsets,
+ SET_VERTEX_BUFFERS_FLAGS Flags )override final;
virtual void InvalidateState()override final;
@@ -83,7 +87,10 @@ public:
virtual void SetScissorRects( Uint32 NumRects, const Rect* pRects, Uint32 RTWidth, Uint32 RTHeight )override final;
- virtual void SetRenderTargets( Uint32 NumRenderTargets, ITextureView* ppRenderTargets[], ITextureView* pDepthStencil )override final;
+ virtual void SetRenderTargets( Uint32 NumRenderTargets,
+ ITextureView* ppRenderTargets[],
+ ITextureView* pDepthStencil,
+ SET_RENDER_TARGETS_FLAGS Flags )override final;
virtual void Draw( DrawAttribs &DrawAttribs )override final;
@@ -97,13 +104,17 @@ public:
virtual void UpdateBuffer(IBuffer *pBuffer, Uint32 Offset, Uint32 Size, const PVoid pData)override final;
- virtual void CopyBuffer(IBuffer *pSrcBuffer, Uint32 SrcOffset, IBuffer *pDstBuffer, Uint32 DstOffset, Uint32 Size)override final;
+ virtual void CopyBuffer(IBuffer* pSrcBuffer, Uint32 SrcOffset, IBuffer* pDstBuffer, Uint32 DstOffset, Uint32 Size)override final;
virtual void MapBuffer(IBuffer* pBuffer, MAP_TYPE MapType, MAP_FLAGS MapFlags, PVoid& pMappedData)override final;
virtual void UnmapBuffer(IBuffer* pBuffer)override final;
- virtual void UpdateTexture(ITexture* pTexture, Uint32 MipLevel, Uint32 Slice, const Box& DstBox, const TextureSubResData& SubresData)override final;
+ virtual void UpdateTexture(ITexture* pTexture,
+ Uint32 MipLevel,
+ Uint32 Slice,
+ const Box& DstBox,
+ const TextureSubResData& SubresData)override final;
virtual void CopyTexture(ITexture* pSrcTexture,
Uint32 SrcMipLevel,
@@ -213,7 +224,7 @@ public:
Int64 GetContextFrameNumber()const{return m_ContextFrameNumber;}
private:
- void CommitRenderPassAndFramebuffer();
+ void CommitRenderPassAndFramebuffer(SET_RENDER_TARGETS_FLAGS Flags);
void CommitVkVertexBuffers(bool TransitionBuffers, bool VerifyStates);
void TransitionVkVertexBuffers();
void CommitViewports();
diff --git a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
index b594aa35..d758f321 100644
--- a/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/DeviceContextVkImpl.cpp
@@ -242,7 +242,7 @@ namespace Diligent
{
m_CommandBuffer.SetStencilReference(m_StencilRef);
m_CommandBuffer.SetBlendConstants(m_BlendFactors);
- CommitRenderPassAndFramebuffer();
+ CommitRenderPassAndFramebuffer(SET_RENDER_TARGETS_FLAG_VERIFY_STATES);
CommitViewports();
}
@@ -540,7 +540,7 @@ namespace Diligent
}
#endif
- CommitRenderPassAndFramebuffer();
+ CommitRenderPassAndFramebuffer(SET_RENDER_TARGETS_FLAG_VERIFY_STATES);
if (pIndirectDrawAttribsVk != nullptr)
{
@@ -673,7 +673,7 @@ namespace Diligent
{
// Render pass may not be currently committed
VERIFY_EXPR(m_RenderPass != VK_NULL_HANDLE && m_Framebuffer != VK_NULL_HANDLE);
- CommitRenderPassAndFramebuffer();
+ CommitRenderPassAndFramebuffer(SET_RENDER_TARGETS_FLAG_VERIFY_STATES);
VkClearAttachment ClearAttachment = {};
ClearAttachment.aspectMask = 0;
@@ -808,7 +808,7 @@ namespace Diligent
{
// Render pass may not be currently committed
VERIFY_EXPR(m_RenderPass != VK_NULL_HANDLE && m_Framebuffer != VK_NULL_HANDLE);
- CommitRenderPassAndFramebuffer();
+ CommitRenderPassAndFramebuffer(SET_RENDER_TARGETS_FLAG_VERIFY_STATES);
VkClearAttachment ClearAttachment = {};
ClearAttachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -1084,7 +1084,7 @@ namespace Diligent
}
- void DeviceContextVkImpl::CommitRenderPassAndFramebuffer()
+ void DeviceContextVkImpl::CommitRenderPassAndFramebuffer(SET_RENDER_TARGETS_FLAGS Flags)
{
const auto& CmdBufferState = m_CommandBuffer.GetState();
if (CmdBufferState.Framebuffer != m_Framebuffer)
@@ -1099,14 +1099,28 @@ namespace Diligent
{
auto* pDSVVk = m_pBoundDepthStencil.RawPtr<TextureViewVkImpl>();
auto* pDepthBufferVk = ValidatedCast<TextureVkImpl>(pDSVVk->GetTexture());
- if (pDepthBufferVk->IsInKnownState())
+ if (Flags & SET_RENDER_TARGETS_FLAG_TRANSITION_DEPTH)
{
- if (!pDepthBufferVk->CheckState(RESOURCE_STATE_DEPTH_WRITE))
+ if (pDepthBufferVk->IsInKnownState())
{
- TransitionTextureState(*pDepthBufferVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_DEPTH_WRITE, true);
+ if (!pDepthBufferVk->CheckState(RESOURCE_STATE_DEPTH_WRITE))
+ {
+ TransitionTextureState(*pDepthBufferVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_DEPTH_WRITE, true);
+ }
+ VERIFY_EXPR(pDepthBufferVk->GetLayout() == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
+ }
+ }
+#ifdef DEVELOPMENT
+ else if (Flags & SET_RENDER_TARGETS_FLAG_VERIFY_STATES)
+ {
+ if (pDepthBufferVk->IsInKnownState() && !pDepthBufferVk->CheckState(RESOURCE_STATE_DEPTH_WRITE))
+ {
+ LOG_ERROR_MESSAGE("Texture '", pDepthBufferVk->GetDesc().Name, "' being set as depth-stencil buffer is not transitioned to RESOURCE_STATE_DEPTH_WRITE state. "
+ "Actual texture state: ", GetResourceStateString(pDepthBufferVk->GetState()), ". "
+ "Use SET_RENDER_TARGETS_FLAG_TRANSITION_DEPTH flag or explicitly transition the resource using IDeviceContext::TransitionResourceStates() method.");
}
- VERIFY_EXPR(pDepthBufferVk->GetLayout() == VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
}
+#endif
}
for (Uint32 rt=0; rt < m_NumBoundRenderTargets; ++rt)
@@ -1115,14 +1129,28 @@ namespace Diligent
{
auto* pRTVVk = ValidatedCast<TextureViewVkImpl>(pRTV);
auto* pRenderTargetVk = ValidatedCast<TextureVkImpl>(pRTVVk->GetTexture());
- if (pRenderTargetVk->IsInKnownState())
+ if (Flags & SET_RENDER_TARGETS_FLAG_TRANSITION_COLOR)
{
- if (!pRenderTargetVk->CheckState(RESOURCE_STATE_RENDER_TARGET))
+ if (pRenderTargetVk->IsInKnownState())
{
- TransitionTextureState(*pRenderTargetVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_RENDER_TARGET, true);
+ if (!pRenderTargetVk->CheckState(RESOURCE_STATE_RENDER_TARGET))
+ {
+ TransitionTextureState(*pRenderTargetVk, RESOURCE_STATE_UNKNOWN, RESOURCE_STATE_RENDER_TARGET, true);
+ }
+ VERIFY_EXPR(pRenderTargetVk->GetLayout() == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
}
- VERIFY_EXPR(pRenderTargetVk->GetLayout() == VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
}
+#ifdef DEVELOPMENT
+ else if (Flags & SET_RENDER_TARGETS_FLAG_VERIFY_STATES)
+ {
+ if (pRenderTargetVk->IsInKnownState() && !pRenderTargetVk->CheckState(RESOURCE_STATE_RENDER_TARGET))
+ {
+ LOG_ERROR_MESSAGE("Texture '", pRenderTargetVk->GetDesc().Name, "' being set as render target at slot ", rt, " is not transitioned to RESOURCE_STATE_RENDER_TARGET state. "
+ "Actual texture state: ", GetResourceStateString(pRenderTargetVk->GetState()), ". "
+ "Use SET_RENDER_TARGETS_FLAG_TRANSITION_COLOR flag or explicitly transition the resource using IDeviceContext::TransitionResourceStates() method.");
+ }
+ }
+#endif
}
}
m_CommandBuffer.BeginRenderPass(m_RenderPass, m_Framebuffer, m_FramebufferWidth, m_FramebufferHeight);
@@ -1130,7 +1158,7 @@ namespace Diligent
}
}
- void DeviceContextVkImpl::SetRenderTargets( Uint32 NumRenderTargets, ITextureView *ppRenderTargets[], ITextureView *pDepthStencil )
+ void DeviceContextVkImpl::SetRenderTargets( Uint32 NumRenderTargets, ITextureView *ppRenderTargets[], ITextureView *pDepthStencil, SET_RENDER_TARGETS_FLAGS Flags )
{
if ( TDeviceContextBase::SetRenderTargets( NumRenderTargets, ppRenderTargets, pDepthStencil ) )
{
@@ -1187,7 +1215,7 @@ namespace Diligent
}
EnsureVkCmdBuffer();
- CommitRenderPassAndFramebuffer();
+ CommitRenderPassAndFramebuffer(Flags);
}
void DeviceContextVkImpl::ResetRenderTargets()
diff --git a/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp b/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp
index 7445df91..654e6bb1 100644
--- a/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/RenderDeviceFactoryVk.cpp
@@ -315,7 +315,7 @@ void EngineFactoryVkImpl::CreateSwapChainVk( IRenderDevice* pDevice,
pDeviceContextVk->SetSwapChain(pSwapChainVk);
// Bind default render target
- pDeviceContextVk->SetRenderTargets( 0, nullptr, nullptr );
+ pDeviceContextVk->SetRenderTargets( 0, nullptr, nullptr, SET_RENDER_TARGETS_FLAG_TRANSITION_ALL );
// Set default viewport
pDeviceContextVk->SetViewports( 1, nullptr, 0, 0 );
diff --git a/Graphics/GraphicsEngineVulkan/src/SwapChainVkImpl.cpp b/Graphics/GraphicsEngineVulkan/src/SwapChainVkImpl.cpp
index 9a5bed10..5cdb4f4c 100644
--- a/Graphics/GraphicsEngineVulkan/src/SwapChainVkImpl.cpp
+++ b/Graphics/GraphicsEngineVulkan/src/SwapChainVkImpl.cpp
@@ -499,7 +499,7 @@ void SwapChainVkImpl::Present(Uint32 SyncInterval)
{
// If default framebuffer is bound, we need to call SetRenderTargets()
// to bind new back buffer RTV
- pImmediateCtxVk->SetRenderTargets(0, nullptr, nullptr);
+ pImmediateCtxVk->SetRenderTargets(0, nullptr, nullptr, SET_RENDER_TARGETS_FLAG_TRANSITION_ALL);
}
}
}
@@ -551,7 +551,7 @@ void SwapChainVkImpl::Resize( Uint32 NewWidth, Uint32 NewHeight )
if( bIsDefaultFBBound )
{
// Set default render target and viewport
- pDeviceContext->SetRenderTargets( 0, nullptr, nullptr );
+ pDeviceContext->SetRenderTargets( 0, nullptr, nullptr, SET_RENDER_TARGETS_FLAG_TRANSITION_ALL );
pDeviceContext->SetViewports( 1, nullptr, 0, 0 );
}
}