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
73
74
75
76
77
78
79
|
// vk-query.cpp
#include "vk-query.h"
#include "vk-util.h"
namespace gfx
{
using namespace Slang;
namespace vk
{
Result QueryPoolImpl::init(const IQueryPool::Desc& desc, DeviceImpl* device)
{
m_device = device;
m_pool = VK_NULL_HANDLE;
VkQueryPoolCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
createInfo.queryCount = (uint32_t)desc.count;
switch (desc.type)
{
case QueryType::Timestamp:
createInfo.queryType = VK_QUERY_TYPE_TIMESTAMP;
break;
case QueryType::AccelerationStructureCompactedSize:
createInfo.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_COMPACTED_SIZE_KHR;
break;
case QueryType::AccelerationStructureSerializedSize:
createInfo.queryType = VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_SIZE_KHR;
break;
case QueryType::AccelerationStructureCurrentSize:
// Vulkan does not support CurrentSize query, will not create actual pools here.
return SLANG_OK;
default:
return SLANG_E_INVALID_ARG;
}
SLANG_VK_RETURN_ON_FAIL(
m_device->m_api.vkCreateQueryPool(m_device->m_api.m_device, &createInfo, nullptr, &m_pool));
return SLANG_OK;
}
QueryPoolImpl::~QueryPoolImpl()
{
m_device->m_api.vkDestroyQueryPool(m_device->m_api.m_device, m_pool, nullptr);
}
Result QueryPoolImpl::getResult(GfxIndex index, GfxCount count, uint64_t* data)
{
if (!m_pool)
{
// Vulkan does not support CurrentSize query, return 0 here.
for (SlangInt i = 0; i < count; i++)
data[i] = 0;
return SLANG_OK;
}
SLANG_VK_RETURN_ON_FAIL(m_device->m_api.vkGetQueryPoolResults(
m_device->m_api.m_device,
m_pool,
(uint32_t)index,
(uint32_t)count,
sizeof(uint64_t) * count,
data,
sizeof(uint64_t),
VK_QUERY_RESULT_64_BIT | VK_QUERY_RESULT_WAIT_BIT));
return SLANG_OK;
}
void _writeTimestamp(
VulkanApi* api, VkCommandBuffer vkCmdBuffer, IQueryPool* queryPool, SlangInt index)
{
auto queryPoolImpl = static_cast<QueryPoolImpl*>(queryPool);
api->vkCmdResetQueryPool(vkCmdBuffer, queryPoolImpl->m_pool, (uint32_t)index, 1);
api->vkCmdWriteTimestamp(
vkCmdBuffer, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT, queryPoolImpl->m_pool, (uint32_t)index);
}
} // namespace vk
} // namespace gfx
|