Bug 227723

Summary: WebGL shader link error in iOS 15 beta: "Internal error compiling shader with Metal backend"
Product: WebKit Reporter: Mike Turitzin <mturitzin>
Component: WebGLAssignee: Kyle Piddington <kpiddington>
Severity: Normal CC: dino, ews-watchlist, kbr, kkinnunen, kondapallykalyan, kpiddington, webkit-bug-importer
Priority: P2 Keywords: InRadar
Version: Safari Technology Preview   
Hardware: iPhone / iPad   
OS: Other   
See Also: https://bugs.webkit.org/show_bug.cgi?id=229050
Description Flags
Patch for landing none

Description Mike Turitzin 2021-07-06 15:01:26 PDT
We are seeing this error (which is new in the iOS 15 beta) when linking some shader programs used by Figma's prototype viewer. I have personally repro'ed it on an iPad running iOS 15 (19A5281j). Shaders that previously compiled and linked without issue now fail when linking with this `getProgramInfoLog` message: 

  "Internal error compiling shader with Metal backend. Please submit this shader, or website as a bug to https://bugs.webkit.org"

I have put together a minimal repro that appears to demonstrate the issue is with usage of the comma operator (see repro steps below). (We have a shader minifier that in some cases replaces semicolons with commas.) I believe the usage below is valid GLSL syntax, and it does compile and link properly on prior versions of Safari and other browsers.

Steps to Reproduce:

1. Run the following Javascript in Safari on iOS 15:
(JSFiddle link: https://jsfiddle.net/9p1f3t5r/2/ )

const VERTEX_SHADER_SOURCE = "void f(vec2 a) {} void main() { f(vec2(0.)), gl_Position = vec4(0.,0.,0.,1.); }";
// Vertex shader with comma (in main()) changed to semicolon.
//const VERTEX_SHADER_SOURCE = "void f(vec2 a) {} void main() { f(vec2(0.)); gl_Position = vec4(0.,0.,0.,1.); }";
const FRAGMENT_SHADER_SOURCE = "void main() { gl_FragColor = vec4(0.); }";

const log = (msg) => {
	document.body.innerHTML += "<p>" + msg + "</p>";

const canvas = document.createElement("canvas");
const gl = canvas.getContext("webgl");

const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.shaderSource(vertexShader, VERTEX_SHADER_SOURCE);
if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) {
	log("error compiling vertex shader: " + gl.getShaderInfoLog(vertexShader));

const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
gl.shaderSource(fragmentShader, FRAGMENT_SHADER_SOURCE);
if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) {
	log("error compiling fragment shader: " + gl.getShaderInfoLog(fragmentShader));

const program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
	log("error linking program: " + gl.getProgramInfoLog(program));


Expected Results:

The shader program compiles/links without error.

Actual Results:

This error is logged when linking the program: "Internal error compiling shader with Metal backend. Please submit this shader, or website as a bug to https://bugs.webkit.org".

An alternate version of the vertex shader with the usage of the comma operator in `main` replaced with a semicolon is included (commented out) in the repro code above. This change to the vertex shader causes the shader to compile/link without error.
Comment 1 Radar WebKit Bug Importer 2021-07-06 15:13:10 PDT
Comment 2 Kyle Piddington 2021-07-06 16:19:40 PDT
Created attachment 432985 [details]
Comment 3 EWS Watchlist 2021-07-06 16:20:54 PDT
Note that there are important steps to take when updating ANGLE. See https://trac.webkit.org/wiki/UpdatingANGLE
Comment 4 Dean Jackson 2021-07-06 18:14:27 PDT
Comment on attachment 432985 [details]

Can we include a test?
Comment 5 Kyle Piddington 2021-07-07 12:03:30 PDT
Created attachment 433058 [details]
Patch for landing
Comment 6 EWS 2021-07-07 12:35:49 PDT
Committed r279656 (239469@main): <https://commits.webkit.org/239469@main>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 433058 [details].
Comment 7 Kenneth Russell 2021-07-09 14:25:00 PDT
Note: filed https://github.com/KhronosGroup/WebGL/issues/3299 about upstreaming this test case to the WebGL conformance suite.