minecraft-src/com/mojang/blaze3d/opengl/DirectStateAccess.java
2025-07-04 03:45:38 +03:00

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