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