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 ...@@ -146,7 +146,7 @@ namespace sw
DrawCall::DrawCall() DrawCall::DrawCall()
{ {
queries = 0; occlusionQuery = nullptr;
references = -1; references = -1;
...@@ -158,8 +158,6 @@ namespace sw ...@@ -158,8 +158,6 @@ namespace sw
DrawCall::~DrawCall() DrawCall::~DrawCall()
{ {
delete queries;
deallocate(data); deallocate(data);
} }
...@@ -235,19 +233,6 @@ namespace sw ...@@ -235,19 +233,6 @@ namespace sw
sw::deallocate(mem); 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) void Renderer::draw(const sw::Context* context, VkIndexType indexType, unsigned int count, int baseVertex, TaskEvents *events, bool update)
{ {
if(count == 0) { return; } if(count == 0) { return; }
...@@ -326,15 +311,11 @@ namespace sw ...@@ -326,15 +311,11 @@ namespace sw
DrawData *data = draw->data; DrawData *data = draw->data;
if(queries.size() != 0) if (occlusionQuery)
{ {
draw->queries = new std::list<vk::Query*>(); occlusionQuery->start();
for(auto &query : queries)
{
query->start();
draw->queries->push_back(query);
}
} }
draw->occlusionQuery = occlusionQuery;
draw->topology = context->topology; draw->topology = context->topology;
draw->indexType = indexType; draw->indexType = indexType;
...@@ -760,27 +741,13 @@ namespace sw ...@@ -760,27 +741,13 @@ namespace sw
if(ref == 0) if(ref == 0)
{ {
if(draw.queries) if (draw.occlusionQuery)
{ {
for(auto &query : *(draw.queries)) for(int cluster = 0; cluster < clusterCount; cluster++)
{ {
switch(query->getType()) draw.occlusionQuery->add(data.occlusion[cluster]);
{
case VK_QUERY_TYPE_OCCLUSION:
for(int cluster = 0; cluster < clusterCount; cluster++)
{
query->add(data.occlusion[cluster]);
}
break;
default:
break;
}
query->finish();
} }
draw.occlusionQuery->finish();
delete draw.queries;
draw.queries = nullptr;
} }
draw.vertexRoutine.reset(); draw.vertexRoutine.reset();
...@@ -1291,12 +1258,18 @@ namespace sw ...@@ -1291,12 +1258,18 @@ namespace sw
void Renderer::addQuery(vk::Query *query) 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) 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) void Renderer::advanceInstanceAttributes(Stream* inputs)
......
...@@ -164,7 +164,7 @@ namespace sw ...@@ -164,7 +164,7 @@ namespace sw
void *operator new(size_t size); void *operator new(size_t size);
void operator delete(void * mem); 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); void draw(const sw::Context* context, VkIndexType indexType, unsigned int count, int baseVertex, TaskEvents *events, bool update = true);
...@@ -245,7 +245,7 @@ namespace sw ...@@ -245,7 +245,7 @@ namespace sw
VertexTask *vertexTask[16]; VertexTask *vertexTask[16];
std::list<vk::Query*> queries; vk::Query *occlusionQuery;
WaitGroup sync; WaitGroup sync;
VertexProcessor::State vertexState; VertexProcessor::State vertexState;
...@@ -285,7 +285,7 @@ namespace sw ...@@ -285,7 +285,7 @@ namespace sw
vk::ImageView *stencilBuffer; vk::ImageView *stencilBuffer;
TaskEvents *events; TaskEvents *events;
std::list<vk::Query*> *queries; vk::Query *occlusionQuery;
std::atomic<int> primitive; // Current primitive to enter pipeline std::atomic<int> primitive; // Current primitive to enter pipeline
std::atomic<int> count; // Number of primitives to render std::atomic<int> count; // Number of primitives to render
......
...@@ -567,7 +567,7 @@ struct DrawBase : public CommandBuffer::Command ...@@ -567,7 +567,7 @@ struct DrawBase : public CommandBuffer::Command
executionState.bindAttachments(context); executionState.bindAttachments(context);
context.multiSampleMask = context.sampleMask & ((unsigned)0xFFFFFFFF >> (32 - context.sampleCount)); 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; std::vector<std::pair<uint32_t, void*>> indexBuffers;
if(indexed) if(indexed)
...@@ -1039,8 +1039,8 @@ struct BeginQuery : public CommandBuffer::Command ...@@ -1039,8 +1039,8 @@ struct BeginQuery : public CommandBuffer::Command
void play(CommandBuffer::ExecutionState& executionState) void play(CommandBuffer::ExecutionState& executionState)
{ {
executionState.renderer->addQuery(queryPool->getQuery(query));
queryPool->begin(query, flags); queryPool->begin(query, flags);
executionState.renderer->addQuery(queryPool->getQuery(query));
} }
private: 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