Hash :
dbd47e37
Author :
Date :
2023-01-30T20:54:24
Revert "Metal: Avoid leaking buffers for GPU access for non-discrete" This reverts commit 369b320f92f54774879e8b8faff834fc8db0793e. Reason for revert: WebGL 2.0 conformance tests failing on Mac/AMD per https://bugs.chromium.org/p/angleproject/issues/detail?id=7975#c4 Original change's description: > Metal: Avoid leaking buffers for GPU access for non-discrete > > The code would pass BufferManager::getBuffer(..,useShared=false,..) > and use that as key to try to obtain a buffer from the cache. > The BufferManager would store the returned buffers based on > the actual storage mode of the buffer. The storage mode for the > buffers for integrated / iOS devices is always shared. > > The above logic would lead the buffer manager always storing returned > buffers to the cache, but never being able to consume any from the > cache. The cache is designed to grow unbounded, and so it did. > > Remove the inconsistent logic of passing variation of "use shared bool" > as the arguments. Various places consulted various different Feature > options in inconsistent manner. > > Instead, add Buffer::AccessPattern for the callers to express what > kind of access pattern to expect a buffer to be used. Add explicit > MTLStorageMode parameters to Buffer constructing functions. > Remove redundant functions from Buffer. > Remove dead code from BufferPool related to allocation policy. > > Bug: angleproject:7975 > Change-Id: I0c4661c55e8c907b702160ae42690269c049f6db > Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4194172 > Reviewed-by: Kenneth Russell <kbr@chromium.org> > Commit-Queue: Kenneth Russell <kbr@chromium.org> > Reviewed-by: Gregg Tavares <gman@chromium.org> > Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Bug: angleproject:7975 Change-Id: I094de8e5b06392fe36a9887d6a817023baa48735 No-Presubmit: true Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4206187 Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com> Commit-Queue: Yuly Novikov <ynovikov@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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
//
// Copyright 2022 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_buffer_manager.h:
// BufferManager manages buffers across all contexts for a single
// device.
//
#ifndef LIBANGLE_RENDERER_METAL_MTL_BUFFER_MANAGER_H_
#define LIBANGLE_RENDERER_METAL_MTL_BUFFER_MANAGER_H_
#include "common/FixedVector.h"
#include "libANGLE/renderer/metal/mtl_resources.h"
#include <vector>
namespace rx
{
class ContextMtl;
namespace mtl
{
// GL buffers are backed by Metal buffers. Which metal
// buffer is backing a particular GL buffer is fluid.
// The case being optimized is a loop of something like
//
// for 1..4
// glBufferSubData
// glDrawXXX
//
// You can't update a buffer in the middle of a render pass
// in metal so instead we'd end up using multiple buffers.
//
// Simple case, the call to `glBufferSubData` updates the
// entire buffer. In this case we'd end up with each call
// to `glBufferSubData` getting a new buffer from this
// BufferManager and copying the new data to it. We'd
// end up submitting this renderpass
//
// draw with buf1
// draw with buf2
// draw with buf3
// draw with buf4
//
// The GL buffer now references buf4. And buf1, buf2, buf3 and
// buf0 (the buffer that was previously referenced by the GL buffer)
// are all added to the inuse-list
//
// This macro enables showing the running totals of the various
// buckets of unused buffers.
// #define ANGLE_MTL_TRACK_BUFFER_MEM
class BufferManager
{
public:
BufferManager();
static constexpr size_t kMaxStagingBufferSize = 1024 * 1024;
static constexpr size_t kMaxSizePowerOf2 = 64;
angle::Result queueBlitCopyDataToBuffer(ContextMtl *contextMtl,
const void *srcPtr,
size_t sizeToCopy,
size_t offset,
mtl::BufferRef &dstMetalBuffer);
angle::Result getBuffer(ContextMtl *contextMtl,
size_t size,
bool useSharedMem,
mtl::BufferRef &bufferRef);
void returnBuffer(ContextMtl *contextMtl, mtl::BufferRef &bufferRef);
private:
typedef std::vector<mtl::BufferRef> BufferList;
void freeUnusedBuffers(ContextMtl *contextMtl);
void addBufferRefToFreeLists(mtl::BufferRef &bufferRef);
BufferList mInUseBuffers;
angle::FixedVector<BufferList, kMaxSizePowerOf2> mFreeBuffers[2];
#ifdef ANGLE_MTL_TRACK_BUFFER_MEM
angle::FixedVector<size_t, kMaxSizePowerOf2> mAllocations;
size_t mTotalMem = 0;
#endif
};
} // namespace mtl
} // namespace rx
#endif /* LIBANGLE_RENDERER_METAL_MTL_BUFFER_MANAGER_H_ */