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);
            }
        }
    }
}

引用的其他类

  • DirectStateAccess

    • 引用位置: 参数
  • GlBuffer

    • 引用位置: 参数/方法调用/构造调用/返回值
    • 关联成员: GlBuffer(), GlBuffer.GlMappedView(), GlMappedView()
  • GlStateManager

    • 引用位置: 方法调用
    • 关联成员: GlStateManager._getError(), GlStateManager.clearGlErrors()