package com.mojang.blaze3d.opengl; import java.util.Set; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import org.lwjgl.opengl.ARBDirectStateAccess; import org.lwjgl.opengl.GLCapabilities; @Environment(EnvType.CLIENT) public abstract class DirectStateAccess { public static DirectStateAccess create(GLCapabilities capabilities, Set enabledExtensions) { if (capabilities.GL_ARB_direct_state_access && GlDevice.USE_GL_ARB_direct_state_access) { enabledExtensions.add("GL_ARB_direct_state_access"); return new DirectStateAccess.Core(); } else { return new DirectStateAccess.Emulated(); } } abstract int createFrameBufferObject(); abstract void bindFrameBufferTextures(int frameBuffer, int colorTexture, int depthTexture, int level, int target); abstract void blitFrameBuffers( int readFrameBuffer, int drawFrameBuffer, int srcX0, int srcY0, int srcX1, int srcY1, int destX0, int destY0, int destX1, int destY1, int mask, int filter ); @Environment(EnvType.CLIENT) static class Core extends DirectStateAccess { @Override public int createFrameBufferObject() { return ARBDirectStateAccess.glCreateFramebuffers(); } @Override public void bindFrameBufferTextures(int frameBuffer, int colorTexture, int depthTexture, int level, int target) { ARBDirectStateAccess.glNamedFramebufferTexture(frameBuffer, 36064, colorTexture, level); ARBDirectStateAccess.glNamedFramebufferTexture(frameBuffer, 36096, depthTexture, level); if (target != 0) { GlStateManager._glBindFramebuffer(target, frameBuffer); } } @Override public void blitFrameBuffers( int readFrameBuffer, int drawFrameBuffer, int srcX0, int srcY0, int srcX1, int srcY1, int destX0, int destY0, int destX1, int destY1, int mask, int filter ) { ARBDirectStateAccess.glBlitNamedFramebuffer(readFrameBuffer, drawFrameBuffer, srcX0, srcY0, srcX1, srcY1, destX0, destY0, destX1, destY1, mask, filter); } } @Environment(EnvType.CLIENT) static class Emulated extends DirectStateAccess { @Override public int createFrameBufferObject() { return GlStateManager.glGenFramebuffers(); } @Override public void bindFrameBufferTextures(int frameBuffer, int colorTexture, int depthTexture, int level, int target) { int i = target == 0 ? '販' : target; int j = GlStateManager.getFrameBuffer(i); GlStateManager._glBindFramebuffer(i, frameBuffer); GlStateManager._glFramebufferTexture2D(i, 36064, 3553, colorTexture, level); GlStateManager._glFramebufferTexture2D(i, 36096, 3553, depthTexture, level); if (target == 0) { GlStateManager._glBindFramebuffer(i, j); } } @Override public void blitFrameBuffers( int readFrameBuffer, int drawFrameBuffer, int srcX0, int srcY0, int srcX1, int srcY1, int destX0, int destY0, int destX1, int destY1, int mask, int filter ) { int i = GlStateManager.getFrameBuffer(36008); int j = GlStateManager.getFrameBuffer(36009); GlStateManager._glBindFramebuffer(36008, readFrameBuffer); GlStateManager._glBindFramebuffer(36009, drawFrameBuffer); GlStateManager._glBlitFrameBuffer(srcX0, srcY0, srcX1, srcY1, destX0, destY0, destX1, destY1, mask, filter); GlStateManager._glBindFramebuffer(36008, i); GlStateManager._glBindFramebuffer(36009, j); } } }