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