Skip to content

Commit b4b36b8

Browse files
committed
opengl: option to automatically assert for no errors
1 parent b82eb41 commit b4b36b8

File tree

12 files changed

+91
-35
lines changed

12 files changed

+91
-35
lines changed

src/main/java/de/bixilon/minosoft/gui/rendering/gui/gui/GUIMeshElement.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import de.bixilon.minosoft.gui.rendering.input.count.MouseClickCounter
2828
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
2929
import de.bixilon.minosoft.gui.rendering.renderer.drawable.BaseDrawable
3030
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
31-
import de.bixilon.minosoft.gui.rendering.system.opengl.MemoryLeakException
31+
import de.bixilon.minosoft.gui.rendering.system.opengl.error.MemoryLeakException
3232
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
3333
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
3434
import de.bixilon.minosoft.util.Initializable

src/main/java/de/bixilon/minosoft/gui/rendering/system/base/RenderSystem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ interface RenderSystem {
166166
}
167167
}
168168

169-
fun reportErrors() {
169+
fun assertErrors() {
170170
val errors = getErrors()
171171
if (errors.isEmpty()) return
172172
throw Exception(errors.first().toString())

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLNativeShader.kt

Lines changed: 25 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import de.bixilon.minosoft.gui.rendering.exceptions.ShaderLoadingException
2929
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.UniformBuffer
3030
import de.bixilon.minosoft.gui.rendering.system.base.shader.NativeShader
3131
import de.bixilon.minosoft.gui.rendering.system.base.shader.code.glsl.GLSLShaderCode
32+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
3233
import de.bixilon.minosoft.util.logging.Log
3334
import de.bixilon.minosoft.util.logging.LogLevels
3435
import de.bixilon.minosoft.util.logging.LogMessageType
@@ -62,17 +63,17 @@ class OpenGLNativeShader(
6263
code.defines[hack.name] = ""
6364
}
6465

65-
val program = glCreateShader(type.native)
66+
val program = gl { glCreateShader(type.native) }
6667
if (program.toLong() == MemoryUtil.NULL) {
6768
throw ShaderLoadingException()
6869
}
6970

7071
val glsl = code.code
71-
glShaderSource(program, glsl)
72+
gl { glShaderSource(program, glsl) }
7273

73-
glCompileShader(program)
74+
gl { glCompileShader(program) }
7475

75-
if (glGetShaderi(program, GL_COMPILE_STATUS) == GL_FALSE) {
76+
if (gl { glGetShaderi(program, GL_COMPILE_STATUS) } == GL_FALSE) {
7677
throw ShaderLoadingException("Can not load shader: $file:\n" + glGetShaderInfoLog(program), glsl)
7778
}
7879

@@ -84,7 +85,7 @@ class OpenGLNativeShader(
8485
if (geometryCode != null) {
8586
defines["HAS_GEOMETRY_SHADER"] = " "
8687
}
87-
handler = glCreateProgram()
88+
handler = gl { glCreateProgram() }
8889

8990
if (handler.toLong() == MemoryUtil.NULL) {
9091
throw ShaderLoadingException()
@@ -100,25 +101,25 @@ class OpenGLNativeShader(
100101
programs += load(fragment, ShaderType.FRAGMENT, null)
101102

102103
for (program in programs) {
103-
glAttachShader(handler, program)
104+
gl { glAttachShader(handler, program) }
104105
}
105106

106-
glLinkProgram(handler)
107+
gl { glLinkProgram(handler) }
107108

108-
glValidateProgram(handler)
109+
gl { glValidateProgram(handler) }
109110

110-
if (glGetProgrami(handler, GL_LINK_STATUS) == GL_FALSE) {
111+
if (gl { glGetProgrami(handler, GL_LINK_STATUS) } == GL_FALSE) {
111112
throw ShaderLinkingException("Can not link shaders: $vertex with $geometry with ${fragment}: \n ${glGetProgramInfoLog(handler)}")
112113
}
113114
for (program in programs) {
114-
glDeleteShader(program)
115+
gl { glDeleteShader(program) }
115116
}
116117
loaded = true
117118
}
118119

119120
override fun unload() {
120121
check(loaded) { "Not loaded!" }
121-
glDeleteProgram(this.handler)
122+
gl { glDeleteProgram(this.handler) }
122123
loaded = false
123124
this.handler = -1
124125
}
@@ -131,7 +132,7 @@ class OpenGLNativeShader(
131132

132133
private fun getUniformLocation(uniform: String): Int {
133134
val location = uniformLocations.getOrPut(uniform) {
134-
val location = glGetUniformLocation(handler, uniform)
135+
val location = gl { glGetUniformLocation(handler, uniform) }
135136
if (location < 0) {
136137
val error = "No uniform named $uniform in $this, maybe you use something that has been optimized out? Check your shader code!"
137138
if (!context.profile.advanced.allowUniformErrors) {
@@ -145,62 +146,62 @@ class OpenGLNativeShader(
145146
}
146147

147148
override fun setFloat(uniform: String, value: Float) {
148-
glUniform1f(getUniformLocation(uniform), value)
149+
gl { glUniform1f(getUniformLocation(uniform), value) }
149150
}
150151

151152
override fun setInt(uniform: String, value: Int) {
152-
glUniform1i(getUniformLocation(uniform), value)
153+
gl { glUniform1i(getUniformLocation(uniform), value) }
153154
}
154155

155156
override fun setUInt(uniform: String, value: Int) {
156-
glUniform1ui(getUniformLocation(uniform), value)
157+
gl { glUniform1ui(getUniformLocation(uniform), value) }
157158
}
158159

159160
override fun setBoolean(uniform: String, boolean: Boolean) {
160161
setInt(uniform, if (boolean) 1 else 0)
161162
}
162163

163164
override fun setMat4f(uniform: String, mat4: Mat4f) {
164-
glUniformMatrix4fv(getUniformLocation(uniform), false, mat4._0.array)
165+
gl { glUniformMatrix4fv(getUniformLocation(uniform), false, mat4._0.array) }
165166
}
166167

167168
override fun setVec2f(uniform: String, vec2: Vec2f) {
168-
glUniform2f(getUniformLocation(uniform), vec2.x, vec2.y)
169+
gl { glUniform2f(getUniformLocation(uniform), vec2.x, vec2.y) }
169170
}
170171

171172
override fun setVec3f(uniform: String, vec3: Vec3f) {
172-
glUniform3f(getUniformLocation(uniform), vec3.x, vec3.y, vec3.z)
173+
gl { glUniform3f(getUniformLocation(uniform), vec3.x, vec3.y, vec3.z) }
173174
}
174175

175176
override fun setVec4f(uniform: String, vec4: Vec4f) {
176-
glUniform4f(getUniformLocation(uniform), vec4.x, vec4.y, vec4.z, vec4.w)
177+
gl { glUniform4f(getUniformLocation(uniform), vec4.x, vec4.y, vec4.z, vec4.w) }
177178
}
178179

179180
override fun setRGBColor(uniform: String, color: RGBColor) {
180181
setRGBAColor(uniform, color.rgba())
181182
}
182183

183184
override fun setRGBAColor(uniform: String, color: RGBAColor) {
184-
glUniform4f(getUniformLocation(uniform), color.redf, color.greenf, color.bluef, color.alphaf)
185+
gl { glUniform4f(getUniformLocation(uniform), color.redf, color.greenf, color.bluef, color.alphaf) }
185186
}
186187

187188
override fun setTexture(uniform: String, textureId: Int) {
188-
glUniform1i(getUniformLocation(uniform), textureId)
189+
gl { glUniform1i(getUniformLocation(uniform), textureId) }
189190
}
190191

191192
override fun setUniformBuffer(uniform: String, buffer: UniformBuffer) {
192193
val index = uniformLocations.getOrPut(uniform) {
193-
val index = glGetUniformBlockIndex(handler, uniform)
194+
val index = gl { glGetUniformBlockIndex(handler, uniform) }
194195
if (index < 0) {
195196
throw IllegalArgumentException("No uniform buffer called $uniform")
196197
}
197198
return@getOrPut index
198199
}
199-
glUniformBlockBinding(handler, index, buffer.bindingIndex)
200+
gl { glUniformBlockBinding(handler, index, buffer.bindingIndex) }
200201
}
201202

202203
fun unsafeUse() {
203-
glUseProgram(handler)
204+
gl { glUseProgram(handler) }
204205
}
205206

206207
override val log: String
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Minosoft
3+
* Copyright (C) 2020-2025 Moritz Zwerger
4+
*
5+
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
6+
*
7+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
8+
*
9+
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
10+
*
11+
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
12+
*/
13+
14+
package de.bixilon.minosoft.gui.rendering.system.opengl
15+
16+
object OpenGLOptions {
17+
const val ASSERT_THREAD = false
18+
const val CHECK_ERRORS_BEFORE_CALL = false
19+
const val CHECK_ERRORS_AFTER_CALL = false
20+
}

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLRenderSystem.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import de.bixilon.minosoft.data.registries.identified.ResourceLocation
1818
import de.bixilon.minosoft.data.text.formatting.color.Colors
1919
import de.bixilon.minosoft.data.text.formatting.color.RGBAColor
2020
import de.bixilon.minosoft.gui.rendering.RenderContext
21+
import de.bixilon.minosoft.gui.rendering.Rendering
2122
import de.bixilon.minosoft.gui.rendering.shader.Shader
2223
import de.bixilon.minosoft.gui.rendering.system.base.*
2324
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
@@ -31,6 +32,8 @@ import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.OpenGLFrameb
3132
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.uniform.FloatOpenGLUniformBuffer
3233
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.uniform.IntOpenGLUniformBuffer
3334
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.vertex.FloatOpenGLVertexBuffer
35+
import de.bixilon.minosoft.gui.rendering.system.opengl.error.OpenGLError
36+
import de.bixilon.minosoft.gui.rendering.system.opengl.error.OpenGLException
3437
import de.bixilon.minosoft.gui.rendering.system.opengl.texture.OpenGLTextureManager
3538
import de.bixilon.minosoft.gui.rendering.system.opengl.vendor.OpenGLVendor
3639
import de.bixilon.minosoft.gui.rendering.util.mesh.MeshOrder
@@ -408,5 +411,21 @@ class OpenGLRenderSystem(
408411
else -> throw IllegalArgumentException("OpenGL does not support integrated buffer type: $this")
409412
}
410413
}
414+
415+
inline fun <T> gl(runnable: () -> T): T {
416+
if (OpenGLOptions.ASSERT_THREAD && Rendering.currentContext == null) {
417+
throw IllegalStateException("No open gl context!")
418+
}
419+
if (OpenGLOptions.CHECK_ERRORS_BEFORE_CALL) {
420+
val error = glGetError()
421+
if (error != GL_NO_ERROR) throw OpenGLException(OpenGLError(error))
422+
}
423+
val result = runnable.invoke()
424+
if (OpenGLOptions.CHECK_ERRORS_AFTER_CALL) {
425+
val error = glGetError()
426+
if (error != GL_NO_ERROR) throw OpenGLException(OpenGLError(error))
427+
}
428+
return result
429+
}
411430
}
412431
}

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/OpenGLRenderableBuffer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBuffer
1818
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferDrawTypes
1919
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferStates
2020
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferTypes
21-
import de.bixilon.minosoft.gui.rendering.system.opengl.MemoryLeakException
21+
import de.bixilon.minosoft.gui.rendering.system.opengl.error.MemoryLeakException
2222
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
2323
import org.lwjgl.opengl.GL15.*
2424
import org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/frame/OpenGLFramebuffer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import de.bixilon.kmath.vec.vec2.i.Vec2i
1717
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.Framebuffer
1818
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.FramebufferState
1919
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.RenderbufferModes
20-
import de.bixilon.minosoft.gui.rendering.system.opengl.MemoryLeakException
20+
import de.bixilon.minosoft.gui.rendering.system.opengl.error.MemoryLeakException
2121
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
2222
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture.OpenGLFramebufferColorTexture
2323
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture.OpenGLFramebufferDepthTexture

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/buffer/render/OpenGLRenderbuffer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import de.bixilon.kmath.vec.vec2.i.Vec2i
1717
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.Renderbuffer
1818
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.RenderbufferModes
1919
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.RenderbufferStates
20-
import de.bixilon.minosoft.gui.rendering.system.opengl.MemoryLeakException
20+
import de.bixilon.minosoft.gui.rendering.system.opengl.error.MemoryLeakException
2121
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
2222
import org.lwjgl.opengl.GL30.*
2323

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/MemoryLeakException.kt renamed to src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/error/MemoryLeakException.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
1212
*/
1313

14-
package de.bixilon.minosoft.gui.rendering.system.opengl
14+
package de.bixilon.minosoft.gui.rendering.system.opengl.error
1515

1616
import de.bixilon.kutil.exception.FastException
1717

src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/OpenGLError.kt renamed to src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/error/OpenGLError.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Minosoft
3-
* Copyright (C) 2020-2022 Moritz Zwerger
3+
* Copyright (C) 2020-2025 Moritz Zwerger
44
*
55
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
66
*
@@ -11,7 +11,7 @@
1111
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
1212
*/
1313

14-
package de.bixilon.minosoft.gui.rendering.system.opengl
14+
package de.bixilon.minosoft.gui.rendering.system.opengl.error
1515

1616
import de.bixilon.kutil.enums.EnumUtil
1717
import de.bixilon.kutil.enums.ValuesEnum
@@ -49,7 +49,7 @@ class OpenGLError(
4949
for (value in VALUES) {
5050
codes[value.code] = value
5151
}
52-
this.CODES = codes
52+
CODES = codes
5353
}
5454
}
5555
}

0 commit comments

Comments
 (0)