• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2020 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // mtl_occlusion_query_pool: A pool for allocating visibility query within
7 // one render pass.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_
11 #define LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_
12 
13 #include <vector>
14 
15 #include "libANGLE/Context.h"
16 #include "libANGLE/renderer/metal/mtl_common.h"
17 #include "libANGLE/renderer/metal/mtl_resources.h"
18 
19 namespace rx
20 {
21 
22 class ContextMtl;
23 class QueryMtl;
24 
25 namespace mtl
26 {
27 
28 class OcclusionQueryPool
29 {
30   public:
31     OcclusionQueryPool();
32     ~OcclusionQueryPool();
33 
34     void destroy(ContextMtl *contextMtl);
35 
36     // Allocate an offset in visibility buffer for a query in a render pass.
37     // - clearOldValue = true, if the old value of query will be cleared before combining in the
38     // visibility resolve pass. This flag is only allowed to be false for the first allocation of
39     // the render pass or the query that already has an allocated offset.
40     // Note: a query might have more than one allocated offset. They will be combined in the final
41     // step.
42     angle::Result allocateQueryOffset(ContextMtl *contextMtl, QueryMtl *query, bool clearOldValue);
43     // Deallocate all offsets used for a query.
44     void deallocateQueryOffset(ContextMtl *contextMtl, QueryMtl *query);
45     // Retrieve a buffer that will contain the visibility results of all allocated queries for
46     // a render pass
getRenderPassVisibilityPoolBuffer()47     const BufferRef &getRenderPassVisibilityPoolBuffer() const { return mRenderPassResultsPool; }
getNumRenderPassAllocatedQueries()48     size_t getNumRenderPassAllocatedQueries() const { return mAllocatedQueries.size(); }
49     // This function is called at the end of render pass
50     void resolveVisibilityResults(ContextMtl *contextMtl);
51 
52   private:
53     // Buffer to hold the visibility results for current render pass
54     BufferRef mRenderPassResultsPool;
55 
56     // List of allocated queries per render pass
57     std::vector<QueryMtl *> mAllocatedQueries;
58 
59     bool mResetFirstQuery = false;
60 };
61 
62 }  // namespace mtl
63 }  // namespace rx
64 
65 #endif /* LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_ */
66