HumbleUI/Skija

Some path effects causing shader compilation errors on macOS

Opened this issue · 2 comments

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

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

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.