<!--Copyright (c) 2019 The Khronos Group Inc.Use of this source code is governed by an MIT-style license that can befound in the LICENSE.txt file.--><!DOCTYPE html><html><head><metacharset="utf-8"><title>GLSL array in complex expression test</title><linkrel="stylesheet"href="../../resources/js-test-style.css"/><scriptsrc="../../js/js-test-pre.js"></script><scriptsrc="../../js/webgl-test-utils.js"></script><scriptsrc="../../js/glsl-conformance-test.js"></script></head><body><divid="description"></div><divid="console"></div><scriptid="fshaderAndShortCircuits"type="x-shader/x-fragment">#version300esprecisionmediumpfloat;outvec4my_FragColor;intg=0;int[2]plus(){++g;returnint[2](g,g);}boolminus(){--g;returnfalse;}voidmain(){inta[2]=int[2](0,0);// The function call must not be evaluated, since && short-circuitsminus()&&(a==plus());my_FragColor=vec4(0.0,((g==-1)?1.0:0.0),0.0,1.0);}</script><scriptid="fshaderOrShortCircuits"type="x-shader/x-fragment">#version300esprecisionmediumpfloat;outvec4my_FragColor;intg=0;int[2]plus(){++g;returnint[2](g,g);}boolminus(){--g;returntrue;}voidmain(){inta[2]=int[2](0,0);// The function call must not be evaluated, since || short-circuits.minus()||(a==plus());my_FragColor=vec4(0.0,((g==-1)?1.0:0.0),0.0,1.0);}</script><scriptid="fshaderTernaryOnlyEvaluatesOneOperand"type="x-shader/x-fragment">#version300esprecisionmediumpfloat;outvec4my_FragColor;intg=0;int[2]plus(){++g;returnint[2](g,g);}voidmain(){inta[2]=int[2](0,0);// The function call must not be evaluated, since the condition is true.(g==0)?true:(a==plus());my_FragColor=vec4(0.0,((g==0)?1.0:0.0),0.0,1.0);}</script><scriptid="fshaderSequenceSideEffectsAffectingComparedArrayContent"type="x-shader/x-fragment">#version300esprecisionmediumpfloat;outvec4my_FragColor;int[2]func(intparam){returnint[2](param,param);}voidmain(){inta[2];for(inti=0;i<2;++i){a[i]=1;}intj=0;// Sequence operator evaluates operands from left to right (ESSL 3.00 section 5.9).// The function call that returns the array needs to be evaluated after ++j// for the expression to return the correct value (true).boolresult=((++j),(a==func(j)));my_FragColor=vec4(0.0,(result?1.0:0.0),0.0,1.0);}</script><scripttype="application/javascript">"use strict";description("Arrays in complex expressions should work");debug("");debug("This test is targeted to stress syntax tree transformations that might need to be done in shader translation when the platform doesn't natively support arrays as return values.");GLSLConformanceTester.runRenderTests([{fShaderId:'fshaderAndShortCircuits',fShaderSuccess:true,linkSuccess:true,passMsg:"Expression where an array is returned from a function call inside an operand to && that doesn't get evaluated as result of short-circuiting"},{fShaderId:'fshaderOrShortCircuits',fShaderSuccess:true,linkSuccess:true,passMsg:"Expression where an array is returned from a function call inside an operand to || that doesn't get evaluated as result of short-circuiting"},{fShaderId:'fshaderTernaryOnlyEvaluatesOneOperand',fShaderSuccess:true,linkSuccess:true,passMsg:"Expression where an array is returned from a function call in an operand of a ternary operator that doesn't get evaluated"},{fShaderId:'fshaderSequenceSideEffectsAffectingComparedArrayContent',fShaderSuccess:true,linkSuccess:true,passMsg:'Expression where first operand of a sequence operator has side effects which affect the second operand that returns an array'}],2);</script></body></html>