Skip to content

Commit c860fda

Browse files
committed
[dxvk] Rework HUD to use a GPU query directly
Allows us to leverage the global timestamp query pool now that queries are reference-counted properly.
1 parent fb6e0ad commit c860fda

File tree

4 files changed

+25
-51
lines changed

4 files changed

+25
-51
lines changed

src/dxvk/dxvk_device.cpp

+6
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,12 @@ namespace dxvk {
151151
}
152152

153153

154+
Rc<DxvkGpuQuery> DxvkDevice::createRawQuery(
155+
VkQueryType type) {
156+
return m_objects.queryPool().allocQuery(type);
157+
}
158+
159+
154160
Rc<DxvkFence> DxvkDevice::createFence(
155161
const DxvkFenceCreateInfo& fenceInfo) {
156162
return new DxvkFence(this, fenceInfo);

src/dxvk/dxvk_device.h

+10-1
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,16 @@ namespace dxvk {
301301
VkQueryType type,
302302
VkQueryControlFlags flags,
303303
uint32_t index);
304-
304+
305+
/**
306+
* \brief Creates a raw GPU query
307+
*
308+
* \param [in] type Query type
309+
* \returns New query
310+
*/
311+
Rc<DxvkGpuQuery> createRawQuery(
312+
VkQueryType type);
313+
305314
/**
306315
* \brief Creates new fence
307316
*

src/dxvk/hud/dxvk_hud_item.cpp

+6-25
Original file line numberDiff line numberDiff line change
@@ -211,25 +211,6 @@ namespace dxvk::hud {
211211
}
212212

213213

214-
HudFrameTimeQueryPool::HudFrameTimeQueryPool(
215-
const Rc<DxvkDevice>& device)
216-
: m_vkd(device->vkd()) {
217-
VkQueryPoolCreateInfo info = { VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO };
218-
info.queryType = VK_QUERY_TYPE_TIMESTAMP;
219-
info.queryCount = 1;
220-
221-
VkResult vr = m_vkd->vkCreateQueryPool(m_vkd->device(), &info, nullptr, &m_pool);
222-
223-
if (vr != VK_SUCCESS)
224-
throw DxvkError(str::format("Failed to create frame time query pool: ", vr));
225-
}
226-
227-
228-
HudFrameTimeQueryPool::~HudFrameTimeQueryPool() {
229-
m_vkd->vkDestroyQueryPool(m_vkd->device(), m_pool, nullptr);
230-
}
231-
232-
233214
HudFrameTimeItem::HudFrameTimeItem(const Rc<DxvkDevice>& device, HudRenderer* renderer)
234215
: m_device (device),
235216
m_gfxSetLayout (createDescriptorSetLayout()),
@@ -298,16 +279,17 @@ namespace dxvk::hud {
298279
HudPos maxPos) {
299280
// Write current time stamp to the buffer
300281
DxvkBufferSliceHandle sliceHandle = m_gpuBuffer->getSliceHandle();
282+
std::pair<VkQueryPool, uint32_t> query = m_query->getQuery();
301283

302284
ctx.cmd->cmdResetQueryPool(DxvkCmdBuffer::InitBuffer,
303-
m_queryPool->handle(), 0, 1);
285+
query.first, query.second, 1);
304286

305287
ctx.cmd->cmdWriteTimestamp(DxvkCmdBuffer::InitBuffer,
306288
VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
307-
m_queryPool->handle(), 0);
289+
query.first, query.second);
308290

309291
ctx.cmd->cmdCopyQueryPoolResults(DxvkCmdBuffer::InitBuffer,
310-
m_queryPool->handle(), 0, 1, sliceHandle.handle,
292+
query.first, query.second, 1, sliceHandle.handle,
311293
sliceHandle.offset + (dataPoint & 1u) * sizeof(uint64_t), sizeof(uint64_t),
312294
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT);
313295

@@ -392,7 +374,7 @@ namespace dxvk::hud {
392374

393375
// Make sure GPU resources are being kept alive as necessary
394376
ctx.cmd->trackResource<DxvkAccess::Write>(m_gpuBuffer->getAllocation());
395-
ctx.cmd->trackResource<DxvkAccess::Write>(m_queryPool);
377+
ctx.cmd->trackQuery(m_query);
396378
}
397379

398380

@@ -493,8 +475,7 @@ namespace dxvk::hud {
493475
ctx.cmd->cmdPipelineBarrier(DxvkCmdBuffer::InitBuffer, &depInfo);
494476
ctx.cmd->trackResource<DxvkAccess::Write>(m_gpuBuffer->getAllocation());
495477

496-
// We'll use and initialize this later as necessary
497-
m_queryPool = new HudFrameTimeQueryPool(m_device);
478+
m_query = m_device->createRawQuery(VK_QUERY_TYPE_TIMESTAMP);
498479
}
499480

500481

src/dxvk/hud/dxvk_hud_item.h

+3-25
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
#include "../../util/util_time.h"
99

10+
#include "../dxvk_gpu_query.h"
11+
1012
#include "dxvk_hud_renderer.h"
1113

1214
namespace dxvk::hud {
@@ -229,30 +231,6 @@ namespace dxvk::hud {
229231
};
230232

231233

232-
/**
233-
* \brief Trackable GPU query pool
234-
*/
235-
class HudFrameTimeQueryPool : public DxvkResource {
236-
237-
public:
238-
239-
HudFrameTimeQueryPool(
240-
const Rc<DxvkDevice>& device);
241-
242-
~HudFrameTimeQueryPool();
243-
244-
VkQueryPool handle() const {
245-
return m_pool;
246-
}
247-
248-
private:
249-
250-
Rc<vk::DeviceFn> m_vkd;
251-
VkQueryPool m_pool = VK_NULL_HANDLE;
252-
253-
};
254-
255-
256234
/**
257235
* \brief HUD item to display the frame rate
258236
*/
@@ -308,7 +286,7 @@ namespace dxvk::hud {
308286
Rc<DxvkDevice> m_device;
309287
Rc<DxvkBuffer> m_gpuBuffer;
310288
Rc<DxvkBufferView> m_textView;
311-
Rc<HudFrameTimeQueryPool> m_queryPool;
289+
Rc<DxvkGpuQuery> m_query;
312290

313291
VkDescriptorSetLayout m_computeSetLayout = VK_NULL_HANDLE;
314292
VkPipelineLayout m_computePipelineLayout = VK_NULL_HANDLE;

0 commit comments

Comments
 (0)