Spaces:
Build error
Build error
File size: 5,128 Bytes
d46f4a3 |
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 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
package com.mojang.blaze3d.vertex;
import com.mojang.jtracy.MemoryPool;
import com.mojang.jtracy.TracyClient;
import com.mojang.logging.LogUtils;
import java.nio.ByteBuffer;
import javax.annotation.Nullable;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import org.lwjgl.system.MemoryUtil;
import org.lwjgl.system.MemoryUtil.MemoryAllocator;
import org.slf4j.Logger;
@OnlyIn(Dist.CLIENT)
public class ByteBufferBuilder implements AutoCloseable {
private static final MemoryPool MEMORY_POOL = TracyClient.createMemoryPool("ByteBufferBuilder");
private static final Logger LOGGER = LogUtils.getLogger();
private static final MemoryAllocator ALLOCATOR = MemoryUtil.getAllocator(false);
private static final int MAX_GROWTH_SIZE = 2097152;
private static final int BUFFER_FREED_GENERATION = -1;
long pointer;
private int capacity;
private int writeOffset;
private int nextResultOffset;
private int resultCount;
private int generation;
public ByteBufferBuilder(int p_344576_) {
this.capacity = p_344576_;
this.pointer = ALLOCATOR.malloc((long)p_344576_);
MEMORY_POOL.malloc(this.pointer, p_344576_);
if (this.pointer == 0L) {
throw new OutOfMemoryError("Failed to allocate " + p_344576_ + " bytes");
}
}
public long reserve(int p_342985_) {
int i = this.writeOffset;
int j = i + p_342985_;
this.ensureCapacity(j);
this.writeOffset = j;
return this.pointer + (long)i;
}
private void ensureCapacity(int p_343904_) {
if (p_343904_ > this.capacity) {
int i = Math.min(this.capacity, 2097152);
int j = Math.max(this.capacity + i, p_343904_);
this.resize(j);
}
}
private void resize(int p_344270_) {
MEMORY_POOL.free(this.pointer);
this.pointer = ALLOCATOR.realloc(this.pointer, (long)p_344270_);
MEMORY_POOL.malloc(this.pointer, p_344270_);
LOGGER.debug("Needed to grow BufferBuilder buffer: Old size {} bytes, new size {} bytes.", this.capacity, p_344270_);
if (this.pointer == 0L) {
throw new OutOfMemoryError("Failed to resize buffer from " + this.capacity + " bytes to " + p_344270_ + " bytes");
} else {
this.capacity = p_344270_;
}
}
@Nullable
public ByteBufferBuilder.Result build() {
this.checkOpen();
int i = this.nextResultOffset;
int j = this.writeOffset - i;
if (j == 0) {
return null;
} else {
this.nextResultOffset = this.writeOffset;
this.resultCount++;
return new ByteBufferBuilder.Result(i, j, this.generation);
}
}
public void clear() {
if (this.resultCount > 0) {
LOGGER.warn("Clearing BufferBuilder with unused batches");
}
this.discard();
}
public void discard() {
this.checkOpen();
if (this.resultCount > 0) {
this.discardResults();
this.resultCount = 0;
}
}
boolean isValid(int p_344177_) {
return p_344177_ == this.generation;
}
void freeResult() {
if (--this.resultCount <= 0) {
this.discardResults();
}
}
private void discardResults() {
int i = this.writeOffset - this.nextResultOffset;
if (i > 0) {
MemoryUtil.memCopy(this.pointer + (long)this.nextResultOffset, this.pointer, (long)i);
}
this.writeOffset = i;
this.nextResultOffset = 0;
this.generation++;
}
@Override
public void close() {
if (this.pointer != 0L) {
MEMORY_POOL.free(this.pointer);
ALLOCATOR.free(this.pointer);
this.pointer = 0L;
this.generation = -1;
}
}
private void checkOpen() {
if (this.pointer == 0L) {
throw new IllegalStateException("Buffer has been freed");
}
}
@OnlyIn(Dist.CLIENT)
public class Result implements AutoCloseable {
private final int offset;
private final int capacity;
private final int generation;
private boolean closed;
Result(final int p_343613_, final int p_344565_, final int p_344170_) {
this.offset = p_343613_;
this.capacity = p_344565_;
this.generation = p_344170_;
}
public ByteBuffer byteBuffer() {
if (!ByteBufferBuilder.this.isValid(this.generation)) {
throw new IllegalStateException("Buffer is no longer valid");
} else {
return MemoryUtil.memByteBuffer(ByteBufferBuilder.this.pointer + (long)this.offset, this.capacity);
}
}
@Override
public void close() {
if (!this.closed) {
this.closed = true;
if (ByteBufferBuilder.this.isValid(this.generation)) {
ByteBufferBuilder.this.freeResult();
}
}
}
}
} |