xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/gl/QueryGL.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 
7*8975f5c5SAndroid Build Coastguard Worker // QueryGL.h: Defines the class interface for QueryGL.
8*8975f5c5SAndroid Build Coastguard Worker 
9*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_GL_QUERYGL_H_
10*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_GL_QUERYGL_H_
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include <deque>
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/QueryImpl.h"
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace rx
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker class FunctionsGL;
20*8975f5c5SAndroid Build Coastguard Worker class StateManagerGL;
21*8975f5c5SAndroid Build Coastguard Worker 
22*8975f5c5SAndroid Build Coastguard Worker class QueryGL : public QueryImpl
23*8975f5c5SAndroid Build Coastguard Worker {
24*8975f5c5SAndroid Build Coastguard Worker   public:
25*8975f5c5SAndroid Build Coastguard Worker     QueryGL(gl::QueryType type);
26*8975f5c5SAndroid Build Coastguard Worker     ~QueryGL() override;
27*8975f5c5SAndroid Build Coastguard Worker 
28*8975f5c5SAndroid Build Coastguard Worker     // OpenGL is only allowed to have one query of each type active at any given time. Since ANGLE
29*8975f5c5SAndroid Build Coastguard Worker     // virtualizes contexts, queries need to be able to be paused and resumed.
30*8975f5c5SAndroid Build Coastguard Worker     // A query is "paused" by ending it and pushing the ID into a list of queries awaiting readback.
31*8975f5c5SAndroid Build Coastguard Worker     // When it is "resumed", a new query is generated and started.
32*8975f5c5SAndroid Build Coastguard Worker     // When a result is required, the queries are "flushed" by iterating over the list of pending
33*8975f5c5SAndroid Build Coastguard Worker     // queries and merging their results.
34*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result pause(const gl::Context *context)  = 0;
35*8975f5c5SAndroid Build Coastguard Worker     virtual angle::Result resume(const gl::Context *context) = 0;
36*8975f5c5SAndroid Build Coastguard Worker };
37*8975f5c5SAndroid Build Coastguard Worker 
38*8975f5c5SAndroid Build Coastguard Worker class StandardQueryGL : public QueryGL
39*8975f5c5SAndroid Build Coastguard Worker {
40*8975f5c5SAndroid Build Coastguard Worker   public:
41*8975f5c5SAndroid Build Coastguard Worker     StandardQueryGL(gl::QueryType type, const FunctionsGL *functions, StateManagerGL *stateManager);
42*8975f5c5SAndroid Build Coastguard Worker     ~StandardQueryGL() override;
43*8975f5c5SAndroid Build Coastguard Worker 
44*8975f5c5SAndroid Build Coastguard Worker     angle::Result begin(const gl::Context *context) override;
45*8975f5c5SAndroid Build Coastguard Worker     angle::Result end(const gl::Context *context) override;
46*8975f5c5SAndroid Build Coastguard Worker     angle::Result queryCounter(const gl::Context *context) override;
47*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLint *params) override;
48*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLuint *params) override;
49*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLint64 *params) override;
50*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLuint64 *params) override;
51*8975f5c5SAndroid Build Coastguard Worker     angle::Result isResultAvailable(const gl::Context *context, bool *available) override;
52*8975f5c5SAndroid Build Coastguard Worker 
53*8975f5c5SAndroid Build Coastguard Worker     angle::Result pause(const gl::Context *context) override;
54*8975f5c5SAndroid Build Coastguard Worker     angle::Result resume(const gl::Context *context) override;
55*8975f5c5SAndroid Build Coastguard Worker 
56*8975f5c5SAndroid Build Coastguard Worker   private:
57*8975f5c5SAndroid Build Coastguard Worker     angle::Result flush(const gl::Context *context, bool force);
58*8975f5c5SAndroid Build Coastguard Worker     void clearInternalQueries();
59*8975f5c5SAndroid Build Coastguard Worker 
60*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
61*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResultBase(const gl::Context *context, T *params);
62*8975f5c5SAndroid Build Coastguard Worker 
63*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *mFunctions;
64*8975f5c5SAndroid Build Coastguard Worker     StateManagerGL *mStateManager;
65*8975f5c5SAndroid Build Coastguard Worker 
66*8975f5c5SAndroid Build Coastguard Worker     GLuint mActiveQuery;
67*8975f5c5SAndroid Build Coastguard Worker     std::deque<GLuint> mPendingQueries;
68*8975f5c5SAndroid Build Coastguard Worker     GLuint64 mResultSum;
69*8975f5c5SAndroid Build Coastguard Worker };
70*8975f5c5SAndroid Build Coastguard Worker 
71*8975f5c5SAndroid Build Coastguard Worker class SyncProviderGL;
72*8975f5c5SAndroid Build Coastguard Worker class SyncQueryGL : public QueryGL
73*8975f5c5SAndroid Build Coastguard Worker {
74*8975f5c5SAndroid Build Coastguard Worker   public:
75*8975f5c5SAndroid Build Coastguard Worker     SyncQueryGL(gl::QueryType type, const FunctionsGL *functions);
76*8975f5c5SAndroid Build Coastguard Worker     ~SyncQueryGL() override;
77*8975f5c5SAndroid Build Coastguard Worker 
78*8975f5c5SAndroid Build Coastguard Worker     static bool IsSupported(const FunctionsGL *functions);
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker     angle::Result begin(const gl::Context *context) override;
81*8975f5c5SAndroid Build Coastguard Worker     angle::Result end(const gl::Context *context) override;
82*8975f5c5SAndroid Build Coastguard Worker     angle::Result queryCounter(const gl::Context *context) override;
83*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLint *params) override;
84*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLuint *params) override;
85*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLint64 *params) override;
86*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResult(const gl::Context *context, GLuint64 *params) override;
87*8975f5c5SAndroid Build Coastguard Worker     angle::Result isResultAvailable(const gl::Context *context, bool *available) override;
88*8975f5c5SAndroid Build Coastguard Worker 
89*8975f5c5SAndroid Build Coastguard Worker     angle::Result pause(const gl::Context *context) override;
90*8975f5c5SAndroid Build Coastguard Worker     angle::Result resume(const gl::Context *context) override;
91*8975f5c5SAndroid Build Coastguard Worker 
92*8975f5c5SAndroid Build Coastguard Worker   private:
93*8975f5c5SAndroid Build Coastguard Worker     angle::Result flush(const gl::Context *context, bool force);
94*8975f5c5SAndroid Build Coastguard Worker 
95*8975f5c5SAndroid Build Coastguard Worker     template <typename T>
96*8975f5c5SAndroid Build Coastguard Worker     angle::Result getResultBase(const gl::Context *context, T *params);
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker     const FunctionsGL *mFunctions;
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker     std::unique_ptr<SyncProviderGL> mSyncProvider;
101*8975f5c5SAndroid Build Coastguard Worker     bool mFinished;
102*8975f5c5SAndroid Build Coastguard Worker };
103*8975f5c5SAndroid Build Coastguard Worker }  // namespace rx
104*8975f5c5SAndroid Build Coastguard Worker 
105*8975f5c5SAndroid Build Coastguard Worker #endif  // LIBANGLE_RENDERER_GL_QUERYGL_H_
106