-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathQueryPool.cpp
72 lines (61 loc) · 1.88 KB
/
QueryPool.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
// Author : Jihong Shin (snowapril)
#include <VulkanFramework/pch.h>
#include <VulkanFramework/Device.h>
#include <VulkanFramework/QueryPool.h>
namespace vfs
{
QueryPool::QueryPool(DevicePtr device, uint32_t numQuery)
{
assert(initialize(device, numQuery));
}
QueryPool::~QueryPool()
{
destroyQueryPool();
}
void QueryPool::destroyQueryPool(void)
{
if (_queryPool != VK_NULL_HANDLE)
{
vkDestroyQueryPool(_device->getDeviceHandle(), _queryPool, nullptr);
_queryPool = VK_NULL_HANDLE;
}
_numQuery = 0;
_device.reset();
}
bool QueryPool::initialize(DevicePtr device, uint32_t numQuery)
{
_device = device;
_numQuery = numQuery;
VkQueryPoolCreateInfo queryPoolInfo = {};
queryPoolInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
queryPoolInfo.pNext = nullptr;
queryPoolInfo.queryCount = numQuery;
queryPoolInfo.queryType = VK_QUERY_TYPE_TIMESTAMP;
queryPoolInfo.pipelineStatistics = 0; // TODO(snowapril) : pipeline statistics
queryPoolInfo.flags = 0;
if (vkCreateQueryPool(_device->getDeviceHandle(), &queryPoolInfo, nullptr, &_queryPool) != VK_SUCCESS)
{
return false;
}
return true;
}
bool QueryPool::readQueryResults(std::vector<uint64_t>* results)
{
results->resize(_numQuery);
VkResult result = vkGetQueryPoolResults(_device->getDeviceHandle(),
_queryPool, 0, _numQuery,
sizeof(uint64_t) * _numQuery,
results->data(), sizeof(uint64_t),
VK_QUERY_RESULT_WAIT_BIT | VK_QUERY_RESULT_64_BIT);
return result == VK_SUCCESS;
}
void QueryPool::writeTimeStamp(VkCommandBuffer cmdBuffer, VkPipelineStageFlagBits stageFlag, uint32_t queryIndex)
{
assert(queryIndex <= _numQuery);
vkCmdWriteTimestamp(cmdBuffer, stageFlag, _queryPool, queryIndex);
}
void QueryPool::resetQueryPool(VkCommandBuffer cmdBuffer)
{
vkCmdResetQueryPool(cmdBuffer, _queryPool, 0, _numQuery);
}
}