@@ -6,6 +6,7 @@ import androidx.compose.material.Button
66import androidx.compose.material.MaterialTheme
77import androidx.compose.material.Surface
88import androidx.compose.material.Text
9+ import androidx.compose.runtime.collectAsState
910import androidx.compose.runtime.getValue
1011import androidx.compose.runtime.mutableStateOf
1112import androidx.compose.runtime.setValue
@@ -18,8 +19,10 @@ import androidx.compose.ui.scene.PlatformLayersComposeScene
1819import androidx.compose.ui.unit.dp
1920import androidx.compose.ui.window.Window
2021import androidx.compose.ui.window.application
21- import dev.silenium.compose.gl.LocalWindow
2222import dev.silenium.compose.gl.canvas.GLCanvas
23+ import dev.silenium.compose.gl.canvas.Stats
24+ import dev.silenium.compose.gl.canvas.rememberGLCanvasState
25+ import dev.silenium.compose.gl.canvas.resetGLFeatures
2326import dev.silenium.compose.gl.findSkiaLayer
2427import dev.silenium.compose.gl.graphicsApi
2528import org.jetbrains.skia.*
@@ -29,22 +32,27 @@ import org.jetbrains.skiko.Version
2932fun main () = application {
3033 val glScene = PlatformLayersComposeScene ()
3134 glScene.setContent {
32- Text (
33- " Hello from Skia on OpenGL" ,
34- style = MaterialTheme .typography.h2,
35- modifier = Modifier .background(Color .White .copy(alpha = 0.5f )).padding(10 .dp),
36- )
35+ Box (modifier = Modifier .wrapContentSize().background(Color .Red )) {
36+ Box (modifier = Modifier .wrapContentSize().padding(50 .dp).background(Color .Blue )) {
37+ Text (
38+ " Hello from Skia on OpenGL" ,
39+ style = MaterialTheme .typography.h2,
40+ modifier = Modifier .background(Color .White .copy(alpha = 0.5f )).padding(10 .dp),
41+ )
42+ }
43+ }
3744 }
3845
3946 var glSurface: Surface ? by mutableStateOf(null )
4047 var glContext: DirectContext ? by mutableStateOf(null )
4148 var glRenderTarget: BackendRenderTarget ? by mutableStateOf(null )
4249
4350 val renderer = SampleRenderer ()
51+ val state = rememberGLCanvasState()
4452 Window (onCloseRequest = ::exitApplication, title = " Test" ) {
4553 Box (Modifier .fillMaxSize()) {
46- println (" skia layer: ${LocalWindow .current?.findSkiaLayer()} " )
4754 GLCanvas (
55+ state = state,
4856 modifier = Modifier .fillMaxSize(),
4957 onDispose = {
5058 renderer.destroy()
@@ -74,15 +82,19 @@ fun main() = application {
7482 )
7583 },
7684 ) {
77- renderer.draw()
78- glContext?.resetGLAll()
85+ glContext?.resetAll()
7986 glSurface?.canvas?.let {
8087 it.save()
8188 it.translate(50f , 200f )
82- glScene.render(it.asComposeCanvas(), 0L )
89+ glScene.render(it.asComposeCanvas(), System .nanoTime() )
8390 it.restore()
8491 }
85- glSurface?.flushAndSubmit()
92+ glSurface?.flushAndSubmit(true )
93+ glContext?.flush()
94+ glContext?.submit(true )
95+ resetGLFeatures()
96+ renderer.draw()
97+ state.requestUpdate()
8698 }
8799 Surface (
88100 shape = MaterialTheme .shapes.medium,
@@ -92,14 +104,28 @@ fun main() = application {
92104 Column (
93105 verticalArrangement = Arrangement .spacedBy(4 .dp),
94106 horizontalAlignment = Alignment .Start ,
95- modifier = Modifier .padding(8 .dp),
107+ modifier = Modifier .padding(8 .dp).width( 300 .dp) ,
96108 ) {
97109 Text (" Skia Graphics API: ${window.findSkiaLayer()?.graphicsApi()} " )
98110 Text (" Skia Version: ${Version .skia} " )
99111 Text (" Skiko Version: ${Version .skiko} " )
100112 Button (onClick = { println (" button pressed" ) }) {
101113 Text (" Button" )
102114 }
115+
116+ val display by state.displayStatistics.collectAsState()
117+ Text (" Display datapoints: ${display.frameTimes.values.size} " )
118+ Text (" Display frame time: ${display.frameTimes.median.inWholeMicroseconds / 1000.0 } ms" )
119+ Text (" Display frame time (99th): ${display.frameTimes.percentile(0.99 ).inWholeMicroseconds / 1000.0 } ms" )
120+ Text (" Display FPS: ${display.fps.median} " )
121+ Text (" Display FPS (99th): ${display.fps.percentile(0.99 , Stats .Percentile .LOWEST )} " )
122+
123+ val render by state.renderStatistics.collectAsState()
124+ Text (" Render datapoints: ${render.frameTimes.values.size} " )
125+ Text (" Render frame time: ${render.frameTimes.median.inWholeMicroseconds / 1000.0 } ms" )
126+ Text (" Render frame time (99th): ${render.frameTimes.percentile(0.99 ).inWholeMicroseconds / 1000.0 } ms" )
127+ Text (" Render FPS: ${render.fps.median} ms" )
128+ Text (" Render FPS (99th): ${render.fps.percentile(0.99 , Stats .Percentile .LOWEST )} " )
103129 }
104130 }
105131 }
0 commit comments