diff --git a/src/dxvk/dxvk_cmdlist.h b/src/dxvk/dxvk_cmdlist.h index e5be0a875..96f826813 100644 --- a/src/dxvk/dxvk_cmdlist.h +++ b/src/dxvk/dxvk_cmdlist.h @@ -275,9 +275,28 @@ namespace dxvk { */ template void track(Rc object) { + static_assert(!std::is_same_v); m_objectTracker.track>(std::move(object)); } + /** + * \brief Tracks a sampler object + * + * Special code path that uses the tracking ID to ensure samplers + * only get tracked once per submission. This is useful since + * sampler objects are processed much the same way as resources. + * \param [in] sampler Sampler object + */ + void track(const Rc& sampler) { + if (sampler->trackId(m_trackingId)) + m_objectTracker.track>(sampler.ptr()); + } + + void track(Rc&& sampler) { + if (sampler->trackId(m_trackingId)) + m_objectTracker.track>(std::move(sampler)); + } + /** * \brief Tracks a resource with access mode * diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp index bea5043c9..ebb0f6080 100644 --- a/src/dxvk/dxvk_context.cpp +++ b/src/dxvk/dxvk_context.cpp @@ -1358,7 +1358,7 @@ namespace dxvk { } m_cmd->track(imageView->image(), DxvkAccess::Write); - m_cmd->track(sampler); + m_cmd->track(std::move(sampler)); } @@ -2662,7 +2662,7 @@ namespace dxvk { m_cmd->track(dstView->image(), DxvkAccess::Write); m_cmd->track(srcView->image(), DxvkAccess::Read); - m_cmd->track(sampler); + m_cmd->track(std::move(sampler)); } diff --git a/src/dxvk/dxvk_sampler.h b/src/dxvk/dxvk_sampler.h index f1c9370c1..4bb782dc7 100644 --- a/src/dxvk/dxvk_sampler.h +++ b/src/dxvk/dxvk_sampler.h @@ -163,6 +163,22 @@ namespace dxvk { release(); } + /** + * \brief Updates tracking ID for sampler object + * + * Used when tracking submissions. + * \param [in] trackingID Tracking ID + * \returns \c true if the tracking ID has been updated, + * \c false if the sampler was already tracked with this ID. + */ + bool trackId(uint64_t trackingId) { + if (trackingId <= m_trackingId) + return false; + + m_trackingId = trackingId; + return true; + } + /** * \brief Sampler handle * \returns Sampler handle @@ -181,7 +197,8 @@ namespace dxvk { private: - std::atomic m_refCount = { 0u }; + std::atomic m_refCount = { 0u }; + uint64_t m_trackingId = 0u; DxvkSamplerPool* m_pool = nullptr; DxvkSamplerKey m_key = { };