[dxvk] Use separate counters for read/write resource usage

It is not unrealistic at all to overflow the 18-bit and 14-bit
counters in modern games, so just use two 32-bit counters instead.
Avoid 64-bit atomics due to poor performance on 32-bit builts.
This commit is contained in:
Philip Rebohle 2019-09-21 02:45:23 +02:00
parent 71e74f1810
commit 1347aeba33
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
1 changed files with 17 additions and 19 deletions

View File

@ -20,10 +20,7 @@ namespace dxvk {
* is recorded, it will be marked as 'in use'. * is recorded, it will be marked as 'in use'.
*/ */
class DxvkResource : public RcObject { class DxvkResource : public RcObject {
constexpr static uint32_t UseCountIncrementW = 1 << 18;
constexpr static uint32_t UseCountIncrementR = 1;
constexpr static uint32_t UseCountMaskW = ~(UseCountIncrementW - 1);
constexpr static uint32_t UseCountMaskR = ~(UseCountIncrementR - 1);
public: public:
virtual ~DxvkResource(); virtual ~DxvkResource();
@ -39,10 +36,10 @@ namespace dxvk {
* \returns \c true if the resource is in use * \returns \c true if the resource is in use
*/ */
bool isInUse(DxvkAccess access = DxvkAccess::Read) const { bool isInUse(DxvkAccess access = DxvkAccess::Read) const {
uint32_t mask = access == DxvkAccess::Write bool result = m_useCountW.load();
? UseCountMaskW if (access == DxvkAccess::Read)
: UseCountMaskR; result |= m_useCountR.load();
return m_useCount.load() & mask; return result;
} }
/** /**
@ -52,8 +49,11 @@ namespace dxvk {
* \param Access Resource access type * \param Access Resource access type
*/ */
void acquire(DxvkAccess access) { void acquire(DxvkAccess access) {
if (access != DxvkAccess::None) if (access != DxvkAccess::None) {
m_useCount += getIncrement(access); (access == DxvkAccess::Read
? m_useCountR
: m_useCountW) += 1;
}
} }
/** /**
@ -63,19 +63,17 @@ namespace dxvk {
* \param Access Resource access type * \param Access Resource access type
*/ */
void release(DxvkAccess access) { void release(DxvkAccess access) {
if (access != DxvkAccess::None) if (access != DxvkAccess::None) {
m_useCount -= getIncrement(access); (access == DxvkAccess::Read
? m_useCountR
: m_useCountW) -= 1;
}
} }
private: private:
std::atomic<uint32_t> m_useCount = { 0u }; std::atomic<uint32_t> m_useCountR = { 0u };
std::atomic<uint32_t> m_useCountW = { 0u };
static constexpr uint32_t getIncrement(DxvkAccess access) {
return access == DxvkAccess::Write
? UseCountIncrementW
: UseCountIncrementR;
}
}; };