From 3d2b5e4beda1d3c47e1909ca7b668bd84916cb68 Mon Sep 17 00:00:00 2001 From: Sylvain Doremus Date: Sun, 10 May 2026 16:56:20 +0200 Subject: [PATCH] Fixed an issue when source and target buffer are the same during a copy. --- source/RenderGraph/RecordContext.cpp | 12 ++++++++++-- test/TestBases.cpp | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/source/RenderGraph/RecordContext.cpp b/source/RenderGraph/RecordContext.cpp index b31862e..cbf46bf 100644 --- a/source/RenderGraph/RecordContext.cpp +++ b/source/RenderGraph/RecordContext.cpp @@ -667,8 +667,16 @@ namespace crg , AccessState const & finalState ) { runImplicitTransition( commandBuffer, index, srcView ); - memoryBarrier( commandBuffer, srcView, { AccessFlags::eTransferRead, PipelineStageFlags::eTransfer } ); - memoryBarrier( commandBuffer, dstView, { AccessFlags::eTransferWrite, PipelineStageFlags::eTransfer } ); + if ( srcView != dstView ) + { + memoryBarrier( commandBuffer, srcView, { AccessFlags::eTransferRead, PipelineStageFlags::eTransfer } ); + memoryBarrier( commandBuffer, dstView, { AccessFlags::eTransferWrite, PipelineStageFlags::eTransfer } ); + } + else + { + memoryBarrier( commandBuffer, dstView, { AccessFlags::eTransferWrite | AccessFlags::eTransferRead, PipelineStageFlags::eTransfer } ); + } + auto & resources = getResources(); auto [srcPageMin, srcPageCount] = getBufferPageRange( srcView.data->buffer, { srcOffset, size } ); auto [dstPageMin, dstPageCount] = getBufferPageRange( dstView.data->buffer, { dstOffset, size } ); diff --git a/test/TestBases.cpp b/test/TestBases.cpp index b3f6f11..061d287 100644 --- a/test/TestBases.cpp +++ b/test/TestBases.cpp @@ -380,7 +380,7 @@ TEST( Bases, ImplicitActions ) buf6->update(); auto buffer6v = graph.createViewId( test::createView( "buffer6v", buffer6, crg::PixelFormat::eUNDEFINED, buf6->getAllocatedPageCount() ) ); auto & testPass1 = graph.createPass( "Mesh" - , [&testCounts, depth2v, colour1v, colour2v, colour3v, colour4v, buffer1v, buffer2v, buffer3v, buffer5v, buffer6v]( crg::FramePass const & framePass + , [&testCounts, depth2v, colour1v, colour2v, colour3v, colour4v, buffer1v, buffer2v, buffer3v, buffer4v, buffer5v, buffer6v]( crg::FramePass const & framePass , crg::GraphContext & context , crg::RunnableGraph & runGraph ) { @@ -403,6 +403,7 @@ TEST( Bases, ImplicitActions ) .implicitAction( buffer1v, crg::RecordContext::clearBuffer( buffer1v, { crg::AccessFlags::eShaderWrite, crg::PipelineStageFlags::eFragmentShader } ) ) .implicitAction( buffer2v, crg::RecordContext::clearBuffer( buffer2v, 18u, { crg::AccessFlags::eShaderWrite, crg::PipelineStageFlags::eFragmentShader } ) ) .implicitAction( buffer3v, crg::RecordContext::copyBuffer( buffer1v, buffer3v, 0u, 0u, 48u, { crg::AccessFlags::eShaderWrite, crg::PipelineStageFlags::eFragmentShader } ) ) + .implicitAction( buffer4v, crg::RecordContext::copyBuffer( buffer4v, buffer4v, 0u, 48u, 48u, { crg::AccessFlags::eShaderWrite, crg::PipelineStageFlags::eFragmentShader } ) ) .implicitAction( buffer5v, crg::RecordContext::copyBuffer( buffer1v, buffer5v, 0u, 0u, getSize( buffer5v ), { crg::AccessFlags::eShaderWrite, crg::PipelineStageFlags::eFragmentShader } ) ) .implicitAction( buffer6v, crg::RecordContext::copyBuffer( buffer1v, buffer6v, 0u, 0u, getSize( buffer6v ), { crg::AccessFlags::eShaderWrite, crg::PipelineStageFlags::eFragmentShader } ) ) ); } );