Hash :
d33a2222
Author :
Date :
2021-04-26T16:56:15
Upstream Apple's direct-to-Metal backend: compile libANGLE. This change is meant to merge the metal backend changes from Apple's direct-to-Metal backend. Taken from Kyle Piddington's CL: https://chromium-review.googlesource.com/c/angle/angle/+/2857366/ The goal of this CL is to merge the metal backend code in a state that compiles, but not to switch the Metal backend over to using the direct-to-metal backend yet. Bug: angleproject:5505 Bug: angleproject:6127 Change-Id: If6783e06e0086b3a1dd25c6f53caca5cfc96cb86 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2950067 Reviewed-by: Jonah Ryan-Davis <jonahr@google.com> Reviewed-by: Kenneth Russell <kbr@chromium.org> Commit-Queue: 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 (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);
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_ */