diff --git a/include/RenderGraph/Attachment.hpp b/include/RenderGraph/Attachment.hpp index a0780b4..b1f0cf6 100644 --- a/include/RenderGraph/Attachment.hpp +++ b/include/RenderGraph/Attachment.hpp @@ -245,7 +245,8 @@ namespace crg CRG_API VkDescriptorType getDescriptorType()const; CRG_API WriteDescriptorSet getWrite( uint32_t binding - , uint32_t count )const; + , uint32_t count + , uint32_t index )const; CRG_API VkAccessFlags getAccessMask( bool isInput , bool isOutput )const; CRG_API VkPipelineStageFlags getPipelineStageFlags( bool isCompute )const; @@ -260,6 +261,11 @@ namespace crg return Flag( flags & FlagKind( flag ) ) == flag; } + uint32_t getBufferCount()const + { + return uint32_t( buffer.getCount() ); + } + bool isUniform()const { return hasFlag( Flag::Uniform ); @@ -351,10 +357,11 @@ namespace crg */ /**@{*/ CRG_API uint32_t getViewCount()const; + CRG_API uint32_t getBufferCount()const; CRG_API ImageViewId view( uint32_t index = 0u )const; CRG_API VkImageLayout getImageLayout( bool separateDepthStencilLayouts )const; CRG_API VkDescriptorType getDescriptorType()const; - CRG_API WriteDescriptorSet getBufferWrite()const; + CRG_API WriteDescriptorSet getBufferWrite( uint32_t index = 0u )const; CRG_API VkAccessFlags getAccessMask()const; CRG_API VkPipelineStageFlags getPipelineStageFlags( bool isCompute )const; diff --git a/include/RenderGraph/FrameGraph.hpp b/include/RenderGraph/FrameGraph.hpp index 2fb5977..3a77f71 100644 --- a/include/RenderGraph/FrameGraph.hpp +++ b/include/RenderGraph/FrameGraph.hpp @@ -75,8 +75,10 @@ namespace crg CRG_API LayoutState getFinalLayoutState( ImageId image , VkImageViewType viewType , VkImageSubresourceRange range )const; - CRG_API LayoutState getFinalLayoutState( ImageViewId view )const; - CRG_API AccessState getFinalAccessState( Buffer const & buffer )const; + CRG_API LayoutState getFinalLayoutState( ImageViewId view + , uint32_t passIndex = 0u )const; + CRG_API AccessState getFinalAccessState( Buffer const & buffer + , uint32_t passIndex = 0u )const; CRG_API void addInput( ImageId image , VkImageViewType viewType , VkImageSubresourceRange range diff --git a/include/RenderGraph/FrameGraphPrerequisites.hpp b/include/RenderGraph/FrameGraphPrerequisites.hpp index 705bcaa..7ac1292 100644 --- a/include/RenderGraph/FrameGraphPrerequisites.hpp +++ b/include/RenderGraph/FrameGraphPrerequisites.hpp @@ -124,6 +124,7 @@ namespace crg using VkAttachmentDescriptionArray = std::vector< VkAttachmentDescription >; using VkAttachmentReferenceArray = std::vector< VkAttachmentReference >; + using VkBufferArray = std::vector< VkBuffer >; using VkBufferViewArray = std::vector< VkBufferView >; using VkDescriptorBufferInfoArray = std::vector< VkDescriptorBufferInfo >; using VkDescriptorImageInfoArray = std::vector< VkDescriptorImageInfo >; @@ -198,9 +199,46 @@ namespace crg struct Buffer { - VkBuffer buffer; std::string name; + + Buffer( VkBufferArray pbuffers + , std::string pname )noexcept + : name{ std::move( pname ) } + , m_buffers{ std::move( pbuffers ) } + { + } + + Buffer( VkBuffer buffer + , std::string name )noexcept + : Buffer{ VkBufferArray{ buffer }, std::move( name ) } + { + } + + VkBuffer const & buffer( uint32_t index = 0 )const noexcept + { + return m_buffers.size() == 1u + ? m_buffers.front() + : m_buffers[index]; + } + + VkBuffer & buffer( uint32_t index = 0 )noexcept + { + return m_buffers.size() == 1u + ? m_buffers.front() + : m_buffers[index]; + } + + size_t getCount()const noexcept + { + return m_buffers.size(); + } + + private: + VkBufferArray m_buffers; + + friend CRG_API bool operator==( Buffer const & lhs, Buffer const & rhs ); }; + CRG_API bool operator==( Buffer const & lhs, Buffer const & rhs ); struct VertexBuffer @@ -391,6 +429,8 @@ namespace crg CRG_API bool isStencilFormat( VkFormat fmt )noexcept; CRG_API bool isColourFormat( VkFormat fmt )noexcept; CRG_API bool isDepthStencilFormat( VkFormat fmt )noexcept; + CRG_API ImageViewId const & resolveView( ImageViewId const & view + , uint32_t passIndex ); template< typename T > static size_t hashCombine( size_t hash diff --git a/include/RenderGraph/FramePassGroup.hpp b/include/RenderGraph/FramePassGroup.hpp index 62237ff..5139a94 100644 --- a/include/RenderGraph/FramePassGroup.hpp +++ b/include/RenderGraph/FramePassGroup.hpp @@ -53,8 +53,10 @@ namespace crg */ /**@[*/ CRG_API ResourceHandler & getHandler()const; - CRG_API LayoutState getFinalLayoutState( ImageViewId view )const; - CRG_API AccessState getFinalAccessState( Buffer const & buffer )const; + CRG_API LayoutState getFinalLayoutState( ImageViewId view + , uint32_t passIndex = 0u )const; + CRG_API AccessState getFinalAccessState( Buffer const & buffer + , uint32_t passIndex = 0u )const; CRG_API ImageId createImage( ImageData const & img )const; CRG_API ImageViewId createView( ImageViewData const & view )const; CRG_API void addInput( ImageId image diff --git a/include/RenderGraph/RunnablePass.hpp b/include/RenderGraph/RunnablePass.hpp index 3517eb0..204b549 100644 --- a/include/RenderGraph/RunnablePass.hpp +++ b/include/RenderGraph/RunnablePass.hpp @@ -213,12 +213,12 @@ namespace crg *\param[in] index * The pass index. */ - CRG_API void recordCurrent( RecordContext & context ); + CRG_API uint32_t recordCurrent( RecordContext & context ); /** *\brief * Re-records the pass commands into its command buffer. */ - CRG_API void reRecordCurrent(); + CRG_API uint32_t reRecordCurrent(); /** *\brief * Submits this pass' command buffer to the given queue. diff --git a/include/RenderGraph/RunnablePasses/ComputePass.hpp b/include/RenderGraph/RunnablePasses/ComputePass.hpp index 7b0b537..24551e5 100644 --- a/include/RenderGraph/RunnablePasses/ComputePass.hpp +++ b/include/RenderGraph/RunnablePasses/ComputePass.hpp @@ -73,7 +73,10 @@ namespace crg */ auto & passIndex( uint32_t const * config ) { - m_passIndex = config; + m_getPassIndex = [config]() + { + return *config; + }; return *this; } /** @@ -87,6 +90,15 @@ namespace crg } /** *\param[in] config + * The pass index callback. + */ + auto & getPassIndex( RunnablePass::GetPassIndexCallback config ) + { + m_getPassIndex = config; + return *this; + } + /** + *\param[in] config * The callback checking the enable status of the pass. */ auto & isEnabled( RunnablePass::IsEnabledCallback config ) @@ -105,6 +117,15 @@ namespace crg } /** *\param[in] config + * The callback initialising the pass. + */ + auto & initialise( RunnablePass::InitialiseCallback config ) + { + m_initialise = config; + return *this; + } + /** + *\param[in] config * The callback ending the pass. */ auto & end( RunnablePass::RecordCallback config ) @@ -141,9 +162,10 @@ namespace crg } pp::ConfigT< WrapperT > m_baseConfig{}; - WrapperT< uint32_t const * > m_passIndex{}; + WrapperT< RunnablePass::InitialiseCallback > m_initialise{}; WrapperT< bool const * > m_enabled{}; WrapperT< RunnablePass::IsEnabledCallback > m_isEnabled{}; + WrapperT< RunnablePass::GetPassIndexCallback > m_getPassIndex{}; WrapperT< RunnablePass::RecordCallback > m_recordInto{}; WrapperT< RunnablePass::RecordCallback > m_end{}; WrapperT< uint32_t > m_groupCountX{}; @@ -154,9 +176,10 @@ namespace crg template<> struct ConfigT< RawTypeT > { - RawTypeT< uint32_t const * > passIndex{ nullptr }; + RawTypeT< RunnablePass::InitialiseCallback > initialise{}; RawTypeT< bool const * > enabled{ nullptr }; std::optional< RunnablePass::IsEnabledCallback > isEnabled{}; + RawTypeT< RunnablePass::GetPassIndexCallback > getPassIndex{}; RawTypeT< RunnablePass::RecordCallback > recordInto{}; RawTypeT< RunnablePass::RecordCallback > end{}; RawTypeT< uint32_t > groupCountX{ 1u }; diff --git a/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp b/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp index c55dcd9..9044089 100644 --- a/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp +++ b/include/RenderGraph/RunnablePasses/RenderPassHolder.hpp @@ -93,5 +93,6 @@ namespace crg PassData const * m_currentPass{}; VkPipelineColorBlendAttachmentStateArray m_blendAttachs; uint32_t m_layers{}; + uint32_t m_index{}; }; } diff --git a/source/RenderGraph/Attachment.cpp b/source/RenderGraph/Attachment.cpp index dc485b0..4856a2a 100644 --- a/source/RenderGraph/Attachment.cpp +++ b/source/RenderGraph/Attachment.cpp @@ -75,7 +75,8 @@ namespace crg } WriteDescriptorSet BufferAttachment::getWrite( uint32_t binding - , uint32_t count )const + , uint32_t count + , uint32_t index )const { WriteDescriptorSet result{ binding , 0u @@ -84,12 +85,12 @@ namespace crg if ( isView() ) { - result.bufferViewInfo.push_back( VkDescriptorBufferInfo{ buffer.buffer, range.offset, range.size } ); + result.bufferViewInfo.push_back( VkDescriptorBufferInfo{ buffer.buffer( index ), range.offset, range.size } ); result.texelBufferView.push_back( view ); } else { - result.bufferInfo.push_back( VkDescriptorBufferInfo{ buffer.buffer, range.offset, range.size } ); + result.bufferInfo.push_back( VkDescriptorBufferInfo{ buffer.buffer( index ), range.offset, range.size } ); } return result; @@ -579,6 +580,13 @@ namespace crg : uint32_t{}; } + uint32_t Attachment::getBufferCount()const + { + return isBuffer() + ? buffer.getBufferCount() + : uint32_t{}; + } + ImageViewId Attachment::view( uint32_t index )const { return isImage() @@ -604,10 +612,10 @@ namespace crg return buffer.getDescriptorType(); } - WriteDescriptorSet Attachment::getBufferWrite()const + WriteDescriptorSet Attachment::getBufferWrite( uint32_t index )const { assert( isBuffer() ); - return buffer.getWrite( binding, 1u ); + return buffer.getWrite( binding, 1u, index ); } VkAccessFlags Attachment::getAccessMask()const diff --git a/source/RenderGraph/AttachmentTransition.cpp b/source/RenderGraph/AttachmentTransition.cpp index 0a1764e..18fc27b 100644 --- a/source/RenderGraph/AttachmentTransition.cpp +++ b/source/RenderGraph/AttachmentTransition.cpp @@ -106,7 +106,7 @@ namespace crg bool operator==( Buffer const & lhs, Buffer const & rhs ) { - return lhs.buffer == rhs.buffer; + return lhs.m_buffers == rhs.m_buffers; } AttachmentTransitions mergeIdenticalTransitions( AttachmentTransitions transitions ) diff --git a/source/RenderGraph/FrameGraph.cpp b/source/RenderGraph/FrameGraph.cpp index 68f2032..e9045df 100644 --- a/source/RenderGraph/FrameGraph.cpp +++ b/source/RenderGraph/FrameGraph.cpp @@ -249,16 +249,23 @@ namespace crg return m_finalState.getLayoutState( image, viewType, range ); } - LayoutState FrameGraph::getFinalLayoutState( ImageViewId view )const + LayoutState FrameGraph::getFinalLayoutState( ImageViewId view + , uint32_t passIndex )const { - return getFinalLayoutState( view.data->image - , view.data->info.viewType - , view.data->info.subresourceRange ); + if ( view.data->source.empty() ) + { + return getFinalLayoutState( view.data->image + , view.data->info.viewType + , view.data->info.subresourceRange ); + } + + return getFinalLayoutState( view.data->source[passIndex], 0u ); } - AccessState FrameGraph::getFinalAccessState( Buffer const & buffer )const + AccessState FrameGraph::getFinalAccessState( Buffer const & buffer + , uint32_t passIndex )const { - return m_finalState.getAccessState( buffer.buffer, { 0u, VK_WHOLE_SIZE } ); + return m_finalState.getAccessState( buffer.buffer( passIndex ), { 0u, VK_WHOLE_SIZE } ); } void FrameGraph::addInput( ImageId image @@ -677,4 +684,12 @@ namespace crg { return isDepthFormat( fmt ) && isStencilFormat( fmt ); } + + ImageViewId const & resolveView( ImageViewId const & view + , uint32_t passIndex ) + { + return view.data->source.empty() + ? view + : view.data->source[passIndex]; + } } diff --git a/source/RenderGraph/FramePass.cpp b/source/RenderGraph/FramePass.cpp index 3ccfab6..fbc7ec1 100644 --- a/source/RenderGraph/FramePass.cpp +++ b/source/RenderGraph/FramePass.cpp @@ -176,12 +176,12 @@ namespace crg if constexpr ( sizeof( size_t ) == sizeof( uint64_t ) ) { return size_t( pass.id ) << 32u - | ( ptrdiff_t( buffer.buffer ) & 0xFFFFFFFF ); + | ( ptrdiff_t( buffer.buffer() ) & 0xFFFFFFFF ); } else { return size_t( pass.id ) << 16u - | ( ptrdiff_t( buffer.buffer ) & 0x0000FFFF ); + | ( ptrdiff_t( buffer.buffer() ) & 0x0000FFFF ); } } } diff --git a/source/RenderGraph/FramePassDependenciesBuilder.cpp b/source/RenderGraph/FramePassDependenciesBuilder.cpp index 1269440..79855ed 100644 --- a/source/RenderGraph/FramePassDependenciesBuilder.cpp +++ b/source/RenderGraph/FramePassDependenciesBuilder.cpp @@ -347,7 +347,7 @@ namespace crg static bool areOverlapping( Buffer const & lhs , Buffer const & rhs ) { - return lhs.buffer == rhs.buffer; + return lhs.buffer() == rhs.buffer(); } template< typename DataT > @@ -626,7 +626,7 @@ namespace crg static bool match( Buffer const & lhs, Buffer const & rhs ) { - return lhs.buffer != rhs.buffer; + return lhs.buffer() != rhs.buffer(); } static bool match( ImageViewId const & lhs, ImageViewId const & rhs ) diff --git a/source/RenderGraph/FramePassGroup.cpp b/source/RenderGraph/FramePassGroup.cpp index d0372cf..785826f 100644 --- a/source/RenderGraph/FramePassGroup.cpp +++ b/source/RenderGraph/FramePassGroup.cpp @@ -140,14 +140,16 @@ namespace crg return m_graph.getHandler(); } - LayoutState FramePassGroup::getFinalLayoutState( ImageViewId view )const + LayoutState FramePassGroup::getFinalLayoutState( ImageViewId view + , uint32_t passIndex )const { - return m_graph.getFinalLayoutState( view ); + return m_graph.getFinalLayoutState( view, passIndex ); } - AccessState FramePassGroup::getFinalAccessState( Buffer const & buffer )const + AccessState FramePassGroup::getFinalAccessState( Buffer const & buffer + , uint32_t passIndex )const { - return m_graph.getFinalAccessState( buffer ); + return m_graph.getFinalAccessState( buffer, passIndex ); } ImageId FramePassGroup::createImage( ImageData const & img )const diff --git a/source/RenderGraph/LayerLayoutStatesHandler.cpp b/source/RenderGraph/LayerLayoutStatesHandler.cpp index 1003eb0..6ec6575 100644 --- a/source/RenderGraph/LayerLayoutStatesHandler.cpp +++ b/source/RenderGraph/LayerLayoutStatesHandler.cpp @@ -6,6 +6,8 @@ See LICENSE file in root folder. #include "RenderGraph/ImageData.hpp" #include "RenderGraph/ImageViewData.hpp" +#include + namespace crg { LayerLayoutStatesHandler::LayerLayoutStatesHandler( LayerLayoutStatesMap const & rhs ) @@ -38,6 +40,8 @@ namespace crg void LayerLayoutStatesHandler::setLayoutState( crg::ImageViewId view , LayoutState layoutState ) { + assert( view.data->source.empty() + && "Merged image views must be resolved before setting their layout state" ); setLayoutState( view.data->image , view.data->info.viewType , view.data->info.subresourceRange @@ -65,6 +69,8 @@ namespace crg LayoutState LayerLayoutStatesHandler::getLayoutState( ImageViewId view )const { + assert( view.data->source.empty() + && "Merged image views must be resolved before finding their layout state" ); return getLayoutState( view.data->image , view.data->info.viewType , view.data->info.subresourceRange ); diff --git a/source/RenderGraph/ResourceHandler.cpp b/source/RenderGraph/ResourceHandler.cpp index 74b93ea..ab8e707 100644 --- a/source/RenderGraph/ResourceHandler.cpp +++ b/source/RenderGraph/ResourceHandler.cpp @@ -99,7 +99,7 @@ namespace crg Logger::logError( stream.str() ); } - if ( vertexBuffer->buffer.buffer ) + if ( vertexBuffer->buffer.buffer() ) { std::stringstream stream; stream << "Leaked [VkBuffer](" << vertexBuffer->buffer.name << ")"; @@ -311,13 +311,13 @@ namespace crg auto res = context.vkCreateBuffer( context.device , &createInfo , context.allocator - , &vertexBuffer->buffer.buffer ); + , &vertexBuffer->buffer.buffer() ); checkVkResult( res, "Vertex buffer creation" ); - crgRegisterObject( context, "QuadVertexBuffer_" + suffix, vertexBuffer->buffer.buffer ); + crgRegisterObject( context, "QuadVertexBuffer_" + suffix, vertexBuffer->buffer.buffer() ); VkMemoryRequirements requirements{}; context.vkGetBufferMemoryRequirements( context.device - , vertexBuffer->buffer.buffer + , vertexBuffer->buffer.buffer() , &requirements ); uint32_t deduced = context.deduceMemoryType( requirements.memoryTypeBits , VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT ); @@ -333,7 +333,7 @@ namespace crg crgRegisterObject( context, "QuadVertexMemory_" + suffix, vertexBuffer->memory ); res = context.vkBindBufferMemory( context.device - , vertexBuffer->buffer.buffer + , vertexBuffer->buffer.buffer() , vertexBuffer->memory , 0u ); checkVkResult( res, "Buffer memory binding" ); @@ -474,11 +474,11 @@ namespace crg , context.allocator ); } - if ( vertexBuffer.buffer.buffer ) + if ( vertexBuffer.buffer.buffer() ) { - crgUnregisterObject( context, vertexBuffer.buffer.buffer ); + crgUnregisterObject( context, vertexBuffer.buffer.buffer() ); context.vkDestroyBuffer( context.device - , vertexBuffer.buffer.buffer + , vertexBuffer.buffer.buffer() , context.allocator ); } } diff --git a/source/RenderGraph/RunnableGraph.cpp b/source/RenderGraph/RunnableGraph.cpp index 4f777cf..f70dd02 100644 --- a/source/RenderGraph/RunnableGraph.cpp +++ b/source/RenderGraph/RunnableGraph.cpp @@ -261,8 +261,7 @@ namespace crg , {} ); } - pass->recordCurrent( recordContext ); - *it = pass->getIndex(); + *it = pass->recordCurrent( recordContext ); ++it; } } diff --git a/source/RenderGraph/RunnablePass.cpp b/source/RenderGraph/RunnablePass.cpp index 7feae29..b26c6e3 100644 --- a/source/RenderGraph/RunnablePass.cpp +++ b/source/RenderGraph/RunnablePass.cpp @@ -281,10 +281,25 @@ namespace crg { for ( uint32_t i = 0u; i < attach.getViewCount(); ++i ) { - m_imageLayouts.setLayoutState( attach.view( i ) - , { attach.getImageLayout( m_context.separateDepthStencilLayouts ) - , attach.getAccessMask() - , attach.getPipelineStageFlags( m_callbacks.isComputePass() ) } ); + auto view = attach.view( i ); + + if ( view.data->source.empty() ) + { + m_imageLayouts.setLayoutState( view + , { attach.getImageLayout( m_context.separateDepthStencilLayouts ) + , attach.getAccessMask() + , attach.getPipelineStageFlags( m_callbacks.isComputePass() ) } ); + } + else + { + for ( auto & source : view.data->source ) + { + m_imageLayouts.setLayoutState( source + , { attach.getImageLayout( m_context.separateDepthStencilLayouts ) + , attach.getAccessMask() + , attach.getPipelineStageFlags( m_callbacks.isComputePass() ) } ); + } + } } } @@ -292,10 +307,14 @@ namespace crg { if ( attach.isStorageBuffer() ) { - auto buffer = attach.buffer.buffer; - auto bires = m_bufferAccesses.emplace( buffer.buffer, AccessState{} ); - bires.first->second = { attach.getAccessMask() - , attach.getPipelineStageFlags( m_callbacks.isComputePass() ) }; + auto & buffer = attach.buffer.buffer; + + for ( uint32_t i = 0u; i < uint32_t( buffer.getCount() ); ++i ) + { + auto bires = m_bufferAccesses.emplace( buffer.buffer( i ), AccessState{} ); + bires.first->second = { attach.getAccessMask() + , attach.getPipelineStageFlags( m_callbacks.isComputePass() ) }; + } } } } @@ -313,7 +332,7 @@ namespace crg pass.initialised = true; } - void RunnablePass::recordCurrent( RecordContext & context ) + uint32_t RunnablePass::recordCurrent( RecordContext & context ) { auto index = m_callbacks.getPassIndex(); assert( m_passes.size() > index ); @@ -321,9 +340,10 @@ namespace crg recordOne( pass.commandBuffer , index , context ); + return isEnabled() ? index : ~( 0u ); } - void RunnablePass::reRecordCurrent() + uint32_t RunnablePass::reRecordCurrent() { assert( m_ruConfig.resettable ); auto index = m_callbacks.getPassIndex(); @@ -337,6 +357,8 @@ namespace crg , index , context ); } + + return isEnabled() ? index : ~( 0u ); } void RunnablePass::recordAll( RecordContext & context ) @@ -438,19 +460,19 @@ namespace crg && attach.isStorageBuffer() ) { auto buffer = attach.buffer; - auto currentState = context.getAccessState( buffer.buffer.buffer + auto currentState = context.getAccessState( buffer.buffer.buffer( index ) , buffer.range ); if ( attach.isClearableBuffer() ) { context.memoryBarrier( commandBuffer - , buffer.buffer.buffer + , buffer.buffer.buffer( index ) , buffer.range , currentState.access , currentState.pipelineStage , { VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT } ); m_context.vkCmdFillBuffer( commandBuffer - , buffer.buffer.buffer + , buffer.buffer.buffer( index ) , buffer.range.offset == 0u ? 0u : details::getAlignedSize( buffer.range.offset, 4u ) , buffer.range.size == VK_WHOLE_SIZE ? VK_WHOLE_SIZE : details::getAlignedSize( buffer.range.size, 4u ) , 0u ); @@ -459,7 +481,7 @@ namespace crg } context.memoryBarrier( commandBuffer - , buffer.buffer.buffer + , buffer.buffer.buffer( index ) , buffer.range , currentState.access , currentState.pipelineStage diff --git a/source/RenderGraph/RunnablePasses/BufferCopy.cpp b/source/RenderGraph/RunnablePasses/BufferCopy.cpp index 5d6f37c..f10e077 100644 --- a/source/RenderGraph/RunnablePasses/BufferCopy.cpp +++ b/source/RenderGraph/RunnablePasses/BufferCopy.cpp @@ -44,8 +44,8 @@ namespace crg { auto srcBufferRange{ m_pass.buffers.front().buffer.range }; auto dstBufferRange{ m_pass.buffers.back().buffer.range }; - auto srcBuffer{ m_pass.buffers.front().buffer.buffer.buffer }; - auto dstBuffer{ m_pass.buffers.back().buffer.buffer.buffer }; + auto srcBuffer{ m_pass.buffers.front().buffer.buffer.buffer( index ) }; + auto dstBuffer{ m_pass.buffers.back().buffer.buffer.buffer( index ) }; // Copy source to target. VkBufferCopy copyRegion{ srcBufferRange.offset + m_copyOffset , dstBufferRange.offset + m_copyOffset diff --git a/source/RenderGraph/RunnablePasses/BufferToImageCopy.cpp b/source/RenderGraph/RunnablePasses/BufferToImageCopy.cpp index 2fa9b8b..71fd9cd 100644 --- a/source/RenderGraph/RunnablePasses/BufferToImageCopy.cpp +++ b/source/RenderGraph/RunnablePasses/BufferToImageCopy.cpp @@ -54,7 +54,7 @@ namespace crg , uint32_t index ) { auto dstAttach{ m_pass.images.back().view( index ) }; - auto srcBuffer{ m_pass.buffers.front().buffer.buffer.buffer }; + auto srcBuffer{ m_pass.buffers.front().buffer.buffer.buffer( index ) }; auto dstImage{ m_graph.createImage( dstAttach.data->image ) }; // Copy source to target. auto range = bufToImg::convert( dstAttach.data->info.subresourceRange ); diff --git a/source/RenderGraph/RunnablePasses/ComputePass.cpp b/source/RenderGraph/RunnablePasses/ComputePass.cpp index 3fb619a..fc2f822 100644 --- a/source/RenderGraph/RunnablePasses/ComputePass.cpp +++ b/source/RenderGraph/RunnablePasses/ComputePass.cpp @@ -26,9 +26,10 @@ namespace crg , IsEnabledCallback( [this](){ return doIsEnabled(); } ) , IsComputePassCallback( [](){ return true; } ) } , ruConfig } - , m_cpConfig{ cpConfig.m_passIndex ? std::move( *cpConfig.m_passIndex ) : defaultV< uint32_t const * > + , m_cpConfig{ cpConfig.m_initialise ? std::move( *cpConfig.m_initialise ) : defaultV< RunnablePass::InitialiseCallback > , cpConfig.m_enabled ? std::move( *cpConfig.m_enabled ) : defaultV< bool const * > , cpConfig.m_isEnabled + , cpConfig.m_getPassIndex ? std::move( *cpConfig.m_getPassIndex ) : defaultV< RunnablePass::GetPassIndexCallback > , cpConfig.m_recordInto ? std::move( *cpConfig.m_recordInto ) : getDefaultV< RunnablePass::RecordCallback >() , cpConfig.m_end ? std::move( *cpConfig.m_end ) : getDefaultV< RunnablePass::RecordCallback >() , cpConfig.m_groupCountX ? std::move( *cpConfig.m_groupCountX ) : 1u @@ -56,13 +57,12 @@ namespace crg { m_pipeline.initialise(); doCreatePipeline( index ); + m_cpConfig.initialise( index ); } uint32_t ComputePass::doGetPassIndex()const { - return ( m_cpConfig.passIndex - ? *m_cpConfig.passIndex - : 0u ); + return m_cpConfig.getPassIndex(); } bool ComputePass::doIsEnabled()const diff --git a/source/RenderGraph/RunnablePasses/ImageToBufferCopy.cpp b/source/RenderGraph/RunnablePasses/ImageToBufferCopy.cpp index 4a9b91d..fbc929e 100644 --- a/source/RenderGraph/RunnablePasses/ImageToBufferCopy.cpp +++ b/source/RenderGraph/RunnablePasses/ImageToBufferCopy.cpp @@ -54,7 +54,7 @@ namespace crg , uint32_t index ) { auto srcAttach{ m_pass.images.back().view( index ) }; - auto dstBuffer{ m_pass.buffers.front().buffer.buffer.buffer }; + auto dstBuffer{ m_pass.buffers.front().buffer.buffer.buffer( index ) }; auto srcImage{ m_graph.createImage( srcAttach.data->image ) }; // Copy source to target. auto range = imToBuf::convert( srcAttach.data->info.subresourceRange ); diff --git a/source/RenderGraph/RunnablePasses/PipelineHolder.cpp b/source/RenderGraph/RunnablePasses/PipelineHolder.cpp index 680e837..bf5a42b 100644 --- a/source/RenderGraph/RunnablePasses/PipelineHolder.cpp +++ b/source/RenderGraph/RunnablePasses/PipelineHolder.cpp @@ -246,7 +246,7 @@ namespace crg for ( auto & uniform : m_pass.buffers ) { - descriptorSet.writes.push_back( uniform.getBufferWrite() ); + descriptorSet.writes.push_back( uniform.getBufferWrite( index ) ); } VkDescriptorSetAllocateInfo allocateInfo{ VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO diff --git a/source/RenderGraph/RunnablePasses/RenderMeshHolder.cpp b/source/RenderGraph/RunnablePasses/RenderMeshHolder.cpp index 7e99472..1a8e224 100644 --- a/source/RenderGraph/RunnablePasses/RenderMeshHolder.cpp +++ b/source/RenderGraph/RunnablePasses/RenderMeshHolder.cpp @@ -109,14 +109,14 @@ namespace crg m_config.recordInto( context, commandBuffer, index ); VkDeviceSize offset{}; - if ( m_config.vertexBuffer.buffer.buffer ) + if ( m_config.vertexBuffer.buffer.buffer( index ) ) { - m_context.vkCmdBindVertexBuffers( commandBuffer, 0u, 1u, &m_config.vertexBuffer.buffer.buffer, &offset ); + m_context.vkCmdBindVertexBuffers( commandBuffer, 0u, 1u, &m_config.vertexBuffer.buffer.buffer( index ), &offset ); } - if ( m_config.indexBuffer.buffer.buffer ) + if ( m_config.indexBuffer.buffer.buffer( index ) ) { - m_context.vkCmdBindIndexBuffer( commandBuffer, m_config.indexBuffer.buffer.buffer, offset, m_config.getIndexType() ); + m_context.vkCmdBindIndexBuffer( commandBuffer, m_config.indexBuffer.buffer.buffer( index ), offset, m_config.getIndexType() ); m_context.vkCmdDrawIndexed( commandBuffer, m_config.getPrimitiveCount(), 1u, 0u, 0u, 0u ); } else diff --git a/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp b/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp index 3ce1f14..1f26a07 100644 --- a/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp +++ b/source/RenderGraph/RunnablePasses/RenderPassHolder.cpp @@ -42,7 +42,19 @@ namespace crg , finalLayout.layout } ); viewAttaches.push_back( { view, initialLayout, finalLayout } ); clearValues.push_back( attach.image.clearValue ); - context.setLayoutState( view, finalLayout ); + + if ( view.data->source.empty() ) + { + context.setLayoutState( view, finalLayout ); + } + else + { + for ( auto & source : view.data->source ) + { + context.setLayoutState( source, finalLayout ); + } + } + return result; } @@ -170,15 +182,16 @@ namespace crg , VkSubpassContents subpassContents , uint32_t index ) { - m_currentPass = &m_passes[index]; + m_index = index; + m_currentPass = &m_passes[m_index]; for ( auto & attach : m_currentPass->attaches ) { - context.setLayoutState( attach.view + context.setLayoutState( resolveView( attach.view, m_index ) , attach.input ); } - auto beginInfo = getBeginInfo( index ); + auto beginInfo = getBeginInfo( m_index ); m_context.vkCmdBeginRenderPass( commandBuffer , &beginInfo , subpassContents ); @@ -191,7 +204,7 @@ namespace crg for ( auto & attach : m_currentPass->attaches ) { - context.setLayoutState( attach.view + context.setLayoutState( resolveView( attach.view, m_index ) , attach.output ); } diff --git a/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp b/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp index 77c1b2d..2b0a9f0 100644 --- a/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp +++ b/source/RenderGraph/RunnablePasses/RenderQuadHolder.cpp @@ -109,7 +109,7 @@ namespace crg m_pipeline.recordInto( context, commandBuffer, index ); m_config.recordInto( context, commandBuffer, index ); VkDeviceSize offset{}; - m_context.vkCmdBindVertexBuffers( commandBuffer, 0u, 1u, &m_vertexBuffer->buffer.buffer, &offset ); + m_context.vkCmdBindVertexBuffers( commandBuffer, 0u, 1u, &m_vertexBuffer->buffer.buffer( index ), &offset ); m_context.vkCmdDraw( commandBuffer, 3u, m_config.m_instances, 0u, 0u ); }