From 942a1a8787f1968f8087f8a5d75c9232eecdb0f6 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 2 May 2022 22:36:50 +0200 Subject: [PATCH] dynamic textures: use weak references --- .../gui/elements/primitive/DynamicImageElement.kt | 4 ++++ .../gui/hud/elements/tab/TabListEntryElement.kt | 2 +- .../texture/dynamic/OpenGLDynamicTextureArray.kt | 15 +++++++++------ 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/primitive/DynamicImageElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/primitive/DynamicImageElement.kt index 943898c63..58b6e7440 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/primitive/DynamicImageElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/elements/primitive/DynamicImageElement.kt @@ -97,4 +97,8 @@ open class DynamicImageElement( override fun forceSilentApply() = Unit override fun silentApply(): Boolean = false + + protected fun finalize() { + texture?.usages?.decrementAndGet() + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt index 5e3cd0bd6..c32c33d4b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/gui/hud/elements/tab/TabListEntryElement.kt @@ -104,7 +104,7 @@ class TabListEntryElement( nameElement.text = displayName - this.prefSize = Vec2i((PADDING * 6) + skinElement.prefSize.x + nameElement.prefSize.x + INNER_MARGIN + pingElement.prefSize.x, HEIGHT) + this.prefSize = Vec2i((PADDING * 6) + skinElement.size.x + nameElement.prefSize.x + INNER_MARGIN + pingElement.prefSize.x, HEIGHT) background.size = size cacheUpToDate = false } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt index 196688f5d..13c300aab 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/system/opengl/texture/dynamic/OpenGLDynamicTextureArray.kt @@ -28,6 +28,7 @@ import org.lwjgl.opengl.GL12.glTexSubImage3D import org.lwjgl.opengl.GL13.GL_TEXTURE0 import org.lwjgl.opengl.GL13.glActiveTexture import org.lwjgl.opengl.GL30.GL_TEXTURE_2D_ARRAY +import java.lang.ref.WeakReference import java.nio.ByteBuffer import java.util.* @@ -37,7 +38,7 @@ class OpenGLDynamicTextureArray( initialSize: Int = 32, val resolution: Int, ) : DynamicTextureArray { - private val textures: Array = arrayOfNulls(initialSize) + private val textures: Array?> = arrayOfNulls(initialSize) private var textureId = -1 override val size: Int @@ -71,14 +72,15 @@ class OpenGLDynamicTextureArray( override fun pushBuffer(identifier: UUID, data: () -> ByteBuffer): OpenGLDynamicTexture { check(textureId >= 0) { "Dynamic texture array not yet initialized!" } cleanup() - for (texture in textures) { + for (textureReference in textures) { + val texture = textureReference?.get() if (texture?.uuid == identifier) { return texture } } val index = getNextIndex() val texture = OpenGLDynamicTexture(identifier, createShaderIdentifier(index = index)) - textures[index] = texture + textures[index] = WeakReference(texture) texture.state = DynamicTextureState.LOADING DefaultThreadPool += { val bytes = data() @@ -138,11 +140,12 @@ class OpenGLDynamicTextureArray( } private fun cleanup() { - for ((index, texture) in textures.withIndex()) { - if (texture == null) { + for ((index, textureReference) in textures.withIndex()) { + if (textureReference == null) { continue } - if (texture.usages.get() > 0) { + val texture = textureReference.get() + if (texture != null && texture.usages.get() > 0) { continue } textures[index] = null