Hash :
b6adeb2f
Author :
Date :
2021-06-21T11:11:30
Vulkan: Use pipeline statistics query to emulate primitives generated The VK_QUERY_PIPELINE_STATISTIC_CLIPPING_INVOCATIONS_BIT query produces the same result as the GL primitives generated query. One caveat is that in combination with rasterizer discard this query may not work. This is emulated by disabling rasterizer discard when this query is active and applying an empty scissor instead. When VK_EXT_primitives_generated_query is released and supported, a similar issue with rasterizer discard persists so this change will facilitate using that extension as well. Bug: angleproject:5430 Change-Id: Id45b6f058c5cb6837e04aa64b1efde28c104e4cf Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2976181 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Reviewed-by: Tim Van Patten <timvp@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// QueryVk.h:
// Defines the class interface for QueryVk, implementing QueryImpl.
//
#ifndef LIBANGLE_RENDERER_VULKAN_QUERYVK_H_
#define LIBANGLE_RENDERER_VULKAN_QUERYVK_H_
#include "libANGLE/renderer/QueryImpl.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h"
namespace rx
{
class TransformFeedbackVk;
class QueryVk : public QueryImpl
{
public:
QueryVk(gl::QueryType type);
~QueryVk() override;
void onDestroy(const gl::Context *context) override;
angle::Result begin(const gl::Context *context) override;
angle::Result end(const gl::Context *context) override;
angle::Result queryCounter(const gl::Context *context) override;
angle::Result getResult(const gl::Context *context, GLint *params) override;
angle::Result getResult(const gl::Context *context, GLuint *params) override;
angle::Result getResult(const gl::Context *context, GLint64 *params) override;
angle::Result getResult(const gl::Context *context, GLuint64 *params) override;
angle::Result isResultAvailable(const gl::Context *context, bool *available) override;
void onTransformFeedbackEnd(GLsizeiptr primitivesDrawn);
vk::QueryHelper *getQueryHelper()
{
ASSERT(mQueryHelper.isReferenced());
return &mQueryHelper.get();
}
// Called by ContextVk on render pass start / end for render pass queries. These will
// stash and create new queries as needed.
angle::Result onRenderPassStart(ContextVk *contextVk);
void onRenderPassEnd(ContextVk *contextVk);
private:
angle::Result getResult(const gl::Context *context, bool wait);
bool isUsedInRecordedCommands() const;
bool isCurrentlyInUse(Serial lastCompletedSerial) const;
angle::Result finishRunningCommands(ContextVk *contextVk);
void stashQueryHelper();
uint32_t getQueryResultCount(ContextVk *contextVk) const;
angle::Result accumulateStashedQueryResult(ContextVk *contextVk, vk::QueryResult *result);
// Manage query allocations
angle::Result allocateQuery(ContextVk *contextVk);
void assignSharedQuery(QueryVk *shareQuery);
void releaseQueries(ContextVk *contextVk);
void releaseStashedQueries(ContextVk *contextVk);
// Prepare for begin by handling peculiarities such as the two transform feedback queries
// sharing QueryHelpers.
angle::Result setupBegin(ContextVk *contextVk);
// Used for all queries, except TimeElapsed (begin) or those that are emulated. For transform
// feedback queries, these can be shared if the two queries are simultaneously active.
vk::Shared<vk::QueryHelper> mQueryHelper;
// Used for queries that may end up with multiple outstanding query helper objects as they end
// and begin again with render passes.
std::vector<vk::Shared<vk::QueryHelper>> mStashedQueryHelpers;
// An additional query used for TimeElapsed (begin), as it is implemented using Timestamp.
vk::QueryHelper mQueryHelperTimeElapsedBegin;
// Used with TransformFeedbackPrimitivesWritten when transform feedback is emulated.
size_t mTransformFeedbackPrimitivesDrawn;
uint64_t mCachedResult;
bool mCachedResultValid;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_QUERYVK_H_