Skip to content

Some path effects causing shader compilation errors on macOS #58

@Lappun0

Description

@Lappun0

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions