Simplify query tracking machinery

Vulkan does not have nested queries, so this was overbuilt. Get rid of
all the list wrangling and just have a single slot in the draw call for
the active occlusion query.

Bug: b/129706526
Change-Id: I30158895e6ef4edefd6e1de85766fb6c88bb528f
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/34728
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Chris Forbes <chrisforbes@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Device/Renderer.cpp b/src/Device/Renderer.cpp
index f37e261..5f9b8f0 100644
--- a/src/Device/Renderer.cpp
+++ b/src/Device/Renderer.cpp
@@ -146,7 +146,7 @@
 
 	DrawCall::DrawCall()
 	{
-		queries = 0;
+		occlusionQuery = nullptr;
 
 		references = -1;
 
@@ -158,8 +158,6 @@
 
 	DrawCall::~DrawCall()
 	{
-		delete queries;
-
 		deallocate(data);
 	}
 
@@ -235,19 +233,6 @@
 		sw::deallocate(mem);
 	}
 
-	bool Renderer::hasQueryOfType(VkQueryType type) const
-	{
-		for(auto query : queries)
-		{
-			if(query->getType() == type)
-			{
-				return true;
-			}
-		}
-
-		return false;
-	}
-
 	void Renderer::draw(const sw::Context* context, VkIndexType indexType, unsigned int count, int baseVertex, TaskEvents *events, bool update)
 	{
 		if(count == 0) { return; }
@@ -326,15 +311,11 @@
 
 		DrawData *data = draw->data;
 
-		if(queries.size() != 0)
+		if (occlusionQuery)
 		{
-			draw->queries = new std::list<vk::Query*>();
-			for(auto &query : queries)
-			{
-				query->start();
-				draw->queries->push_back(query);
-			}
+			occlusionQuery->start();
 		}
+		draw->occlusionQuery = occlusionQuery;
 
 		draw->topology = context->topology;
 		draw->indexType = indexType;
@@ -760,27 +741,13 @@
 
 			if(ref == 0)
 			{
-				if(draw.queries)
+				if (draw.occlusionQuery)
 				{
-					for(auto &query : *(draw.queries))
+					for(int cluster = 0; cluster < clusterCount; cluster++)
 					{
-						switch(query->getType())
-						{
-						case VK_QUERY_TYPE_OCCLUSION:
-							for(int cluster = 0; cluster < clusterCount; cluster++)
-							{
-								query->add(data.occlusion[cluster]);
-							}
-							break;
-						default:
-							break;
-						}
-
-						query->finish();
+						draw.occlusionQuery->add(data.occlusion[cluster]);
 					}
-
-					delete draw.queries;
-					draw.queries = nullptr;
+					draw.occlusionQuery->finish();
 				}
 
 				draw.vertexRoutine.reset();
@@ -1291,12 +1258,18 @@
 
 	void Renderer::addQuery(vk::Query *query)
 	{
-		queries.push_back(query);
+		ASSERT(query->getType() == VK_QUERY_TYPE_OCCLUSION);
+		ASSERT(!occlusionQuery);
+
+		occlusionQuery = query;
 	}
 
 	void Renderer::removeQuery(vk::Query *query)
 	{
-		queries.remove(query);
+		ASSERT(query->getType() == VK_QUERY_TYPE_OCCLUSION);
+		ASSERT(occlusionQuery == query);
+
+		occlusionQuery = nullptr;
 	}
 
 	void Renderer::advanceInstanceAttributes(Stream* inputs)
diff --git a/src/Device/Renderer.hpp b/src/Device/Renderer.hpp
index 2ae2ca5..fbff8d1 100644
--- a/src/Device/Renderer.hpp
+++ b/src/Device/Renderer.hpp
@@ -164,7 +164,7 @@
 		void *operator new(size_t size);
 		void operator delete(void * mem);
 
-		bool hasQueryOfType(VkQueryType type) const;
+		bool hasOcclusionQuery() const { return occlusionQuery != nullptr; }
 
 		void draw(const sw::Context* context, VkIndexType indexType, unsigned int count, int baseVertex, TaskEvents *events, bool update = true);
 
@@ -245,7 +245,7 @@
 
 		VertexTask *vertexTask[16];
 
-		std::list<vk::Query*> queries;
+		vk::Query *occlusionQuery;
 		WaitGroup sync;
 
 		VertexProcessor::State vertexState;
@@ -285,7 +285,7 @@
 		vk::ImageView *stencilBuffer;
 		TaskEvents *events;
 
-		std::list<vk::Query*> *queries;
+		vk::Query *occlusionQuery;
 
 		std::atomic<int> primitive;    // Current primitive to enter pipeline
 		std::atomic<int> count;        // Number of primitives to render
diff --git a/src/Vulkan/VkCommandBuffer.cpp b/src/Vulkan/VkCommandBuffer.cpp
index d787886..88e0bd9 100644
--- a/src/Vulkan/VkCommandBuffer.cpp
+++ b/src/Vulkan/VkCommandBuffer.cpp
@@ -567,7 +567,7 @@
 		executionState.bindAttachments(context);
 
 		context.multiSampleMask = context.sampleMask & ((unsigned)0xFFFFFFFF >> (32 - context.sampleCount));
-		context.occlusionEnabled = executionState.renderer->hasQueryOfType(VK_QUERY_TYPE_OCCLUSION);
+		context.occlusionEnabled = executionState.renderer->hasOcclusionQuery();
 
 		std::vector<std::pair<uint32_t, void*>> indexBuffers;
 		if(indexed)
@@ -1039,8 +1039,8 @@
 
 	void play(CommandBuffer::ExecutionState& executionState)
 	{
-		executionState.renderer->addQuery(queryPool->getQuery(query));
 		queryPool->begin(query, flags);
+		executionState.renderer->addQuery(queryPool->getQuery(query));
 	}
 
 private: