// // Copyright (c) 2020 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. // // mtl_occlusion_query_pool: A pool for allocating visibility query within // one render pass. // #ifndef LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_ #define LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_ #include #include "libANGLE/Context.h" #include "libANGLE/renderer/metal/mtl_common.h" #include "libANGLE/renderer/metal/mtl_resources.h" namespace rx { class ContextMtl; class QueryMtl; namespace mtl { class OcclusionQueryPool { public: OcclusionQueryPool(); ~OcclusionQueryPool(); void destroy(ContextMtl *contextMtl); // Allocate an offset in visibility buffer for a query in a render pass. // - clearOldValue = true, if the old value of query will be cleared before combining in the // visibility resolve pass. This flag is only allowed to be false for the first allocation of // the render pass or the query that already has an allocated offset. // Note: a query might have more than one allocated offset. They will be combined in the final // step. angle::Result allocateQueryOffset(ContextMtl *contextMtl, QueryMtl *query, bool clearOldValue); // Deallocate all offsets used for a query. void deallocateQueryOffset(ContextMtl *contextMtl, QueryMtl *query); // Retrieve a buffer that will contain the visibility results of all allocated queries for // a render pass const BufferRef &getRenderPassVisibilityPoolBuffer() const { return mRenderPassResultsPool; } size_t getNumRenderPassAllocatedQueries() const { return mAllocatedQueries.size(); } // This function is called at the end of render pass void resolveVisibilityResults(ContextMtl *contextMtl); private: // Buffer to hold the visibility results for current render pass BufferRef mRenderPassResultsPool; // List of allocated queries per render pass std::vector mAllocatedQueries; bool mResetFirstQuery = false; }; } // namespace mtl } // namespace rx #endif /* LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_ */