OpenDlssNrImage.kt
src/jvmMain/kotlin/afield/graphics/render/neural/OpenDlssNrImage.kt · 79 lines
Runs one image file through OpenDlssNrPass and shows the result on screen.
OpenDlssNrImage loads the image and requires OpenDlssNrSupport.availability to be ready. After
OpenDlssNrImage.install it evaluates the pass each frame under the renderer, with controls
for the network and exposure, gamma and offset for grading the result as it reaches the
screen.
package afield.graphics.render.neural
import afield.graphics.render.ModulePointer
import afield.graphics.texture.LoadedTexture
import afield.graphics.vulkan.Renderer
import afield.graphics.vulkan.Target
import afield.graphics.vulkan.device.CommandBuffer
import afield.graphics.vulkan.targets.RenderToTexture
import afield.math.linalg.Vector4f
import org.lwjgl.vulkan.VK10.VK_FORMAT_R8G8B8A8_UNORM
class OpenDlssNrImage(val renderer: Renderer, val path: String, val name: String = "opendlssnr-image") :
Editable image study. Install below a renderer; inference precedes the grading/display module. close detaches immediately and retires allocations after submitted frames finish.
class OpenDlssNrImage(val renderer: Renderer, val path: String, val name: String = "opendlssnr-image") :
Target, AutoCloseable {
private val availability = OpenDlssNrSupport.availability(renderer).also { check(it.ready) { it.reason } }
private val texture = LoadedTexture.fromFile(path, renderer, VK_FORMAT_R8G8B8A8_UNORM)
val pass
val pass = try {
OpenDlssNrPass(renderer, texture.width, texture.height)
} catch (failure: Throwable) {
texture.cleanup()
throw failure
}
val output: RenderToTexture
val output: RenderToTexture
get() = pass.output
var controls: OpenDlssNrControls
var controls: OpenDlssNrControls
get() = pass.controls
set(value) {
pass.controls = value
}
var exposure = Vector4f(1f, 1f, 1f, 1f)
Linear RGB multipliers, independent of the network condition.
var gamma = Vector4f(1f, 1f, 1f, 1f)
var offset = Vector4f(0f, 0f, 0f, 0f)
private var frame = 0L
private var closed = false
private var blit: ModulePointer? = null
fun install(): OpenDlssNrImage
fun install(): OpenDlssNrImage {
check(!closed)
blit = output.blitToScreen(name = name)
renderer.renderList.preTargets[name] = this
return this
}
override fun render(command: CommandBuffer, index: Int)
override fun render(command: CommandBuffer, index: Int) {
if (closed) return
pass.evaluate(command, OpenDlssNrInputs(texture, OpenDlssNrColorEncoding.SRGB_CODE), OpenDlssNrFrame(frame++))
blit?.current?.meshes?.get(name)?.push?.apply {
set("exposure", exposure)
set("gamma", gamma)
set("offset", offset)
}
}
override fun close()
override fun close() {
if (closed) return
closed = true
renderer.renderList.preTargets.remove(name, this)
renderer.renderList.modules.remove(name, blit)
blit?.current?.cleanup()
pass.close()
renderer.cleanup += Runnable { texture.cleanup() }
}
}