Commit 0c1adcca by Chris Forbes

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: 's avatarChris Forbes <chrisforbes@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent 3aec8a3b
......@@ -146,7 +146,7 @@ namespace sw
DrawCall::DrawCall()
{
queries = 0;
occlusionQuery = nullptr;
references = -1;
......@@ -158,8 +158,6 @@ namespace sw
DrawCall::~DrawCall()
{
delete queries;
deallocate(data);
}
......@@ -235,19 +233,6 @@ namespace sw
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 @@ namespace sw
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 @@ namespace sw
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 @@ namespace sw
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)
......
......@@ -164,7 +164,7 @@ namespace sw
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 @@ namespace sw
VertexTask *vertexTask[16];
std::list<vk::Query*> queries;
vk::Query *occlusionQuery;
WaitGroup sync;
VertexProcessor::State vertexState;
......@@ -285,7 +285,7 @@ namespace sw
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
......
......@@ -567,7 +567,7 @@ struct DrawBase : public CommandBuffer::Command
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 @@ struct BeginQuery : public CommandBuffer::Command
void play(CommandBuffer::ExecutionState& executionState)
{
executionState.renderer->addQuery(queryPool->getQuery(query));
queryPool->begin(query, flags);
executionState.renderer->addQuery(queryPool->getQuery(query));
}
private:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment