Mesa depth stencil bug bypass
This commit is contained in:
@@ -4,6 +4,8 @@ import me.cortex.voxy.client.core.gl.shader.ShaderType;
|
|||||||
import org.lwjgl.opengl.GL;
|
import org.lwjgl.opengl.GL;
|
||||||
import org.lwjgl.opengl.GL20C;
|
import org.lwjgl.opengl.GL20C;
|
||||||
|
|
||||||
|
import static org.lwjgl.opengl.GL11.GL_VENDOR;
|
||||||
|
import static org.lwjgl.opengl.GL11.glGetString;
|
||||||
import static org.lwjgl.opengl.GL32.glGetInteger64;
|
import static org.lwjgl.opengl.GL32.glGetInteger64;
|
||||||
import static org.lwjgl.opengl.GL43C.GL_MAX_SHADER_STORAGE_BLOCK_SIZE;
|
import static org.lwjgl.opengl.GL43C.GL_MAX_SHADER_STORAGE_BLOCK_SIZE;
|
||||||
|
|
||||||
@@ -14,6 +16,7 @@ public class Capabilities {
|
|||||||
public final boolean meshShaders;
|
public final boolean meshShaders;
|
||||||
public final boolean INT64_t;
|
public final boolean INT64_t;
|
||||||
public final long ssboMaxSize;
|
public final long ssboMaxSize;
|
||||||
|
public final boolean isMesa;
|
||||||
public Capabilities() {
|
public Capabilities() {
|
||||||
var cap = GL.getCapabilities();
|
var cap = GL.getCapabilities();
|
||||||
this.meshShaders = cap.GL_NV_mesh_shader && cap.GL_NV_representative_fragment_test;
|
this.meshShaders = cap.GL_NV_mesh_shader && cap.GL_NV_representative_fragment_test;
|
||||||
@@ -29,6 +32,8 @@ public class Capabilities {
|
|||||||
""");
|
""");
|
||||||
|
|
||||||
this.ssboMaxSize = glGetInteger64(GL_MAX_SHADER_STORAGE_BLOCK_SIZE);
|
this.ssboMaxSize = glGetInteger64(GL_MAX_SHADER_STORAGE_BLOCK_SIZE);
|
||||||
|
|
||||||
|
this.isMesa = "Mesa".equalsIgnoreCase(glGetString(GL_VENDOR));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void init() {
|
public static void init() {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
|
|||||||
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
|
import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
|
||||||
import it.unimi.dsi.fastutil.objects.ObjectSet;
|
import it.unimi.dsi.fastutil.objects.ObjectSet;
|
||||||
|
import me.cortex.voxy.client.core.gl.Capabilities;
|
||||||
import me.cortex.voxy.client.core.rendering.util.RawDownloadStream;
|
import me.cortex.voxy.client.core.rendering.util.RawDownloadStream;
|
||||||
import me.cortex.voxy.client.core.rendering.util.UploadStream;
|
import me.cortex.voxy.client.core.rendering.util.UploadStream;
|
||||||
import me.cortex.voxy.common.Logger;
|
import me.cortex.voxy.common.Logger;
|
||||||
@@ -261,6 +262,12 @@ public class ModelFactory {
|
|||||||
|
|
||||||
int checkMode = blockRenderLayer==RenderLayer.getSolid()?TextureUtils.WRITE_CHECK_STENCIL:TextureUtils.WRITE_CHECK_ALPHA;
|
int checkMode = blockRenderLayer==RenderLayer.getSolid()?TextureUtils.WRITE_CHECK_STENCIL:TextureUtils.WRITE_CHECK_ALPHA;
|
||||||
|
|
||||||
|
if (Capabilities.INSTANCE.isMesa) {
|
||||||
|
//Mesa does not work with GL_DEPTH_STENCIL_TEXTURE_MODE GL_STENCIL_INDEX
|
||||||
|
// the sampler in the compute shader always reads zero even when stencil is guarenteed not to be zero
|
||||||
|
// (e.g. clearing with stencil 10)
|
||||||
|
checkMode = TextureUtils.WRITE_CHECK_ALPHA;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -80,11 +80,12 @@ public class ModelTextureBakery {
|
|||||||
this.height = height;
|
this.height = height;
|
||||||
this.colourTex = new GlTexture().store(GL_RGBA8, 1, width, height).name("ModelBakeryColour");
|
this.colourTex = new GlTexture().store(GL_RGBA8, 1, width, height).name("ModelBakeryColour");
|
||||||
this.depthTex = new GlTexture().store(GL_DEPTH24_STENCIL8, 1, width, height).name("ModelBakeryDepth");
|
this.depthTex = new GlTexture().store(GL_DEPTH24_STENCIL8, 1, width, height).name("ModelBakeryDepth");
|
||||||
|
glTextureParameteri(this.depthTex.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
|
||||||
this.depthTexView = this.depthTex.createView();
|
this.depthTexView = this.depthTex.createView();
|
||||||
|
glTextureParameteri(this.depthTex.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
|
||||||
|
|
||||||
this.framebuffer = new GlFramebuffer().bind(GL_COLOR_ATTACHMENT0, this.colourTex).bind(GL_DEPTH_STENCIL_ATTACHMENT, this.depthTex).verify().name("ModelFramebuffer");
|
this.framebuffer = new GlFramebuffer().bind(GL_COLOR_ATTACHMENT0, this.colourTex).bind(GL_DEPTH_STENCIL_ATTACHMENT, this.depthTex).verify().name("ModelFramebuffer");
|
||||||
|
|
||||||
glTextureParameteri(this.depthTex.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_DEPTH_COMPONENT);
|
|
||||||
glTextureParameteri(this.depthTexView.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
|
glTextureParameteri(this.depthTexView.id, GL_DEPTH_STENCIL_TEXTURE_MODE, GL_STENCIL_INDEX);
|
||||||
|
|
||||||
this.copyOutShader = Shader.make()
|
this.copyOutShader = Shader.make()
|
||||||
@@ -159,6 +160,7 @@ public class ModelTextureBakery {
|
|||||||
|
|
||||||
glClearColor(0,0,0,0);
|
glClearColor(0,0,0,0);
|
||||||
glClearDepth(1);
|
glClearDepth(1);
|
||||||
|
glClearStencil(0);
|
||||||
glBindFramebuffer(GL_FRAMEBUFFER, this.framebuffer.id);
|
glBindFramebuffer(GL_FRAMEBUFFER, this.framebuffer.id);
|
||||||
|
|
||||||
glEnable(GL_STENCIL_TEST);
|
glEnable(GL_STENCIL_TEST);
|
||||||
@@ -332,6 +334,8 @@ public class ModelTextureBakery {
|
|||||||
this.emitToStream(streamBuffer, streamOffset);
|
this.emitToStream(streamBuffer, streamOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: FIXME: Mesa is broken when trying to read from a sampler of GL_STENCIL_INDEX
|
||||||
|
// it seems to just ignore the value set in GL_DEPTH_STENCIL_TEXTURE_MODE
|
||||||
private void emitToStream(int streamBuffer, int streamOffset) {
|
private void emitToStream(int streamBuffer, int streamOffset) {
|
||||||
if (streamOffset%4 != 0) {
|
if (streamOffset%4 != 0) {
|
||||||
throw new IllegalArgumentException();
|
throw new IllegalArgumentException();
|
||||||
@@ -339,10 +343,13 @@ public class ModelTextureBakery {
|
|||||||
this.copyOutShader.bind();
|
this.copyOutShader.bind();
|
||||||
glActiveTexture(GL_TEXTURE0);
|
glActiveTexture(GL_TEXTURE0);
|
||||||
GL11C.glBindTexture(GL11.GL_TEXTURE_2D, this.colourTex.id);
|
GL11C.glBindTexture(GL11.GL_TEXTURE_2D, this.colourTex.id);
|
||||||
|
glBindSampler(0, 0);
|
||||||
glActiveTexture(GL_TEXTURE1);
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glBindTexture(GL11.GL_TEXTURE_2D, this.depthTex.id);
|
glBindTexture(GL11.GL_TEXTURE_2D, this.depthTex.id);
|
||||||
|
glBindSampler(1, 0);
|
||||||
glActiveTexture(GL_TEXTURE2);
|
glActiveTexture(GL_TEXTURE2);
|
||||||
glBindTexture(GL11.GL_TEXTURE_2D, this.depthTexView.id);
|
glBindTexture(GL11.GL_TEXTURE_2D, this.depthTexView.id);
|
||||||
|
glBindSampler(2, 0);
|
||||||
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, streamBuffer);
|
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, streamBuffer);
|
||||||
glUniform1ui(4, streamOffset/4);
|
glUniform1ui(4, streamOffset/4);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user