Skip to content

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)
            }
        }
    }
}