1
0
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:
Philip Rebohle 2018-11-13 17:05:37 +01:00
parent 63d42073b8
commit 4db5c21ec5
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 8 additions and 7 deletions

View File

@ -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"

View File

@ -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) {

View File

@ -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 = {};