BufferStorage.java
com.mojang.blaze3d.opengl.BufferStorage
信息
- 全限定名:com.mojang.blaze3d.opengl.BufferStorage
- 类型:public abstract class
- 包:com.mojang.blaze3d.opengl
- 源码路径:src/main/java/com/mojang/blaze3d/opengl/BufferStorage.java
- 起始行号:L14
- 职责:
TODO
字段/常量
- 无
内部类/嵌套类型
-
com.mojang.blaze3d.opengl.BufferStorage.Immutable- 类型:
class - 修饰符:
private static - 源码定位:
L31 - 说明:
TODO
- 类型:
-
com.mojang.blaze3d.opengl.BufferStorage.Mutable- 类型:
class - 修饰符:
private static - 源码定位:
L92 - 说明:
TODO
- 类型:
构造器
- 无
方法
下面的方法块按源码顺序生成。
public static BufferStorage create(GLCapabilities capabilities, Set<String> enabledExtensions) @ L15
- 方法名:create
- 源码定位:L15
- 返回类型:BufferStorage
- 修饰符:public static
参数:
- capabilities: GLCapabilities
- enabledExtensions: Set
说明:
TODO
public abstract GlBuffer createBuffer(DirectStateAccess dsa, Supplier<String> label, int usage, long size) @ L24
- 方法名:createBuffer
- 源码定位:L24
- 返回类型:GlBuffer
- 修饰符:public abstract
参数:
- dsa: DirectStateAccess
- label: Supplier
- usage: int
- size: long
说明:
TODO
public abstract GlBuffer createBuffer(DirectStateAccess dsa, Supplier<String> label, int usage, ByteBuffer data) @ L26
- 方法名:createBuffer
- 源码定位:L26
- 返回类型:GlBuffer
- 修饰符:public abstract
参数:
- dsa: DirectStateAccess
- label: Supplier
- usage: int
- data: ByteBuffer
说明:
TODO
public abstract GlBuffer.GlMappedView mapBuffer(DirectStateAccess dsa, GlBuffer buffer, long offset, long length, int flags) @ L28
- 方法名:mapBuffer
- 源码定位:L28
- 返回类型:GlBuffer.GlMappedView
- 修饰符:public abstract
参数:
- dsa: DirectStateAccess
- buffer: GlBuffer
- offset: long
- length: long
- flags: int
说明:
TODO
代码
@OnlyIn(Dist.CLIENT)
public abstract class BufferStorage {
public static BufferStorage create(GLCapabilities capabilities, Set<String> enabledExtensions) {
if (capabilities.GL_ARB_buffer_storage && GlDevice.USE_GL_ARB_buffer_storage) {
enabledExtensions.add("GL_ARB_buffer_storage");
return new BufferStorage.Immutable();
} else {
return new BufferStorage.Mutable();
}
}
public abstract GlBuffer createBuffer(DirectStateAccess dsa, @Nullable Supplier<String> label, @GpuBuffer.Usage int usage, long size);
public abstract GlBuffer createBuffer(DirectStateAccess dsa, @Nullable Supplier<String> label, @GpuBuffer.Usage int usage, ByteBuffer data);
public abstract GlBuffer.GlMappedView mapBuffer(DirectStateAccess dsa, GlBuffer buffer, long offset, long length, int flags);
@OnlyIn(Dist.CLIENT)
private static class Immutable extends BufferStorage {
@Override
public GlBuffer createBuffer(DirectStateAccess dsa, @Nullable Supplier<String> label, @GpuBuffer.Usage int usage, long size) {
int buffer = dsa.createBuffer();
dsa.bufferStorage(buffer, size, usage);
ByteBuffer persistentBuffer = this.tryMapBufferPersistent(dsa, usage, buffer, size);
return new GlBuffer(label, dsa, usage, size, buffer, persistentBuffer);
}
@Override
public GlBuffer createBuffer(DirectStateAccess dsa, @Nullable Supplier<String> label, @GpuBuffer.Usage int usage, ByteBuffer data) {
int buffer = dsa.createBuffer();
int size = data.remaining();
dsa.bufferStorage(buffer, data, usage);
ByteBuffer persistentBuffer = this.tryMapBufferPersistent(dsa, usage, buffer, size);
return new GlBuffer(label, dsa, usage, size, buffer, persistentBuffer);
}
private @Nullable ByteBuffer tryMapBufferPersistent(DirectStateAccess dsa, @GpuBuffer.Usage int usage, int buffer, long size) {
int mapFlags = 0;
if ((usage & 1) != 0) {
mapFlags |= 1;
}
if ((usage & 2) != 0) {
mapFlags |= 18;
}
ByteBuffer persistentBuffer;
if (mapFlags != 0) {
GlStateManager.clearGlErrors();
persistentBuffer = dsa.mapBufferRange(buffer, 0L, size, mapFlags | 64, usage);
if (persistentBuffer == null) {
throw new IllegalStateException("Can't persistently map buffer, opengl error " + GlStateManager._getError());
}
} else {
persistentBuffer = null;
}
return persistentBuffer;
}
@Override
public GlBuffer.GlMappedView mapBuffer(DirectStateAccess dsa, GlBuffer buffer, long offset, long length, int flags) {
if (buffer.persistentBuffer == null) {
throw new IllegalStateException("Somehow trying to map an unmappable buffer");
} else if (offset > 2147483647L || length > 2147483647L) {
throw new IllegalArgumentException("Mapping buffers larger than 2GB is not supported");
} else if (offset >= 0L && length >= 0L) {
return new GlBuffer.GlMappedView(() -> {
if ((flags & 2) != 0) {
dsa.flushMappedBufferRange(buffer.handle, offset, length, buffer.usage());
}
}, buffer, MemoryUtil.memSlice(buffer.persistentBuffer, (int)offset, (int)length));
} else {
throw new IllegalArgumentException("Offset or length must be positive integer values");
}
}
}
@OnlyIn(Dist.CLIENT)
private static class Mutable extends BufferStorage {
@Override
public GlBuffer createBuffer(DirectStateAccess dsa, @Nullable Supplier<String> label, @GpuBuffer.Usage int usage, long size) {
int buffer = dsa.createBuffer();
dsa.bufferData(buffer, size, usage);
return new GlBuffer(label, dsa, usage, size, buffer, null);
}
@Override
public GlBuffer createBuffer(DirectStateAccess dsa, @Nullable Supplier<String> label, @GpuBuffer.Usage int usage, ByteBuffer data) {
int buffer = dsa.createBuffer();
int size = data.remaining();
dsa.bufferData(buffer, data, usage);
return new GlBuffer(label, dsa, usage, size, buffer, null);
}
@Override
public GlBuffer.GlMappedView mapBuffer(DirectStateAccess dsa, GlBuffer buffer, long offset, long length, int flags) {
GlStateManager.clearGlErrors();
ByteBuffer byteBuffer = dsa.mapBufferRange(buffer.handle, offset, length, flags, buffer.usage());
if (byteBuffer == null) {
throw new IllegalStateException("Can't map buffer, opengl error " + GlStateManager._getError());
} else {
return new GlBuffer.GlMappedView(() -> dsa.unmapBuffer(buffer.handle, buffer.usage()), buffer, byteBuffer);
}
}
}
}引用的其他类
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/方法调用/构造调用/返回值 - 关联成员:
GlBuffer(), GlBuffer.GlMappedView(), GlMappedView()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
GlStateManager._getError(), GlStateManager.clearGlErrors()
- 引用位置: