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: