Hash :
b46344bb
Author :
Date :
2023-06-12T13:50:40
Metal: Cache render pipelines at the context level Cache Metal render pipelines in a new mtl::PipelineCache which lives at the context level. This allows us to clean up unused pipelines from programs that are not actively used. The cache limits were chosen based on running Chromium. Without a limit, the total number of pipelines peaks at ~200. With frequent GCs, the active working set usually sits at ~60 pipelines. Bug: chromium:1329376 Change-Id: Ifa83b797c893684294e16dd638f6b3a35e1d043f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4608486 Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Quyen Le <lehoangquyen@chromium.org> Commit-Queue: 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 69 70 71 72 73 74 75 76
//
// Copyright 2023 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_pipeline_cache.h:
// Defines classes for caching of mtl pipelines
//
#ifndef LIBANGLE_RENDERER_METAL_MTL_PIPELINE_CACHE_H_
#define LIBANGLE_RENDERER_METAL_MTL_PIPELINE_CACHE_H_
#include "common/hash_utils.h"
#include "libANGLE/SizedMRUCache.h"
#include "libANGLE/renderer/metal/mtl_utils.h"
namespace rx
{
namespace mtl
{
struct RenderPipelineKey
{
AutoObjCPtr<id<MTLFunction>> vertexShader;
AutoObjCPtr<id<MTLFunction>> fragmentShader;
RenderPipelineDesc pipelineDesc;
bool operator==(const RenderPipelineKey &rhs) const;
size_t hash() const;
};
} // namespace mtl
} // namespace rx
namespace std
{
template <>
struct hash<rx::mtl::RenderPipelineKey>
{
size_t operator()(const rx::mtl::RenderPipelineKey &key) const { return key.hash(); }
};
} // namespace std
namespace rx
{
namespace mtl
{
class PipelineCache : angle::NonCopyable
{
public:
PipelineCache();
angle::Result getRenderPipeline(ContextMtl *context,
id<MTLFunction> vertexShader,
id<MTLFunction> fragmentShader,
const RenderPipelineDesc &desc,
AutoObjCPtr<id<MTLRenderPipelineState>> *outRenderPipeline);
private:
static constexpr unsigned int kMaxPipelines = 128;
// The cache tries to clean up this many states at once.
static constexpr unsigned int kGCLimit = 32;
using RenderPipelineMap =
angle::base::HashingMRUCache<RenderPipelineKey, AutoObjCPtr<id<MTLRenderPipelineState>>>;
RenderPipelineMap mRenderPiplineCache;
};
} // namespace mtl
} // namespace rx
#endif // LIBANGLE_RENDERER_METAL_MTL_PIPELINE_CACHE_H_