Hash :
12028222
Author :
Date :
2024-06-20T00:00:00
Metal: Clear visibility result buffer before use Ensured that the current visibility pool buffer does not contain previous results if it was used before. Fixed: angleproject:348206830 Change-Id: I8dbc36626ef8267d5466c96405dac0da2754cb6d Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5643453 Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
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 66 67 68
//
// 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 <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);
// Clear visibility pool buffer to drop previous results
void prepareRenderPassVisibilityPoolBuffer(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;
bool mUsed = false;
};
} // namespace mtl
} // namespace rx
#endif /* LIBANGLE_RENDERER_METAL_MTL_OCCLUSION_QUERY_POOL_H_ */