in skiko/src/awtMain/kotlin/org/jetbrains/skiko/swing/LinuxOpenGLSwingRedrawer.kt [44:87]
override fun onRender(g: Graphics2D, width: Int, height: Int, nanoTime: Long) {
offScreenBufferPtr = makeOffScreenBuffer(offScreenContextPtr, offScreenBufferPtr, width, height)
if (offScreenBufferPtr == 0L) {
throw RenderException("Cannot create offScreen OpenGL buffer")
}
startRendering(offScreenContextPtr, offScreenBufferPtr)
try {
autoCloseScope {
// TODO: reuse texture
val texturePtr = createAndBindTexture(width, height)
if (texturePtr == 0L) {
throw RenderException("Cannot create offScreen OpenGL texture")
}
val fbId = getFboId(texturePtr)
val renderTarget = makeGLRenderTarget(
width,
height,
0,
8,
fbId,
FramebufferFormat.GR_GL_RGBA8
).autoClose()
// TODO: may be it is possible to reuse [makeGLContext]
val directContext = makeGLContext().configureContext().autoClose()
val surface = Surface.makeFromBackendRenderTarget(
directContext,
renderTarget,
SurfaceOrigin.TOP_LEFT,
SurfaceColorFormat.BGRA_8888,
ColorSpace.sRGB,
SurfaceProps(pixelGeometry = PixelGeometry.UNKNOWN)
)?.autoClose() ?: throw RenderException("Cannot create surface")
val canvas = surface.canvas
canvas.clear(Color.TRANSPARENT)
renderDelegate.onRender(canvas, width, height, nanoTime)
flush(surface, g)
unbindAndDisposeTexture(texturePtr)
}
} finally {
finishRendering(offScreenContextPtr)
}
}