blob: 87dc21764637a1b1ffe39be71c3e2844e89127ca [file] [log] [blame]
//
// 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_ */