OpenXRFrame.kt
src/jvmMain/kotlin/afield/graphics/vulkan/targets/OpenXRFrame.kt · 30 lines
package afield.graphics.vulkan.targets
internal fun <F : Any> withOpenXRFrame
Keeps a located frame alive across caller-thread scene rendering and queue-thread submission.
internal fun <F : Any> withOpenXRFrame(
prepare: () -> F?,
renderScene: () -> Unit,
submit: (F, Boolean) -> Unit,
release: (F) -> Unit,
) {
val frame = prepare()
var sceneFailure: Throwable? = null
try {
renderScene()
} catch (failure: Throwable) {
sceneFailure = failure
throw failure
} finally {
if (frame != null) {
try {
submit(frame, sceneFailure == null)
} catch (failure: Throwable) {
if (sceneFailure == null) throw failure
sceneFailure.addSuppressed(failure)
} finally {
release(frame)
}
}
}
}