Skip to content

Commit b484368

Browse files
committed
feat: move DoubleDestructionProtection into separate class
1 parent 755c624 commit b484368

File tree

4 files changed

+47
-38
lines changed

4 files changed

+47
-38
lines changed

src/main/java/dev/silenium/compose/gl/fbo/FBO.kt

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,18 @@ package dev.silenium.compose.gl.fbo
33
import androidx.compose.ui.unit.IntSize
44
import dev.silenium.compose.gl.objects.Renderbuffer
55
import dev.silenium.compose.gl.objects.Texture
6+
import dev.silenium.compose.gl.util.DoubleDestructionProtection
67
import dev.silenium.compose.gl.util.checkGLError
78
import org.lwjgl.opengl.GL30.*
89
import org.slf4j.LoggerFactory
9-
import java.util.concurrent.atomic.AtomicBoolean
10+
import java.util.concurrent.atomic.AtomicReference
1011

1112
data class FBO(
12-
val id: Int,
13+
override val id: Int,
1314
val size: IntSize,
1415
val colorAttachment: Texture,
1516
val depthStencilAttachment: Renderbuffer,
16-
) {
17+
) : DoubleDestructionProtection<Int>() {
1718
fun bind() {
1819
glBindFramebuffer(GL_FRAMEBUFFER, id)
1920
checkGLError("glBindFramebuffer")
@@ -25,20 +26,13 @@ data class FBO(
2526
checkGLError("glBindFramebuffer")
2627
}
2728

28-
private val destroyed = AtomicBoolean(false)
29-
fun destroy() {
30-
if (destroyed.compareAndExchange(false, true)) {
31-
glDeleteFramebuffers(id)
32-
colorAttachment.destroy()
33-
depthStencilAttachment.destroy()
34-
} else {
35-
logger.trace("FBO $id is already destroyed", Exception())
36-
}
29+
override fun destroyInternal() {
30+
glDeleteFramebuffers(id)
31+
colorAttachment.destroy()
32+
depthStencilAttachment.destroy()
3733
}
3834

3935
companion object {
40-
private val logger = LoggerFactory.getLogger(FBO::class.java)
41-
4236
fun create(
4337
colorAttachment: Texture,
4438
depthStencilAttachment: Renderbuffer,

src/main/java/dev/silenium/compose/gl/objects/Renderbuffer.kt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
11
package dev.silenium.compose.gl.objects
22

33
import androidx.compose.ui.unit.IntSize
4+
import dev.silenium.compose.gl.util.DoubleDestructionProtection
45
import dev.silenium.compose.gl.util.checkGLError
56
import org.lwjgl.opengl.GL30.*
6-
import org.slf4j.LoggerFactory
7-
import java.util.concurrent.atomic.AtomicBoolean
87

98
data class Renderbuffer(
109
override val id: Int,
1110
override val size: IntSize,
1211
override val internalFormat: Int,
13-
) : TextureOrRenderbuffer {
12+
) : TextureOrRenderbuffer, DoubleDestructionProtection<Int>() {
1413
override val target: Int = GL_RENDERBUFFER
1514
override val binding: Int = GL_RENDERBUFFER_BINDING
1615

@@ -24,18 +23,11 @@ data class Renderbuffer(
2423
checkGLError("glBindRenderbuffer")
2524
}
2625

27-
private val destroyed = AtomicBoolean(false)
28-
override fun destroy() {
29-
if (destroyed.compareAndExchange(false, true)) {
30-
glDeleteRenderbuffers(id)
31-
} else {
32-
logger.trace("Texture $id is already destroyed")
33-
}
26+
override fun destroyInternal() {
27+
glDeleteRenderbuffers(id)
3428
}
3529

3630
companion object {
37-
private val logger = LoggerFactory.getLogger(Renderbuffer::class.java)
38-
3931
fun create(size: IntSize, internalFormat: Int): Renderbuffer {
4032
val id = glGenRenderbuffers()
4133
checkGLError("glGenRenderbuffers")

src/main/java/dev/silenium/compose/gl/objects/Texture.kt

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,16 @@ package dev.silenium.compose.gl.objects
22

33
import androidx.compose.ui.unit.IntSize
44
import dev.silenium.compose.gl.objects.TextureOrRenderbuffer.Companion.textureTargetBindings
5+
import dev.silenium.compose.gl.util.DoubleDestructionProtection
56
import dev.silenium.compose.gl.util.checkGLError
67
import org.lwjgl.opengl.GL11.*
7-
import org.slf4j.LoggerFactory
8-
import java.util.concurrent.atomic.AtomicBoolean
98

109
data class Texture(
1110
override val id: Int,
1211
override val size: IntSize,
1312
override val target: Int,
1413
override val internalFormat: Int,
15-
) : TextureOrRenderbuffer {
14+
) : TextureOrRenderbuffer, DoubleDestructionProtection<Int>() {
1615
init {
1716
require(target in textureTargetBindings) { "Unsupported texture target: $target" }
1817
}
@@ -29,18 +28,11 @@ data class Texture(
2928
checkGLError("glBindTexture")
3029
}
3130

32-
private val destroyed = AtomicBoolean(false)
33-
override fun destroy() {
34-
if (destroyed.compareAndExchange(false, true)) {
35-
glDeleteTextures(id)
36-
} else {
37-
logger.trace("Texture $id is already destroyed")
38-
}
31+
override fun destroyInternal() {
32+
glDeleteTextures(id)
3933
}
4034

4135
companion object {
42-
private val logger = LoggerFactory.getLogger(Texture::class.java)
43-
4436
fun create(
4537
target: Int,
4638
size: IntSize,
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package dev.silenium.compose.gl.util
2+
3+
import org.slf4j.LoggerFactory
4+
import java.util.concurrent.atomic.AtomicBoolean
5+
6+
abstract class DoubleDestructionProtection<ID> {
7+
abstract val id: ID
8+
9+
private val destroyed = AtomicBoolean(false)
10+
private var destructionPoint: Throwable? = null
11+
fun destroy() {
12+
if (destroyed.compareAndSet(false, true)) {
13+
destroyInternal()
14+
destructionPoint = Exception()
15+
} else {
16+
logger.trace(
17+
"{} {} was already destroyed at: {}",
18+
javaClass.simpleName,
19+
id,
20+
destroyed.get(),
21+
Exception(),
22+
)
23+
}
24+
}
25+
26+
protected abstract fun destroyInternal()
27+
28+
companion object {
29+
private val logger = LoggerFactory.getLogger(DoubleDestructionProtection::class.java)
30+
}
31+
}

0 commit comments

Comments
 (0)