84 lines
3.2 KiB
Java
84 lines
3.2 KiB
Java
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<String> 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);
|
|
}
|
|
}
|
|
}
|