DirectStateAccess.java

com.mojang.blaze3d.opengl.DirectStateAccess

信息

  • 全限定名:com.mojang.blaze3d.opengl.DirectStateAccess
  • 类型:public abstract class
  • 包:com.mojang.blaze3d.opengl
  • 源码路径:src/main/java/com/mojang/blaze3d/opengl/DirectStateAccess.java
  • 起始行号:L17
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • com.mojang.blaze3d.opengl.DirectStateAccess.Core

    • 类型: class
    • 修饰符: private static
    • 源码定位: L56
    • 说明:

      TODO

  • com.mojang.blaze3d.opengl.DirectStateAccess.Emulated

    • 类型: class
    • 修饰符: private static
    • 源码定位: L131
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

public static DirectStateAccess create(GLCapabilities capabilities, Set<String> enabledExtensions, GraphicsWorkarounds workarounds) @ L18

  • 方法名:create
  • 源码定位:L18
  • 返回类型:DirectStateAccess
  • 修饰符:public static

参数:

  • capabilities: GLCapabilities
  • enabledExtensions: Set
  • workarounds: GraphicsWorkarounds

说明:

TODO

abstract int createBuffer() @ L27

  • 方法名:createBuffer
  • 源码定位:L27
  • 返回类型:int
  • 修饰符:abstract

参数:

说明:

TODO

abstract void bufferData(int buffer, long size, int usage) @ L29

  • 方法名:bufferData
  • 源码定位:L29
  • 返回类型:void
  • 修饰符:abstract

参数:

  • buffer: int
  • size: long
  • usage: int

说明:

TODO

abstract void bufferData(int buffer, ByteBuffer data, int usage) @ L31

  • 方法名:bufferData
  • 源码定位:L31
  • 返回类型:void
  • 修饰符:abstract

参数:

  • buffer: int
  • data: ByteBuffer
  • usage: int

说明:

TODO

abstract void bufferSubData(int buffer, long offset, ByteBuffer data, int usage) @ L33

  • 方法名:bufferSubData
  • 源码定位:L33
  • 返回类型:void
  • 修饰符:abstract

参数:

  • buffer: int
  • offset: long
  • data: ByteBuffer
  • usage: int

说明:

TODO

abstract void bufferStorage(int buffer, long size, int usage) @ L35

  • 方法名:bufferStorage
  • 源码定位:L35
  • 返回类型:void
  • 修饰符:abstract

参数:

  • buffer: int
  • size: long
  • usage: int

说明:

TODO

abstract void bufferStorage(int buffer, ByteBuffer data, int usage) @ L37

  • 方法名:bufferStorage
  • 源码定位:L37
  • 返回类型:void
  • 修饰符:abstract

参数:

  • buffer: int
  • data: ByteBuffer
  • usage: int

说明:

TODO

abstract ByteBuffer mapBufferRange(int buffer, long offset, long length, int access, int usage) @ L39

  • 方法名:mapBufferRange
  • 源码定位:L39
  • 返回类型:ByteBuffer
  • 修饰符:abstract

参数:

  • buffer: int
  • offset: long
  • length: long
  • access: int
  • usage: int

说明:

TODO

abstract void unmapBuffer(int buffer, int usage) @ L41

  • 方法名:unmapBuffer
  • 源码定位:L41
  • 返回类型:void
  • 修饰符:abstract

参数:

  • buffer: int
  • usage: int

说明:

TODO

abstract int createFrameBufferObject() @ L43

  • 方法名:createFrameBufferObject
  • 源码定位:L43
  • 返回类型:int
  • 修饰符:abstract

参数:

说明:

TODO

abstract void bindFrameBufferTextures(int fbo, int color0, int depth, int mipLevel, int bindSlot) @ L45

  • 方法名:bindFrameBufferTextures
  • 源码定位:L45
  • 返回类型:void
  • 修饰符:abstract

参数:

  • fbo: int
  • color0: int
  • depth: int
  • mipLevel: int
  • bindSlot: int

说明:

TODO

abstract void blitFrameBuffers(int source, int dest, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter) @ L47

  • 方法名:blitFrameBuffers
  • 源码定位:L47
  • 返回类型:void
  • 修饰符:abstract

参数:

  • source: int
  • dest: int
  • srcX0: int
  • srcY0: int
  • srcX1: int
  • srcY1: int
  • dstX0: int
  • dstY0: int
  • dstX1: int
  • dstY1: int
  • mask: int
  • filter: int

说明:

TODO

abstract void flushMappedBufferRange(int handle, long offset, long length, int usage) @ L51

  • 方法名:flushMappedBufferRange
  • 源码定位:L51
  • 返回类型:void
  • 修饰符:abstract

参数:

  • handle: int
  • offset: long
  • length: long
  • usage: int

说明:

TODO

abstract void copyBufferSubData(int source, int target, long sourceOffset, long targetOffset, long length) @ L53

  • 方法名:copyBufferSubData
  • 源码定位:L53
  • 返回类型:void
  • 修饰符:abstract

参数:

  • source: int
  • target: int
  • sourceOffset: long
  • targetOffset: long
  • length: long

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public abstract class DirectStateAccess {
    public static DirectStateAccess create(GLCapabilities capabilities, Set<String> enabledExtensions, GraphicsWorkarounds workarounds) {
        if (capabilities.GL_ARB_direct_state_access && GlDevice.USE_GL_ARB_direct_state_access && !workarounds.isGlOnDx12()) {
            enabledExtensions.add("GL_ARB_direct_state_access");
            return new DirectStateAccess.Core();
        } else {
            return new DirectStateAccess.Emulated();
        }
    }
 
    abstract int createBuffer();
 
    abstract void bufferData(int buffer, long size, @GpuBuffer.Usage int usage);
 
    abstract void bufferData(int buffer, ByteBuffer data, @GpuBuffer.Usage int usage);
 
    abstract void bufferSubData(int buffer, long offset, ByteBuffer data, @GpuBuffer.Usage int usage);
 
    abstract void bufferStorage(int buffer, long size, @GpuBuffer.Usage int usage);
 
    abstract void bufferStorage(int buffer, ByteBuffer data, @GpuBuffer.Usage int usage);
 
    abstract @Nullable ByteBuffer mapBufferRange(int buffer, long offset, long length, int access, @GpuBuffer.Usage int usage);
 
    abstract void unmapBuffer(int buffer, @GpuBuffer.Usage int usage);
 
    abstract int createFrameBufferObject();
 
    abstract void bindFrameBufferTextures(int fbo, int color0, int depth, int mipLevel, int bindSlot);
 
    abstract void blitFrameBuffers(
        int source, int dest, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter
    );
 
    abstract void flushMappedBufferRange(final int handle, final long offset, final long length, @GpuBuffer.Usage final int usage);
 
    abstract void copyBufferSubData(int source, int target, long sourceOffset, long targetOffset, long length);
 
    @OnlyIn(Dist.CLIENT)
    private static class Core extends DirectStateAccess {
        @Override
        int createBuffer() {
            GlStateManager.incrementTrackedBuffers();
            return ARBDirectStateAccess.glCreateBuffers();
        }
 
        @Override
        void bufferData(int buffer, long size, @GpuBuffer.Usage int usage) {
            ARBDirectStateAccess.glNamedBufferData(buffer, size, GlConst.bufferUsageToGlEnum(usage));
        }
 
        @Override
        void bufferData(int buffer, ByteBuffer data, @GpuBuffer.Usage int usage) {
            ARBDirectStateAccess.glNamedBufferData(buffer, data, GlConst.bufferUsageToGlEnum(usage));
        }
 
        @Override
        void bufferSubData(int buffer, long offset, ByteBuffer data, @GpuBuffer.Usage int usage) {
            ARBDirectStateAccess.glNamedBufferSubData(buffer, offset, data);
        }
 
        @Override
        void bufferStorage(int buffer, long size, @GpuBuffer.Usage int usage) {
            ARBDirectStateAccess.glNamedBufferStorage(buffer, size, GlConst.bufferUsageToGlFlag(usage));
        }
 
        @Override
        void bufferStorage(int buffer, ByteBuffer data, @GpuBuffer.Usage int usage) {
            ARBDirectStateAccess.glNamedBufferStorage(buffer, data, GlConst.bufferUsageToGlFlag(usage));
        }
 
        @Override
        @Nullable ByteBuffer mapBufferRange(int buffer, long offset, long length, int flags, @GpuBuffer.Usage int usage) {
            return ARBDirectStateAccess.glMapNamedBufferRange(buffer, offset, length, flags);
        }
 
        @Override
        void unmapBuffer(int buffer, int usage) {
            ARBDirectStateAccess.glUnmapNamedBuffer(buffer);
        }
 
        @Override
        public int createFrameBufferObject() {
            return ARBDirectStateAccess.glCreateFramebuffers();
        }
 
        @Override
        public void bindFrameBufferTextures(int fbo, int color0, int depth, int mipLevel, @GpuBuffer.Usage int bindSlot) {
            ARBDirectStateAccess.glNamedFramebufferTexture(fbo, 36064, color0, mipLevel);
            ARBDirectStateAccess.glNamedFramebufferTexture(fbo, 36096, depth, mipLevel);
            if (bindSlot != 0) {
                GlStateManager._glBindFramebuffer(bindSlot, fbo);
            }
        }
 
        @Override
        public void blitFrameBuffers(
            int source, int dest, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter
        ) {
            ARBDirectStateAccess.glBlitNamedFramebuffer(source, dest, srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
        }
 
        @Override
        void flushMappedBufferRange(int handle, long offset, long length, @GpuBuffer.Usage int usage) {
            ARBDirectStateAccess.glFlushMappedNamedBufferRange(handle, offset, length);
        }
 
        @Override
        void copyBufferSubData(int source, int target, long sourceOffset, long targetOffset, long length) {
            ARBDirectStateAccess.glCopyNamedBufferSubData(source, target, sourceOffset, targetOffset, length);
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    private static class Emulated extends DirectStateAccess {
        private int selectBufferBindTarget(@GpuBuffer.Usage int usage) {
            if ((usage & 32) != 0) {
                return 34962;
            } else if ((usage & 64) != 0) {
                return 34963;
            } else {
                return (usage & 128) != 0 ? 35345 : 36663;
            }
        }
 
        @Override
        int createBuffer() {
            return GlStateManager._glGenBuffers();
        }
 
        @Override
        void bufferData(int buffer, long size, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            GlStateManager._glBufferData(target, size, GlConst.bufferUsageToGlEnum(usage));
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        void bufferData(int buffer, ByteBuffer data, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            GlStateManager._glBufferData(target, data, GlConst.bufferUsageToGlEnum(usage));
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        void bufferSubData(int buffer, long offset, ByteBuffer data, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            GlStateManager._glBufferSubData(target, offset, data);
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        void bufferStorage(int buffer, long size, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            ARBBufferStorage.glBufferStorage(target, size, GlConst.bufferUsageToGlFlag(usage));
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        void bufferStorage(int buffer, ByteBuffer data, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            ARBBufferStorage.glBufferStorage(target, data, GlConst.bufferUsageToGlFlag(usage));
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        @Nullable ByteBuffer mapBufferRange(int buffer, long offset, long length, int access, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            ByteBuffer byteBuffer = GlStateManager._glMapBufferRange(target, offset, length, access);
            GlStateManager._glBindBuffer(target, 0);
            return byteBuffer;
        }
 
        @Override
        void unmapBuffer(int buffer, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            GlStateManager._glUnmapBuffer(target);
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        void flushMappedBufferRange(int buffer, long offset, long length, @GpuBuffer.Usage int usage) {
            int target = this.selectBufferBindTarget(usage);
            GlStateManager._glBindBuffer(target, buffer);
            GL30.glFlushMappedBufferRange(target, offset, length);
            GlStateManager._glBindBuffer(target, 0);
        }
 
        @Override
        void copyBufferSubData(int source, int target, long sourceOffset, long targetOffset, long length) {
            GlStateManager._glBindBuffer(36662, source);
            GlStateManager._glBindBuffer(36663, target);
            GL31.glCopyBufferSubData(36662, 36663, sourceOffset, targetOffset, length);
            GlStateManager._glBindBuffer(36662, 0);
            GlStateManager._glBindBuffer(36663, 0);
        }
 
        @Override
        public int createFrameBufferObject() {
            return GlStateManager.glGenFramebuffers();
        }
 
        @Override
        public void bindFrameBufferTextures(int fbo, int color0, int depth, int mipLevel, int bindSlot) {
            int tempBindSlot = bindSlot == 0 ? '\u8ca9' : bindSlot;
            int oldFbo = GlStateManager.getFrameBuffer(tempBindSlot);
            GlStateManager._glBindFramebuffer(tempBindSlot, fbo);
            GlStateManager._glFramebufferTexture2D(tempBindSlot, 36064, 3553, color0, mipLevel);
            GlStateManager._glFramebufferTexture2D(tempBindSlot, 36096, 3553, depth, mipLevel);
            if (bindSlot == 0) {
                GlStateManager._glBindFramebuffer(tempBindSlot, oldFbo);
            }
        }
 
        @Override
        public void blitFrameBuffers(
            int source, int dest, int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, int mask, int filter
        ) {
            int oldRead = GlStateManager.getFrameBuffer(36008);
            int oldDraw = GlStateManager.getFrameBuffer(36009);
            GlStateManager._glBindFramebuffer(36008, source);
            GlStateManager._glBindFramebuffer(36009, dest);
            GlStateManager._glBlitFrameBuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
            GlStateManager._glBindFramebuffer(36008, oldRead);
            GlStateManager._glBindFramebuffer(36009, oldDraw);
        }
    }
}

引用的其他类

  • GraphicsWorkarounds

    • 引用位置: 参数
  • GlConst

    • 引用位置: 方法调用
    • 关联成员: GlConst.bufferUsageToGlEnum(), GlConst.bufferUsageToGlFlag()
  • GlStateManager

    • 引用位置: 方法调用
    • 关联成员: GlStateManager._glBindBuffer(), GlStateManager._glBindFramebuffer(), GlStateManager._glBlitFrameBuffer(), GlStateManager._glBufferData(), GlStateManager._glBufferSubData(), GlStateManager._glFramebufferTexture2D(), GlStateManager._glGenBuffers(), GlStateManager._glMapBufferRange(), GlStateManager._glUnmapBuffer(), GlStateManager.getFrameBuffer(), GlStateManager.glGenFramebuffers(), GlStateManager.incrementTrackedBuffers()