Query implementation

Re-enabled the Renderer object's occlusion queries and linked them
to the queries in the query pool. Removed the old Query structure.

Passes all tests in:
Tests: dEQP-VK.query_pool.*

Note: The dEQP-VK.query_pool.*_discard tests currently fail as discard
      appears to disable the occlusion queries. Will fix in next cl.

Bug b/129706526

Change-Id: I937dcf64d2990758d31a1ed6a13af5cf9f0a627b
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/28288
Tested-by: Alexis Hétu <sugoi@google.com>
Presubmit-Ready: Alexis Hétu <sugoi@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp
index 75a76cd..bd3b6f5 100644
--- a/src/Vulkan/VkCommandBuffer.cpp
+++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -20,6 +20,7 @@
 #include "VkImageView.hpp"
 #include "VkPipeline.hpp"
 #include "VkPipelineLayout.hpp"
+#include "VkQueryPool.hpp"
 #include "VkRenderPass.hpp"
 #include "Device/Renderer.hpp"
 
@@ -738,6 +739,104 @@
 	unsigned char data[MAX_PUSH_CONSTANT_SIZE];
 };
 
+struct BeginQuery : public CommandBuffer::Command
+{
+	BeginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags)
+		: queryPool(queryPool), query(query), flags(flags)
+	{
+	}
+
+	void play(CommandBuffer::ExecutionState& executionState)
+	{
+		executionState.renderer->addQuery(Cast(queryPool)->getQuery(query));
+		Cast(queryPool)->begin(query, flags);
+	}
+
+private:
+	VkQueryPool queryPool;
+	uint32_t query;
+	VkQueryControlFlags flags;
+};
+
+struct EndQuery : public CommandBuffer::Command
+{
+	EndQuery(VkQueryPool queryPool, uint32_t query)
+		: queryPool(queryPool), query(query)
+	{
+	}
+
+	void play(CommandBuffer::ExecutionState& executionState)
+	{
+		executionState.renderer->removeQuery(Cast(queryPool)->getQuery(query));
+		Cast(queryPool)->end(query);
+	}
+
+private:
+	VkQueryPool queryPool;
+	uint32_t query;
+};
+
+struct ResetQueryPool : public CommandBuffer::Command
+{
+	ResetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount)
+		: queryPool(queryPool), firstQuery(firstQuery), queryCount(queryCount)
+	{
+	}
+
+	void play(CommandBuffer::ExecutionState& executionState)
+	{
+		Cast(queryPool)->reset(firstQuery, queryCount);
+	}
+
+private:
+	VkQueryPool queryPool;
+	uint32_t firstQuery;
+	uint32_t queryCount;
+};
+
+struct WriteTimeStamp : public CommandBuffer::Command
+{
+	WriteTimeStamp(VkQueryPool queryPool, uint32_t query)
+		: queryPool(queryPool), query(query)
+	{
+	}
+
+	void play(CommandBuffer::ExecutionState& executionState)
+	{
+		Cast(queryPool)->writeTimestamp(query);
+	}
+
+private:
+	VkQueryPool queryPool;
+	uint32_t query;
+};
+
+struct CopyQueryPoolResults : public CommandBuffer::Command
+{
+	CopyQueryPoolResults(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
+		VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags)
+		: queryPool(queryPool), firstQuery(firstQuery), queryCount(queryCount), dstBuffer(dstBuffer),
+		  dstOffset(dstOffset), stride(stride), flags(flags)
+	{
+	}
+
+	void play(CommandBuffer::ExecutionState& executionState)
+	{
+		vk::Buffer* buffer = Cast(dstBuffer);
+		Cast(queryPool)->getResults(firstQuery, queryCount, buffer->getSize() - dstOffset,
+		                            buffer->getOffsetPointer(dstOffset), stride, flags);
+	}
+
+private:
+	VkQueryPool queryPool;
+	uint32_t firstQuery;
+	uint32_t queryCount;
+	VkBuffer dstBuffer;
+	VkDeviceSize dstOffset;
+	VkDeviceSize stride;
+	VkQueryResultFlags flags;
+};
+
 CommandBuffer::CommandBuffer(VkCommandBufferLevel pLevel) : level(pLevel)
 {
 	// FIXME (b/119409619): replace this vector by an allocator so we can control all memory allocations
@@ -877,28 +976,28 @@
 
 void CommandBuffer::beginQuery(VkQueryPool queryPool, uint32_t query, VkQueryControlFlags flags)
 {
-	UNIMPLEMENTED("beginQuery");
+	addCommand<BeginQuery>(queryPool, query, flags);
 }
 
 void CommandBuffer::endQuery(VkQueryPool queryPool, uint32_t query)
 {
-	UNIMPLEMENTED("endQuery");
+	addCommand<EndQuery>(queryPool, query);
 }
 
 void CommandBuffer::resetQueryPool(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount)
 {
-	UNIMPLEMENTED("resetQueryPool");
+	addCommand<ResetQueryPool>(queryPool, firstQuery, queryCount);
 }
 
 void CommandBuffer::writeTimestamp(VkPipelineStageFlagBits pipelineStage, VkQueryPool queryPool, uint32_t query)
 {
-	UNIMPLEMENTED("writeTimestamp");
+	addCommand<WriteTimeStamp>(queryPool, query);
 }
 
 void CommandBuffer::copyQueryPoolResults(VkQueryPool queryPool, uint32_t firstQuery, uint32_t queryCount,
 	VkBuffer dstBuffer, VkDeviceSize dstOffset, VkDeviceSize stride, VkQueryResultFlags flags)
 {
-	UNIMPLEMENTED("copyQueryPoolResults");
+	addCommand<CopyQueryPoolResults>(queryPool, firstQuery, queryCount, dstBuffer, dstOffset, stride, flags);
 }
 
 void CommandBuffer::pushConstants(VkPipelineLayout layout, VkShaderStageFlags stageFlags,