bug 14844: Query Pool issues (WIP)
We did not and still do not honor the stride nor flags.
https://cvs.khronos.org/bugzilla/show_bug.cgi?id=14844
diff --git a/include/vulkan.h b/include/vulkan.h
index d6eb918..4473f64 100644
--- a/include/vulkan.h
+++ b/include/vulkan.h
@@ -2132,7 +2132,7 @@
typedef VkResult (VKAPI *PFN_vkResetEvent)(VkDevice device, VkEvent event);
typedef VkResult (VKAPI *PFN_vkCreateQueryPool)(VkDevice device, const VkQueryPoolCreateInfo* pCreateInfo, VkQueryPool* pQueryPool);
typedef void (VKAPI *PFN_vkDestroyQueryPool)(VkDevice device, VkQueryPool queryPool);
-typedef VkResult (VKAPI *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags);
+typedef VkResult (VKAPI *PFN_vkGetQueryPoolResults)(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags);
typedef VkResult (VKAPI *PFN_vkCreateBuffer)(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer);
typedef void (VKAPI *PFN_vkDestroyBuffer)(VkDevice device, VkBuffer buffer);
typedef VkResult (VKAPI *PFN_vkCreateBufferView)(VkDevice device, const VkBufferViewCreateInfo* pCreateInfo, VkBufferView* pView);
@@ -2217,7 +2217,7 @@
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, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset);
-typedef void (VKAPI *PFN_vkCmdCopyQueryPoolResults)(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize destStride, VkQueryResultFlags flags);
+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);
typedef void (VKAPI *PFN_vkCmdNextSubpass)(VkCmdBuffer cmdBuffer, VkRenderPassContents contents);
@@ -2491,8 +2491,9 @@
VkQueryPool queryPool,
uint32_t startQuery,
uint32_t queryCount,
- size_t* pDataSize,
+ size_t dataSize,
void* pData,
+ VkDeviceSize stride,
VkQueryResultFlags flags);
VkResult VKAPI vkCreateBuffer(
@@ -2973,7 +2974,7 @@
uint32_t queryCount,
VkBuffer destBuffer,
VkDeviceSize destOffset,
- VkDeviceSize destStride,
+ VkDeviceSize stride,
VkQueryResultFlags flags);
void VKAPI vkCmdPushConstants(
diff --git a/layers/draw_state.cpp b/layers/draw_state.cpp
index 278bcc7..0e0c2b9 100755
--- a/layers/draw_state.cpp
+++ b/layers/draw_state.cpp
@@ -3207,7 +3207,7 @@
VK_LAYER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery,
uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset,
- VkDeviceSize destStride, VkQueryResultFlags flags)
+ VkDeviceSize stride, VkQueryResultFlags flags)
{
VkBool32 skipCall = VK_FALSE;
layer_data* dev_data = get_my_data_ptr(get_dispatch_key(cmdBuffer), layer_data_map);
@@ -3223,7 +3223,7 @@
}
if (VK_FALSE == skipCall)
dev_data->device_dispatch_table->CmdCopyQueryPoolResults(cmdBuffer, queryPool,
- startQuery, queryCount, destBuffer, destOffset, destStride, flags);
+ startQuery, queryCount, destBuffer, destOffset, stride, flags);
}
VK_LAYER_EXPORT void VKAPI vkCmdWriteTimestamp(VkCmdBuffer cmdBuffer, VkTimestampType timestampType, VkBuffer destBuffer, VkDeviceSize destOffset)
diff --git a/layers/param_checker.cpp b/layers/param_checker.cpp
index 4b93577..3405d01 100644
--- a/layers/param_checker.cpp
+++ b/layers/param_checker.cpp
@@ -3302,8 +3302,9 @@
VkQueryPool queryPool,
uint32_t startQuery,
uint32_t queryCount,
- size_t* pDataSize,
+ size_t dataSize,
void* pData,
+ VkDeviceSize stride,
VkQueryResultFlags flags,
VkResult result)
{
@@ -3311,10 +3312,6 @@
- if(pDataSize != nullptr)
- {
- }
-
if(pData != nullptr)
{
}
@@ -3335,13 +3332,14 @@
VkQueryPool queryPool,
uint32_t startQuery,
uint32_t queryCount,
- size_t* pDataSize,
+ size_t dataSize,
void* pData,
+ VkDeviceSize stride,
VkQueryResultFlags flags)
{
- VkResult result = get_dispatch_table(pc_device_table_map, device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
+ VkResult result = get_dispatch_table(pc_device_table_map, device)->GetQueryPoolResults(device, queryPool, startQuery, queryCount, dataSize, pData, stride, flags);
- PostGetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags, result);
+ PostGetQueryPoolResults(device, queryPool, startQuery, queryCount, dataSize, pData, stride, flags, result);
return result;
}
@@ -6489,7 +6487,7 @@
uint32_t queryCount,
VkBuffer destBuffer,
VkDeviceSize destOffset,
- VkDeviceSize destStride,
+ VkDeviceSize stride,
VkQueryResultFlags flags)
{
@@ -6510,12 +6508,12 @@
uint32_t queryCount,
VkBuffer destBuffer,
VkDeviceSize destOffset,
- VkDeviceSize destStride,
+ VkDeviceSize stride,
VkQueryResultFlags flags)
{
- get_dispatch_table(pc_device_table_map, cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
+ get_dispatch_table(pc_device_table_map, cmdBuffer)->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, stride, flags);
- PostCmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
+ PostCmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, stride, flags);
}
bool PreCmdPushConstants(
diff --git a/loader/trampoline.c b/loader/trampoline.c
index 012473d..f359f61 100644
--- a/loader/trampoline.c
+++ b/loader/trampoline.c
@@ -657,13 +657,13 @@
disp->DestroyQueryPool(device, queryPool);
}
-LOADER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t* pDataSize, void* pData, VkQueryResultFlags flags)
+LOADER_EXPORT VkResult VKAPI vkGetQueryPoolResults(VkDevice device, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, size_t dataSize, void* pData, VkDeviceSize stride, VkQueryResultFlags flags)
{
const VkLayerDispatchTable *disp;
disp = loader_get_dispatch(device);
- return disp->GetQueryPoolResults(device, queryPool, startQuery, queryCount, pDataSize, pData, flags);
+ return disp->GetQueryPoolResults(device, queryPool, startQuery, queryCount, dataSize, pData, stride, flags);
}
LOADER_EXPORT VkResult VKAPI vkCreateBuffer(VkDevice device, const VkBufferCreateInfo* pCreateInfo, VkBuffer* pBuffer)
@@ -1441,13 +1441,13 @@
disp->CmdWriteTimestamp(cmdBuffer, timestampType, destBuffer, destOffset);
}
-LOADER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize destStride, VkFlags flags)
+LOADER_EXPORT void VKAPI vkCmdCopyQueryPoolResults(VkCmdBuffer cmdBuffer, VkQueryPool queryPool, uint32_t startQuery, uint32_t queryCount, VkBuffer destBuffer, VkDeviceSize destOffset, VkDeviceSize stride, VkFlags flags)
{
const VkLayerDispatchTable *disp;
disp = loader_get_dispatch(cmdBuffer);
- disp->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, destStride, flags);
+ disp->CmdCopyQueryPoolResults(cmdBuffer, queryPool, startQuery, queryCount, destBuffer, destOffset, stride, flags);
}
LOADER_EXPORT void VKAPI vkCmdPushConstants(VkCmdBuffer cmdBuffer, VkPipelineLayout layout, VkShaderStageFlags stageFlags, uint32_t start, uint32_t length, const void* values)
diff --git a/tests/init.cpp b/tests/init.cpp
index 557c390..77e22d2 100644
--- a/tests/init.cpp
+++ b/tests/init.cpp
@@ -211,7 +211,7 @@
VkQueryPoolCreateInfo query_info;
VkQueryPool query_pool;
size_t query_result_size;
- uint32_t *query_result_data;
+ uint8_t *query_result_data;
VkResult err;
// typedef enum VkQueryType_
@@ -253,14 +253,12 @@
// TODO: commands
// TOOD: vkCmdEndQuery
- err = vkGetQueryPoolResults(device(), query_pool, 0, MAX_QUERY_SLOTS,
- &query_result_size, VK_NULL_HANDLE, 0);
- ASSERT_VK_SUCCESS(err);
-
+ query_result_size = MAX_QUERY_SLOTS * sizeof(uint64_t);
if (query_result_size > 0) {
- query_result_data = new uint32_t [query_result_size];
+ query_result_data = new uint8_t [query_result_size];
err = vkGetQueryPoolResults(device(), query_pool, 0, MAX_QUERY_SLOTS,
- &query_result_size, query_result_data, 0);
+ query_result_size, query_result_data,
+ sizeof(uint64_t), VK_QUERY_RESULT_64_BIT);
//ASSERT_VK_SUCCESS(err); TODO fix once actually submit queries
// TODO: Test Query result data.
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index b8ba332..da2883b 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -504,16 +504,10 @@
NON_DISPATCHABLE_HANDLE_INIT(vkCreateQueryPool, dev, &info);
}
-VkResult QueryPool::results(uint32_t start, uint32_t count, size_t size, void *data)
+VkResult QueryPool::results(uint32_t start, uint32_t count, size_t size, void *data, size_t stride)
{
- size_t tmp = size;
- VkResult err = vkGetQueryPoolResults(device(), handle(), start, count, &tmp, data, 0);
- if (err == VK_SUCCESS) {
- if (!EXPECT(tmp == size))
- memset(data, 0, size);
- } else {
- EXPECT(err == VK_NOT_READY);
- }
+ VkResult err = vkGetQueryPoolResults(device(), handle(), start, count, size, data, stride, 0);
+ EXPECT(err == VK_SUCCESS || err == VK_NOT_READY);
return err;
}
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index 9f0baa7..3c56ea1 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -310,7 +310,7 @@
void init(const Device &dev, const VkQueryPoolCreateInfo &info);
// vkGetQueryPoolResults()
- VkResult results(uint32_t start, uint32_t count, size_t size, void *data);
+ VkResult results(uint32_t start, uint32_t count, size_t size, void *data, size_t stride);
static VkQueryPoolCreateInfo create_info(VkQueryType type, uint32_t slot_count);
};
diff --git a/vulkan.py b/vulkan.py
index 4b19fc6..c0d18c7 100755
--- a/vulkan.py
+++ b/vulkan.py
@@ -477,8 +477,9 @@
Param("VkQueryPool", "queryPool"),
Param("uint32_t", "startQuery"),
Param("uint32_t", "queryCount"),
- Param("size_t*", "pDataSize"),
+ Param("size_t", "dataSize"),
Param("void*", "pData"),
+ Param("VkDeviceSize", "stride"),
Param("VkQueryResultFlags", "flags")]),
Proto("VkResult", "CreateBuffer",
@@ -959,7 +960,7 @@
Param("uint32_t", "queryCount"),
Param("VkBuffer", "destBuffer"),
Param("VkDeviceSize", "destOffset"),
- Param("VkDeviceSize", "destStride"),
+ Param("VkDeviceSize", "stride"),
Param("VkQueryResultFlags", "flags")]),
Proto("void", "CmdPushConstants",