diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h index c35d0750a5..be30697980 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawContext.h @@ -162,6 +162,7 @@ namespace AZ RHI::DrawListTag GetDrawListTag(); //! Create a draw srg + //! Note: the draw srg can only be used in the current frame. It can't be cached and used for following frames. Data::Instance NewDrawSrg(); //! Get per context srg diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h index 23a93481fd..afc9340521 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawInterface.h @@ -59,10 +59,15 @@ namespace AZ //! Draw a geometry to a scene with a given material virtual void DrawGeometry(Data::Instance material, const GeometryData& geometry, ScenePtr scene) = 0; + //! Deprecated. Please use AddDrawPacket(Scene* scene, ConstPtr drawPacket) instead //! Submits a DrawPacket to the renderer. //! Note that ownership of the DrawPacket pointer is passed to the dynamic draw system. //! (it will be cleaned up correctly since the DrawPacket keeps track of the allocator that was used when it was built) virtual void AddDrawPacket(Scene* scene, AZStd::unique_ptr drawPacket) = 0; + + //! Submits a DrawPacket to the scene. + //! The dynamic draw system will keep a reference for the DrawPacket until it's rendered. + virtual void AddDrawPacket(Scene* scene, ConstPtr drawPacket) = 0; //! Get DrawLists from any DynamicDrawContext which output to the specified RasterPass. virtual AZStd::vector GetDrawListsForPass(const RasterPass* pass) = 0; diff --git a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h index 4a00566632..369a3a5a55 100644 --- a/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h +++ b/Gems/Atom/RPI/Code/Include/Atom/RPI.Public/DynamicDraw/DynamicDrawSystem.h @@ -35,6 +35,7 @@ namespace AZ RHI::Ptr GetDynamicBuffer(uint32_t size, uint32_t alignment) override; void DrawGeometry(Data::Instance material, const GeometryData& geometry, ScenePtr scene) override; void AddDrawPacket(Scene* scene, AZStd::unique_ptr drawPacket) override; + void AddDrawPacket(Scene* scene, ConstPtr drawPacket) override; AZStd::vector GetDrawListsForPass(const RasterPass* pass) override; // Submit draw data for selected scene and pipeline @@ -52,7 +53,7 @@ namespace AZ AZStd::list> m_dynamicDrawContexts; AZStd::mutex m_mutexDrawPackets; - AZStd::map>> m_drawPackets; + AZStd::map>> m_drawPackets; }; } } diff --git a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp index c38fbc4480..85391d854a 100644 --- a/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp +++ b/Gems/Atom/RPI/Code/Source/RPI.Public/DynamicDraw/DynamicDrawSystem.cpp @@ -70,7 +70,13 @@ namespace AZ void DynamicDrawSystem::AddDrawPacket(Scene* scene, AZStd::unique_ptr drawPacket) { AZStd::lock_guard lock(m_mutexDrawPackets); - m_drawPackets[scene].emplace_back(AZStd::move(drawPacket)); + m_drawPackets[scene].emplace_back(ConstPtr(AZStd::move(drawPacket.get()))); + } + + void DynamicDrawSystem::AddDrawPacket(Scene* scene, ConstPtr drawPacket) + { + AZStd::lock_guard lock(m_mutexDrawPackets); + m_drawPackets[scene].emplace_back(drawPacket); } void DynamicDrawSystem::SubmitDrawData(Scene* scene, AZStd::vector views)