diff options
| author | Egor Yusov <egor.yusov@gmail.com> | 2018-12-01 04:20:46 +0000 |
|---|---|---|
| committer | Egor Yusov <egor.yusov@gmail.com> | 2018-12-01 04:20:46 +0000 |
| commit | 1303ae5da64c35a56768edecdf60d57f7a2fe628 (patch) | |
| tree | b240850db3f521a636bdd71435a9aafda99a89c5 /Graphics/GraphicsEngineVulkan | |
| parent | Improved type safety of different flag types (diff) | |
| download | DiligentCore-1303ae5da64c35a56768edecdf60d57f7a2fe628.tar.gz DiligentCore-1303ae5da64c35a56768edecdf60d57f7a2fe628.zip | |
Added explicit state transition flags to SetRenderTargets method
Diffstat (limited to 'Graphics/GraphicsEngineVulkan')
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 ); } } |
