diff --git a/src/main/java/me/cortex/voxy/client/core/gl/Capabilities.java b/src/main/java/me/cortex/voxy/client/core/gl/Capabilities.java index 2c0d08c6..9ed8d2b3 100644 --- a/src/main/java/me/cortex/voxy/client/core/gl/Capabilities.java +++ b/src/main/java/me/cortex/voxy/client/core/gl/Capabilities.java @@ -26,6 +26,7 @@ public class Capabilities { public final boolean isIntel; public final boolean subgroup; public final boolean sparseBuffer; + public final boolean isNvidia; public Capabilities() { var cap = GL.getCapabilities(); @@ -63,6 +64,7 @@ public class Capabilities { this.isMesa = glGetString(GL_VERSION).toLowerCase().contains("mesa"); this.isIntel = glGetString(GL_VENDOR).toLowerCase().contains("intel"); + this.isNvidia = glGetString(GL_VENDOR).toLowerCase().contains("nvidia"); if (this.canQueryGpuMemory) { this.totalDedicatedMemory = glGetInteger64(GL_GPU_MEMORY_INFO_DEDICATED_VIDMEM_NVX)*1024;//Since its in Kb diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/section/geometry/BasicSectionGeometryData.java b/src/main/java/me/cortex/voxy/client/core/rendering/section/geometry/BasicSectionGeometryData.java index 41847ca2..2b5b3cfb 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/section/geometry/BasicSectionGeometryData.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/section/geometry/BasicSectionGeometryData.java @@ -3,10 +3,12 @@ package me.cortex.voxy.client.core.rendering.section.geometry; import me.cortex.voxy.client.core.gl.Capabilities; import me.cortex.voxy.client.core.gl.GlBuffer; import me.cortex.voxy.common.Logger; +import me.cortex.voxy.common.util.ThreadUtils; -import static org.lwjgl.opengl.ARBSparseBuffer.GL_SPARSE_STORAGE_BIT_ARB; -import static org.lwjgl.opengl.ARBSparseBuffer.glNamedBufferPageCommitmentARB; +import static org.lwjgl.opengl.ARBSparseBuffer.*; import static org.lwjgl.opengl.GL11C.*; +import static org.lwjgl.opengl.GL15C.GL_ARRAY_BUFFER; +import static org.lwjgl.opengl.GL15C.glBindBuffer; public class BasicSectionGeometryData implements IGeometryData { public static final int SECTION_METADATA_SIZE = 32; @@ -31,14 +33,23 @@ public class BasicSectionGeometryData implements IGeometryData { Logger.info(msg); Logger.info("if your game crashes/exits here without any other log message, try manually decreasing the geometry capacity"); glGetError();//Clear any errors - var buffer = new GlBuffer(geometryCapacity); + GlBuffer buffer = null; + if (!(Capabilities.INSTANCE.isNvidia && ThreadUtils.isWindows)) { + buffer = new GlBuffer(geometryCapacity);//Only do this if we are not on nvidia + } else { + Logger.info("Running on windows nvidia, using workaround sparse buffer allocation"); + } int error = glGetError(); - if (error != GL_NO_ERROR) { - if (error == GL_OUT_OF_MEMORY && Capabilities.INSTANCE.sparseBuffer) { - Logger.error("Failed to allocate geometry buffer, attempting workaround with sparse buffers"); - buffer.free(); + if (error != GL_NO_ERROR || buffer == null) { + if ((buffer == null || error == GL_OUT_OF_MEMORY) && Capabilities.INSTANCE.sparseBuffer) { + if (buffer != null) { + Logger.error("Failed to allocate geometry buffer, attempting workaround with sparse buffers"); + buffer.free(); + } buffer = new GlBuffer(geometryCapacity, GL_SPARSE_STORAGE_BIT_ARB); - glNamedBufferPageCommitmentARB(buffer.id, 0, geometryCapacity, true); + glBindBuffer(GL_ARRAY_BUFFER, buffer.id); + glBufferPageCommitmentARB(GL_ARRAY_BUFFER, 0, geometryCapacity, true); + glBindBuffer(GL_ARRAY_BUFFER, 0); buffer.zero(); error = glGetError(); if (error != GL_NO_ERROR) {