Reland "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::Usage 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. Reland: continue to allocate buffers with shared rather than managed mode in BufferPool, as otherwise bug angleproject:7997 is encountered. Bug: angleproject:7975 Change-Id: Iae4e75a85e6d49b20e724ed037a7c14cc0f7693f Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/4217712 Reviewed-by: Kenneth Russell <kbr@chromium.org> Auto-Submit: Kimmo Kinnunen <kkinnunen@apple.com> Reviewed-by: Gregg Tavares <gman@chromium.org> Reviewed-by: Kimmo Kinnunen <kkinnunen@apple.com> Commit-Queue: Kenneth Russell <kbr@chromium.org>