Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/doitsujin/dxvk.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-08-23 14:44:35 +0300
committerPhilip Rebohle <philip.rebohle@tu-dortmund.de>2023-08-23 14:44:35 +0300
commitc2cd129b89670c185f53dbb1cec319bc1ff07efe (patch)
treea25ac5c7f58418ee0faa2ee12bc8f2ac56bf2353
parent915244c00ce12a0f8771ceff62cec6f93b3cf431 (diff)
[dxvk] Fix xfb counter buffer draw tracking
-rw-r--r--src/dxvk/dxvk_context.cpp13
-rw-r--r--src/dxvk/dxvk_context_state.h1
2 files changed, 9 insertions, 5 deletions
diff --git a/src/dxvk/dxvk_context.cpp b/src/dxvk/dxvk_context.cpp
index 9c9ca14a..61ad7016 100644
--- a/src/dxvk/dxvk_context.cpp
+++ b/src/dxvk/dxvk_context.cpp
@@ -4832,13 +4832,14 @@ namespace dxvk {
VkDeviceSize ctrOffsets[MaxNumXfbBuffers];
for (uint32_t i = 0; i < MaxNumXfbBuffers; i++) {
- auto physSlice = m_state.xfb.counters[i].getSliceHandle();
+ m_state.xfb.activeCounters[i] = m_state.xfb.counters[i];
+ auto physSlice = m_state.xfb.activeCounters[i].getSliceHandle();
ctrBuffers[i] = physSlice.handle;
ctrOffsets[i] = physSlice.offset;
if (physSlice.handle != VK_NULL_HANDLE)
- m_cmd->trackResource<DxvkAccess::Read>(m_state.xfb.counters[i].buffer());
+ m_cmd->trackResource<DxvkAccess::Read>(m_state.xfb.activeCounters[i].buffer());
}
m_cmd->cmdBeginTransformFeedback(
@@ -4858,13 +4859,15 @@ namespace dxvk {
VkDeviceSize ctrOffsets[MaxNumXfbBuffers];
for (uint32_t i = 0; i < MaxNumXfbBuffers; i++) {
- auto physSlice = m_state.xfb.counters[i].getSliceHandle();
+ auto physSlice = m_state.xfb.activeCounters[i].getSliceHandle();
ctrBuffers[i] = physSlice.handle;
ctrOffsets[i] = physSlice.offset;
if (physSlice.handle != VK_NULL_HANDLE)
- m_cmd->trackResource<DxvkAccess::Write>(m_state.xfb.counters[i].buffer());
+ m_cmd->trackResource<DxvkAccess::Write>(m_state.xfb.activeCounters[i].buffer());
+
+ m_state.xfb.activeCounters[i] = DxvkBufferSlice();
}
m_queryManager.endQueries(m_cmd,
@@ -6073,7 +6076,7 @@ namespace dxvk {
&& m_state.gp.flags.test(DxvkGraphicsPipelineFlag::HasTransformFeedback)) {
for (uint32_t i = 0; i < MaxNumXfbBuffers && !requiresBarrier; i++) {
const auto& xfbBufferSlice = m_state.xfb.buffers[i];
- const auto& xfbCounterSlice = m_state.xfb.counters[i];
+ const auto& xfbCounterSlice = m_state.xfb.activeCounters[i];
if (xfbBufferSlice.length()) {
requiresBarrier = this->checkBufferBarrier<DoEmit>(xfbBufferSlice,
diff --git a/src/dxvk/dxvk_context_state.h b/src/dxvk/dxvk_context_state.h
index 34018f0e..23f2e248 100644
--- a/src/dxvk/dxvk_context_state.h
+++ b/src/dxvk/dxvk_context_state.h
@@ -123,6 +123,7 @@ namespace dxvk {
struct DxvkXfbState {
std::array<DxvkBufferSlice, MaxNumXfbBuffers> buffers;
std::array<DxvkBufferSlice, MaxNumXfbBuffers> counters;
+ std::array<DxvkBufferSlice, MaxNumXfbBuffers> activeCounters;
};