bug 14876: Can timestamps be written inside a renderpass? (WIP)
Timestamps are written to a query pool.
https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14876
diff --git a/include/vulkan.h b/include/vulkan.h
index e17207b..514c118 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -412,9 +412,10 @@
typedef enum {
VK_QUERY_TYPE_OCCLUSION = 0,
VK_QUERY_TYPE_PIPELINE_STATISTICS = 1,
+ VK_QUERY_TYPE_TIMESTAMP = 2,
VK_QUERY_TYPE_BEGIN_RANGE = VK_QUERY_TYPE_OCCLUSION,
- VK_QUERY_TYPE_END_RANGE = VK_QUERY_TYPE_PIPELINE_STATISTICS,
- VK_QUERY_TYPE_NUM = (VK_QUERY_TYPE_PIPELINE_STATISTICS - VK_QUERY_TYPE_OCCLUSION + 1),
+ VK_QUERY_TYPE_END_RANGE = VK_QUERY_TYPE_TIMESTAMP,
+ VK_QUERY_TYPE_NUM = (VK_QUERY_TYPE_TIMESTAMP - VK_QUERY_TYPE_OCCLUSION + 1),
VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF
} VkQueryType;
@@ -2177,7 +2178,7 @@
typedef void (VKAPI *PFN_vkCmdBeginQuery)(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot, VkQueryControlFlags flags);
typedef void (VKAPI *PFN_vkCmdEndQuery)(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t slot);
typedef void (VKAPI *PFN_vkCmdResetQueryPool)(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount);
-typedef void (VKAPI *PFN_vkCmdWriteTimestamp)(VkCmdBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer destBuffer, VkDeviceSize destOffset);
+typedef void (VKAPI *PFN_vkCmdWriteTimestamp)(VkCmdBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot);
typedef void (VKAPI *PFN_vkCmdCopyQueryPoolResults)(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize stride, VkQueryResultFlags flags);
typedef void (VKAPI *PFN_vkCmdPushConstants)(VkCmdBuffer cmdBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t start, uint32_t length, const void* values);
typedef void (VKAPI *PFN_vkCmdBeginRenderPass)(VkCmdBuffer cmdBuffer, const VkRenderPassBeginInfo* pRenderPassBegin, VkRenderPassContents contents);
@@ -2913,8 +2914,8 @@
void VKAPI vkCmdWriteTimestamp(
VkCmdBuffer cmdBuffer,
VkPipelineStageFlagBits pipelineStage,
- VkBuffer destBuffer,
- VkDeviceSize destOffset);
+ VkQueryPool queryPool,
+ uint32_t slot);
void VKAPI vkCmdCopyQueryPoolResults(
VkCmdBuffer cmdBuffer,
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 2b6d55e..fec569f 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -3236,7 +3236,7 @@
startQuery, queryCount, destBuffer, destOffset, stride, flags);
}
-VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer destBuffer, VkDeviceSize destOffset)
+VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot)
{
VkBool32 skipCall = VK_FALSE;
layer_data* dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
@@ -3250,7 +3250,7 @@
}
}
if (VK_FALSE == skipCall)
- dev_data->device_dispatch_table->CmdWriteTimestamp(cmdBuffer, pipelineStage, destBuffer, destOffset);
+ dev_data->device_dispatch_table->CmdWriteTimestamp(cmdBuffer, pipelineStage, queryPool, slot);
}
VK_LAYER_EXPORT VkResult VKAPI vkCreateFramebuffer(VkDevice device, const VkFramebufferCreateInfo* pCreateInfo, VkFramebuffer* pFramebuffer)
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index d7c13d4..bdb5dad 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -6362,8 +6362,8 @@
bool PostCmdWriteTimestamp(
VkCmdBuffer cmdBuffer,
VkPipelineStageFlagBits pipelineStage,
- VkBuffer destBuffer,
- VkDeviceSize destOffset)
+ VkQueryPool queryPool,
+ uint32_t slot)
{
ValidateEnumerator(pipelineStage);
@@ -6374,12 +6374,12 @@
VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(
VkCmdBuffer cmdBuffer,
VkPipelineStageFlagBits pipelineStage,
- VkBuffer destBuffer,
- VkDeviceSize destOffset)
+ VkQueryPool queryPool,
+ uint32_t slot)
{
- get_dispatch_table(pc_device_table_map, cmdBuffer)->CmdWriteTimestamp(cmdBuffer, pipelineStage, destBuffer, destOffset);
+ get_dispatch_table(pc_device_table_map, cmdBuffer)->CmdWriteTimestamp(cmdBuffer, pipelineStage, queryPool, slot);
- PostCmdWriteTimestamp(cmdBuffer, pipelineStage, destBuffer, destOffset);
+ PostCmdWriteTimestamp(cmdBuffer, pipelineStage, queryPool, slot);
}
bool PostCmdCopyQueryPoolResults(
diff --git a/loader/trampoline.c b/loader/trampoline.c
index 53a1a68..d2f28a8 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -1405,13 +1405,13 @@
disp->CmdResetQueryPool(cmdBuffer, queryPool, startQuery, queryCount);
}
-LOADER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkBuffer destBuffer, VkDeviceSize destOffset)
+LOADER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t slot)
{
const VkLayerDispatchTable *disp;
disp = loader_get_dispatch(cmdBuffer);
- disp->CmdWriteTimestamp(cmdBuffer, pipelineStage, destBuffer, destOffset);
+ disp->CmdWriteTimestamp(cmdBuffer, pipelineStage, queryPool, slot);
}
LOADER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize stride, VkFlags flags)
diff --git a/vulkan.py b/vulkan.py
index 174501e..40d41de 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -938,8 +938,8 @@
Proto("void", "CmdWriteTimestamp",
[Param("VkCmdBuffer", "cmdBuffer"),
Param("VkPipelineStageFlagBits", "pipelineStage"),
- Param("VkBuffer", "destBuffer"),
- Param("VkDeviceSize", "destOffset")]),
+ Param("VkQueryPool", "queryPool"),
+ Param("uint32_t", "slot")]),
Proto("void", "CmdCopyQueryPoolResults",
[Param("VkCmdBuffer", "cmdBuffer"),