Hash :
006c11d9
Author :
Date :
2021-11-20T22:12:20
Vulkan: Fix xfb query ASSERT on end It's possible for the xfb query to have never been issued, as it's deferred until a draw call with xfb active is encountered, which may never happen. Bug: chromium:1209285 Change-Id: I893f9f9a06e4b9f2f9da9406affab0be3598fcb4 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3294701 Reviewed-by: Tim Van Patten <timvp@google.com> Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org>
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 87
//
// 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);
bool hasQueryBegun() const { return mQueryHelper.isReferenced(); }
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_