Hash :
50704dc3
Author :
Date :
2020-08-04T12:08:00
Metal: Implement EXT_occlusion_query_boolean.
- Metal's occlusion(called visibility) query operates per render pass.
Implementation details are in
src/libANGLE/renderer/metal/doc/OcclusionQueries.md.
- New tests:
- OcclusionQueriesTest.ClearNotCounted.
- OcclusionQueriesTest.MultiQueries (failure on OpenGL/D3D11
back-end).
Bug: angleproject:2634
Change-Id: Idd1327b5472d0e8c2b69307a7f04a1da4a847a40
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2336121
Commit-Queue: Le Hoang Quyen <le.hoang.q@gmail.com>
Reviewed-by: back sept 10 - Jamie Madill <jmadill@chromium.org>
Reviewed-by: Jonah Ryan-Davis <jonahr@google.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
//
// Copyright 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 <vector>
#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<QueryMtl *> mAllocatedQueries;
bool mResetFirstQuery = false;
};
} // namespace mtl
} // namespace rx
#endif /* LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_ */