Skip to content

Commit 2789156

Browse files
committed
opengl: wrap every opengl call in a gl block
That can enforce thread safety (in minosoft), not native code and errors can easily be traced
1 parent 70592b6 commit 2789156

18 files changed

+99
-81
lines changed

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferDraw
1919
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferStates
2020
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferTypes
2121
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
22+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
2223
import org.lwjgl.opengl.GL15.glBufferSubData
2324
import org.lwjgl.opengl.GL15C
2425
import org.lwjgl.system.MemoryUtil.memAddress
@@ -36,19 +37,19 @@ open class FloatOpenGLBuffer(renderSystem: OpenGLRenderSystem, protected var _da
3637
bind()
3738
val position = buffer.position()
3839
buffer.position(0)
39-
nglBufferData(type.gl, buffer, if (EMPTY_BUFFERS) 0 else position, drawTypes.gl)
40+
gl { nglBufferData(type.gl, buffer, if (EMPTY_BUFFERS) 0 else position, drawTypes.gl) }
4041
buffer.position(position)
4142
state = RenderableBufferStates.UPLOADED
4243
unbind()
4344
}
4445

4546
override fun upload() {
4647
bind()
47-
glBufferSubData(type.gl, 0, buffer)
48+
gl { glBufferSubData(type.gl, 0, buffer) }
4849
unbind()
4950
}
5051

5152
private fun nglBufferData(target: Int, buffer: FloatBuffer, length: Int, usage: Int) {
52-
GL15C.nglBufferData(target, Integer.toUnsignedLong(length) shl 2, memAddress(buffer), usage)
53+
gl { GL15C.nglBufferData(target, Integer.toUnsignedLong(length) shl 2, memAddress(buffer), usage) }
5354
}
5455
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferDraw
1919
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferStates
2020
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferTypes
2121
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
22+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
2223
import de.bixilon.minosoft.gui.rendering.system.opengl.error.MemoryLeakException
2324
import org.lwjgl.opengl.GL15.*
2425
import org.lwjgl.opengl.GL31.GL_UNIFORM_BUFFER
@@ -36,7 +37,7 @@ abstract class OpenGLRenderableBuffer(
3637
override fun init() {
3738
if (this.state != RenderableBufferStates.PREPARING) throw IllegalStateException("Already initialized (buffer=$this, state=$state)")
3839
system.log { "Init renderable buffer $this" }
39-
id = glGenBuffers()
40+
id = gl { glGenBuffers() }
4041
}
4142

4243
protected abstract fun initialUpload()
@@ -45,7 +46,7 @@ abstract class OpenGLRenderableBuffer(
4546
if (system.boundBuffer == id) {
4647
return
4748
}
48-
glBindBuffer(type.gl, id)
49+
gl { glBindBuffer(type.gl, id) }
4950
system.boundBuffer = id
5051
}
5152

@@ -55,12 +56,12 @@ abstract class OpenGLRenderableBuffer(
5556
// This is unclean, yes. But it is not required to do at all (we always bind another buffer), so this saves a ton of gl calls
5657
return
5758
}
58-
glBindBuffer(type.gl, 0)
59+
gl { glBindBuffer(type.gl, 0) }
5960
}
6061

6162
override fun unload() {
6263
if (this.state != RenderableBufferStates.UPLOADED) throw IllegalStateException("Not uploaded (buffer=$this, state=$state)")
63-
glDeleteBuffers(id)
64+
gl { glDeleteBuffers(id) }
6465
if (system.boundBuffer == id) {
6566
system.boundBuffer = -1
6667
}

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

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ 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
2020
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
21+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
2122
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture.OpenGLFramebufferColorTexture
2223
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture.OpenGLFramebufferDepthTexture
2324
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.render.OpenGLRenderbuffer
@@ -51,7 +52,7 @@ class OpenGLFramebuffer(
5152
override fun init() {
5253
check(state == FramebufferState.PREPARING) { "Framebuffer was already initialized!" }
5354
system.log { "Init framebuffer $this" }
54-
id = glGenFramebuffers()
55+
id = gl { glGenFramebuffers() }
5556
unsafeBind()
5657

5758
this.scaled = if (scale == 1.0f) size else Vec2i((size.x * scale).toInt(), (size.y * scale).toInt())
@@ -74,7 +75,7 @@ class OpenGLFramebuffer(
7475
//depthTexture.init()
7576
//attach(depthTexture)
7677

77-
val state = glCheckFramebufferStatus(GL_FRAMEBUFFER)
78+
val state = gl { glCheckFramebufferStatus(GL_FRAMEBUFFER) }
7879
check(state == GL_FRAMEBUFFER_COMPLETE) { "Framebuffer is incomplete: $state" }
7980
this.state = FramebufferState.COMPLETE
8081
}
@@ -87,19 +88,19 @@ class OpenGLFramebuffer(
8788

8889
private fun unsafeBind() {
8990
system.log { "Binding framebuffer $this" }
90-
glBindFramebuffer(GL_FRAMEBUFFER, id)
91+
gl { glBindFramebuffer(GL_FRAMEBUFFER, id) }
9192
}
9293

9394
private fun attach(renderbuffer: OpenGLRenderbuffer) {
94-
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer.id)
95+
gl { glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, renderbuffer.id) }
9596
}
9697

9798
private fun attach(texture: OpenGLFramebufferDepthTexture) {
98-
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture.id, 0)
99+
gl { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, texture.id, 0) }
99100
}
100101

101102
private fun attach(texture: OpenGLFramebufferColorTexture) {
102-
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.id, 0)
103+
gl { glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.id, 0) }
103104
}
104105

105106
override fun delete() {
@@ -108,7 +109,7 @@ class OpenGLFramebuffer(
108109
colorTexture?.unload()
109110
depthBuffer?.unload()
110111

111-
glDeleteFramebuffers(id)
112+
gl { glDeleteFramebuffers(id) }
112113
id = -1
113114
state = FramebufferState.DELETED
114115
}

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture
1515

1616
import de.bixilon.kmath.vec.vec2.i.Vec2i
1717
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.texture.FramebufferTexture
18+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
1819
import org.lwjgl.opengl.GL30.*
1920
import java.nio.ByteBuffer
2021

@@ -25,11 +26,11 @@ class OpenGLFramebufferColorTexture(
2526
override fun init() {
2627
if (state != OpenGLTextureStates.PREPARING) throw IllegalStateException("Already initialized (state=$state)")
2728

28-
id = glGenTextures()
29-
glBindTexture(GL_TEXTURE_2D, id)
30-
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, null as ByteBuffer?)
31-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
32-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
29+
id = gl { glGenTextures() }
30+
gl { glBindTexture(GL_TEXTURE_2D, id) }
31+
gl { glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, null as ByteBuffer?) }
32+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) }
33+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) }
3334

3435
state = OpenGLTextureStates.INITIALIZED
3536
}

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

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture
1616
import de.bixilon.kmath.vec.vec2.i.Vec2i
1717
import de.bixilon.minosoft.gui.rendering.system.base.buffer.frame.texture.FramebufferTexture
1818
import de.bixilon.minosoft.gui.rendering.system.base.buffer.render.RenderbufferModes
19+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
1920
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.render.OpenGLRenderbuffer.Companion.gl
2021
import org.lwjgl.opengl.GL30.*
2122
import java.nio.ByteBuffer
@@ -28,17 +29,17 @@ class OpenGLFramebufferDepthTexture(
2829
override fun init() {
2930
if (state != OpenGLTextureStates.PREPARING) throw IllegalStateException("Already initialized (state=$state)")
3031

31-
id = glGenTextures()
32-
glBindTexture(GL_TEXTURE_2D, id)
33-
glTexImage2D(GL_TEXTURE_2D, 0, mode.gl, size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null as ByteBuffer?)
34-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL)
35-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE)
32+
id = gl { glGenTextures() }
33+
gl { glBindTexture(GL_TEXTURE_2D, id) }
34+
gl { glTexImage2D(GL_TEXTURE_2D, 0, mode.gl, size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null as ByteBuffer?) }
35+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL) }
36+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE) }
3637

37-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE)
38-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE)
38+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) }
39+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) }
3940

40-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST)
41-
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST)
41+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) }
42+
gl { glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) }
4243

4344
state = OpenGLTextureStates.INITIALIZED
4445
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.frame.texture
1515

16+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
1617
import org.lwjgl.opengl.GL11.*
1718
import org.lwjgl.opengl.GL13.GL_TEXTURE0
1819
import org.lwjgl.opengl.GL13.glActiveTexture
@@ -28,13 +29,13 @@ abstract class OpenGLTexture {
2829
fun bind(target: Int) {
2930
if (state != OpenGLTextureStates.INITIALIZED) throw IllegalStateException("Not loaded (state=$state)")
3031
check(target in 0 until 12)
31-
glActiveTexture(GL_TEXTURE0 + target)
32-
glBindTexture(GL_TEXTURE_2D, id)
32+
gl { glActiveTexture(GL_TEXTURE0 + target) }
33+
gl { glBindTexture(GL_TEXTURE_2D, id) }
3334
}
3435

3536
fun unload() {
3637
if (state != OpenGLTextureStates.INITIALIZED) throw IllegalStateException("Not loaded (state=$state)")
37-
glDeleteTextures(id)
38+
gl { glDeleteTextures(id) }
3839
id = -1
3940
}
4041
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ 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
2020
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
21+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
2122
import de.bixilon.minosoft.gui.rendering.system.opengl.error.MemoryLeakException
2223
import org.lwjgl.opengl.GL30.*
2324

@@ -33,9 +34,9 @@ class OpenGLRenderbuffer(
3334

3435
override fun init() {
3536
check(state == RenderbufferStates.PREPARING) { "Can not init renderbuffer in $state" }
36-
id = glGenRenderbuffers()
37+
id = gl { glGenRenderbuffers() }
3738
unsafeBind()
38-
glRenderbufferStorage(GL_RENDERBUFFER, mode.gl, size.x, size.y)
39+
gl { glRenderbufferStorage(GL_RENDERBUFFER, mode.gl, size.x, size.y) }
3940
state = RenderbufferStates.GENERATED
4041
}
4142

@@ -45,12 +46,12 @@ class OpenGLRenderbuffer(
4546
}
4647

4748
fun unsafeBind() {
48-
glBindRenderbuffer(GL_RENDERBUFFER, id)
49+
gl { glBindRenderbuffer(GL_RENDERBUFFER, id) }
4950
}
5051

5152
override fun unload() {
5253
check(state == RenderbufferStates.GENERATED) { "Can not unload renderbuffer in $state" }
53-
glDeleteRenderbuffers(id)
54+
gl { glDeleteRenderbuffers(id) }
5455
id = -1
5556
state = RenderbufferStates.UNLOADED
5657
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.uniform
1616
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferStates
1717
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.FloatUniformBuffer
1818
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
19+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
1920
import org.lwjgl.opengl.GL15.glBufferData
2021
import org.lwjgl.opengl.GL15.glBufferSubData
2122
import org.lwjgl.opengl.GL15C.nglBufferSubData
@@ -30,15 +31,15 @@ class FloatOpenGLUniformBuffer(renderSystem: OpenGLRenderSystem, bindingIndex: I
3031
override fun initialUpload() {
3132
bind()
3233
buffer.position(0)
33-
glBufferData(type.gl, buffer, drawTypes.gl)
34+
gl { glBufferData(type.gl, buffer, drawTypes.gl) }
3435
state = RenderableBufferStates.UPLOADED
3536
unbind()
3637
}
3738

3839
override fun upload() {
3940
check(initialSize == size) { "Can not change buffer size!" }
4041
bind()
41-
glBufferSubData(type.gl, 0, buffer)
42+
gl { glBufferSubData(type.gl, 0, buffer) }
4243
unbind()
4344
}
4445

@@ -48,7 +49,7 @@ class FloatOpenGLUniformBuffer(renderSystem: OpenGLRenderSystem, bindingIndex: I
4849
throw IndexOutOfBoundsException(start)
4950
}
5051
bind()
51-
nglBufferSubData(type.gl, start * 4L, Integer.toUnsignedLong(((end + 1) - start) * 4), MemoryUtil.memAddress(buffer, start))
52+
gl { nglBufferSubData(type.gl, start * 4L, Integer.toUnsignedLong(((end + 1) - start) * 4), MemoryUtil.memAddress(buffer, start)) }
5253
unbind()
5354
}
5455
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package de.bixilon.minosoft.gui.rendering.system.opengl.buffer.uniform
1616
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferStates
1717
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.IntUniformBuffer
1818
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
19+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
1920
import org.lwjgl.opengl.GL15.glBufferData
2021
import org.lwjgl.opengl.GL15.glBufferSubData
2122

@@ -25,15 +26,15 @@ class IntOpenGLUniformBuffer(renderSystem: OpenGLRenderSystem, bindingIndex: Int
2526

2627
override fun initialUpload() {
2728
bind()
28-
glBufferData(type.gl, data, drawTypes.gl)
29+
gl { glBufferData(type.gl, data, drawTypes.gl) }
2930
state = RenderableBufferStates.UPLOADED
3031
unbind()
3132
}
3233

3334
override fun upload() {
3435
check(initialSize == size) { "Can not change buffer size!" }
3536
bind()
36-
glBufferSubData(type.gl, 0, data)
37+
gl { glBufferSubData(type.gl, 0, data) }
3738
unbind()
3839
}
3940

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferStat
1919
import de.bixilon.minosoft.gui.rendering.system.base.buffer.RenderableBufferTypes
2020
import de.bixilon.minosoft.gui.rendering.system.base.buffer.uniform.UniformBuffer
2121
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem
22+
import de.bixilon.minosoft.gui.rendering.system.opengl.OpenGLRenderSystem.Companion.gl
2223
import de.bixilon.minosoft.gui.rendering.system.opengl.buffer.OpenGLRenderableBuffer
2324
import org.lwjgl.opengl.GL30.glBindBufferBase
2425
import org.lwjgl.opengl.GL30.glBindBufferRange
@@ -33,7 +34,7 @@ abstract class OpenGLUniformBuffer(renderSystem: OpenGLRenderSystem, override va
3334
override fun init() {
3435
super.init()
3536
initialUpload()
36-
glBindBufferRange(GL_UNIFORM_BUFFER, bindingIndex, id, 0, size.toLong())
37+
gl { glBindBufferRange(GL_UNIFORM_BUFFER, bindingIndex, id, 0, size.toLong()) }
3738
initialSize = size
3839
}
3940

@@ -43,6 +44,6 @@ abstract class OpenGLUniformBuffer(renderSystem: OpenGLRenderSystem, override va
4344
shader.use()
4445

4546
shader.native[bufferName] = this
46-
glBindBufferBase(GL_UNIFORM_BUFFER, bindingIndex, id)
47+
gl { glBindBufferBase(GL_UNIFORM_BUFFER, bindingIndex, id) }
4748
}
4849
}

0 commit comments

Comments
 (0)