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",