diff --git a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp
index 836d960..ce1c454 100644
--- a/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp
+++ b/external/vulkancts/modules/vulkan/query_pool/vktQueryPoolPerformanceTests.cpp
@@ -587,6 +587,31 @@
 		return tcu::TestStatus::pass("Pass");
 	}
 
+	// reset query pool
+	{
+		Unique<VkCommandBuffer>		resetCmdBuffer	(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+		const Unique<VkFence>		fence			(createFence(vkd, device));
+		const VkSubmitInfo			submitInfo		=
+		{
+			VK_STRUCTURE_TYPE_SUBMIT_INFO,						// sType
+			DE_NULL,											// pNext
+			0u,													// waitSemaphoreCount
+			DE_NULL,											// pWaitSemaphores
+			(const VkPipelineStageFlags*)DE_NULL,				// pWaitDstStageMask
+			1u,													// commandBufferCount
+			&resetCmdBuffer.get(),								// pCommandBuffers
+			0u,													// signalSemaphoreCount
+			DE_NULL,											// pSignalSemaphores
+		};
+
+		beginCommandBuffer(vkd, *resetCmdBuffer);
+		vkd.cmdResetQueryPool(*resetCmdBuffer, *queryPool, 0u, 1u);
+		endCommandBuffer(vkd, *resetCmdBuffer);
+
+		VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, *fence));
+		VK_CHECK(vkd.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+	}
+
 	// begin command buffer
 	const VkCommandBufferBeginInfo commandBufBeginParams =
 	{
@@ -604,9 +629,6 @@
 	VkClearValue renderPassClearValue;
 	deMemset(&renderPassClearValue, 0, sizeof(VkClearValue));
 
-	// reset query pool
-	vkd.cmdResetQueryPool(*cmdBuffer, *queryPool, 0, 1);
-
 	// perform query during triangle draw
 	vkd.cmdBeginQuery(*cmdBuffer, *queryPool, 0, VK_QUERY_CONTROL_PRECISE_BIT);
 
@@ -708,6 +730,32 @@
 		return tcu::TestStatus::pass("Pass");
 	}
 
+	// reset query pools
+	{
+		Unique<VkCommandBuffer>		resetCmdBuffer	(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
+		const Unique<VkFence>		fence			(createFence(vkd, device));
+		const VkSubmitInfo			submitInfo		=
+		{
+			VK_STRUCTURE_TYPE_SUBMIT_INFO,						// sType
+			DE_NULL,											// pNext
+			0u,													// waitSemaphoreCount
+			DE_NULL,											// pWaitSemaphores
+			(const VkPipelineStageFlags*)DE_NULL,				// pWaitDstStageMask
+			1u,													// commandBufferCount
+			&resetCmdBuffer.get(),								// pCommandBuffers
+			0u,													// signalSemaphoreCount
+			DE_NULL,											// pSignalSemaphores
+		};
+
+		beginCommandBuffer(vkd, *resetCmdBuffer);
+		vkd.cmdResetQueryPool(*resetCmdBuffer, *queryPool1, 0u, 1u);
+		vkd.cmdResetQueryPool(*resetCmdBuffer, *queryPool2, 0u, 1u);
+		endCommandBuffer(vkd, *resetCmdBuffer);
+
+		VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, *fence));
+		VK_CHECK(vkd.waitForFences(device, 1u, &fence.get(), DE_TRUE, ~0ull));
+	}
+
 	// begin command buffer
 	const VkCommandBufferBeginInfo commandBufBeginParams =
 	{
@@ -733,10 +781,6 @@
 		*queryPool2
 	};
 
-	// reset query pools
-	vkd.cmdResetQueryPool(*cmdBuffer, queryPools[0], 0u, 1u);
-	vkd.cmdResetQueryPool(*cmdBuffer, queryPools[1], 0u, 1u);
-
 	// perform two queries during triangle draw
 	for (deUint32 loop = 0; loop < DE_LENGTH_OF_ARRAY(queryPools); ++loop)
 	{
@@ -943,6 +987,7 @@
 	const VkQueue					queue				= m_context.getUniversalQueue();
 	const CmdPoolCreateInfo			cmdPoolCreateInfo	(m_context.getUniversalQueueFamilyIndex());
 	const Unique<VkCommandPool>		cmdPool				(createCommandPool(vkd, device, &cmdPoolCreateInfo));
+	const Unique<VkCommandBuffer>	resetCmdBuffer		(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
 	const Unique<VkCommandBuffer>	cmdBuffer			(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
 
 	initStateObjects();
@@ -956,9 +1001,11 @@
 		return tcu::TestStatus::pass("Pass");
 	}
 
-	beginCommandBuffer(vkd, *cmdBuffer);
-	vkd.cmdResetQueryPool(*cmdBuffer, *queryPool, 0u, 1u);
+	beginCommandBuffer(vkd, *resetCmdBuffer);
+	vkd.cmdResetQueryPool(*resetCmdBuffer, *queryPool, 0u, 1u);
+	endCommandBuffer(vkd, *resetCmdBuffer);
 
+	beginCommandBuffer(vkd, *cmdBuffer);
 	vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipeline);
 	vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0u, 1u, &(m_descriptorSet.get()), 0u, DE_NULL);
 
@@ -970,6 +1017,24 @@
 		(VkDependencyFlags)0u, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &m_computeFinishBarrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
 	endCommandBuffer(vkd, *cmdBuffer);
 
+	// submit reset of queries only once
+	{
+		const VkSubmitInfo submitInfo =
+		{
+			VK_STRUCTURE_TYPE_SUBMIT_INFO,						// sType
+			DE_NULL,											// pNext
+			0u,													// waitSemaphoreCount
+			DE_NULL,											// pWaitSemaphores
+			(const VkPipelineStageFlags*)DE_NULL,				// pWaitDstStageMask
+			1u,													// commandBufferCount
+			&resetCmdBuffer.get(),								// pCommandBuffers
+			0u,													// signalSemaphoreCount
+			DE_NULL,											// pSignalSemaphores
+		};
+
+		VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, DE_NULL));
+	}
+
 	// submit command buffer for each pass and wait for its completion
 	for (deUint32 passIndex = 0; passIndex < getRequiredNumerOfPasses(); passIndex++)
 	{
@@ -1030,6 +1095,7 @@
 	const VkQueue					queue = m_context.getUniversalQueue();
 	const CmdPoolCreateInfo			cmdPoolCreateInfo(m_context.getUniversalQueueFamilyIndex());
 	const Unique<VkCommandPool>		cmdPool(createCommandPool(vkd, device, &cmdPoolCreateInfo));
+	const Unique<VkCommandBuffer>	resetCmdBuffer(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
 	const Unique<VkCommandBuffer>	cmdBuffer(allocateCommandBuffer(vkd, device, *cmdPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY));
 
 	initStateObjects();
@@ -1050,10 +1116,12 @@
 		*queryPool2
 	};
 
-	beginCommandBuffer(vkd, *cmdBuffer);
-	vkd.cmdResetQueryPool(*cmdBuffer, queryPools[0], 0u, 1u);
-	vkd.cmdResetQueryPool(*cmdBuffer, queryPools[1], 0u, 1u);
+	beginCommandBuffer(vkd, *resetCmdBuffer);
+	vkd.cmdResetQueryPool(*resetCmdBuffer, queryPools[0], 0u, 1u);
+	vkd.cmdResetQueryPool(*resetCmdBuffer, queryPools[1], 0u, 1u);
+	endCommandBuffer(vkd, *resetCmdBuffer);
 
+	beginCommandBuffer(vkd, *cmdBuffer);
 	vkd.cmdBindPipeline(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipeline);
 	vkd.cmdBindDescriptorSets(*cmdBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, *m_pipelineLayout, 0u, 1u, &(m_descriptorSet.get()), 0u, DE_NULL);
 
@@ -1070,6 +1138,24 @@
 		(VkDependencyFlags)0u, 0u, (const VkMemoryBarrier*)DE_NULL, 1u, &m_computeFinishBarrier, 0u, (const VkImageMemoryBarrier*)DE_NULL);
 	endCommandBuffer(vkd, *cmdBuffer);
 
+	// submit reset of queries only once
+	{
+		const VkSubmitInfo submitInfo =
+		{
+			VK_STRUCTURE_TYPE_SUBMIT_INFO,						// sType
+			DE_NULL,											// pNext
+			0u,													// waitSemaphoreCount
+			DE_NULL,											// pWaitSemaphores
+			(const VkPipelineStageFlags*)DE_NULL,				// pWaitDstStageMask
+			1u,													// commandBufferCount
+			&resetCmdBuffer.get(),								// pCommandBuffers
+			0u,													// signalSemaphoreCount
+			DE_NULL,											// pSignalSemaphores
+		};
+
+		VK_CHECK(vkd.queueSubmit(queue, 1u, &submitInfo, DE_NULL));
+	}
+
 	// submit command buffer for each pass and wait for its completion
 	for (deUint32 passIndex = 0; passIndex < getRequiredNumerOfPasses(); passIndex++)
 	{
