package com.mojang.blaze3d.resource; import com.google.common.annotations.VisibleForTesting; import java.util.ArrayDeque; import java.util.Collection; import java.util.Deque; import java.util.Iterator; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class CrossFrameResourcePool implements GraphicsResourceAllocator, AutoCloseable { private final int framesToKeepResource; private final Deque> pool = new ArrayDeque<>(); public CrossFrameResourcePool(int p_363418_) { this.framesToKeepResource = p_363418_; } public void endFrame() { Iterator> iterator = this.pool.iterator(); while (iterator.hasNext()) { CrossFrameResourcePool.ResourceEntry resourceentry = (CrossFrameResourcePool.ResourceEntry)iterator.next(); if (resourceentry.framesToLive-- == 0) { resourceentry.close(); iterator.remove(); } } } @Override public T acquire(ResourceDescriptor p_364134_) { Iterator> iterator = this.pool.iterator(); while (iterator.hasNext()) { CrossFrameResourcePool.ResourceEntry resourceentry = (CrossFrameResourcePool.ResourceEntry)iterator.next(); if (resourceentry.descriptor.equals(p_364134_)) { iterator.remove(); return (T)resourceentry.value; } } return p_364134_.allocate(); } @Override public void release(ResourceDescriptor p_370226_, T p_369520_) { this.pool.addFirst(new CrossFrameResourcePool.ResourceEntry<>(p_370226_, p_369520_, this.framesToKeepResource)); } public void clear() { this.pool.forEach(CrossFrameResourcePool.ResourceEntry::close); this.pool.clear(); } @Override public void close() { this.clear(); } @VisibleForTesting protected Collection> entries() { return this.pool; } @OnlyIn(Dist.CLIENT) @VisibleForTesting protected static final class ResourceEntry implements AutoCloseable { final ResourceDescriptor descriptor; final T value; int framesToLive; ResourceEntry(ResourceDescriptor p_361734_, T p_367770_, int p_363856_) { this.descriptor = p_361734_; this.value = p_367770_; this.framesToLive = p_363856_; } @Override public void close() { this.descriptor.free(this.value); } } }