mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-02-27 04:54:15 +01:00
[dxvk] Use ticket lock to synchronize access to query objects
Lowers overhead in the uncontested case compared to std::mutex, and prevents the main rendering thread from blocking updates for too long.
This commit is contained in:
parent
63d42073b8
commit
4db5c21ec5
@ -15,6 +15,7 @@
|
||||
#include "../util/sha1/sha1_util.h"
|
||||
|
||||
#include "../util/sync/sync_spinlock.h"
|
||||
#include "../util/sync/sync_ticketlock.h"
|
||||
|
||||
#include "../vulkan/vulkan_loader.h"
|
||||
#include "../vulkan/vulkan_names.h"
|
||||
|
@ -24,7 +24,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
uint32_t DxvkQuery::reset() {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
std::unique_lock<sync::TicketLock> lock(m_mutex);
|
||||
|
||||
m_status = DxvkQueryStatus::Reset;
|
||||
m_data = DxvkQueryData { };
|
||||
@ -37,7 +37,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
DxvkQueryStatus DxvkQuery::getData(DxvkQueryData& data) {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
std::unique_lock<sync::TicketLock> lock(m_mutex);
|
||||
|
||||
if (m_status == DxvkQueryStatus::Available)
|
||||
data = m_data;
|
||||
@ -52,7 +52,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
void DxvkQuery::beginRecording(uint32_t revision) {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
std::unique_lock<sync::TicketLock> lock(m_mutex);
|
||||
|
||||
if (m_revision == revision)
|
||||
m_status = DxvkQueryStatus::Active;
|
||||
@ -60,7 +60,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
void DxvkQuery::endRecording(uint32_t revision) {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
std::unique_lock<sync::TicketLock> lock(m_mutex);
|
||||
|
||||
if (m_revision == revision) {
|
||||
m_status = m_queryIndex < m_queryCount
|
||||
@ -72,7 +72,7 @@ namespace dxvk {
|
||||
|
||||
|
||||
void DxvkQuery::associateQuery(uint32_t revision, DxvkQueryHandle handle) {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
std::unique_lock<sync::TicketLock> lock(m_mutex);
|
||||
|
||||
if (m_revision == revision)
|
||||
m_queryCount += 1;
|
||||
@ -86,7 +86,7 @@ namespace dxvk {
|
||||
void DxvkQuery::updateData(
|
||||
uint32_t revision,
|
||||
const DxvkQueryData& data) {
|
||||
std::unique_lock<std::mutex> lock(m_mutex);
|
||||
std::unique_lock<sync::TicketLock> lock(m_mutex);
|
||||
|
||||
if (m_revision == revision) {
|
||||
switch (m_type) {
|
||||
|
@ -224,7 +224,7 @@ namespace dxvk {
|
||||
const VkQueryControlFlags m_flags;
|
||||
const uint32_t m_index;
|
||||
|
||||
std::mutex m_mutex;
|
||||
sync::TicketLock m_mutex;
|
||||
|
||||
DxvkQueryStatus m_status = DxvkQueryStatus::Created;
|
||||
DxvkQueryData m_data = {};
|
||||
|
Loading…
x
Reference in New Issue
Block a user