HumbleUI / Skija

Java bindings for Skia
Apache License 2.0
519 stars 34 forks source link

Some path effects causing shader compilation errors on macOS #58

Open Lappun0 opened 1 year ago

Lappun0 commented 1 year ago

I have the code from the original PathEffects demo setup in Kotlin, when I run it with some basic LWJGL code on Windows everything renders fine, but when I run it on macOS it gives me this error each frame:

Shader compilation error

1 #version 110 2
3 uniform vec4 sk_RTAdjust; 4 uniform vec2 uatlas_adjust_S0; 5 attribute vec4 fillBounds; 6 attribute vec4 color; 7 attribute vec4 locations; 8 varying vec2 vatlasCoord_S0; 9 varying vec4 vcolor_S0; 10 void main() { 11 vec2 unitCoord = vec2(float(gl_VertexID & 1), float(gl_VertexID >> 1)); 12 vec2 devCoord = mix(fillBounds.xy, fillBounds.zw, unitCoord); 13 vec2 atlasTopLeft = vec2(abs(locations.x) - 1.0, locations.y); 14 vec2 devTopLeft = locations.zw; 15 bool transposed = locations.x < 0.0; 16 vec2 atlasCoord = devCoord - devTopLeft; 17 if (transposed) { 18 atlasCoord = atlasCoord.yx; 19 } 20 atlasCoord += atlasTopLeft; 21 vatlasCoord_S0 = atlasCoord uatlas_adjust_S0; 22 vcolor_S0 = color; 23 gl_Position = vec4(devCoord, 0.0, 1.0); 24 gl_Position = vec4(gl_Position.xy sk_RTAdjust.xz + gl_Position.ww * sk_RTAdjust.yw, 0.0, gl_Position.w); 25 } 26
Errors: ERROR: 0:11: Use of undeclared identifier 'gl_VertexID' ERROR: 0:11: Use of undeclared identifier 'gl_VertexID' ERROR: 0:12: Use of undeclared identifier 'unitCoord' ERROR: 0:16: Use of undeclared identifier 'devCoord' ERROR: 0:18: Use of undeclared identifier 'atlasCoord' ERROR: 0:18: Use of undeclared identifier 'atlasCoord' ERROR: 0:20: Use of undeclared identifier 'atlasCoord' ERROR: 0:21: Use of undeclared identifier 'atlasCoord' ERROR: 0:23: Use of undeclared identifier 'devCoord'

here is my draw code:

var x = 20f
var y = 20f

Path().moveTo(-5f, -3f).lineTo(5f, 0f).lineTo(-5f, 3f).closePath().use { pattern ->
    Path().lineTo(10f, 0f).lineTo(10f, 1f).lineTo(0f, 1f).closePath().use { dash ->
        Paint().setColor(0x20457b9d).setMode(PaintMode.STROKE).setStrokeWidth(1f).use { stroke ->
            Paint().setColor(-0x1890af).setMode(PaintMode.STROKE).setStrokeWidth(1f).use { fill ->
                Path().moveTo(100f, 10f).lineTo(190f, 190f).lineTo(10f, 190f).closePath().use { figure ->
                    val offset = 1f - System.currentTimeMillis() % 1000 / 1000f
                    val effects = arrayOf(
                        PathEffect.makePath1D(pattern, 10f, 10 * offset, PathEffect.Style.TRANSLATE),
                        PathEffect.makePath1D(pattern, 20f, 20 * offset, PathEffect.Style.TRANSLATE),
                        PathEffect.makePath1D(pattern, 20f, 20 * offset, PathEffect.Style.ROTATE),
                        PathEffect.makePath1D(pattern, 20f, 20 * offset, PathEffect.Style.MORPH)
                            .makeCompose(PathEffect.makeCorner(50f)),
                        PathEffect.makePath1D(dash, 15f, 15 * offset, PathEffect.Style.MORPH),
                        PathEffect.makePath2D(Matrix33.makeScale(15f), pattern),
                        PathEffect.makeLine2D(1f, Matrix33.makeScale(3f, 3f)),
                        PathEffect.makeLine2D(1f, Matrix33.makeScale(3f, 3f).makeConcat(Matrix33.makeRotate(30f))),
                        PathEffect.makeCorner(10f),
                        PathEffect.makeCorner(30f),
                        PathEffect.makeDash(floatArrayOf(10f, 10f), 20 * offset),
                        PathEffect.makeDash(floatArrayOf(10f, 5f), 15 * offset),
                        PathEffect.makeDash(floatArrayOf(10f, 5f, 2f, 5f), 22 * offset),
                        PathEffect.makeDiscrete(5f, 2f, (System.currentTimeMillis() / 32).toInt()),
                        PathEffect.makeDash(floatArrayOf(10f, 5f, 2f, 5f), 22 * offset)
                            .makeCompose(PathEffect.makeCorner(50f)),
                        PathEffect.makeDash(floatArrayOf(10f, 5f, 2f, 5f), 22 * offset)
                            .makeSum(PathEffect.makeCorner(50f)),
                    )
                    for (effect in effects) {
                        if (x > 0f && x + 200f > width) {
                            x = 0f
                            y += 200f
                        }
                        canvas!!.save()
                        canvas!!.translate(x.toFloat(), y.toFloat())
                        canvas!!.drawPath(figure, stroke)
                        fill.setPathEffect(effect)
                        canvas!!.drawPath(figure, fill)
                        fill.setPathEffect(null)
                        effect.close()
                        canvas!!.restore()
                        x += 200
                    }
                }
            }
        }
    }
}

When no drawing (or only basic drawing) Is done before the path effects are drawn, only the first five fail to be drawn. However if I place this code after the rest of my scene is drawn, all effects fail.

This happens on the latest version (0.109.2)

tonsky commented 1 year ago

Maybe ask at Skia? https://groups.google.com/g/skia-discuss/ I’m not sure in what state their OpenGL / macOS version is right now, given that Apple deprecated OpenGL a while ago Also, try 0.116.1, it’s been out for a few days :)

Lappun0 commented 1 year ago

Whoops, While writing I figured id try with the newest version, but it seems that I accidentally wrote the one I was using before in, this happens on 0.116.1 too.