diff --git a/fabric/src/main/java/com/noxcrew/noxesium/mixin/sodium/SodiumGlProgramMixin.java b/fabric/src/main/java/com/noxcrew/noxesium/mixin/sodium/SodiumGlProgramMixin.java
new file mode 100644
index 0000000..844181f
--- /dev/null
+++ b/fabric/src/main/java/com/noxcrew/noxesium/mixin/sodium/SodiumGlProgramMixin.java
@@ -0,0 +1,54 @@
+package com.noxcrew.noxesium.mixin.sodium;
+
+import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod;
+import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
+import com.noxcrew.noxesium.NoxesiumMod;
+import me.jellysquid.mods.sodium.client.gl.GlObject;
+import me.jellysquid.mods.sodium.client.gl.shader.GlProgram;
+import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniform;
+import me.jellysquid.mods.sodium.client.gl.shader.uniform.GlUniformBlock;
+import org.lwjgl.opengl.GL20C;
+import org.lwjgl.opengl.GL32C;
+import org.spongepowered.asm.mixin.Mixin;
+
+import java.util.function.IntFunction;
+
+/**
+ * Directly based on Sodium Core Shader Support.
+ */
+@Mixin(value = GlProgram.class, remap = false)
+public class SodiumGlProgramMixin extends GlObject {
+
+ @WrapMethod(method = "bindUniform")
+ private > U noxesium$bindUniform(String name, IntFunction factory, Operation original) {
+ var index = GL20C.glGetUniformLocation(this.handle(), name);
+ if (index < 0) {
+ var error = GL20C.glGetError();
+ if (error == GL20C.GL_INVALID_OPERATION) {
+ NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform: GL_INVALID_OPERATION");
+ } else if (error == GL20C.GL_INVALID_VALUE) {
+ NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform: GL_INVALID_VALUE");
+ } else {
+ NoxesiumMod.getInstance().getLogger().warn("Unknown error while binding uniform, code: {}", error);
+ }
+ }
+ return (U) factory.apply(index);
+ }
+
+ @WrapMethod(method = "bindUniformBlock")
+ private GlUniformBlock noxesium$bindUniformBlock(String name, int bindingPoint, Operation original) {
+ var index = GL32C.glGetUniformBlockIndex(this.handle(), name);
+ if (index < 0) {
+ var error = GL20C.glGetError();
+ if (error == GL20C.GL_INVALID_OPERATION) {
+ NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform block: GL_INVALID_OPERATION");
+ } else if (error == GL20C.GL_INVALID_VALUE) {
+ NoxesiumMod.getInstance().getLogger().warn("Error while binding uniform block: GL_INVALID_VALUE");
+ } else {
+ NoxesiumMod.getInstance().getLogger().warn("Unknown error while binding uniform block, code: {}", error);
+ }
+ }
+ GL32C.glUniformBlockBinding(this.handle(), index, bindingPoint);
+ return new GlUniformBlock(bindingPoint);
+ }
+}
diff --git a/fabric/src/main/resources/noxesium-sodium.mixins.json b/fabric/src/main/resources/noxesium-sodium.mixins.json
index 98eb86e..a299aef 100644
--- a/fabric/src/main/resources/noxesium-sodium.mixins.json
+++ b/fabric/src/main/resources/noxesium-sodium.mixins.json
@@ -4,6 +4,7 @@
"package": "com.noxcrew.noxesium.mixin.sodium",
"compatibilityLevel": "JAVA_17",
"client": [
+ "SodiumGlProgramMixin",
"SodiumOptionImplMixin",
"SodiumRenderSectionManagerMixin",
"SodiumShaderLoaderMixin",
diff --git a/gradle.properties b/gradle.properties
index 4b57e71..5a0bc39 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,7 +9,7 @@ loader_version=0.15.11
# Fabric API
fabric_version=0.100.1+1.21
# Mod Properties
-mod_version=2.1.3
+mod_version=2.1.4
# Mod dependencies
sodium = mc1.21-0.5.9