From 4c0cbbef6abe2b1a9e8c358be0caf207c907a5d2 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 17 Oct 2024 16:31:22 +0200 Subject: [PATCH] [dxvk] Factor DxvkResource code into DxvkPagedResource And remove the now obsolete code. --- src/d3d11/d3d11_cuda.h | 3 +- src/dxvk/dxvk_buffer.h | 1 - src/dxvk/dxvk_compute.h | 1 - src/dxvk/dxvk_constant_state.h | 1 - src/dxvk/dxvk_context.h | 1 - src/dxvk/dxvk_fence.h | 2 +- src/dxvk/dxvk_gpu_event.h | 2 +- src/dxvk/dxvk_gpu_query.h | 3 +- src/dxvk/dxvk_graphics.h | 1 - src/dxvk/dxvk_image.h | 1 - src/dxvk/dxvk_meta_copy.h | 1 - src/dxvk/dxvk_meta_resolve.h | 2 +- src/dxvk/dxvk_resource.cpp | 18 ----- src/dxvk/dxvk_resource.h | 129 --------------------------------- src/dxvk/dxvk_sampler.h | 3 +- src/dxvk/dxvk_sparse.cpp | 5 ++ src/dxvk/dxvk_sparse.h | 83 ++++++++++++++++++++- src/dxvk/meson.build | 1 - 18 files changed, 93 insertions(+), 165 deletions(-) delete mode 100644 src/dxvk/dxvk_resource.cpp delete mode 100644 src/dxvk/dxvk_resource.h diff --git a/src/d3d11/d3d11_cuda.h b/src/d3d11/d3d11_cuda.h index a9fcdf4b3..8e0c35c73 100644 --- a/src/d3d11/d3d11_cuda.h +++ b/src/d3d11/d3d11_cuda.h @@ -3,7 +3,8 @@ #include #include -#include "../dxvk/dxvk_resource.h" +#include "../dxvk/dxvk_memory.h" +#include "../dxvk/dxvk_sparse.h" #include "../util/com/com_guid.h" #include "../util/com/com_object.h" diff --git a/src/dxvk/dxvk_buffer.h b/src/dxvk/dxvk_buffer.h index 628225076..5e2b74524 100644 --- a/src/dxvk/dxvk_buffer.h +++ b/src/dxvk/dxvk_buffer.h @@ -7,7 +7,6 @@ #include "dxvk_format.h" #include "dxvk_hash.h" #include "dxvk_memory.h" -#include "dxvk_resource.h" #include "dxvk_sparse.h" namespace dxvk { diff --git a/src/dxvk/dxvk_compute.h b/src/dxvk/dxvk_compute.h index cd758ae0d..c684d9762 100644 --- a/src/dxvk/dxvk_compute.h +++ b/src/dxvk/dxvk_compute.h @@ -7,7 +7,6 @@ #include "dxvk_bind_mask.h" #include "dxvk_graphics_state.h" #include "dxvk_pipelayout.h" -#include "dxvk_resource.h" #include "dxvk_shader.h" #include "dxvk_stats.h" diff --git a/src/dxvk/dxvk_constant_state.h b/src/dxvk/dxvk_constant_state.h index dec4ec94a..19db7b88f 100644 --- a/src/dxvk/dxvk_constant_state.h +++ b/src/dxvk/dxvk_constant_state.h @@ -3,7 +3,6 @@ #include "dxvk_buffer.h" #include "dxvk_framebuffer.h" #include "dxvk_limits.h" -#include "dxvk_resource.h" #include "dxvk_shader.h" namespace dxvk { diff --git a/src/dxvk/dxvk_context.h b/src/dxvk/dxvk_context.h index 012dc316f..c26788493 100644 --- a/src/dxvk/dxvk_context.h +++ b/src/dxvk/dxvk_context.h @@ -6,7 +6,6 @@ #include "dxvk_context_state.h" #include "dxvk_objects.h" #include "dxvk_queue.h" -#include "dxvk_resource.h" #include "dxvk_util.h" namespace dxvk { diff --git a/src/dxvk/dxvk_fence.h b/src/dxvk/dxvk_fence.h index 86783dac4..ffa2556d4 100644 --- a/src/dxvk/dxvk_fence.h +++ b/src/dxvk/dxvk_fence.h @@ -5,7 +5,7 @@ #include #include -#include "dxvk_resource.h" +#include "dxvk_include.h" #include "../util/thread.h" diff --git a/src/dxvk/dxvk_gpu_event.h b/src/dxvk/dxvk_gpu_event.h index 36dd494e3..1e53f7069 100644 --- a/src/dxvk/dxvk_gpu_event.h +++ b/src/dxvk/dxvk_gpu_event.h @@ -3,7 +3,7 @@ #include #include -#include "dxvk_resource.h" +#include "dxvk_include.h" namespace dxvk { diff --git a/src/dxvk/dxvk_gpu_query.h b/src/dxvk/dxvk_gpu_query.h index 9f25dbf48..ec65c329b 100644 --- a/src/dxvk/dxvk_gpu_query.h +++ b/src/dxvk/dxvk_gpu_query.h @@ -7,10 +7,11 @@ #include "../util/util_small_vector.h" -#include "dxvk_resource.h" +#include "dxvk_include.h" namespace dxvk { + class DxvkDevice; class DxvkCommandList; class DxvkGpuQueryPool; diff --git a/src/dxvk/dxvk_graphics.h b/src/dxvk/dxvk_graphics.h index 4f618f783..5b8ee6b14 100644 --- a/src/dxvk/dxvk_graphics.h +++ b/src/dxvk/dxvk_graphics.h @@ -9,7 +9,6 @@ #include "dxvk_graphics_state.h" #include "dxvk_pipelayout.h" #include "dxvk_renderpass.h" -#include "dxvk_resource.h" #include "dxvk_shader.h" #include "dxvk_stats.h" diff --git a/src/dxvk/dxvk_image.h b/src/dxvk/dxvk_image.h index f7c06c9a1..f28ac4ee2 100644 --- a/src/dxvk/dxvk_image.h +++ b/src/dxvk/dxvk_image.h @@ -3,7 +3,6 @@ #include "dxvk_descriptor.h" #include "dxvk_format.h" #include "dxvk_memory.h" -#include "dxvk_resource.h" #include "dxvk_sparse.h" #include "dxvk_util.h" diff --git a/src/dxvk/dxvk_meta_copy.h b/src/dxvk/dxvk_meta_copy.h index 93c1651c3..46e9f09ba 100644 --- a/src/dxvk/dxvk_meta_copy.h +++ b/src/dxvk/dxvk_meta_copy.h @@ -8,7 +8,6 @@ #include "dxvk_barrier.h" #include "dxvk_cmdlist.h" #include "dxvk_hash.h" -#include "dxvk_resource.h" namespace dxvk { diff --git a/src/dxvk/dxvk_meta_resolve.h b/src/dxvk/dxvk_meta_resolve.h index e32241b0d..9a1b1523e 100644 --- a/src/dxvk/dxvk_meta_resolve.h +++ b/src/dxvk/dxvk_meta_resolve.h @@ -7,7 +7,7 @@ #include "dxvk_barrier.h" #include "dxvk_cmdlist.h" -#include "dxvk_resource.h" +#include "dxvk_image.h" namespace dxvk { diff --git a/src/dxvk/dxvk_resource.cpp b/src/dxvk/dxvk_resource.cpp deleted file mode 100644 index 4dff5d7c2..000000000 --- a/src/dxvk/dxvk_resource.cpp +++ /dev/null @@ -1,18 +0,0 @@ -#include "dxvk_resource.h" - -namespace dxvk { - - std::atomic DxvkResource::s_cookie = { 0ull }; - - - DxvkResource::DxvkResource() - : m_useCount(0ull), m_cookie(++s_cookie) { - - } - - - DxvkResource::~DxvkResource() { - - } - -} \ No newline at end of file diff --git a/src/dxvk/dxvk_resource.h b/src/dxvk/dxvk_resource.h deleted file mode 100644 index 9007c6ff9..000000000 --- a/src/dxvk/dxvk_resource.h +++ /dev/null @@ -1,129 +0,0 @@ -#pragma once - -#include "dxvk_include.h" -#include "dxvk_memory.h" - -namespace dxvk { - - /** - * \brief DXVK resource - * - * Keeps track of whether the resource is currently in use - * by the GPU. As soon as a command that uses the resource - * is recorded, it will be marked as 'in use'. - */ - class DxvkResource { - static constexpr uint64_t RdAccessShift = 24; - static constexpr uint64_t WrAccessShift = 44; - - static constexpr uint64_t RefcountMask = (1ull << RdAccessShift) - 1; - static constexpr uint64_t RdAccessMask = ((1ull << (WrAccessShift - RdAccessShift)) - 1) << RdAccessShift; - static constexpr uint64_t WrAccessMask = ((1ull << (64 - WrAccessShift)) - 1) << WrAccessShift; - - static constexpr uint64_t RefcountInc = 1ull; - static constexpr uint64_t RdAccessInc = 1ull << RdAccessShift; - static constexpr uint64_t WrAccessInc = 1ull << WrAccessShift; - public: - - DxvkResource(); - - virtual ~DxvkResource(); - - /** - * \brief Unique object identifier - * - * Can be used to identify an object even when - * the lifetime of the object is unknown, and - * without referencing the actual object. - * \returns Unique identifier - */ - uint64_t cookie() const { - return m_cookie; - } - - /** - * \brief Increments reference count - */ - void incRef() { - acquire(DxvkAccess::None); - } - - /** - * \brief Decrements reference count - */ - void decRef() { - release(DxvkAccess::None); - } - - /** - * \brief Acquires resource with given access - * - * Atomically increments both the reference count - * as well as the use count for the given access. - */ - void acquire(DxvkAccess access) { - m_useCount += getIncrement(access); - } - - /** - * \brief Releases resource with given access - * - * Atomically decrements both the reference count - * as well as the use count for the given access. - */ - void release(DxvkAccess access) { - if (!(m_useCount -= getIncrement(access))) - delete this; - } - - /** - * \brief Converts reference type - * - * \param [in] from Old access type - * \param [in] to New access type - */ - void convertRef(DxvkAccess from, DxvkAccess to) { - uint64_t increment = getIncrement(to) - getIncrement(from); - - if (increment) - m_useCount += increment; - } - - /** - * \brief Checks whether resource is in use - * - * Returns \c true if there are pending accesses to - * the resource by the GPU matching the given access - * type. Note that checking for reads will also return - * \c true if the resource is being written to. - * \param [in] access Access type to check for - * \returns \c true if the resource is in use - */ - bool isInUse(DxvkAccess access = DxvkAccess::Read) const { - uint64_t mask = WrAccessMask; - if (access == DxvkAccess::Read) - mask |= RdAccessMask; - return bool(m_useCount.load() & mask); - } - - private: - - std::atomic m_useCount; - uint64_t m_cookie; - - static constexpr uint64_t getIncrement(DxvkAccess access) { - uint64_t increment = RefcountInc; - - if (access != DxvkAccess::None) { - increment |= (access == DxvkAccess::Read) - ? RdAccessInc : WrAccessInc; - } - - return increment; - } - - static std::atomic s_cookie; - - }; - -} diff --git a/src/dxvk/dxvk_sampler.h b/src/dxvk/dxvk_sampler.h index fdcc93127..f1c9370c1 100644 --- a/src/dxvk/dxvk_sampler.h +++ b/src/dxvk/dxvk_sampler.h @@ -5,7 +5,8 @@ #include "../util/util_bit.h" #include "../util/thread.h" -#include "dxvk_resource.h" +#include "dxvk_hash.h" +#include "dxvk_include.h" namespace dxvk { diff --git a/src/dxvk/dxvk_sparse.cpp b/src/dxvk/dxvk_sparse.cpp index c0875431f..dbe339560 100644 --- a/src/dxvk/dxvk_sparse.cpp +++ b/src/dxvk/dxvk_sparse.cpp @@ -7,6 +7,11 @@ namespace dxvk { + DxvkPagedResource::~DxvkPagedResource() { + + } + + DxvkResourceRef::~DxvkResourceRef() { auto resource = reinterpret_cast(m_ptr & ~AccessMask); resource->release(DxvkAccess(m_ptr & AccessMask)); diff --git a/src/dxvk/dxvk_sparse.h b/src/dxvk/dxvk_sparse.h index 7c31b92c2..e7df91a8f 100644 --- a/src/dxvk/dxvk_sparse.h +++ b/src/dxvk/dxvk_sparse.h @@ -2,8 +2,8 @@ #include +#include "dxvk_access.h" #include "dxvk_memory.h" -#include "dxvk_resource.h" namespace dxvk { @@ -427,13 +427,80 @@ namespace dxvk { /** * \brief Paged resource * - * Base class for any resource that can - * hold a sparse page table. + * Base class for memory-backed resources that may + * or may not also have a sparse page table. */ - class DxvkPagedResource : public DxvkResource { + class DxvkPagedResource { public: + virtual ~DxvkPagedResource(); + + /** + * \brief Increments reference count + */ + force_inline void incRef() { + acquire(DxvkAccess::None); + } + + /** + * \brief Decrements reference count + */ + force_inline void decRef() { + release(DxvkAccess::None); + } + + /** + * \brief Acquires resource with given access + * + * Atomically increments both the reference count + * as well as the use count for the given access. + */ + force_inline void acquire(DxvkAccess access) { + m_useCount.fetch_add(getIncrement(access), std::memory_order_acquire); + } + + /** + * \brief Releases resource with given access + * + * Atomically decrements both the reference count + * as well as the use count for the given access. + */ + force_inline void release(DxvkAccess access) { + uint64_t increment = getIncrement(access); + uint64_t remaining = m_useCount.fetch_sub(increment, std::memory_order_release); + + if (unlikely(remaining == increment)) + delete this; + } + + /** + * \brief Converts reference type + * + * \param [in] from Old access type + * \param [in] to New access type + */ + force_inline void convertRef(DxvkAccess from, DxvkAccess to) { + uint64_t increment = getIncrement(to) - getIncrement(from); + + if (increment) + m_useCount.fetch_add(increment, std::memory_order_acq_rel); + } + + /** + * \brief Checks whether resource is in use + * + * Returns \c true if there are pending accesses to + * the resource by the GPU matching the given access + * type. Note that checking for reads will also return + * \c true if the resource is being written to. + * \param [in] access Access type to check for + * \returns \c true if the resource is in use + */ + force_inline bool isInUse(DxvkAccess access) const { + return m_useCount.load(std::memory_order_acquire) >= getIncrement(access); + } + /** * \brief Queries sparse page table * @@ -443,6 +510,14 @@ namespace dxvk { */ virtual DxvkSparsePageTable* getSparsePageTable() = 0; + private: + + std::atomic m_useCount = { 0u }; + + static constexpr uint64_t getIncrement(DxvkAccess access) { + return uint64_t(1u) << (uint32_t(access) * 20u); + } + }; diff --git a/src/dxvk/meson.build b/src/dxvk/meson.build index f954a7c03..44137f717 100644 --- a/src/dxvk/meson.build +++ b/src/dxvk/meson.build @@ -99,7 +99,6 @@ dxvk_src = [ 'dxvk_platform_exts.cpp', 'dxvk_presenter.cpp', 'dxvk_queue.cpp', - 'dxvk_resource.cpp', 'dxvk_sampler.cpp', 'dxvk_shader.cpp', 'dxvk_shader_key.cpp',