xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/QueryVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 The ANGLE Project Authors. All rights reserved.
3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file.
5*8975f5c5SAndroid Build Coastguard Worker //
6*8975f5c5SAndroid Build Coastguard Worker // QueryVk.h:
7*8975f5c5SAndroid Build Coastguard Worker //    Defines the class interface for QueryVk, implementing QueryImpl.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_QUERYVK_H_
11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_QUERYVK_H_
12*8975f5c5SAndroid Build Coastguard Worker 
13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/QueryImpl.h"
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace rx
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker class TransformFeedbackVk;
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker class QueryVk : public QueryImpl
21*8975f5c5SAndroid Build Coastguard Worker {
22*8975f5c5SAndroid Build Coastguard Worker   public:
23*8975f5c5SAndroid Build Coastguard Worker     QueryVk(gl::QueryType type);
24*8975f5c5SAndroid Build Coastguard Worker     ~QueryVk() override;
25*8975f5c5SAndroid Build Coastguard Worker 
26*8975f5c5SAndroid Build Coastguard Worker     void onDestroy(const gl::Context *context) override;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     angle::Result begin(const gl::Context *context) override;
29*8975f5c5SAndroid Build Coastguard Worker     angle::Result end(const gl::Context *context) override;
30*8975f5c5SAndroid Build Coastguard Worker     angle::Result queryCounter(const gl::Context *context) override;
31*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLint *params) override;
32*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLuint *params) override;
33*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLint64 *params) override;
34*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLuint64 *params) override;
35*8975f5c5SAndroid Build Coastguard Worker     angle::Result isResultAvailable(const gl::Context *context, bool *available) override;
36*8975f5c5SAndroid Build Coastguard Worker 
37*8975f5c5SAndroid Build Coastguard Worker     void onTransformFeedbackEnd(GLsizeiptr primitivesDrawn);
hasQueryBegun()38*8975f5c5SAndroid Build Coastguard Worker     bool hasQueryBegun() const { return mQueryHelper.isReferenced(); }
getQueryHelper()39*8975f5c5SAndroid Build Coastguard Worker     vk::QueryHelper *getQueryHelper()
40*8975f5c5SAndroid Build Coastguard Worker     {
41*8975f5c5SAndroid Build Coastguard Worker         ASSERT(mQueryHelper.isReferenced());
42*8975f5c5SAndroid Build Coastguard Worker         return &mQueryHelper.get();
43*8975f5c5SAndroid Build Coastguard Worker     }
44*8975f5c5SAndroid Build Coastguard Worker 
45*8975f5c5SAndroid Build Coastguard Worker     // Called by ContextVk on render pass start / end for render pass queries.  These will
46*8975f5c5SAndroid Build Coastguard Worker     // stash and create new queries as needed.
47*8975f5c5SAndroid Build Coastguard Worker     angle::Result onRenderPassStart(ContextVk *contextVk);
48*8975f5c5SAndroid Build Coastguard Worker     void onRenderPassEnd(ContextVk *contextVk);
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker   private:
51*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, bool wait);
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     bool isCurrentlyInUse(vk::Renderer *renderer) const;
54*8975f5c5SAndroid Build Coastguard Worker     angle::Result finishRunningCommands(ContextVk *contextVk);
55*8975f5c5SAndroid Build Coastguard Worker     void stashQueryHelper();
56*8975f5c5SAndroid Build Coastguard Worker     uint32_t getQueryResultCount(ContextVk *contextVk) const;
57*8975f5c5SAndroid Build Coastguard Worker     angle::Result accumulateStashedQueryResult(ContextVk *contextVk, vk::QueryResult *result);
58*8975f5c5SAndroid Build Coastguard Worker 
59*8975f5c5SAndroid Build Coastguard Worker     // Manage query allocations
60*8975f5c5SAndroid Build Coastguard Worker     angle::Result allocateQuery(ContextVk *contextVk);
61*8975f5c5SAndroid Build Coastguard Worker     void assignSharedQuery(QueryVk *shareQuery);
62*8975f5c5SAndroid Build Coastguard Worker     void releaseQueries(ContextVk *contextVk);
63*8975f5c5SAndroid Build Coastguard Worker     void releaseStashedQueries(ContextVk *contextVk);
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker     // Prepare for begin by handling peculiarities such as the two transform feedback queries
66*8975f5c5SAndroid Build Coastguard Worker     // sharing QueryHelpers.
67*8975f5c5SAndroid Build Coastguard Worker     angle::Result setupBegin(ContextVk *contextVk);
68*8975f5c5SAndroid Build Coastguard Worker 
69*8975f5c5SAndroid Build Coastguard Worker     // Used for all queries, except TimeElapsed (begin) or those that are emulated.  For transform
70*8975f5c5SAndroid Build Coastguard Worker     // feedback queries, these can be shared if the two queries are simultaneously active.
71*8975f5c5SAndroid Build Coastguard Worker     vk::Shared<vk::QueryHelper> mQueryHelper;
72*8975f5c5SAndroid Build Coastguard Worker     // Used for queries that may end up with multiple outstanding query helper objects as they end
73*8975f5c5SAndroid Build Coastguard Worker     // and begin again with render passes.
74*8975f5c5SAndroid Build Coastguard Worker     std::vector<vk::Shared<vk::QueryHelper>> mStashedQueryHelpers;
75*8975f5c5SAndroid Build Coastguard Worker     // An additional query used for TimeElapsed (begin), as it is implemented using Timestamp.
76*8975f5c5SAndroid Build Coastguard Worker     vk::QueryHelper mQueryHelperTimeElapsedBegin;
77*8975f5c5SAndroid Build Coastguard Worker     // Used with TransformFeedbackPrimitivesWritten when transform feedback is emulated.
78*8975f5c5SAndroid Build Coastguard Worker     size_t mTransformFeedbackPrimitivesDrawn;
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker     uint64_t mCachedResult;
81*8975f5c5SAndroid Build Coastguard Worker     bool mCachedResultValid;
82*8975f5c5SAndroid Build Coastguard Worker };
83*8975f5c5SAndroid Build Coastguard Worker 
84*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
85*8975f5c5SAndroid Build Coastguard Worker 
86*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_VULKAN_QUERYVK_H_
87