Spaces:
Build error
Build error
File size: 6,098 Bytes
d46f4a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
package com.mojang.blaze3d.pipeline;
import com.google.common.collect.ImmutableList;
import com.mojang.blaze3d.platform.GlStateManager;
import com.mojang.blaze3d.platform.TextureUtil;
import com.mojang.blaze3d.systems.RenderSystem;
import java.util.List;
import java.util.Objects;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
public class MainTarget extends RenderTarget {
public static final int DEFAULT_WIDTH = 854;
public static final int DEFAULT_HEIGHT = 480;
static final MainTarget.Dimension DEFAULT_DIMENSIONS = new MainTarget.Dimension(854, 480);
public MainTarget(int p_166137_, int p_166138_) {
super(true);
this.createFrameBuffer(p_166137_, p_166138_);
}
private void createFrameBuffer(int p_166142_, int p_166143_) {
MainTarget.Dimension maintarget$dimension = this.allocateAttachments(p_166142_, p_166143_);
this.frameBufferId = GlStateManager.glGenFramebuffers();
GlStateManager._glBindFramebuffer(36160, this.frameBufferId);
GlStateManager._bindTexture(this.colorTextureId);
GlStateManager._texParameter(3553, 10241, 9728);
GlStateManager._texParameter(3553, 10240, 9728);
GlStateManager._texParameter(3553, 10242, 33071);
GlStateManager._texParameter(3553, 10243, 33071);
GlStateManager._glFramebufferTexture2D(36160, 36064, 3553, this.colorTextureId, 0);
GlStateManager._bindTexture(this.depthBufferId);
GlStateManager._texParameter(3553, 34892, 0);
GlStateManager._texParameter(3553, 10241, 9728);
GlStateManager._texParameter(3553, 10240, 9728);
GlStateManager._texParameter(3553, 10242, 33071);
GlStateManager._texParameter(3553, 10243, 33071);
GlStateManager._glFramebufferTexture2D(36160, 36096, 3553, this.depthBufferId, 0);
GlStateManager._bindTexture(0);
this.viewWidth = maintarget$dimension.width;
this.viewHeight = maintarget$dimension.height;
this.width = maintarget$dimension.width;
this.height = maintarget$dimension.height;
this.checkStatus();
GlStateManager._glBindFramebuffer(36160, 0);
}
private MainTarget.Dimension allocateAttachments(int p_166147_, int p_166148_) {
RenderSystem.assertOnRenderThreadOrInit();
this.colorTextureId = TextureUtil.generateTextureId();
this.depthBufferId = TextureUtil.generateTextureId();
MainTarget.AttachmentState maintarget$attachmentstate = MainTarget.AttachmentState.NONE;
for (MainTarget.Dimension maintarget$dimension : MainTarget.Dimension.listWithFallback(p_166147_, p_166148_)) {
maintarget$attachmentstate = MainTarget.AttachmentState.NONE;
if (this.allocateColorAttachment(maintarget$dimension)) {
maintarget$attachmentstate = maintarget$attachmentstate.with(MainTarget.AttachmentState.COLOR);
}
if (this.allocateDepthAttachment(maintarget$dimension)) {
maintarget$attachmentstate = maintarget$attachmentstate.with(MainTarget.AttachmentState.DEPTH);
}
if (maintarget$attachmentstate == MainTarget.AttachmentState.COLOR_DEPTH) {
return maintarget$dimension;
}
}
throw new RuntimeException("Unrecoverable GL_OUT_OF_MEMORY (allocated attachments = " + maintarget$attachmentstate.name() + ")");
}
private boolean allocateColorAttachment(MainTarget.Dimension p_166140_) {
RenderSystem.assertOnRenderThreadOrInit();
GlStateManager._getError();
GlStateManager._bindTexture(this.colorTextureId);
GlStateManager._texImage2D(3553, 0, 32856, p_166140_.width, p_166140_.height, 0, 6408, 5121, null);
return GlStateManager._getError() != 1285;
}
private boolean allocateDepthAttachment(MainTarget.Dimension p_166145_) {
RenderSystem.assertOnRenderThreadOrInit();
GlStateManager._getError();
GlStateManager._bindTexture(this.depthBufferId);
GlStateManager._texImage2D(3553, 0, 6402, p_166145_.width, p_166145_.height, 0, 6402, 5126, null);
return GlStateManager._getError() != 1285;
}
@OnlyIn(Dist.CLIENT)
static enum AttachmentState {
NONE,
COLOR,
DEPTH,
COLOR_DEPTH;
private static final MainTarget.AttachmentState[] VALUES = values();
MainTarget.AttachmentState with(MainTarget.AttachmentState p_166164_) {
return VALUES[this.ordinal() | p_166164_.ordinal()];
}
}
@OnlyIn(Dist.CLIENT)
static class Dimension {
public final int width;
public final int height;
Dimension(int p_166171_, int p_166172_) {
this.width = p_166171_;
this.height = p_166172_;
}
static List<MainTarget.Dimension> listWithFallback(int p_166174_, int p_166175_) {
RenderSystem.assertOnRenderThreadOrInit();
int i = RenderSystem.maxSupportedTextureSize();
return p_166174_ > 0 && p_166174_ <= i && p_166175_ > 0 && p_166175_ <= i
? ImmutableList.of(new MainTarget.Dimension(p_166174_, p_166175_), MainTarget.DEFAULT_DIMENSIONS)
: ImmutableList.of(MainTarget.DEFAULT_DIMENSIONS);
}
@Override
public boolean equals(Object p_166177_) {
if (this == p_166177_) {
return true;
} else if (p_166177_ != null && this.getClass() == p_166177_.getClass()) {
MainTarget.Dimension maintarget$dimension = (MainTarget.Dimension)p_166177_;
return this.width == maintarget$dimension.width && this.height == maintarget$dimension.height;
} else {
return false;
}
}
@Override
public int hashCode() {
return Objects.hash(this.width, this.height);
}
@Override
public String toString() {
return this.width + "x" + this.height;
}
}
} |