Skip to content

Commit a9f3b5d

Browse files
committed
Use transient memory
1 parent aeedb3e commit a9f3b5d

3 files changed

Lines changed: 43 additions & 72 deletions

File tree

src/main/kotlin/org/visuals/legacy/animatium/renderer/uniform/UniformKey.kt

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -27,43 +27,33 @@ package org.visuals.legacy.animatium.renderer.uniform
2727

2828
import org.joml.*
2929

30-
interface UniformKey<T> {
30+
class UniformKey<T>(val name: String, val serializer: UniformSerializer<*>) {
3131
companion object {
3232
@JvmStatic
33-
fun Integer(name: String): UniformKey<Int> = Impl(name, UniformSerializer.INTEGER)
33+
fun Integer(name: String): UniformKey<Int> = UniformKey(name, UniformSerializer.INTEGER)
3434

3535
@JvmStatic
36-
fun Float(name: String): UniformKey<Float> = Impl(name, UniformSerializer.FLOAT)
36+
fun Float(name: String): UniformKey<Float> = UniformKey(name, UniformSerializer.FLOAT)
3737

3838
@JvmStatic
39-
fun Matrix4f(name: String): UniformKey<Matrix4f> = Impl(name, UniformSerializer.MATRIX4F)
39+
fun Matrix4f(name: String): UniformKey<Matrix4f> = UniformKey(name, UniformSerializer.MATRIX4F)
4040

4141
@JvmStatic
42-
fun Vector2f(name: String): UniformKey<Vector2f> = Impl(name, UniformSerializer.VECTOR2F)
42+
fun Vector2f(name: String): UniformKey<Vector2f> = UniformKey(name, UniformSerializer.VECTOR2F)
4343

4444
@JvmStatic
45-
fun Vector2i(name: String): UniformKey<Vector2i> = Impl(name, UniformSerializer.VECTOR2I)
45+
fun Vector2i(name: String): UniformKey<Vector2i> = UniformKey(name, UniformSerializer.VECTOR2I)
4646

4747
@JvmStatic
48-
fun Vector3f(name: String): UniformKey<Vector3f> = Impl(name, UniformSerializer.VECTOR3F)
48+
fun Vector3f(name: String): UniformKey<Vector3f> = UniformKey(name, UniformSerializer.VECTOR3F)
4949

5050
@JvmStatic
51-
fun Vector3i(name: String): UniformKey<Vector3i> = Impl(name, UniformSerializer.VECTOR3I)
51+
fun Vector3i(name: String): UniformKey<Vector3i> = UniformKey(name, UniformSerializer.VECTOR3I)
5252

5353
@JvmStatic
54-
fun Vector4f(name: String): UniformKey<Vector4f> = Impl(name, UniformSerializer.VECTOR4F)
54+
fun Vector4f(name: String): UniformKey<Vector4f> = UniformKey(name, UniformSerializer.VECTOR4F)
5555

5656
@JvmStatic
57-
fun Vector4i(name: String): UniformKey<Vector4i> = Impl(name, UniformSerializer.VECTOR4I)
58-
}
59-
60-
fun name(): String
61-
62-
fun serializer(): UniformSerializer<T>
63-
64-
private data class Impl<T>(val name: String, val serializer: UniformSerializer<T>) : UniformKey<T> {
65-
override fun name(): String = this.name
66-
67-
override fun serializer(): UniformSerializer<T> = this.serializer
57+
fun Vector4i(name: String): UniformKey<Vector4i> = UniformKey(name, UniformSerializer.VECTOR4I)
6858
}
6959
}

src/main/kotlin/org/visuals/legacy/animatium/renderer/uniform/UniformSerializer.kt

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import java.nio.ByteBuffer
3131

3232
abstract class UniformSerializer<T> {
3333
companion object {
34-
val INTEGER: UniformSerializer<Int> = object : UniformSerializer<Int>() {
34+
val INTEGER = object : UniformSerializer<Int>() {
3535
override fun put(buffer: ByteBuffer, value: Int) {
3636
buffer.putInt(value)
3737
}
@@ -41,7 +41,7 @@ abstract class UniformSerializer<T> {
4141
}
4242
}
4343

44-
val FLOAT: UniformSerializer<Float> = object : UniformSerializer<Float>() {
44+
val FLOAT = object : UniformSerializer<Float>() {
4545
override fun put(buffer: ByteBuffer, value: Float) {
4646
buffer.putFloat(value)
4747
}
@@ -51,7 +51,7 @@ abstract class UniformSerializer<T> {
5151
}
5252
}
5353

54-
val MATRIX4F: UniformSerializer<Matrix4f> = object : UniformSerializer<Matrix4f>() {
54+
val MATRIX4F = object : UniformSerializer<Matrix4f>() {
5555
override fun put(buffer: ByteBuffer, value: Matrix4f) {
5656
value.get(buffer)
5757
}
@@ -61,7 +61,7 @@ abstract class UniformSerializer<T> {
6161
}
6262
}
6363

64-
val VECTOR2F: UniformSerializer<Vector2f> = object : UniformSerializer<Vector2f>() {
64+
val VECTOR2F = object : UniformSerializer<Vector2f>() {
6565
override fun put(buffer: ByteBuffer, value: Vector2f) {
6666
value.get(buffer)
6767
}
@@ -71,7 +71,7 @@ abstract class UniformSerializer<T> {
7171
}
7272
}
7373

74-
val VECTOR2I: UniformSerializer<Vector2i> = object : UniformSerializer<Vector2i>() {
74+
val VECTOR2I = object : UniformSerializer<Vector2i>() {
7575
override fun put(buffer: ByteBuffer, value: Vector2i) {
7676
value.get(buffer)
7777
}
@@ -81,7 +81,7 @@ abstract class UniformSerializer<T> {
8181
}
8282
}
8383

84-
val VECTOR3F: UniformSerializer<Vector3f> = object : UniformSerializer<Vector3f>() {
84+
val VECTOR3F = object : UniformSerializer<Vector3f>() {
8585
override fun put(buffer: ByteBuffer, value: Vector3f) {
8686
value.get(buffer)
8787
}
@@ -91,7 +91,7 @@ abstract class UniformSerializer<T> {
9191
}
9292
}
9393

94-
val VECTOR3I: UniformSerializer<Vector3i> = object : UniformSerializer<Vector3i>() {
94+
val VECTOR3I = object : UniformSerializer<Vector3i>() {
9595
override fun put(buffer: ByteBuffer, value: Vector3i) {
9696
value.get(buffer)
9797
}
@@ -101,18 +101,17 @@ abstract class UniformSerializer<T> {
101101
}
102102
}
103103

104-
val VECTOR4F: UniformSerializer<Vector4f> =
105-
object : UniformSerializer<Vector4f>() {
106-
override fun put(buffer: ByteBuffer, value: Vector4f) {
107-
value.get(buffer)
108-
}
104+
val VECTOR4F = object : UniformSerializer<Vector4f>() {
105+
override fun put(buffer: ByteBuffer, value: Vector4f) {
106+
value.get(buffer)
107+
}
109108

110-
override fun size(calculator: Std140SizeCalculator) {
111-
calculator.putVec4()
112-
}
109+
override fun size(calculator: Std140SizeCalculator) {
110+
calculator.putVec4()
113111
}
112+
}
114113

115-
val VECTOR4I: UniformSerializer<Vector4i> = object : UniformSerializer<Vector4i>() {
114+
val VECTOR4I = object : UniformSerializer<Vector4i>() {
116115
override fun put(buffer: ByteBuffer, value: Vector4i) {
117116
value.get(buffer)
118117
}

src/main/kotlin/org/visuals/legacy/animatium/renderer/uniform/UniformStorage.kt

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,20 @@
2626
package org.visuals.legacy.animatium.renderer.uniform
2727

2828
import com.mojang.blaze3d.buffers.GpuBuffer
29+
import com.mojang.blaze3d.buffers.GpuBufferSlice
2930
import com.mojang.blaze3d.buffers.Std140SizeCalculator
30-
import com.mojang.blaze3d.systems.CommandEncoder
3131
import com.mojang.blaze3d.systems.RenderSystem
32-
import org.lwjgl.system.MemoryStack
3332

3433
class UniformStorage : AutoCloseable {
3534
private val name: String
36-
private val ubo: GpuBuffer
3735
private val keys: MutableList<UniformKey<*>>
3836
private val values = LinkedHashMap<UniformKey<*>, Any?>()
3937
private val size: Int
4038

41-
private var dirty = true
4239
private var closed = false
4340

4441
private constructor(name: String, keys: List<UniformKey<*>>, size: Int) {
4542
this.name = name
46-
this.ubo = RenderSystem.getDevice().createBuffer(
47-
{ "Dynamic Uniform Storage (${this.name})" },
48-
GpuBuffer.USAGE_UNIFORM or GpuBuffer.USAGE_COPY_DST,
49-
size.toLong()
50-
)
5143
this.keys = keys.toMutableList()
5244
this.size = size
5345
for (key in this.keys) {
@@ -63,14 +55,9 @@ class UniformStorage : AutoCloseable {
6355
if (this.closed) {
6456
throw RuntimeException("Cannot set value in uniform storage \"" + this.name + "\" as it has been closed!")
6557
} else if (!this.keys.contains(key)) {
66-
throw UnsupportedOperationException("Uniform storage does not contain key '" + key.name() + "'!")
58+
throw UnsupportedOperationException("Uniform storage does not contain key '" + key.name + "'!")
6759
} else {
68-
val currentValue = this.values[key]
69-
if (currentValue != values) {
70-
this.dirty = true
71-
this.values[key] = value
72-
}
73-
60+
this.values[key] = value
7461
return this
7562
}
7663
}
@@ -82,40 +69,35 @@ class UniformStorage : AutoCloseable {
8269
this.values[key] as T?
8370
}
8471

85-
fun update(commandEncoder: CommandEncoder) {
72+
fun upload(): GpuBufferSlice {
8673
if (this.closed) {
8774
throw RuntimeException("Cannot update uniform storage \"" + this.name + "\" as it has been closed!")
88-
} else if (this.dirty) {
89-
val slice = this.ubo.slice()
90-
MemoryStack.stackPush().use { stack ->
91-
val buffer = stack.malloc(this.size)
75+
} else {
76+
val device = RenderSystem.getDevice()
77+
val transientMemory = device.createCommandEncoder().transientMemory()
78+
val alignment = device.deviceInfo.limits.minUniformOffsetAlignment
79+
transientMemory.allocateGpuMapped(
80+
this.size.toLong(),
81+
alignment.toLong(),
82+
GpuBuffer.USAGE_UNIFORM
83+
).use { view ->
9284
for (entry in this.values) {
9385
val key = entry.key
9486
val value = entry.value
95-
if (value == null) {
96-
throw RuntimeException("Failed to bind \"" + key.name() + "\" in Uniform Storage (" + this.name + ") as value is not set!")
97-
} else {
98-
(key.serializer() as UniformSerializer<Any>).put(buffer, value)
99-
}
87+
?: throw RuntimeException("Failed to bind \"" + key.name + "\" in Uniform Storage (" + this.name + ") as value is not set!")
88+
(key.serializer as UniformSerializer<Any>).put(view.data, value)
10089
}
10190

102-
commandEncoder.writeToBuffer(slice, buffer)
91+
return view.slice
10392
}
104-
105-
this.dirty = false
10693
}
10794
}
10895

109-
fun update() = this.update(RenderSystem.getDevice().createCommandEncoder())
110-
111-
fun slice() = this.ubo.slice()
112-
113-
fun isClose() = this.closed
96+
fun isClosed() = this.closed
11497

11598
override fun close() {
11699
if (!this.closed) {
117100
this.closed = true
118-
this.ubo.close()
119101
this.keys.clear()
120102
this.values.clear()
121103
}
@@ -127,7 +109,7 @@ class UniformStorage : AutoCloseable {
127109

128110
fun with(key: UniformKey<*>): Builder {
129111
this.keys.add(key)
130-
key.serializer().size(this.calculator)
112+
key.serializer.size(this.calculator)
131113
return this
132114
}
133115

0 commit comments

Comments
 (0)