Initialize.cpp 479 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460
  1. //
  2. // Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
  3. // Copyright (C) 2012-2016 LunarG, Inc.
  4. // Copyright (C) 2015-2020 Google, Inc.
  5. // Copyright (C) 2017 ARM Limited.
  6. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
  7. //
  8. // All rights reserved.
  9. //
  10. // Redistribution and use in source and binary forms, with or without
  11. // modification, are permitted provided that the following conditions
  12. // are met:
  13. //
  14. // Redistributions of source code must retain the above copyright
  15. // notice, this list of conditions and the following disclaimer.
  16. //
  17. // Redistributions in binary form must reproduce the above
  18. // copyright notice, this list of conditions and the following
  19. // disclaimer in the documentation and/or other materials provided
  20. // with the distribution.
  21. //
  22. // Neither the name of 3Dlabs Inc. Ltd. nor the names of its
  23. // contributors may be used to endorse or promote products derived
  24. // from this software without specific prior written permission.
  25. //
  26. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  27. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  28. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  29. // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
  30. // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
  31. // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
  32. // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  33. // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  34. // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  35. // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
  36. // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  37. // POSSIBILITY OF SUCH DAMAGE.
  38. //
  39. //
  40. // Create strings that declare built-in definitions, add built-ins programmatically
  41. // that cannot be expressed in the strings, and establish mappings between
  42. // built-in functions and operators.
  43. //
  44. // Where to put a built-in:
  45. // TBuiltIns::initialize(version,profile) context-independent textual built-ins; add them to the right string
  46. // TBuiltIns::initialize(resources,...) context-dependent textual built-ins; add them to the right string
  47. // TBuiltIns::identifyBuiltIns(...,symbolTable) context-independent programmatic additions/mappings to the symbol table,
  48. // including identifying what extensions are needed if a version does not allow a symbol
  49. // TBuiltIns::identifyBuiltIns(...,symbolTable, resources) context-dependent programmatic additions/mappings to the symbol table,
  50. // including identifying what extensions are needed if a version does not allow a symbol
  51. //
  52. #include "../Include/intermediate.h"
  53. #include "Initialize.h"
  54. namespace glslang {
  55. // TODO: ARB_Compatability: do full extension support
  56. const bool ARBCompatibility = true;
  57. const bool ForwardCompatibility = false;
  58. // change this back to false if depending on textual spellings of texturing calls when consuming the AST
  59. // Using PureOperatorBuiltins=false is deprecated.
  60. bool PureOperatorBuiltins = true;
  61. namespace {
  62. //
  63. // A set of definitions for tabling of the built-in functions.
  64. //
  65. // Order matters here, as does correlation with the subsequent
  66. // "const int ..." declarations and the ArgType enumerants.
  67. const char* TypeString[] = {
  68. "bool", "bvec2", "bvec3", "bvec4",
  69. "float", "vec2", "vec3", "vec4",
  70. "int", "ivec2", "ivec3", "ivec4",
  71. "uint", "uvec2", "uvec3", "uvec4",
  72. };
  73. const int TypeStringCount = sizeof(TypeString) / sizeof(char*); // number of entries in 'TypeString'
  74. const int TypeStringRowShift = 2; // shift amount to go downe one row in 'TypeString'
  75. const int TypeStringColumnMask = (1 << TypeStringRowShift) - 1; // reduce type to its column number in 'TypeString'
  76. const int TypeStringScalarMask = ~TypeStringColumnMask; // take type to its scalar column in 'TypeString'
  77. enum ArgType {
  78. // numbers hardcoded to correspond to 'TypeString'; order and value matter
  79. TypeB = 1 << 0, // Boolean
  80. TypeF = 1 << 1, // float 32
  81. TypeI = 1 << 2, // int 32
  82. TypeU = 1 << 3, // uint 32
  83. TypeF16 = 1 << 4, // float 16
  84. TypeF64 = 1 << 5, // float 64
  85. TypeI8 = 1 << 6, // int 8
  86. TypeI16 = 1 << 7, // int 16
  87. TypeI64 = 1 << 8, // int 64
  88. TypeU8 = 1 << 9, // uint 8
  89. TypeU16 = 1 << 10, // uint 16
  90. TypeU64 = 1 << 11, // uint 64
  91. };
  92. // Mixtures of the above, to help the function tables
  93. const ArgType TypeFI = static_cast<ArgType>(TypeF | TypeI);
  94. const ArgType TypeFIB = static_cast<ArgType>(TypeF | TypeI | TypeB);
  95. const ArgType TypeIU = static_cast<ArgType>(TypeI | TypeU);
  96. // The relationships between arguments and return type, whether anything is
  97. // output, or other unusual situations.
  98. enum ArgClass {
  99. ClassRegular = 0, // nothing special, just all vector widths with matching return type; traditional arithmetic
  100. ClassLS = 1 << 0, // the last argument is also held fixed as a (type-matched) scalar while the others cycle
  101. ClassXLS = 1 << 1, // the last argument is exclusively a (type-matched) scalar while the others cycle
  102. ClassLS2 = 1 << 2, // the last two arguments are held fixed as a (type-matched) scalar while the others cycle
  103. ClassFS = 1 << 3, // the first argument is held fixed as a (type-matched) scalar while the others cycle
  104. ClassFS2 = 1 << 4, // the first two arguments are held fixed as a (type-matched) scalar while the others cycle
  105. ClassLO = 1 << 5, // the last argument is an output
  106. ClassB = 1 << 6, // return type cycles through only bool/bvec, matching vector width of args
  107. ClassLB = 1 << 7, // last argument cycles through only bool/bvec, matching vector width of args
  108. ClassV1 = 1 << 8, // scalar only
  109. ClassFIO = 1 << 9, // first argument is inout
  110. ClassRS = 1 << 10, // the return is held scalar as the arguments cycle
  111. ClassNS = 1 << 11, // no scalar prototype
  112. ClassCV = 1 << 12, // first argument is 'coherent volatile'
  113. ClassFO = 1 << 13, // first argument is output
  114. ClassV3 = 1 << 14, // vec3 only
  115. };
  116. // Mixtures of the above, to help the function tables
  117. const ArgClass ClassV1FIOCV = (ArgClass)(ClassV1 | ClassFIO | ClassCV);
  118. const ArgClass ClassBNS = (ArgClass)(ClassB | ClassNS);
  119. const ArgClass ClassRSNS = (ArgClass)(ClassRS | ClassNS);
  120. // A descriptor, for a single profile, of when something is available.
  121. // If the current profile does not match 'profile' mask below, the other fields
  122. // do not apply (nor validate).
  123. // profiles == EBadProfile is the end of an array of these
  124. struct Versioning {
  125. EProfile profiles; // the profile(s) (mask) that the following fields are valid for
  126. int minExtendedVersion; // earliest version when extensions are enabled; ignored if numExtensions is 0
  127. int minCoreVersion; // earliest version function is in core; 0 means never
  128. int numExtensions; // how many extensions are in the 'extensions' list
  129. const char** extensions; // list of extension names enabling the function
  130. };
  131. EProfile EDesktopProfile = static_cast<EProfile>(ENoProfile | ECoreProfile | ECompatibilityProfile);
  132. // Declare pointers to put into the table for versioning.
  133. #ifdef GLSLANG_WEB
  134. const Versioning* Es300Desktop130 = nullptr;
  135. const Versioning* Es310Desktop420 = nullptr;
  136. #elif defined(GLSLANG_ANGLE)
  137. const Versioning* Es300Desktop130 = nullptr;
  138. const Versioning* Es310Desktop420 = nullptr;
  139. const Versioning* Es310Desktop450 = nullptr;
  140. #else
  141. const Versioning Es300Desktop130Version[] = { { EEsProfile, 0, 300, 0, nullptr },
  142. { EDesktopProfile, 0, 130, 0, nullptr },
  143. { EBadProfile } };
  144. const Versioning* Es300Desktop130 = &Es300Desktop130Version[0];
  145. const Versioning Es310Desktop420Version[] = { { EEsProfile, 0, 310, 0, nullptr },
  146. { EDesktopProfile, 0, 420, 0, nullptr },
  147. { EBadProfile } };
  148. const Versioning* Es310Desktop420 = &Es310Desktop420Version[0];
  149. const Versioning Es310Desktop450Version[] = { { EEsProfile, 0, 310, 0, nullptr },
  150. { EDesktopProfile, 0, 450, 0, nullptr },
  151. { EBadProfile } };
  152. const Versioning* Es310Desktop450 = &Es310Desktop450Version[0];
  153. #endif
  154. // The main descriptor of what a set of function prototypes can look like, and
  155. // a pointer to extra versioning information, when needed.
  156. struct BuiltInFunction {
  157. TOperator op; // operator to map the name to
  158. const char* name; // function name
  159. int numArguments; // number of arguments (overloads with varying arguments need different entries)
  160. ArgType types; // ArgType mask
  161. ArgClass classes; // the ways this particular function entry manifests
  162. const Versioning* versioning; // nullptr means always a valid version
  163. };
  164. // The tables can have the same built-in function name more than one time,
  165. // but the exact same prototype must be indicated at most once.
  166. // The prototypes that get declared are the union of all those indicated.
  167. // This is important when different releases add new prototypes for the same name.
  168. // It also also congnitively simpler tiling of the prototype space.
  169. // In practice, most names can be fully represented with one entry.
  170. //
  171. // Table is terminated by an OpNull TOperator.
  172. const BuiltInFunction BaseFunctions[] = {
  173. // TOperator, name, arg-count, ArgType, ArgClass, versioning
  174. // --------- ---- --------- ------- -------- ----------
  175. { EOpRadians, "radians", 1, TypeF, ClassRegular, nullptr },
  176. { EOpDegrees, "degrees", 1, TypeF, ClassRegular, nullptr },
  177. { EOpSin, "sin", 1, TypeF, ClassRegular, nullptr },
  178. { EOpCos, "cos", 1, TypeF, ClassRegular, nullptr },
  179. { EOpTan, "tan", 1, TypeF, ClassRegular, nullptr },
  180. { EOpAsin, "asin", 1, TypeF, ClassRegular, nullptr },
  181. { EOpAcos, "acos", 1, TypeF, ClassRegular, nullptr },
  182. { EOpAtan, "atan", 2, TypeF, ClassRegular, nullptr },
  183. { EOpAtan, "atan", 1, TypeF, ClassRegular, nullptr },
  184. { EOpPow, "pow", 2, TypeF, ClassRegular, nullptr },
  185. { EOpExp, "exp", 1, TypeF, ClassRegular, nullptr },
  186. { EOpLog, "log", 1, TypeF, ClassRegular, nullptr },
  187. { EOpExp2, "exp2", 1, TypeF, ClassRegular, nullptr },
  188. { EOpLog2, "log2", 1, TypeF, ClassRegular, nullptr },
  189. { EOpSqrt, "sqrt", 1, TypeF, ClassRegular, nullptr },
  190. { EOpInverseSqrt, "inversesqrt", 1, TypeF, ClassRegular, nullptr },
  191. { EOpAbs, "abs", 1, TypeF, ClassRegular, nullptr },
  192. { EOpSign, "sign", 1, TypeF, ClassRegular, nullptr },
  193. { EOpFloor, "floor", 1, TypeF, ClassRegular, nullptr },
  194. { EOpCeil, "ceil", 1, TypeF, ClassRegular, nullptr },
  195. { EOpFract, "fract", 1, TypeF, ClassRegular, nullptr },
  196. { EOpMod, "mod", 2, TypeF, ClassLS, nullptr },
  197. { EOpMin, "min", 2, TypeF, ClassLS, nullptr },
  198. { EOpMax, "max", 2, TypeF, ClassLS, nullptr },
  199. { EOpClamp, "clamp", 3, TypeF, ClassLS2, nullptr },
  200. { EOpMix, "mix", 3, TypeF, ClassLS, nullptr },
  201. { EOpStep, "step", 2, TypeF, ClassFS, nullptr },
  202. { EOpSmoothStep, "smoothstep", 3, TypeF, ClassFS2, nullptr },
  203. { EOpNormalize, "normalize", 1, TypeF, ClassRegular, nullptr },
  204. { EOpFaceForward, "faceforward", 3, TypeF, ClassRegular, nullptr },
  205. { EOpReflect, "reflect", 2, TypeF, ClassRegular, nullptr },
  206. { EOpRefract, "refract", 3, TypeF, ClassXLS, nullptr },
  207. { EOpLength, "length", 1, TypeF, ClassRS, nullptr },
  208. { EOpDistance, "distance", 2, TypeF, ClassRS, nullptr },
  209. { EOpDot, "dot", 2, TypeF, ClassRS, nullptr },
  210. { EOpCross, "cross", 2, TypeF, ClassV3, nullptr },
  211. { EOpLessThan, "lessThan", 2, TypeFI, ClassBNS, nullptr },
  212. { EOpLessThanEqual, "lessThanEqual", 2, TypeFI, ClassBNS, nullptr },
  213. { EOpGreaterThan, "greaterThan", 2, TypeFI, ClassBNS, nullptr },
  214. { EOpGreaterThanEqual, "greaterThanEqual", 2, TypeFI, ClassBNS, nullptr },
  215. { EOpVectorEqual, "equal", 2, TypeFIB, ClassBNS, nullptr },
  216. { EOpVectorNotEqual, "notEqual", 2, TypeFIB, ClassBNS, nullptr },
  217. { EOpAny, "any", 1, TypeB, ClassRSNS, nullptr },
  218. { EOpAll, "all", 1, TypeB, ClassRSNS, nullptr },
  219. { EOpVectorLogicalNot, "not", 1, TypeB, ClassNS, nullptr },
  220. { EOpSinh, "sinh", 1, TypeF, ClassRegular, Es300Desktop130 },
  221. { EOpCosh, "cosh", 1, TypeF, ClassRegular, Es300Desktop130 },
  222. { EOpTanh, "tanh", 1, TypeF, ClassRegular, Es300Desktop130 },
  223. { EOpAsinh, "asinh", 1, TypeF, ClassRegular, Es300Desktop130 },
  224. { EOpAcosh, "acosh", 1, TypeF, ClassRegular, Es300Desktop130 },
  225. { EOpAtanh, "atanh", 1, TypeF, ClassRegular, Es300Desktop130 },
  226. { EOpAbs, "abs", 1, TypeI, ClassRegular, Es300Desktop130 },
  227. { EOpSign, "sign", 1, TypeI, ClassRegular, Es300Desktop130 },
  228. { EOpTrunc, "trunc", 1, TypeF, ClassRegular, Es300Desktop130 },
  229. { EOpRound, "round", 1, TypeF, ClassRegular, Es300Desktop130 },
  230. { EOpRoundEven, "roundEven", 1, TypeF, ClassRegular, Es300Desktop130 },
  231. { EOpModf, "modf", 2, TypeF, ClassLO, Es300Desktop130 },
  232. { EOpMin, "min", 2, TypeIU, ClassLS, Es300Desktop130 },
  233. { EOpMax, "max", 2, TypeIU, ClassLS, Es300Desktop130 },
  234. { EOpClamp, "clamp", 3, TypeIU, ClassLS2, Es300Desktop130 },
  235. { EOpMix, "mix", 3, TypeF, ClassLB, Es300Desktop130 },
  236. { EOpIsInf, "isinf", 1, TypeF, ClassB, Es300Desktop130 },
  237. { EOpIsNan, "isnan", 1, TypeF, ClassB, Es300Desktop130 },
  238. { EOpLessThan, "lessThan", 2, TypeU, ClassBNS, Es300Desktop130 },
  239. { EOpLessThanEqual, "lessThanEqual", 2, TypeU, ClassBNS, Es300Desktop130 },
  240. { EOpGreaterThan, "greaterThan", 2, TypeU, ClassBNS, Es300Desktop130 },
  241. { EOpGreaterThanEqual, "greaterThanEqual", 2, TypeU, ClassBNS, Es300Desktop130 },
  242. { EOpVectorEqual, "equal", 2, TypeU, ClassBNS, Es300Desktop130 },
  243. { EOpVectorNotEqual, "notEqual", 2, TypeU, ClassBNS, Es300Desktop130 },
  244. { EOpAtomicAdd, "atomicAdd", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  245. { EOpAtomicMin, "atomicMin", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  246. { EOpAtomicMax, "atomicMax", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  247. { EOpAtomicAnd, "atomicAnd", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  248. { EOpAtomicOr, "atomicOr", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  249. { EOpAtomicXor, "atomicXor", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  250. { EOpAtomicExchange, "atomicExchange", 2, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  251. { EOpAtomicCompSwap, "atomicCompSwap", 3, TypeIU, ClassV1FIOCV, Es310Desktop420 },
  252. #ifndef GLSLANG_WEB
  253. { EOpMix, "mix", 3, TypeB, ClassRegular, Es310Desktop450 },
  254. { EOpMix, "mix", 3, TypeIU, ClassLB, Es310Desktop450 },
  255. #endif
  256. { EOpNull }
  257. };
  258. const BuiltInFunction DerivativeFunctions[] = {
  259. { EOpDPdx, "dFdx", 1, TypeF, ClassRegular, nullptr },
  260. { EOpDPdy, "dFdy", 1, TypeF, ClassRegular, nullptr },
  261. { EOpFwidth, "fwidth", 1, TypeF, ClassRegular, nullptr },
  262. { EOpNull }
  263. };
  264. // For functions declared some other way, but still use the table to relate to operator.
  265. struct CustomFunction {
  266. TOperator op; // operator to map the name to
  267. const char* name; // function name
  268. const Versioning* versioning; // nullptr means always a valid version
  269. };
  270. const CustomFunction CustomFunctions[] = {
  271. { EOpBarrier, "barrier", nullptr },
  272. { EOpMemoryBarrierShared, "memoryBarrierShared", nullptr },
  273. { EOpGroupMemoryBarrier, "groupMemoryBarrier", nullptr },
  274. { EOpMemoryBarrier, "memoryBarrier", nullptr },
  275. { EOpMemoryBarrierBuffer, "memoryBarrierBuffer", nullptr },
  276. { EOpPackSnorm2x16, "packSnorm2x16", nullptr },
  277. { EOpUnpackSnorm2x16, "unpackSnorm2x16", nullptr },
  278. { EOpPackUnorm2x16, "packUnorm2x16", nullptr },
  279. { EOpUnpackUnorm2x16, "unpackUnorm2x16", nullptr },
  280. { EOpPackHalf2x16, "packHalf2x16", nullptr },
  281. { EOpUnpackHalf2x16, "unpackHalf2x16", nullptr },
  282. { EOpMul, "matrixCompMult", nullptr },
  283. { EOpOuterProduct, "outerProduct", nullptr },
  284. { EOpTranspose, "transpose", nullptr },
  285. { EOpDeterminant, "determinant", nullptr },
  286. { EOpMatrixInverse, "inverse", nullptr },
  287. { EOpFloatBitsToInt, "floatBitsToInt", nullptr },
  288. { EOpFloatBitsToUint, "floatBitsToUint", nullptr },
  289. { EOpIntBitsToFloat, "intBitsToFloat", nullptr },
  290. { EOpUintBitsToFloat, "uintBitsToFloat", nullptr },
  291. { EOpTextureQuerySize, "textureSize", nullptr },
  292. { EOpTextureQueryLod, "textureQueryLod", nullptr },
  293. { EOpTextureQueryLevels, "textureQueryLevels", nullptr },
  294. { EOpTextureQuerySamples, "textureSamples", nullptr },
  295. { EOpTexture, "texture", nullptr },
  296. { EOpTextureProj, "textureProj", nullptr },
  297. { EOpTextureLod, "textureLod", nullptr },
  298. { EOpTextureOffset, "textureOffset", nullptr },
  299. { EOpTextureFetch, "texelFetch", nullptr },
  300. { EOpTextureFetchOffset, "texelFetchOffset", nullptr },
  301. { EOpTextureProjOffset, "textureProjOffset", nullptr },
  302. { EOpTextureLodOffset, "textureLodOffset", nullptr },
  303. { EOpTextureProjLod, "textureProjLod", nullptr },
  304. { EOpTextureProjLodOffset, "textureProjLodOffset", nullptr },
  305. { EOpTextureGrad, "textureGrad", nullptr },
  306. { EOpTextureGradOffset, "textureGradOffset", nullptr },
  307. { EOpTextureProjGrad, "textureProjGrad", nullptr },
  308. { EOpTextureProjGradOffset, "textureProjGradOffset", nullptr },
  309. { EOpNull }
  310. };
  311. // For the given table of functions, add all the indicated prototypes for each
  312. // one, to be returned in the passed in decls.
  313. void AddTabledBuiltin(TString& decls, const BuiltInFunction& function)
  314. {
  315. const auto isScalarType = [](int type) { return (type & TypeStringColumnMask) == 0; };
  316. // loop across these two:
  317. // 0: the varying arg set, and
  318. // 1: the fixed scalar args
  319. const ArgClass ClassFixed = (ArgClass)(ClassLS | ClassXLS | ClassLS2 | ClassFS | ClassFS2);
  320. for (int fixed = 0; fixed < ((function.classes & ClassFixed) > 0 ? 2 : 1); ++fixed) {
  321. if (fixed == 0 && (function.classes & ClassXLS))
  322. continue;
  323. // walk the type strings in TypeString[]
  324. for (int type = 0; type < TypeStringCount; ++type) {
  325. // skip types not selected: go from type to row number to type bit
  326. if ((function.types & (1 << (type >> TypeStringRowShift))) == 0)
  327. continue;
  328. // if we aren't on a scalar, and should be, skip
  329. if ((function.classes & ClassV1) && !isScalarType(type))
  330. continue;
  331. // if we aren't on a 3-vector, and should be, skip
  332. if ((function.classes & ClassV3) && (type & TypeStringColumnMask) != 2)
  333. continue;
  334. // skip replication of all arg scalars between the varying arg set and the fixed args
  335. if (fixed == 1 && type == (type & TypeStringScalarMask) && (function.classes & ClassXLS) == 0)
  336. continue;
  337. // skip scalars when we are told to
  338. if ((function.classes & ClassNS) && isScalarType(type))
  339. continue;
  340. // return type
  341. if (function.classes & ClassB)
  342. decls.append(TypeString[type & TypeStringColumnMask]);
  343. else if (function.classes & ClassRS)
  344. decls.append(TypeString[type & TypeStringScalarMask]);
  345. else
  346. decls.append(TypeString[type]);
  347. decls.append(" ");
  348. decls.append(function.name);
  349. decls.append("(");
  350. // arguments
  351. for (int arg = 0; arg < function.numArguments; ++arg) {
  352. if (arg == function.numArguments - 1 && (function.classes & ClassLO))
  353. decls.append("out ");
  354. if (arg == 0) {
  355. #ifndef GLSLANG_WEB
  356. if (function.classes & ClassCV)
  357. decls.append("coherent volatile ");
  358. #endif
  359. if (function.classes & ClassFIO)
  360. decls.append("inout ");
  361. if (function.classes & ClassFO)
  362. decls.append("out ");
  363. }
  364. if ((function.classes & ClassLB) && arg == function.numArguments - 1)
  365. decls.append(TypeString[type & TypeStringColumnMask]);
  366. else if (fixed && ((arg == function.numArguments - 1 && (function.classes & (ClassLS | ClassXLS |
  367. ClassLS2))) ||
  368. (arg == function.numArguments - 2 && (function.classes & ClassLS2)) ||
  369. (arg == 0 && (function.classes & (ClassFS | ClassFS2))) ||
  370. (arg == 1 && (function.classes & ClassFS2))))
  371. decls.append(TypeString[type & TypeStringScalarMask]);
  372. else
  373. decls.append(TypeString[type]);
  374. if (arg < function.numArguments - 1)
  375. decls.append(",");
  376. }
  377. decls.append(");\n");
  378. }
  379. }
  380. }
  381. // See if the tabled versioning information allows the current version.
  382. bool ValidVersion(const BuiltInFunction& function, int version, EProfile profile, const SpvVersion& /* spVersion */)
  383. {
  384. #if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
  385. // all entries in table are valid
  386. return true;
  387. #endif
  388. // nullptr means always valid
  389. if (function.versioning == nullptr)
  390. return true;
  391. // check for what is said about our current profile
  392. for (const Versioning* v = function.versioning; v->profiles != EBadProfile; ++v) {
  393. if ((v->profiles & profile) != 0) {
  394. if (v->minCoreVersion <= version || (v->numExtensions > 0 && v->minExtendedVersion <= version))
  395. return true;
  396. }
  397. }
  398. return false;
  399. }
  400. // Relate a single table of built-ins to their AST operator.
  401. // This can get called redundantly (especially for the common built-ins, when
  402. // called once per stage). This is a performance issue only, not a correctness
  403. // concern. It is done for quality arising from simplicity, as there are subtleties
  404. // to get correct if instead trying to do it surgically.
  405. template<class FunctionT>
  406. void RelateTabledBuiltins(const FunctionT* functions, TSymbolTable& symbolTable)
  407. {
  408. while (functions->op != EOpNull) {
  409. symbolTable.relateToOperator(functions->name, functions->op);
  410. ++functions;
  411. }
  412. }
  413. } // end anonymous namespace
  414. // Add declarations for all tables of built-in functions.
  415. void TBuiltIns::addTabledBuiltins(int version, EProfile profile, const SpvVersion& spvVersion)
  416. {
  417. const auto forEachFunction = [&](TString& decls, const BuiltInFunction* function) {
  418. while (function->op != EOpNull) {
  419. if (ValidVersion(*function, version, profile, spvVersion))
  420. AddTabledBuiltin(decls, *function);
  421. ++function;
  422. }
  423. };
  424. forEachFunction(commonBuiltins, BaseFunctions);
  425. forEachFunction(stageBuiltins[EShLangFragment], DerivativeFunctions);
  426. if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450))
  427. forEachFunction(stageBuiltins[EShLangCompute], DerivativeFunctions);
  428. }
  429. // Relate all tables of built-ins to the AST operators.
  430. void TBuiltIns::relateTabledBuiltins(int /* version */, EProfile /* profile */, const SpvVersion& /* spvVersion */, EShLanguage /* stage */, TSymbolTable& symbolTable)
  431. {
  432. RelateTabledBuiltins(BaseFunctions, symbolTable);
  433. RelateTabledBuiltins(DerivativeFunctions, symbolTable);
  434. RelateTabledBuiltins(CustomFunctions, symbolTable);
  435. }
  436. inline bool IncludeLegacy(int version, EProfile profile, const SpvVersion& spvVersion)
  437. {
  438. return profile != EEsProfile && (version <= 130 || (spvVersion.spv == 0 && ARBCompatibility) || profile == ECompatibilityProfile);
  439. }
  440. // Construct TBuiltInParseables base class. This can be used for language-common constructs.
  441. TBuiltInParseables::TBuiltInParseables()
  442. {
  443. }
  444. // Destroy TBuiltInParseables.
  445. TBuiltInParseables::~TBuiltInParseables()
  446. {
  447. }
  448. TBuiltIns::TBuiltIns()
  449. {
  450. // Set up textual representations for making all the permutations
  451. // of texturing/imaging functions.
  452. prefixes[EbtFloat] = "";
  453. prefixes[EbtInt] = "i";
  454. prefixes[EbtUint] = "u";
  455. #if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
  456. prefixes[EbtFloat16] = "f16";
  457. prefixes[EbtInt8] = "i8";
  458. prefixes[EbtUint8] = "u8";
  459. prefixes[EbtInt16] = "i16";
  460. prefixes[EbtUint16] = "u16";
  461. prefixes[EbtInt64] = "i64";
  462. prefixes[EbtUint64] = "u64";
  463. #endif
  464. postfixes[2] = "2";
  465. postfixes[3] = "3";
  466. postfixes[4] = "4";
  467. // Map from symbolic class of texturing dimension to numeric dimensions.
  468. dimMap[Esd2D] = 2;
  469. dimMap[Esd3D] = 3;
  470. dimMap[EsdCube] = 3;
  471. #ifndef GLSLANG_WEB
  472. #ifndef GLSLANG_ANGLE
  473. dimMap[Esd1D] = 1;
  474. #endif
  475. dimMap[EsdRect] = 2;
  476. dimMap[EsdBuffer] = 1;
  477. dimMap[EsdSubpass] = 2; // potentially unused for now
  478. #endif
  479. }
  480. TBuiltIns::~TBuiltIns()
  481. {
  482. }
  483. //
  484. // Add all context-independent built-in functions and variables that are present
  485. // for the given version and profile. Share common ones across stages, otherwise
  486. // make stage-specific entries.
  487. //
  488. // Most built-ins variables can be added as simple text strings. Some need to
  489. // be added programmatically, which is done later in IdentifyBuiltIns() below.
  490. //
  491. void TBuiltIns::initialize(int version, EProfile profile, const SpvVersion& spvVersion)
  492. {
  493. #ifdef GLSLANG_WEB
  494. version = 310;
  495. profile = EEsProfile;
  496. #elif defined(GLSLANG_ANGLE)
  497. version = 450;
  498. profile = ECoreProfile;
  499. #endif
  500. addTabledBuiltins(version, profile, spvVersion);
  501. //============================================================================
  502. //
  503. // Prototypes for built-in functions used repeatly by different shaders
  504. //
  505. //============================================================================
  506. #ifndef GLSLANG_WEB
  507. //
  508. // Derivatives Functions.
  509. //
  510. TString derivativeControls (
  511. "float dFdxFine(float p);"
  512. "vec2 dFdxFine(vec2 p);"
  513. "vec3 dFdxFine(vec3 p);"
  514. "vec4 dFdxFine(vec4 p);"
  515. "float dFdyFine(float p);"
  516. "vec2 dFdyFine(vec2 p);"
  517. "vec3 dFdyFine(vec3 p);"
  518. "vec4 dFdyFine(vec4 p);"
  519. "float fwidthFine(float p);"
  520. "vec2 fwidthFine(vec2 p);"
  521. "vec3 fwidthFine(vec3 p);"
  522. "vec4 fwidthFine(vec4 p);"
  523. "float dFdxCoarse(float p);"
  524. "vec2 dFdxCoarse(vec2 p);"
  525. "vec3 dFdxCoarse(vec3 p);"
  526. "vec4 dFdxCoarse(vec4 p);"
  527. "float dFdyCoarse(float p);"
  528. "vec2 dFdyCoarse(vec2 p);"
  529. "vec3 dFdyCoarse(vec3 p);"
  530. "vec4 dFdyCoarse(vec4 p);"
  531. "float fwidthCoarse(float p);"
  532. "vec2 fwidthCoarse(vec2 p);"
  533. "vec3 fwidthCoarse(vec3 p);"
  534. "vec4 fwidthCoarse(vec4 p);"
  535. );
  536. #ifndef GLSLANG_ANGLE
  537. TString derivativesAndControl16bits (
  538. "float16_t dFdx(float16_t);"
  539. "f16vec2 dFdx(f16vec2);"
  540. "f16vec3 dFdx(f16vec3);"
  541. "f16vec4 dFdx(f16vec4);"
  542. "float16_t dFdy(float16_t);"
  543. "f16vec2 dFdy(f16vec2);"
  544. "f16vec3 dFdy(f16vec3);"
  545. "f16vec4 dFdy(f16vec4);"
  546. "float16_t dFdxFine(float16_t);"
  547. "f16vec2 dFdxFine(f16vec2);"
  548. "f16vec3 dFdxFine(f16vec3);"
  549. "f16vec4 dFdxFine(f16vec4);"
  550. "float16_t dFdyFine(float16_t);"
  551. "f16vec2 dFdyFine(f16vec2);"
  552. "f16vec3 dFdyFine(f16vec3);"
  553. "f16vec4 dFdyFine(f16vec4);"
  554. "float16_t dFdxCoarse(float16_t);"
  555. "f16vec2 dFdxCoarse(f16vec2);"
  556. "f16vec3 dFdxCoarse(f16vec3);"
  557. "f16vec4 dFdxCoarse(f16vec4);"
  558. "float16_t dFdyCoarse(float16_t);"
  559. "f16vec2 dFdyCoarse(f16vec2);"
  560. "f16vec3 dFdyCoarse(f16vec3);"
  561. "f16vec4 dFdyCoarse(f16vec4);"
  562. "float16_t fwidth(float16_t);"
  563. "f16vec2 fwidth(f16vec2);"
  564. "f16vec3 fwidth(f16vec3);"
  565. "f16vec4 fwidth(f16vec4);"
  566. "float16_t fwidthFine(float16_t);"
  567. "f16vec2 fwidthFine(f16vec2);"
  568. "f16vec3 fwidthFine(f16vec3);"
  569. "f16vec4 fwidthFine(f16vec4);"
  570. "float16_t fwidthCoarse(float16_t);"
  571. "f16vec2 fwidthCoarse(f16vec2);"
  572. "f16vec3 fwidthCoarse(f16vec3);"
  573. "f16vec4 fwidthCoarse(f16vec4);"
  574. );
  575. TString derivativesAndControl64bits (
  576. "float64_t dFdx(float64_t);"
  577. "f64vec2 dFdx(f64vec2);"
  578. "f64vec3 dFdx(f64vec3);"
  579. "f64vec4 dFdx(f64vec4);"
  580. "float64_t dFdy(float64_t);"
  581. "f64vec2 dFdy(f64vec2);"
  582. "f64vec3 dFdy(f64vec3);"
  583. "f64vec4 dFdy(f64vec4);"
  584. "float64_t dFdxFine(float64_t);"
  585. "f64vec2 dFdxFine(f64vec2);"
  586. "f64vec3 dFdxFine(f64vec3);"
  587. "f64vec4 dFdxFine(f64vec4);"
  588. "float64_t dFdyFine(float64_t);"
  589. "f64vec2 dFdyFine(f64vec2);"
  590. "f64vec3 dFdyFine(f64vec3);"
  591. "f64vec4 dFdyFine(f64vec4);"
  592. "float64_t dFdxCoarse(float64_t);"
  593. "f64vec2 dFdxCoarse(f64vec2);"
  594. "f64vec3 dFdxCoarse(f64vec3);"
  595. "f64vec4 dFdxCoarse(f64vec4);"
  596. "float64_t dFdyCoarse(float64_t);"
  597. "f64vec2 dFdyCoarse(f64vec2);"
  598. "f64vec3 dFdyCoarse(f64vec3);"
  599. "f64vec4 dFdyCoarse(f64vec4);"
  600. "float64_t fwidth(float64_t);"
  601. "f64vec2 fwidth(f64vec2);"
  602. "f64vec3 fwidth(f64vec3);"
  603. "f64vec4 fwidth(f64vec4);"
  604. "float64_t fwidthFine(float64_t);"
  605. "f64vec2 fwidthFine(f64vec2);"
  606. "f64vec3 fwidthFine(f64vec3);"
  607. "f64vec4 fwidthFine(f64vec4);"
  608. "float64_t fwidthCoarse(float64_t);"
  609. "f64vec2 fwidthCoarse(f64vec2);"
  610. "f64vec3 fwidthCoarse(f64vec3);"
  611. "f64vec4 fwidthCoarse(f64vec4);"
  612. );
  613. //============================================================================
  614. //
  615. // Prototypes for built-in functions seen by both vertex and fragment shaders.
  616. //
  617. //============================================================================
  618. //
  619. // double functions added to desktop 4.00, but not fma, frexp, ldexp, or pack/unpack
  620. //
  621. if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64
  622. commonBuiltins.append(
  623. "double sqrt(double);"
  624. "dvec2 sqrt(dvec2);"
  625. "dvec3 sqrt(dvec3);"
  626. "dvec4 sqrt(dvec4);"
  627. "double inversesqrt(double);"
  628. "dvec2 inversesqrt(dvec2);"
  629. "dvec3 inversesqrt(dvec3);"
  630. "dvec4 inversesqrt(dvec4);"
  631. "double abs(double);"
  632. "dvec2 abs(dvec2);"
  633. "dvec3 abs(dvec3);"
  634. "dvec4 abs(dvec4);"
  635. "double sign(double);"
  636. "dvec2 sign(dvec2);"
  637. "dvec3 sign(dvec3);"
  638. "dvec4 sign(dvec4);"
  639. "double floor(double);"
  640. "dvec2 floor(dvec2);"
  641. "dvec3 floor(dvec3);"
  642. "dvec4 floor(dvec4);"
  643. "double trunc(double);"
  644. "dvec2 trunc(dvec2);"
  645. "dvec3 trunc(dvec3);"
  646. "dvec4 trunc(dvec4);"
  647. "double round(double);"
  648. "dvec2 round(dvec2);"
  649. "dvec3 round(dvec3);"
  650. "dvec4 round(dvec4);"
  651. "double roundEven(double);"
  652. "dvec2 roundEven(dvec2);"
  653. "dvec3 roundEven(dvec3);"
  654. "dvec4 roundEven(dvec4);"
  655. "double ceil(double);"
  656. "dvec2 ceil(dvec2);"
  657. "dvec3 ceil(dvec3);"
  658. "dvec4 ceil(dvec4);"
  659. "double fract(double);"
  660. "dvec2 fract(dvec2);"
  661. "dvec3 fract(dvec3);"
  662. "dvec4 fract(dvec4);"
  663. "double mod(double, double);"
  664. "dvec2 mod(dvec2 , double);"
  665. "dvec3 mod(dvec3 , double);"
  666. "dvec4 mod(dvec4 , double);"
  667. "dvec2 mod(dvec2 , dvec2);"
  668. "dvec3 mod(dvec3 , dvec3);"
  669. "dvec4 mod(dvec4 , dvec4);"
  670. "double modf(double, out double);"
  671. "dvec2 modf(dvec2, out dvec2);"
  672. "dvec3 modf(dvec3, out dvec3);"
  673. "dvec4 modf(dvec4, out dvec4);"
  674. "double min(double, double);"
  675. "dvec2 min(dvec2, double);"
  676. "dvec3 min(dvec3, double);"
  677. "dvec4 min(dvec4, double);"
  678. "dvec2 min(dvec2, dvec2);"
  679. "dvec3 min(dvec3, dvec3);"
  680. "dvec4 min(dvec4, dvec4);"
  681. "double max(double, double);"
  682. "dvec2 max(dvec2 , double);"
  683. "dvec3 max(dvec3 , double);"
  684. "dvec4 max(dvec4 , double);"
  685. "dvec2 max(dvec2 , dvec2);"
  686. "dvec3 max(dvec3 , dvec3);"
  687. "dvec4 max(dvec4 , dvec4);"
  688. "double clamp(double, double, double);"
  689. "dvec2 clamp(dvec2 , double, double);"
  690. "dvec3 clamp(dvec3 , double, double);"
  691. "dvec4 clamp(dvec4 , double, double);"
  692. "dvec2 clamp(dvec2 , dvec2 , dvec2);"
  693. "dvec3 clamp(dvec3 , dvec3 , dvec3);"
  694. "dvec4 clamp(dvec4 , dvec4 , dvec4);"
  695. "double mix(double, double, double);"
  696. "dvec2 mix(dvec2, dvec2, double);"
  697. "dvec3 mix(dvec3, dvec3, double);"
  698. "dvec4 mix(dvec4, dvec4, double);"
  699. "dvec2 mix(dvec2, dvec2, dvec2);"
  700. "dvec3 mix(dvec3, dvec3, dvec3);"
  701. "dvec4 mix(dvec4, dvec4, dvec4);"
  702. "double mix(double, double, bool);"
  703. "dvec2 mix(dvec2, dvec2, bvec2);"
  704. "dvec3 mix(dvec3, dvec3, bvec3);"
  705. "dvec4 mix(dvec4, dvec4, bvec4);"
  706. "double step(double, double);"
  707. "dvec2 step(dvec2 , dvec2);"
  708. "dvec3 step(dvec3 , dvec3);"
  709. "dvec4 step(dvec4 , dvec4);"
  710. "dvec2 step(double, dvec2);"
  711. "dvec3 step(double, dvec3);"
  712. "dvec4 step(double, dvec4);"
  713. "double smoothstep(double, double, double);"
  714. "dvec2 smoothstep(dvec2 , dvec2 , dvec2);"
  715. "dvec3 smoothstep(dvec3 , dvec3 , dvec3);"
  716. "dvec4 smoothstep(dvec4 , dvec4 , dvec4);"
  717. "dvec2 smoothstep(double, double, dvec2);"
  718. "dvec3 smoothstep(double, double, dvec3);"
  719. "dvec4 smoothstep(double, double, dvec4);"
  720. "bool isnan(double);"
  721. "bvec2 isnan(dvec2);"
  722. "bvec3 isnan(dvec3);"
  723. "bvec4 isnan(dvec4);"
  724. "bool isinf(double);"
  725. "bvec2 isinf(dvec2);"
  726. "bvec3 isinf(dvec3);"
  727. "bvec4 isinf(dvec4);"
  728. "double length(double);"
  729. "double length(dvec2);"
  730. "double length(dvec3);"
  731. "double length(dvec4);"
  732. "double distance(double, double);"
  733. "double distance(dvec2 , dvec2);"
  734. "double distance(dvec3 , dvec3);"
  735. "double distance(dvec4 , dvec4);"
  736. "double dot(double, double);"
  737. "double dot(dvec2 , dvec2);"
  738. "double dot(dvec3 , dvec3);"
  739. "double dot(dvec4 , dvec4);"
  740. "dvec3 cross(dvec3, dvec3);"
  741. "double normalize(double);"
  742. "dvec2 normalize(dvec2);"
  743. "dvec3 normalize(dvec3);"
  744. "dvec4 normalize(dvec4);"
  745. "double faceforward(double, double, double);"
  746. "dvec2 faceforward(dvec2, dvec2, dvec2);"
  747. "dvec3 faceforward(dvec3, dvec3, dvec3);"
  748. "dvec4 faceforward(dvec4, dvec4, dvec4);"
  749. "double reflect(double, double);"
  750. "dvec2 reflect(dvec2 , dvec2 );"
  751. "dvec3 reflect(dvec3 , dvec3 );"
  752. "dvec4 reflect(dvec4 , dvec4 );"
  753. "double refract(double, double, double);"
  754. "dvec2 refract(dvec2 , dvec2 , double);"
  755. "dvec3 refract(dvec3 , dvec3 , double);"
  756. "dvec4 refract(dvec4 , dvec4 , double);"
  757. "dmat2 matrixCompMult(dmat2, dmat2);"
  758. "dmat3 matrixCompMult(dmat3, dmat3);"
  759. "dmat4 matrixCompMult(dmat4, dmat4);"
  760. "dmat2x3 matrixCompMult(dmat2x3, dmat2x3);"
  761. "dmat2x4 matrixCompMult(dmat2x4, dmat2x4);"
  762. "dmat3x2 matrixCompMult(dmat3x2, dmat3x2);"
  763. "dmat3x4 matrixCompMult(dmat3x4, dmat3x4);"
  764. "dmat4x2 matrixCompMult(dmat4x2, dmat4x2);"
  765. "dmat4x3 matrixCompMult(dmat4x3, dmat4x3);"
  766. "dmat2 outerProduct(dvec2, dvec2);"
  767. "dmat3 outerProduct(dvec3, dvec3);"
  768. "dmat4 outerProduct(dvec4, dvec4);"
  769. "dmat2x3 outerProduct(dvec3, dvec2);"
  770. "dmat3x2 outerProduct(dvec2, dvec3);"
  771. "dmat2x4 outerProduct(dvec4, dvec2);"
  772. "dmat4x2 outerProduct(dvec2, dvec4);"
  773. "dmat3x4 outerProduct(dvec4, dvec3);"
  774. "dmat4x3 outerProduct(dvec3, dvec4);"
  775. "dmat2 transpose(dmat2);"
  776. "dmat3 transpose(dmat3);"
  777. "dmat4 transpose(dmat4);"
  778. "dmat2x3 transpose(dmat3x2);"
  779. "dmat3x2 transpose(dmat2x3);"
  780. "dmat2x4 transpose(dmat4x2);"
  781. "dmat4x2 transpose(dmat2x4);"
  782. "dmat3x4 transpose(dmat4x3);"
  783. "dmat4x3 transpose(dmat3x4);"
  784. "double determinant(dmat2);"
  785. "double determinant(dmat3);"
  786. "double determinant(dmat4);"
  787. "dmat2 inverse(dmat2);"
  788. "dmat3 inverse(dmat3);"
  789. "dmat4 inverse(dmat4);"
  790. "bvec2 lessThan(dvec2, dvec2);"
  791. "bvec3 lessThan(dvec3, dvec3);"
  792. "bvec4 lessThan(dvec4, dvec4);"
  793. "bvec2 lessThanEqual(dvec2, dvec2);"
  794. "bvec3 lessThanEqual(dvec3, dvec3);"
  795. "bvec4 lessThanEqual(dvec4, dvec4);"
  796. "bvec2 greaterThan(dvec2, dvec2);"
  797. "bvec3 greaterThan(dvec3, dvec3);"
  798. "bvec4 greaterThan(dvec4, dvec4);"
  799. "bvec2 greaterThanEqual(dvec2, dvec2);"
  800. "bvec3 greaterThanEqual(dvec3, dvec3);"
  801. "bvec4 greaterThanEqual(dvec4, dvec4);"
  802. "bvec2 equal(dvec2, dvec2);"
  803. "bvec3 equal(dvec3, dvec3);"
  804. "bvec4 equal(dvec4, dvec4);"
  805. "bvec2 notEqual(dvec2, dvec2);"
  806. "bvec3 notEqual(dvec3, dvec3);"
  807. "bvec4 notEqual(dvec4, dvec4);"
  808. "\n");
  809. }
  810. if (profile != EEsProfile && version >= 450) {
  811. commonBuiltins.append(
  812. "int64_t abs(int64_t);"
  813. "i64vec2 abs(i64vec2);"
  814. "i64vec3 abs(i64vec3);"
  815. "i64vec4 abs(i64vec4);"
  816. "int64_t sign(int64_t);"
  817. "i64vec2 sign(i64vec2);"
  818. "i64vec3 sign(i64vec3);"
  819. "i64vec4 sign(i64vec4);"
  820. "int64_t min(int64_t, int64_t);"
  821. "i64vec2 min(i64vec2, int64_t);"
  822. "i64vec3 min(i64vec3, int64_t);"
  823. "i64vec4 min(i64vec4, int64_t);"
  824. "i64vec2 min(i64vec2, i64vec2);"
  825. "i64vec3 min(i64vec3, i64vec3);"
  826. "i64vec4 min(i64vec4, i64vec4);"
  827. "uint64_t min(uint64_t, uint64_t);"
  828. "u64vec2 min(u64vec2, uint64_t);"
  829. "u64vec3 min(u64vec3, uint64_t);"
  830. "u64vec4 min(u64vec4, uint64_t);"
  831. "u64vec2 min(u64vec2, u64vec2);"
  832. "u64vec3 min(u64vec3, u64vec3);"
  833. "u64vec4 min(u64vec4, u64vec4);"
  834. "int64_t max(int64_t, int64_t);"
  835. "i64vec2 max(i64vec2, int64_t);"
  836. "i64vec3 max(i64vec3, int64_t);"
  837. "i64vec4 max(i64vec4, int64_t);"
  838. "i64vec2 max(i64vec2, i64vec2);"
  839. "i64vec3 max(i64vec3, i64vec3);"
  840. "i64vec4 max(i64vec4, i64vec4);"
  841. "uint64_t max(uint64_t, uint64_t);"
  842. "u64vec2 max(u64vec2, uint64_t);"
  843. "u64vec3 max(u64vec3, uint64_t);"
  844. "u64vec4 max(u64vec4, uint64_t);"
  845. "u64vec2 max(u64vec2, u64vec2);"
  846. "u64vec3 max(u64vec3, u64vec3);"
  847. "u64vec4 max(u64vec4, u64vec4);"
  848. "int64_t clamp(int64_t, int64_t, int64_t);"
  849. "i64vec2 clamp(i64vec2, int64_t, int64_t);"
  850. "i64vec3 clamp(i64vec3, int64_t, int64_t);"
  851. "i64vec4 clamp(i64vec4, int64_t, int64_t);"
  852. "i64vec2 clamp(i64vec2, i64vec2, i64vec2);"
  853. "i64vec3 clamp(i64vec3, i64vec3, i64vec3);"
  854. "i64vec4 clamp(i64vec4, i64vec4, i64vec4);"
  855. "uint64_t clamp(uint64_t, uint64_t, uint64_t);"
  856. "u64vec2 clamp(u64vec2, uint64_t, uint64_t);"
  857. "u64vec3 clamp(u64vec3, uint64_t, uint64_t);"
  858. "u64vec4 clamp(u64vec4, uint64_t, uint64_t);"
  859. "u64vec2 clamp(u64vec2, u64vec2, u64vec2);"
  860. "u64vec3 clamp(u64vec3, u64vec3, u64vec3);"
  861. "u64vec4 clamp(u64vec4, u64vec4, u64vec4);"
  862. "int64_t mix(int64_t, int64_t, bool);"
  863. "i64vec2 mix(i64vec2, i64vec2, bvec2);"
  864. "i64vec3 mix(i64vec3, i64vec3, bvec3);"
  865. "i64vec4 mix(i64vec4, i64vec4, bvec4);"
  866. "uint64_t mix(uint64_t, uint64_t, bool);"
  867. "u64vec2 mix(u64vec2, u64vec2, bvec2);"
  868. "u64vec3 mix(u64vec3, u64vec3, bvec3);"
  869. "u64vec4 mix(u64vec4, u64vec4, bvec4);"
  870. "int64_t doubleBitsToInt64(double);"
  871. "i64vec2 doubleBitsToInt64(dvec2);"
  872. "i64vec3 doubleBitsToInt64(dvec3);"
  873. "i64vec4 doubleBitsToInt64(dvec4);"
  874. "uint64_t doubleBitsToUint64(double);"
  875. "u64vec2 doubleBitsToUint64(dvec2);"
  876. "u64vec3 doubleBitsToUint64(dvec3);"
  877. "u64vec4 doubleBitsToUint64(dvec4);"
  878. "double int64BitsToDouble(int64_t);"
  879. "dvec2 int64BitsToDouble(i64vec2);"
  880. "dvec3 int64BitsToDouble(i64vec3);"
  881. "dvec4 int64BitsToDouble(i64vec4);"
  882. "double uint64BitsToDouble(uint64_t);"
  883. "dvec2 uint64BitsToDouble(u64vec2);"
  884. "dvec3 uint64BitsToDouble(u64vec3);"
  885. "dvec4 uint64BitsToDouble(u64vec4);"
  886. "int64_t packInt2x32(ivec2);"
  887. "uint64_t packUint2x32(uvec2);"
  888. "ivec2 unpackInt2x32(int64_t);"
  889. "uvec2 unpackUint2x32(uint64_t);"
  890. "bvec2 lessThan(i64vec2, i64vec2);"
  891. "bvec3 lessThan(i64vec3, i64vec3);"
  892. "bvec4 lessThan(i64vec4, i64vec4);"
  893. "bvec2 lessThan(u64vec2, u64vec2);"
  894. "bvec3 lessThan(u64vec3, u64vec3);"
  895. "bvec4 lessThan(u64vec4, u64vec4);"
  896. "bvec2 lessThanEqual(i64vec2, i64vec2);"
  897. "bvec3 lessThanEqual(i64vec3, i64vec3);"
  898. "bvec4 lessThanEqual(i64vec4, i64vec4);"
  899. "bvec2 lessThanEqual(u64vec2, u64vec2);"
  900. "bvec3 lessThanEqual(u64vec3, u64vec3);"
  901. "bvec4 lessThanEqual(u64vec4, u64vec4);"
  902. "bvec2 greaterThan(i64vec2, i64vec2);"
  903. "bvec3 greaterThan(i64vec3, i64vec3);"
  904. "bvec4 greaterThan(i64vec4, i64vec4);"
  905. "bvec2 greaterThan(u64vec2, u64vec2);"
  906. "bvec3 greaterThan(u64vec3, u64vec3);"
  907. "bvec4 greaterThan(u64vec4, u64vec4);"
  908. "bvec2 greaterThanEqual(i64vec2, i64vec2);"
  909. "bvec3 greaterThanEqual(i64vec3, i64vec3);"
  910. "bvec4 greaterThanEqual(i64vec4, i64vec4);"
  911. "bvec2 greaterThanEqual(u64vec2, u64vec2);"
  912. "bvec3 greaterThanEqual(u64vec3, u64vec3);"
  913. "bvec4 greaterThanEqual(u64vec4, u64vec4);"
  914. "bvec2 equal(i64vec2, i64vec2);"
  915. "bvec3 equal(i64vec3, i64vec3);"
  916. "bvec4 equal(i64vec4, i64vec4);"
  917. "bvec2 equal(u64vec2, u64vec2);"
  918. "bvec3 equal(u64vec3, u64vec3);"
  919. "bvec4 equal(u64vec4, u64vec4);"
  920. "bvec2 notEqual(i64vec2, i64vec2);"
  921. "bvec3 notEqual(i64vec3, i64vec3);"
  922. "bvec4 notEqual(i64vec4, i64vec4);"
  923. "bvec2 notEqual(u64vec2, u64vec2);"
  924. "bvec3 notEqual(u64vec3, u64vec3);"
  925. "bvec4 notEqual(u64vec4, u64vec4);"
  926. "int64_t bitCount(int64_t);"
  927. "i64vec2 bitCount(i64vec2);"
  928. "i64vec3 bitCount(i64vec3);"
  929. "i64vec4 bitCount(i64vec4);"
  930. "int64_t bitCount(uint64_t);"
  931. "i64vec2 bitCount(u64vec2);"
  932. "i64vec3 bitCount(u64vec3);"
  933. "i64vec4 bitCount(u64vec4);"
  934. "int64_t findLSB(int64_t);"
  935. "i64vec2 findLSB(i64vec2);"
  936. "i64vec3 findLSB(i64vec3);"
  937. "i64vec4 findLSB(i64vec4);"
  938. "int64_t findLSB(uint64_t);"
  939. "i64vec2 findLSB(u64vec2);"
  940. "i64vec3 findLSB(u64vec3);"
  941. "i64vec4 findLSB(u64vec4);"
  942. "int64_t findMSB(int64_t);"
  943. "i64vec2 findMSB(i64vec2);"
  944. "i64vec3 findMSB(i64vec3);"
  945. "i64vec4 findMSB(i64vec4);"
  946. "int64_t findMSB(uint64_t);"
  947. "i64vec2 findMSB(u64vec2);"
  948. "i64vec3 findMSB(u64vec3);"
  949. "i64vec4 findMSB(u64vec4);"
  950. "\n"
  951. );
  952. }
  953. // GL_AMD_shader_trinary_minmax
  954. if (profile != EEsProfile && version >= 430) {
  955. commonBuiltins.append(
  956. "float min3(float, float, float);"
  957. "vec2 min3(vec2, vec2, vec2);"
  958. "vec3 min3(vec3, vec3, vec3);"
  959. "vec4 min3(vec4, vec4, vec4);"
  960. "int min3(int, int, int);"
  961. "ivec2 min3(ivec2, ivec2, ivec2);"
  962. "ivec3 min3(ivec3, ivec3, ivec3);"
  963. "ivec4 min3(ivec4, ivec4, ivec4);"
  964. "uint min3(uint, uint, uint);"
  965. "uvec2 min3(uvec2, uvec2, uvec2);"
  966. "uvec3 min3(uvec3, uvec3, uvec3);"
  967. "uvec4 min3(uvec4, uvec4, uvec4);"
  968. "float max3(float, float, float);"
  969. "vec2 max3(vec2, vec2, vec2);"
  970. "vec3 max3(vec3, vec3, vec3);"
  971. "vec4 max3(vec4, vec4, vec4);"
  972. "int max3(int, int, int);"
  973. "ivec2 max3(ivec2, ivec2, ivec2);"
  974. "ivec3 max3(ivec3, ivec3, ivec3);"
  975. "ivec4 max3(ivec4, ivec4, ivec4);"
  976. "uint max3(uint, uint, uint);"
  977. "uvec2 max3(uvec2, uvec2, uvec2);"
  978. "uvec3 max3(uvec3, uvec3, uvec3);"
  979. "uvec4 max3(uvec4, uvec4, uvec4);"
  980. "float mid3(float, float, float);"
  981. "vec2 mid3(vec2, vec2, vec2);"
  982. "vec3 mid3(vec3, vec3, vec3);"
  983. "vec4 mid3(vec4, vec4, vec4);"
  984. "int mid3(int, int, int);"
  985. "ivec2 mid3(ivec2, ivec2, ivec2);"
  986. "ivec3 mid3(ivec3, ivec3, ivec3);"
  987. "ivec4 mid3(ivec4, ivec4, ivec4);"
  988. "uint mid3(uint, uint, uint);"
  989. "uvec2 mid3(uvec2, uvec2, uvec2);"
  990. "uvec3 mid3(uvec3, uvec3, uvec3);"
  991. "uvec4 mid3(uvec4, uvec4, uvec4);"
  992. "float16_t min3(float16_t, float16_t, float16_t);"
  993. "f16vec2 min3(f16vec2, f16vec2, f16vec2);"
  994. "f16vec3 min3(f16vec3, f16vec3, f16vec3);"
  995. "f16vec4 min3(f16vec4, f16vec4, f16vec4);"
  996. "float16_t max3(float16_t, float16_t, float16_t);"
  997. "f16vec2 max3(f16vec2, f16vec2, f16vec2);"
  998. "f16vec3 max3(f16vec3, f16vec3, f16vec3);"
  999. "f16vec4 max3(f16vec4, f16vec4, f16vec4);"
  1000. "float16_t mid3(float16_t, float16_t, float16_t);"
  1001. "f16vec2 mid3(f16vec2, f16vec2, f16vec2);"
  1002. "f16vec3 mid3(f16vec3, f16vec3, f16vec3);"
  1003. "f16vec4 mid3(f16vec4, f16vec4, f16vec4);"
  1004. "int16_t min3(int16_t, int16_t, int16_t);"
  1005. "i16vec2 min3(i16vec2, i16vec2, i16vec2);"
  1006. "i16vec3 min3(i16vec3, i16vec3, i16vec3);"
  1007. "i16vec4 min3(i16vec4, i16vec4, i16vec4);"
  1008. "int16_t max3(int16_t, int16_t, int16_t);"
  1009. "i16vec2 max3(i16vec2, i16vec2, i16vec2);"
  1010. "i16vec3 max3(i16vec3, i16vec3, i16vec3);"
  1011. "i16vec4 max3(i16vec4, i16vec4, i16vec4);"
  1012. "int16_t mid3(int16_t, int16_t, int16_t);"
  1013. "i16vec2 mid3(i16vec2, i16vec2, i16vec2);"
  1014. "i16vec3 mid3(i16vec3, i16vec3, i16vec3);"
  1015. "i16vec4 mid3(i16vec4, i16vec4, i16vec4);"
  1016. "uint16_t min3(uint16_t, uint16_t, uint16_t);"
  1017. "u16vec2 min3(u16vec2, u16vec2, u16vec2);"
  1018. "u16vec3 min3(u16vec3, u16vec3, u16vec3);"
  1019. "u16vec4 min3(u16vec4, u16vec4, u16vec4);"
  1020. "uint16_t max3(uint16_t, uint16_t, uint16_t);"
  1021. "u16vec2 max3(u16vec2, u16vec2, u16vec2);"
  1022. "u16vec3 max3(u16vec3, u16vec3, u16vec3);"
  1023. "u16vec4 max3(u16vec4, u16vec4, u16vec4);"
  1024. "uint16_t mid3(uint16_t, uint16_t, uint16_t);"
  1025. "u16vec2 mid3(u16vec2, u16vec2, u16vec2);"
  1026. "u16vec3 mid3(u16vec3, u16vec3, u16vec3);"
  1027. "u16vec4 mid3(u16vec4, u16vec4, u16vec4);"
  1028. "\n"
  1029. );
  1030. }
  1031. #endif // !GLSLANG_ANGLE
  1032. if ((profile == EEsProfile && version >= 310) ||
  1033. (profile != EEsProfile && version >= 430)) {
  1034. commonBuiltins.append(
  1035. "uint atomicAdd(coherent volatile inout uint, uint, int, int, int);"
  1036. " int atomicAdd(coherent volatile inout int, int, int, int, int);"
  1037. "uint atomicMin(coherent volatile inout uint, uint, int, int, int);"
  1038. " int atomicMin(coherent volatile inout int, int, int, int, int);"
  1039. "uint atomicMax(coherent volatile inout uint, uint, int, int, int);"
  1040. " int atomicMax(coherent volatile inout int, int, int, int, int);"
  1041. "uint atomicAnd(coherent volatile inout uint, uint, int, int, int);"
  1042. " int atomicAnd(coherent volatile inout int, int, int, int, int);"
  1043. "uint atomicOr (coherent volatile inout uint, uint, int, int, int);"
  1044. " int atomicOr (coherent volatile inout int, int, int, int, int);"
  1045. "uint atomicXor(coherent volatile inout uint, uint, int, int, int);"
  1046. " int atomicXor(coherent volatile inout int, int, int, int, int);"
  1047. "uint atomicExchange(coherent volatile inout uint, uint, int, int, int);"
  1048. " int atomicExchange(coherent volatile inout int, int, int, int, int);"
  1049. "uint atomicCompSwap(coherent volatile inout uint, uint, uint, int, int, int, int, int);"
  1050. " int atomicCompSwap(coherent volatile inout int, int, int, int, int, int, int, int);"
  1051. "uint atomicLoad(coherent volatile in uint, int, int, int);"
  1052. " int atomicLoad(coherent volatile in int, int, int, int);"
  1053. "void atomicStore(coherent volatile out uint, uint, int, int, int);"
  1054. "void atomicStore(coherent volatile out int, int, int, int, int);"
  1055. "\n");
  1056. }
  1057. #ifndef GLSLANG_ANGLE
  1058. if (profile != EEsProfile && version >= 440) {
  1059. commonBuiltins.append(
  1060. "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t);"
  1061. " int64_t atomicMin(coherent volatile inout int64_t, int64_t);"
  1062. "uint64_t atomicMin(coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1063. " int64_t atomicMin(coherent volatile inout int64_t, int64_t, int, int, int);"
  1064. "uint64_t atomicMax(coherent volatile inout uint64_t, uint64_t);"
  1065. " int64_t atomicMax(coherent volatile inout int64_t, int64_t);"
  1066. "uint64_t atomicMax(coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1067. " int64_t atomicMax(coherent volatile inout int64_t, int64_t, int, int, int);"
  1068. "uint64_t atomicAnd(coherent volatile inout uint64_t, uint64_t);"
  1069. " int64_t atomicAnd(coherent volatile inout int64_t, int64_t);"
  1070. "uint64_t atomicAnd(coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1071. " int64_t atomicAnd(coherent volatile inout int64_t, int64_t, int, int, int);"
  1072. "uint64_t atomicOr (coherent volatile inout uint64_t, uint64_t);"
  1073. " int64_t atomicOr (coherent volatile inout int64_t, int64_t);"
  1074. "uint64_t atomicOr (coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1075. " int64_t atomicOr (coherent volatile inout int64_t, int64_t, int, int, int);"
  1076. "uint64_t atomicXor(coherent volatile inout uint64_t, uint64_t);"
  1077. " int64_t atomicXor(coherent volatile inout int64_t, int64_t);"
  1078. "uint64_t atomicXor(coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1079. " int64_t atomicXor(coherent volatile inout int64_t, int64_t, int, int, int);"
  1080. "uint64_t atomicAdd(coherent volatile inout uint64_t, uint64_t);"
  1081. " int64_t atomicAdd(coherent volatile inout int64_t, int64_t);"
  1082. "uint64_t atomicAdd(coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1083. " int64_t atomicAdd(coherent volatile inout int64_t, int64_t, int, int, int);"
  1084. " float atomicAdd(coherent volatile inout float, float);"
  1085. " float atomicAdd(coherent volatile inout float, float, int, int, int);"
  1086. " double atomicAdd(coherent volatile inout double, double);"
  1087. " double atomicAdd(coherent volatile inout double, double, int, int, int);"
  1088. "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t);"
  1089. " int64_t atomicExchange(coherent volatile inout int64_t, int64_t);"
  1090. "uint64_t atomicExchange(coherent volatile inout uint64_t, uint64_t, int, int, int);"
  1091. " int64_t atomicExchange(coherent volatile inout int64_t, int64_t, int, int, int);"
  1092. " float atomicExchange(coherent volatile inout float, float);"
  1093. " float atomicExchange(coherent volatile inout float, float, int, int, int);"
  1094. " double atomicExchange(coherent volatile inout double, double);"
  1095. " double atomicExchange(coherent volatile inout double, double, int, int, int);"
  1096. "uint64_t atomicCompSwap(coherent volatile inout uint64_t, uint64_t, uint64_t);"
  1097. " int64_t atomicCompSwap(coherent volatile inout int64_t, int64_t, int64_t);"
  1098. "uint64_t atomicCompSwap(coherent volatile inout uint64_t, uint64_t, uint64_t, int, int, int, int, int);"
  1099. " int64_t atomicCompSwap(coherent volatile inout int64_t, int64_t, int64_t, int, int, int, int, int);"
  1100. "uint64_t atomicLoad(coherent volatile in uint64_t, int, int, int);"
  1101. " int64_t atomicLoad(coherent volatile in int64_t, int, int, int);"
  1102. " float atomicLoad(coherent volatile in float, int, int, int);"
  1103. " double atomicLoad(coherent volatile in double, int, int, int);"
  1104. "void atomicStore(coherent volatile out uint64_t, uint64_t, int, int, int);"
  1105. "void atomicStore(coherent volatile out int64_t, int64_t, int, int, int);"
  1106. "void atomicStore(coherent volatile out float, float, int, int, int);"
  1107. "void atomicStore(coherent volatile out double, double, int, int, int);"
  1108. "\n");
  1109. }
  1110. #endif // !GLSLANG_ANGLE
  1111. #endif // !GLSLANG_WEB
  1112. if ((profile == EEsProfile && version >= 300) ||
  1113. (profile != EEsProfile && version >= 150)) { // GL_ARB_shader_bit_encoding
  1114. commonBuiltins.append(
  1115. "int floatBitsToInt(highp float value);"
  1116. "ivec2 floatBitsToInt(highp vec2 value);"
  1117. "ivec3 floatBitsToInt(highp vec3 value);"
  1118. "ivec4 floatBitsToInt(highp vec4 value);"
  1119. "uint floatBitsToUint(highp float value);"
  1120. "uvec2 floatBitsToUint(highp vec2 value);"
  1121. "uvec3 floatBitsToUint(highp vec3 value);"
  1122. "uvec4 floatBitsToUint(highp vec4 value);"
  1123. "float intBitsToFloat(highp int value);"
  1124. "vec2 intBitsToFloat(highp ivec2 value);"
  1125. "vec3 intBitsToFloat(highp ivec3 value);"
  1126. "vec4 intBitsToFloat(highp ivec4 value);"
  1127. "float uintBitsToFloat(highp uint value);"
  1128. "vec2 uintBitsToFloat(highp uvec2 value);"
  1129. "vec3 uintBitsToFloat(highp uvec3 value);"
  1130. "vec4 uintBitsToFloat(highp uvec4 value);"
  1131. "\n");
  1132. }
  1133. #ifndef GLSLANG_WEB
  1134. if ((profile != EEsProfile && version >= 400) ||
  1135. (profile == EEsProfile && version >= 310)) { // GL_OES_gpu_shader5
  1136. commonBuiltins.append(
  1137. "float fma(float, float, float );"
  1138. "vec2 fma(vec2, vec2, vec2 );"
  1139. "vec3 fma(vec3, vec3, vec3 );"
  1140. "vec4 fma(vec4, vec4, vec4 );"
  1141. "\n");
  1142. }
  1143. #ifndef GLSLANG_ANGLE
  1144. if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64
  1145. commonBuiltins.append(
  1146. "double fma(double, double, double);"
  1147. "dvec2 fma(dvec2, dvec2, dvec2 );"
  1148. "dvec3 fma(dvec3, dvec3, dvec3 );"
  1149. "dvec4 fma(dvec4, dvec4, dvec4 );"
  1150. "\n");
  1151. }
  1152. #endif
  1153. if ((profile == EEsProfile && version >= 310) ||
  1154. (profile != EEsProfile && version >= 400)) {
  1155. commonBuiltins.append(
  1156. "float frexp(highp float, out highp int);"
  1157. "vec2 frexp(highp vec2, out highp ivec2);"
  1158. "vec3 frexp(highp vec3, out highp ivec3);"
  1159. "vec4 frexp(highp vec4, out highp ivec4);"
  1160. "float ldexp(highp float, highp int);"
  1161. "vec2 ldexp(highp vec2, highp ivec2);"
  1162. "vec3 ldexp(highp vec3, highp ivec3);"
  1163. "vec4 ldexp(highp vec4, highp ivec4);"
  1164. "\n");
  1165. }
  1166. #ifndef GLSLANG_ANGLE
  1167. if (profile != EEsProfile && version >= 150) { // ARB_gpu_shader_fp64
  1168. commonBuiltins.append(
  1169. "double frexp(double, out int);"
  1170. "dvec2 frexp( dvec2, out ivec2);"
  1171. "dvec3 frexp( dvec3, out ivec3);"
  1172. "dvec4 frexp( dvec4, out ivec4);"
  1173. "double ldexp(double, int);"
  1174. "dvec2 ldexp( dvec2, ivec2);"
  1175. "dvec3 ldexp( dvec3, ivec3);"
  1176. "dvec4 ldexp( dvec4, ivec4);"
  1177. "double packDouble2x32(uvec2);"
  1178. "uvec2 unpackDouble2x32(double);"
  1179. "\n");
  1180. }
  1181. #endif
  1182. #endif
  1183. if ((profile == EEsProfile && version >= 300) ||
  1184. (profile != EEsProfile && version >= 150)) {
  1185. commonBuiltins.append(
  1186. "highp uint packUnorm2x16(vec2);"
  1187. "vec2 unpackUnorm2x16(highp uint);"
  1188. "\n");
  1189. }
  1190. if ((profile == EEsProfile && version >= 300) ||
  1191. (profile != EEsProfile && version >= 150)) {
  1192. commonBuiltins.append(
  1193. "highp uint packSnorm2x16(vec2);"
  1194. " vec2 unpackSnorm2x16(highp uint);"
  1195. "highp uint packHalf2x16(vec2);"
  1196. "\n");
  1197. }
  1198. if (profile == EEsProfile && version >= 300) {
  1199. commonBuiltins.append(
  1200. "mediump vec2 unpackHalf2x16(highp uint);"
  1201. "\n");
  1202. } else if (profile != EEsProfile && version >= 150) {
  1203. commonBuiltins.append(
  1204. " vec2 unpackHalf2x16(highp uint);"
  1205. "\n");
  1206. }
  1207. #ifndef GLSLANG_WEB
  1208. if ((profile == EEsProfile && version >= 310) ||
  1209. (profile != EEsProfile && version >= 150)) {
  1210. commonBuiltins.append(
  1211. "highp uint packSnorm4x8(vec4);"
  1212. "highp uint packUnorm4x8(vec4);"
  1213. "\n");
  1214. }
  1215. if (profile == EEsProfile && version >= 310) {
  1216. commonBuiltins.append(
  1217. "mediump vec4 unpackSnorm4x8(highp uint);"
  1218. "mediump vec4 unpackUnorm4x8(highp uint);"
  1219. "\n");
  1220. } else if (profile != EEsProfile && version >= 150) {
  1221. commonBuiltins.append(
  1222. "vec4 unpackSnorm4x8(highp uint);"
  1223. "vec4 unpackUnorm4x8(highp uint);"
  1224. "\n");
  1225. }
  1226. #endif
  1227. //
  1228. // Matrix Functions.
  1229. //
  1230. commonBuiltins.append(
  1231. "mat2 matrixCompMult(mat2 x, mat2 y);"
  1232. "mat3 matrixCompMult(mat3 x, mat3 y);"
  1233. "mat4 matrixCompMult(mat4 x, mat4 y);"
  1234. "\n");
  1235. // 120 is correct for both ES and desktop
  1236. if (version >= 120) {
  1237. commonBuiltins.append(
  1238. "mat2 outerProduct(vec2 c, vec2 r);"
  1239. "mat3 outerProduct(vec3 c, vec3 r);"
  1240. "mat4 outerProduct(vec4 c, vec4 r);"
  1241. "mat2x3 outerProduct(vec3 c, vec2 r);"
  1242. "mat3x2 outerProduct(vec2 c, vec3 r);"
  1243. "mat2x4 outerProduct(vec4 c, vec2 r);"
  1244. "mat4x2 outerProduct(vec2 c, vec4 r);"
  1245. "mat3x4 outerProduct(vec4 c, vec3 r);"
  1246. "mat4x3 outerProduct(vec3 c, vec4 r);"
  1247. "mat2 transpose(mat2 m);"
  1248. "mat3 transpose(mat3 m);"
  1249. "mat4 transpose(mat4 m);"
  1250. "mat2x3 transpose(mat3x2 m);"
  1251. "mat3x2 transpose(mat2x3 m);"
  1252. "mat2x4 transpose(mat4x2 m);"
  1253. "mat4x2 transpose(mat2x4 m);"
  1254. "mat3x4 transpose(mat4x3 m);"
  1255. "mat4x3 transpose(mat3x4 m);"
  1256. "mat2x3 matrixCompMult(mat2x3, mat2x3);"
  1257. "mat2x4 matrixCompMult(mat2x4, mat2x4);"
  1258. "mat3x2 matrixCompMult(mat3x2, mat3x2);"
  1259. "mat3x4 matrixCompMult(mat3x4, mat3x4);"
  1260. "mat4x2 matrixCompMult(mat4x2, mat4x2);"
  1261. "mat4x3 matrixCompMult(mat4x3, mat4x3);"
  1262. "\n");
  1263. // 150 is correct for both ES and desktop
  1264. if (version >= 150) {
  1265. commonBuiltins.append(
  1266. "float determinant(mat2 m);"
  1267. "float determinant(mat3 m);"
  1268. "float determinant(mat4 m);"
  1269. "mat2 inverse(mat2 m);"
  1270. "mat3 inverse(mat3 m);"
  1271. "mat4 inverse(mat4 m);"
  1272. "\n");
  1273. }
  1274. }
  1275. #ifndef GLSLANG_WEB
  1276. #ifndef GLSLANG_ANGLE
  1277. //
  1278. // Original-style texture functions existing in all stages.
  1279. // (Per-stage functions below.)
  1280. //
  1281. if ((profile == EEsProfile && version == 100) ||
  1282. profile == ECompatibilityProfile ||
  1283. (profile == ECoreProfile && version < 420) ||
  1284. profile == ENoProfile) {
  1285. if (spvVersion.spv == 0) {
  1286. commonBuiltins.append(
  1287. "vec4 texture2D(sampler2D, vec2);"
  1288. "vec4 texture2DProj(sampler2D, vec3);"
  1289. "vec4 texture2DProj(sampler2D, vec4);"
  1290. "vec4 texture3D(sampler3D, vec3);" // OES_texture_3D, but caught by keyword check
  1291. "vec4 texture3DProj(sampler3D, vec4);" // OES_texture_3D, but caught by keyword check
  1292. "vec4 textureCube(samplerCube, vec3);"
  1293. "\n");
  1294. }
  1295. }
  1296. if ( profile == ECompatibilityProfile ||
  1297. (profile == ECoreProfile && version < 420) ||
  1298. profile == ENoProfile) {
  1299. if (spvVersion.spv == 0) {
  1300. commonBuiltins.append(
  1301. "vec4 texture1D(sampler1D, float);"
  1302. "vec4 texture1DProj(sampler1D, vec2);"
  1303. "vec4 texture1DProj(sampler1D, vec4);"
  1304. "vec4 shadow1D(sampler1DShadow, vec3);"
  1305. "vec4 shadow2D(sampler2DShadow, vec3);"
  1306. "vec4 shadow1DProj(sampler1DShadow, vec4);"
  1307. "vec4 shadow2DProj(sampler2DShadow, vec4);"
  1308. "vec4 texture2DRect(sampler2DRect, vec2);" // GL_ARB_texture_rectangle, caught by keyword check
  1309. "vec4 texture2DRectProj(sampler2DRect, vec3);" // GL_ARB_texture_rectangle, caught by keyword check
  1310. "vec4 texture2DRectProj(sampler2DRect, vec4);" // GL_ARB_texture_rectangle, caught by keyword check
  1311. "vec4 shadow2DRect(sampler2DRectShadow, vec3);" // GL_ARB_texture_rectangle, caught by keyword check
  1312. "vec4 shadow2DRectProj(sampler2DRectShadow, vec4);" // GL_ARB_texture_rectangle, caught by keyword check
  1313. "\n");
  1314. }
  1315. }
  1316. if (profile == EEsProfile) {
  1317. if (spvVersion.spv == 0) {
  1318. if (version < 300) {
  1319. commonBuiltins.append(
  1320. "vec4 texture2D(samplerExternalOES, vec2 coord);" // GL_OES_EGL_image_external
  1321. "vec4 texture2DProj(samplerExternalOES, vec3);" // GL_OES_EGL_image_external
  1322. "vec4 texture2DProj(samplerExternalOES, vec4);" // GL_OES_EGL_image_external
  1323. "\n");
  1324. } else {
  1325. commonBuiltins.append(
  1326. "highp ivec2 textureSize(samplerExternalOES, int lod);" // GL_OES_EGL_image_external_essl3
  1327. "vec4 texture(samplerExternalOES, vec2);" // GL_OES_EGL_image_external_essl3
  1328. "vec4 texture(samplerExternalOES, vec2, float bias);" // GL_OES_EGL_image_external_essl3
  1329. "vec4 textureProj(samplerExternalOES, vec3);" // GL_OES_EGL_image_external_essl3
  1330. "vec4 textureProj(samplerExternalOES, vec3, float bias);" // GL_OES_EGL_image_external_essl3
  1331. "vec4 textureProj(samplerExternalOES, vec4);" // GL_OES_EGL_image_external_essl3
  1332. "vec4 textureProj(samplerExternalOES, vec4, float bias);" // GL_OES_EGL_image_external_essl3
  1333. "vec4 texelFetch(samplerExternalOES, ivec2, int lod);" // GL_OES_EGL_image_external_essl3
  1334. "\n");
  1335. }
  1336. commonBuiltins.append(
  1337. "highp ivec2 textureSize(__samplerExternal2DY2YEXT, int lod);" // GL_EXT_YUV_target
  1338. "vec4 texture(__samplerExternal2DY2YEXT, vec2);" // GL_EXT_YUV_target
  1339. "vec4 texture(__samplerExternal2DY2YEXT, vec2, float bias);" // GL_EXT_YUV_target
  1340. "vec4 textureProj(__samplerExternal2DY2YEXT, vec3);" // GL_EXT_YUV_target
  1341. "vec4 textureProj(__samplerExternal2DY2YEXT, vec3, float bias);" // GL_EXT_YUV_target
  1342. "vec4 textureProj(__samplerExternal2DY2YEXT, vec4);" // GL_EXT_YUV_target
  1343. "vec4 textureProj(__samplerExternal2DY2YEXT, vec4, float bias);" // GL_EXT_YUV_target
  1344. "vec4 texelFetch(__samplerExternal2DY2YEXT sampler, ivec2, int lod);" // GL_EXT_YUV_target
  1345. "\n");
  1346. commonBuiltins.append(
  1347. "vec4 texture2DGradEXT(sampler2D, vec2, vec2, vec2);" // GL_EXT_shader_texture_lod
  1348. "vec4 texture2DProjGradEXT(sampler2D, vec3, vec2, vec2);" // GL_EXT_shader_texture_lod
  1349. "vec4 texture2DProjGradEXT(sampler2D, vec4, vec2, vec2);" // GL_EXT_shader_texture_lod
  1350. "vec4 textureCubeGradEXT(samplerCube, vec3, vec3, vec3);" // GL_EXT_shader_texture_lod
  1351. "float shadow2DEXT(sampler2DShadow, vec3);" // GL_EXT_shadow_samplers
  1352. "float shadow2DProjEXT(sampler2DShadow, vec4);" // GL_EXT_shadow_samplers
  1353. "\n");
  1354. }
  1355. }
  1356. //
  1357. // Noise functions.
  1358. //
  1359. if (spvVersion.spv == 0 && profile != EEsProfile) {
  1360. commonBuiltins.append(
  1361. "float noise1(float x);"
  1362. "float noise1(vec2 x);"
  1363. "float noise1(vec3 x);"
  1364. "float noise1(vec4 x);"
  1365. "vec2 noise2(float x);"
  1366. "vec2 noise2(vec2 x);"
  1367. "vec2 noise2(vec3 x);"
  1368. "vec2 noise2(vec4 x);"
  1369. "vec3 noise3(float x);"
  1370. "vec3 noise3(vec2 x);"
  1371. "vec3 noise3(vec3 x);"
  1372. "vec3 noise3(vec4 x);"
  1373. "vec4 noise4(float x);"
  1374. "vec4 noise4(vec2 x);"
  1375. "vec4 noise4(vec3 x);"
  1376. "vec4 noise4(vec4 x);"
  1377. "\n");
  1378. }
  1379. if (spvVersion.vulkan == 0) {
  1380. //
  1381. // Atomic counter functions.
  1382. //
  1383. if ((profile != EEsProfile && version >= 300) ||
  1384. (profile == EEsProfile && version >= 310)) {
  1385. commonBuiltins.append(
  1386. "uint atomicCounterIncrement(atomic_uint);"
  1387. "uint atomicCounterDecrement(atomic_uint);"
  1388. "uint atomicCounter(atomic_uint);"
  1389. "\n");
  1390. }
  1391. if (profile != EEsProfile && version >= 460) {
  1392. commonBuiltins.append(
  1393. "uint atomicCounterAdd(atomic_uint, uint);"
  1394. "uint atomicCounterSubtract(atomic_uint, uint);"
  1395. "uint atomicCounterMin(atomic_uint, uint);"
  1396. "uint atomicCounterMax(atomic_uint, uint);"
  1397. "uint atomicCounterAnd(atomic_uint, uint);"
  1398. "uint atomicCounterOr(atomic_uint, uint);"
  1399. "uint atomicCounterXor(atomic_uint, uint);"
  1400. "uint atomicCounterExchange(atomic_uint, uint);"
  1401. "uint atomicCounterCompSwap(atomic_uint, uint, uint);"
  1402. "\n");
  1403. }
  1404. }
  1405. #endif // !GLSLANG_ANGLE
  1406. // Bitfield
  1407. if ((profile == EEsProfile && version >= 310) ||
  1408. (profile != EEsProfile && version >= 400)) {
  1409. commonBuiltins.append(
  1410. " int bitfieldExtract( int, int, int);"
  1411. "ivec2 bitfieldExtract(ivec2, int, int);"
  1412. "ivec3 bitfieldExtract(ivec3, int, int);"
  1413. "ivec4 bitfieldExtract(ivec4, int, int);"
  1414. " uint bitfieldExtract( uint, int, int);"
  1415. "uvec2 bitfieldExtract(uvec2, int, int);"
  1416. "uvec3 bitfieldExtract(uvec3, int, int);"
  1417. "uvec4 bitfieldExtract(uvec4, int, int);"
  1418. " int bitfieldInsert( int base, int, int, int);"
  1419. "ivec2 bitfieldInsert(ivec2 base, ivec2, int, int);"
  1420. "ivec3 bitfieldInsert(ivec3 base, ivec3, int, int);"
  1421. "ivec4 bitfieldInsert(ivec4 base, ivec4, int, int);"
  1422. " uint bitfieldInsert( uint base, uint, int, int);"
  1423. "uvec2 bitfieldInsert(uvec2 base, uvec2, int, int);"
  1424. "uvec3 bitfieldInsert(uvec3 base, uvec3, int, int);"
  1425. "uvec4 bitfieldInsert(uvec4 base, uvec4, int, int);"
  1426. "\n");
  1427. }
  1428. if (profile != EEsProfile && version >= 400) {
  1429. commonBuiltins.append(
  1430. " int findLSB( int);"
  1431. "ivec2 findLSB(ivec2);"
  1432. "ivec3 findLSB(ivec3);"
  1433. "ivec4 findLSB(ivec4);"
  1434. " int findLSB( uint);"
  1435. "ivec2 findLSB(uvec2);"
  1436. "ivec3 findLSB(uvec3);"
  1437. "ivec4 findLSB(uvec4);"
  1438. "\n");
  1439. } else if (profile == EEsProfile && version >= 310) {
  1440. commonBuiltins.append(
  1441. "lowp int findLSB( int);"
  1442. "lowp ivec2 findLSB(ivec2);"
  1443. "lowp ivec3 findLSB(ivec3);"
  1444. "lowp ivec4 findLSB(ivec4);"
  1445. "lowp int findLSB( uint);"
  1446. "lowp ivec2 findLSB(uvec2);"
  1447. "lowp ivec3 findLSB(uvec3);"
  1448. "lowp ivec4 findLSB(uvec4);"
  1449. "\n");
  1450. }
  1451. if (profile != EEsProfile && version >= 400) {
  1452. commonBuiltins.append(
  1453. " int bitCount( int);"
  1454. "ivec2 bitCount(ivec2);"
  1455. "ivec3 bitCount(ivec3);"
  1456. "ivec4 bitCount(ivec4);"
  1457. " int bitCount( uint);"
  1458. "ivec2 bitCount(uvec2);"
  1459. "ivec3 bitCount(uvec3);"
  1460. "ivec4 bitCount(uvec4);"
  1461. " int findMSB(highp int);"
  1462. "ivec2 findMSB(highp ivec2);"
  1463. "ivec3 findMSB(highp ivec3);"
  1464. "ivec4 findMSB(highp ivec4);"
  1465. " int findMSB(highp uint);"
  1466. "ivec2 findMSB(highp uvec2);"
  1467. "ivec3 findMSB(highp uvec3);"
  1468. "ivec4 findMSB(highp uvec4);"
  1469. "\n");
  1470. }
  1471. if ((profile == EEsProfile && version >= 310) ||
  1472. (profile != EEsProfile && version >= 400)) {
  1473. commonBuiltins.append(
  1474. " uint uaddCarry(highp uint, highp uint, out lowp uint carry);"
  1475. "uvec2 uaddCarry(highp uvec2, highp uvec2, out lowp uvec2 carry);"
  1476. "uvec3 uaddCarry(highp uvec3, highp uvec3, out lowp uvec3 carry);"
  1477. "uvec4 uaddCarry(highp uvec4, highp uvec4, out lowp uvec4 carry);"
  1478. " uint usubBorrow(highp uint, highp uint, out lowp uint borrow);"
  1479. "uvec2 usubBorrow(highp uvec2, highp uvec2, out lowp uvec2 borrow);"
  1480. "uvec3 usubBorrow(highp uvec3, highp uvec3, out lowp uvec3 borrow);"
  1481. "uvec4 usubBorrow(highp uvec4, highp uvec4, out lowp uvec4 borrow);"
  1482. "void umulExtended(highp uint, highp uint, out highp uint, out highp uint lsb);"
  1483. "void umulExtended(highp uvec2, highp uvec2, out highp uvec2, out highp uvec2 lsb);"
  1484. "void umulExtended(highp uvec3, highp uvec3, out highp uvec3, out highp uvec3 lsb);"
  1485. "void umulExtended(highp uvec4, highp uvec4, out highp uvec4, out highp uvec4 lsb);"
  1486. "void imulExtended(highp int, highp int, out highp int, out highp int lsb);"
  1487. "void imulExtended(highp ivec2, highp ivec2, out highp ivec2, out highp ivec2 lsb);"
  1488. "void imulExtended(highp ivec3, highp ivec3, out highp ivec3, out highp ivec3 lsb);"
  1489. "void imulExtended(highp ivec4, highp ivec4, out highp ivec4, out highp ivec4 lsb);"
  1490. " int bitfieldReverse(highp int);"
  1491. "ivec2 bitfieldReverse(highp ivec2);"
  1492. "ivec3 bitfieldReverse(highp ivec3);"
  1493. "ivec4 bitfieldReverse(highp ivec4);"
  1494. " uint bitfieldReverse(highp uint);"
  1495. "uvec2 bitfieldReverse(highp uvec2);"
  1496. "uvec3 bitfieldReverse(highp uvec3);"
  1497. "uvec4 bitfieldReverse(highp uvec4);"
  1498. "\n");
  1499. }
  1500. if (profile == EEsProfile && version >= 310) {
  1501. commonBuiltins.append(
  1502. "lowp int bitCount( int);"
  1503. "lowp ivec2 bitCount(ivec2);"
  1504. "lowp ivec3 bitCount(ivec3);"
  1505. "lowp ivec4 bitCount(ivec4);"
  1506. "lowp int bitCount( uint);"
  1507. "lowp ivec2 bitCount(uvec2);"
  1508. "lowp ivec3 bitCount(uvec3);"
  1509. "lowp ivec4 bitCount(uvec4);"
  1510. "lowp int findMSB(highp int);"
  1511. "lowp ivec2 findMSB(highp ivec2);"
  1512. "lowp ivec3 findMSB(highp ivec3);"
  1513. "lowp ivec4 findMSB(highp ivec4);"
  1514. "lowp int findMSB(highp uint);"
  1515. "lowp ivec2 findMSB(highp uvec2);"
  1516. "lowp ivec3 findMSB(highp uvec3);"
  1517. "lowp ivec4 findMSB(highp uvec4);"
  1518. "\n");
  1519. }
  1520. #ifndef GLSLANG_ANGLE
  1521. // GL_ARB_shader_ballot
  1522. if (profile != EEsProfile && version >= 450) {
  1523. commonBuiltins.append(
  1524. "uint64_t ballotARB(bool);"
  1525. "float readInvocationARB(float, uint);"
  1526. "vec2 readInvocationARB(vec2, uint);"
  1527. "vec3 readInvocationARB(vec3, uint);"
  1528. "vec4 readInvocationARB(vec4, uint);"
  1529. "int readInvocationARB(int, uint);"
  1530. "ivec2 readInvocationARB(ivec2, uint);"
  1531. "ivec3 readInvocationARB(ivec3, uint);"
  1532. "ivec4 readInvocationARB(ivec4, uint);"
  1533. "uint readInvocationARB(uint, uint);"
  1534. "uvec2 readInvocationARB(uvec2, uint);"
  1535. "uvec3 readInvocationARB(uvec3, uint);"
  1536. "uvec4 readInvocationARB(uvec4, uint);"
  1537. "float readFirstInvocationARB(float);"
  1538. "vec2 readFirstInvocationARB(vec2);"
  1539. "vec3 readFirstInvocationARB(vec3);"
  1540. "vec4 readFirstInvocationARB(vec4);"
  1541. "int readFirstInvocationARB(int);"
  1542. "ivec2 readFirstInvocationARB(ivec2);"
  1543. "ivec3 readFirstInvocationARB(ivec3);"
  1544. "ivec4 readFirstInvocationARB(ivec4);"
  1545. "uint readFirstInvocationARB(uint);"
  1546. "uvec2 readFirstInvocationARB(uvec2);"
  1547. "uvec3 readFirstInvocationARB(uvec3);"
  1548. "uvec4 readFirstInvocationARB(uvec4);"
  1549. "\n");
  1550. }
  1551. // GL_ARB_shader_group_vote
  1552. if (profile != EEsProfile && version >= 430) {
  1553. commonBuiltins.append(
  1554. "bool anyInvocationARB(bool);"
  1555. "bool allInvocationsARB(bool);"
  1556. "bool allInvocationsEqualARB(bool);"
  1557. "\n");
  1558. }
  1559. // GL_KHR_shader_subgroup
  1560. if ((profile == EEsProfile && version >= 310) ||
  1561. (profile != EEsProfile && version >= 140)) {
  1562. commonBuiltins.append(
  1563. "void subgroupBarrier();"
  1564. "void subgroupMemoryBarrier();"
  1565. "void subgroupMemoryBarrierBuffer();"
  1566. "void subgroupMemoryBarrierImage();"
  1567. "bool subgroupElect();"
  1568. "bool subgroupAll(bool);\n"
  1569. "bool subgroupAny(bool);\n"
  1570. "uvec4 subgroupBallot(bool);\n"
  1571. "bool subgroupInverseBallot(uvec4);\n"
  1572. "bool subgroupBallotBitExtract(uvec4, uint);\n"
  1573. "uint subgroupBallotBitCount(uvec4);\n"
  1574. "uint subgroupBallotInclusiveBitCount(uvec4);\n"
  1575. "uint subgroupBallotExclusiveBitCount(uvec4);\n"
  1576. "uint subgroupBallotFindLSB(uvec4);\n"
  1577. "uint subgroupBallotFindMSB(uvec4);\n"
  1578. );
  1579. // Generate all flavors of subgroup ops.
  1580. static const char *subgroupOps[] =
  1581. {
  1582. "bool subgroupAllEqual(%s);\n",
  1583. "%s subgroupBroadcast(%s, uint);\n",
  1584. "%s subgroupBroadcastFirst(%s);\n",
  1585. "%s subgroupShuffle(%s, uint);\n",
  1586. "%s subgroupShuffleXor(%s, uint);\n",
  1587. "%s subgroupShuffleUp(%s, uint delta);\n",
  1588. "%s subgroupShuffleDown(%s, uint delta);\n",
  1589. "%s subgroupAdd(%s);\n",
  1590. "%s subgroupMul(%s);\n",
  1591. "%s subgroupMin(%s);\n",
  1592. "%s subgroupMax(%s);\n",
  1593. "%s subgroupAnd(%s);\n",
  1594. "%s subgroupOr(%s);\n",
  1595. "%s subgroupXor(%s);\n",
  1596. "%s subgroupInclusiveAdd(%s);\n",
  1597. "%s subgroupInclusiveMul(%s);\n",
  1598. "%s subgroupInclusiveMin(%s);\n",
  1599. "%s subgroupInclusiveMax(%s);\n",
  1600. "%s subgroupInclusiveAnd(%s);\n",
  1601. "%s subgroupInclusiveOr(%s);\n",
  1602. "%s subgroupInclusiveXor(%s);\n",
  1603. "%s subgroupExclusiveAdd(%s);\n",
  1604. "%s subgroupExclusiveMul(%s);\n",
  1605. "%s subgroupExclusiveMin(%s);\n",
  1606. "%s subgroupExclusiveMax(%s);\n",
  1607. "%s subgroupExclusiveAnd(%s);\n",
  1608. "%s subgroupExclusiveOr(%s);\n",
  1609. "%s subgroupExclusiveXor(%s);\n",
  1610. "%s subgroupClusteredAdd(%s, uint);\n",
  1611. "%s subgroupClusteredMul(%s, uint);\n",
  1612. "%s subgroupClusteredMin(%s, uint);\n",
  1613. "%s subgroupClusteredMax(%s, uint);\n",
  1614. "%s subgroupClusteredAnd(%s, uint);\n",
  1615. "%s subgroupClusteredOr(%s, uint);\n",
  1616. "%s subgroupClusteredXor(%s, uint);\n",
  1617. "%s subgroupQuadBroadcast(%s, uint);\n",
  1618. "%s subgroupQuadSwapHorizontal(%s);\n",
  1619. "%s subgroupQuadSwapVertical(%s);\n",
  1620. "%s subgroupQuadSwapDiagonal(%s);\n",
  1621. "uvec4 subgroupPartitionNV(%s);\n",
  1622. "%s subgroupPartitionedAddNV(%s, uvec4 ballot);\n",
  1623. "%s subgroupPartitionedMulNV(%s, uvec4 ballot);\n",
  1624. "%s subgroupPartitionedMinNV(%s, uvec4 ballot);\n",
  1625. "%s subgroupPartitionedMaxNV(%s, uvec4 ballot);\n",
  1626. "%s subgroupPartitionedAndNV(%s, uvec4 ballot);\n",
  1627. "%s subgroupPartitionedOrNV(%s, uvec4 ballot);\n",
  1628. "%s subgroupPartitionedXorNV(%s, uvec4 ballot);\n",
  1629. "%s subgroupPartitionedInclusiveAddNV(%s, uvec4 ballot);\n",
  1630. "%s subgroupPartitionedInclusiveMulNV(%s, uvec4 ballot);\n",
  1631. "%s subgroupPartitionedInclusiveMinNV(%s, uvec4 ballot);\n",
  1632. "%s subgroupPartitionedInclusiveMaxNV(%s, uvec4 ballot);\n",
  1633. "%s subgroupPartitionedInclusiveAndNV(%s, uvec4 ballot);\n",
  1634. "%s subgroupPartitionedInclusiveOrNV(%s, uvec4 ballot);\n",
  1635. "%s subgroupPartitionedInclusiveXorNV(%s, uvec4 ballot);\n",
  1636. "%s subgroupPartitionedExclusiveAddNV(%s, uvec4 ballot);\n",
  1637. "%s subgroupPartitionedExclusiveMulNV(%s, uvec4 ballot);\n",
  1638. "%s subgroupPartitionedExclusiveMinNV(%s, uvec4 ballot);\n",
  1639. "%s subgroupPartitionedExclusiveMaxNV(%s, uvec4 ballot);\n",
  1640. "%s subgroupPartitionedExclusiveAndNV(%s, uvec4 ballot);\n",
  1641. "%s subgroupPartitionedExclusiveOrNV(%s, uvec4 ballot);\n",
  1642. "%s subgroupPartitionedExclusiveXorNV(%s, uvec4 ballot);\n",
  1643. };
  1644. static const char *floatTypes[] = {
  1645. "float", "vec2", "vec3", "vec4",
  1646. "float16_t", "f16vec2", "f16vec3", "f16vec4",
  1647. };
  1648. static const char *doubleTypes[] = {
  1649. "double", "dvec2", "dvec3", "dvec4",
  1650. };
  1651. static const char *intTypes[] = {
  1652. "int8_t", "i8vec2", "i8vec3", "i8vec4",
  1653. "int16_t", "i16vec2", "i16vec3", "i16vec4",
  1654. "int", "ivec2", "ivec3", "ivec4",
  1655. "int64_t", "i64vec2", "i64vec3", "i64vec4",
  1656. "uint8_t", "u8vec2", "u8vec3", "u8vec4",
  1657. "uint16_t", "u16vec2", "u16vec3", "u16vec4",
  1658. "uint", "uvec2", "uvec3", "uvec4",
  1659. "uint64_t", "u64vec2", "u64vec3", "u64vec4",
  1660. };
  1661. static const char *boolTypes[] = {
  1662. "bool", "bvec2", "bvec3", "bvec4",
  1663. };
  1664. for (size_t i = 0; i < sizeof(subgroupOps)/sizeof(subgroupOps[0]); ++i) {
  1665. const char *op = subgroupOps[i];
  1666. // Logical operations don't support float
  1667. bool logicalOp = strstr(op, "Or") || strstr(op, "And") ||
  1668. (strstr(op, "Xor") && !strstr(op, "ShuffleXor"));
  1669. // Math operations don't support bool
  1670. bool mathOp = strstr(op, "Add") || strstr(op, "Mul") || strstr(op, "Min") || strstr(op, "Max");
  1671. const int bufSize = 256;
  1672. char buf[bufSize];
  1673. if (!logicalOp) {
  1674. for (size_t j = 0; j < sizeof(floatTypes)/sizeof(floatTypes[0]); ++j) {
  1675. snprintf(buf, bufSize, op, floatTypes[j], floatTypes[j]);
  1676. commonBuiltins.append(buf);
  1677. }
  1678. if (profile != EEsProfile && version >= 400) {
  1679. for (size_t j = 0; j < sizeof(doubleTypes)/sizeof(doubleTypes[0]); ++j) {
  1680. snprintf(buf, bufSize, op, doubleTypes[j], doubleTypes[j]);
  1681. commonBuiltins.append(buf);
  1682. }
  1683. }
  1684. }
  1685. if (!mathOp) {
  1686. for (size_t j = 0; j < sizeof(boolTypes)/sizeof(boolTypes[0]); ++j) {
  1687. snprintf(buf, bufSize, op, boolTypes[j], boolTypes[j]);
  1688. commonBuiltins.append(buf);
  1689. }
  1690. }
  1691. for (size_t j = 0; j < sizeof(intTypes)/sizeof(intTypes[0]); ++j) {
  1692. snprintf(buf, bufSize, op, intTypes[j], intTypes[j]);
  1693. commonBuiltins.append(buf);
  1694. }
  1695. }
  1696. stageBuiltins[EShLangCompute].append(
  1697. "void subgroupMemoryBarrierShared();"
  1698. "\n"
  1699. );
  1700. stageBuiltins[EShLangMeshNV].append(
  1701. "void subgroupMemoryBarrierShared();"
  1702. "\n"
  1703. );
  1704. stageBuiltins[EShLangTaskNV].append(
  1705. "void subgroupMemoryBarrierShared();"
  1706. "\n"
  1707. );
  1708. }
  1709. if (profile != EEsProfile && version >= 460) {
  1710. commonBuiltins.append(
  1711. "bool anyInvocation(bool);"
  1712. "bool allInvocations(bool);"
  1713. "bool allInvocationsEqual(bool);"
  1714. "\n");
  1715. }
  1716. // GL_AMD_shader_ballot
  1717. if (profile != EEsProfile && version >= 450) {
  1718. commonBuiltins.append(
  1719. "float minInvocationsAMD(float);"
  1720. "vec2 minInvocationsAMD(vec2);"
  1721. "vec3 minInvocationsAMD(vec3);"
  1722. "vec4 minInvocationsAMD(vec4);"
  1723. "int minInvocationsAMD(int);"
  1724. "ivec2 minInvocationsAMD(ivec2);"
  1725. "ivec3 minInvocationsAMD(ivec3);"
  1726. "ivec4 minInvocationsAMD(ivec4);"
  1727. "uint minInvocationsAMD(uint);"
  1728. "uvec2 minInvocationsAMD(uvec2);"
  1729. "uvec3 minInvocationsAMD(uvec3);"
  1730. "uvec4 minInvocationsAMD(uvec4);"
  1731. "double minInvocationsAMD(double);"
  1732. "dvec2 minInvocationsAMD(dvec2);"
  1733. "dvec3 minInvocationsAMD(dvec3);"
  1734. "dvec4 minInvocationsAMD(dvec4);"
  1735. "int64_t minInvocationsAMD(int64_t);"
  1736. "i64vec2 minInvocationsAMD(i64vec2);"
  1737. "i64vec3 minInvocationsAMD(i64vec3);"
  1738. "i64vec4 minInvocationsAMD(i64vec4);"
  1739. "uint64_t minInvocationsAMD(uint64_t);"
  1740. "u64vec2 minInvocationsAMD(u64vec2);"
  1741. "u64vec3 minInvocationsAMD(u64vec3);"
  1742. "u64vec4 minInvocationsAMD(u64vec4);"
  1743. "float16_t minInvocationsAMD(float16_t);"
  1744. "f16vec2 minInvocationsAMD(f16vec2);"
  1745. "f16vec3 minInvocationsAMD(f16vec3);"
  1746. "f16vec4 minInvocationsAMD(f16vec4);"
  1747. "int16_t minInvocationsAMD(int16_t);"
  1748. "i16vec2 minInvocationsAMD(i16vec2);"
  1749. "i16vec3 minInvocationsAMD(i16vec3);"
  1750. "i16vec4 minInvocationsAMD(i16vec4);"
  1751. "uint16_t minInvocationsAMD(uint16_t);"
  1752. "u16vec2 minInvocationsAMD(u16vec2);"
  1753. "u16vec3 minInvocationsAMD(u16vec3);"
  1754. "u16vec4 minInvocationsAMD(u16vec4);"
  1755. "float minInvocationsInclusiveScanAMD(float);"
  1756. "vec2 minInvocationsInclusiveScanAMD(vec2);"
  1757. "vec3 minInvocationsInclusiveScanAMD(vec3);"
  1758. "vec4 minInvocationsInclusiveScanAMD(vec4);"
  1759. "int minInvocationsInclusiveScanAMD(int);"
  1760. "ivec2 minInvocationsInclusiveScanAMD(ivec2);"
  1761. "ivec3 minInvocationsInclusiveScanAMD(ivec3);"
  1762. "ivec4 minInvocationsInclusiveScanAMD(ivec4);"
  1763. "uint minInvocationsInclusiveScanAMD(uint);"
  1764. "uvec2 minInvocationsInclusiveScanAMD(uvec2);"
  1765. "uvec3 minInvocationsInclusiveScanAMD(uvec3);"
  1766. "uvec4 minInvocationsInclusiveScanAMD(uvec4);"
  1767. "double minInvocationsInclusiveScanAMD(double);"
  1768. "dvec2 minInvocationsInclusiveScanAMD(dvec2);"
  1769. "dvec3 minInvocationsInclusiveScanAMD(dvec3);"
  1770. "dvec4 minInvocationsInclusiveScanAMD(dvec4);"
  1771. "int64_t minInvocationsInclusiveScanAMD(int64_t);"
  1772. "i64vec2 minInvocationsInclusiveScanAMD(i64vec2);"
  1773. "i64vec3 minInvocationsInclusiveScanAMD(i64vec3);"
  1774. "i64vec4 minInvocationsInclusiveScanAMD(i64vec4);"
  1775. "uint64_t minInvocationsInclusiveScanAMD(uint64_t);"
  1776. "u64vec2 minInvocationsInclusiveScanAMD(u64vec2);"
  1777. "u64vec3 minInvocationsInclusiveScanAMD(u64vec3);"
  1778. "u64vec4 minInvocationsInclusiveScanAMD(u64vec4);"
  1779. "float16_t minInvocationsInclusiveScanAMD(float16_t);"
  1780. "f16vec2 minInvocationsInclusiveScanAMD(f16vec2);"
  1781. "f16vec3 minInvocationsInclusiveScanAMD(f16vec3);"
  1782. "f16vec4 minInvocationsInclusiveScanAMD(f16vec4);"
  1783. "int16_t minInvocationsInclusiveScanAMD(int16_t);"
  1784. "i16vec2 minInvocationsInclusiveScanAMD(i16vec2);"
  1785. "i16vec3 minInvocationsInclusiveScanAMD(i16vec3);"
  1786. "i16vec4 minInvocationsInclusiveScanAMD(i16vec4);"
  1787. "uint16_t minInvocationsInclusiveScanAMD(uint16_t);"
  1788. "u16vec2 minInvocationsInclusiveScanAMD(u16vec2);"
  1789. "u16vec3 minInvocationsInclusiveScanAMD(u16vec3);"
  1790. "u16vec4 minInvocationsInclusiveScanAMD(u16vec4);"
  1791. "float minInvocationsExclusiveScanAMD(float);"
  1792. "vec2 minInvocationsExclusiveScanAMD(vec2);"
  1793. "vec3 minInvocationsExclusiveScanAMD(vec3);"
  1794. "vec4 minInvocationsExclusiveScanAMD(vec4);"
  1795. "int minInvocationsExclusiveScanAMD(int);"
  1796. "ivec2 minInvocationsExclusiveScanAMD(ivec2);"
  1797. "ivec3 minInvocationsExclusiveScanAMD(ivec3);"
  1798. "ivec4 minInvocationsExclusiveScanAMD(ivec4);"
  1799. "uint minInvocationsExclusiveScanAMD(uint);"
  1800. "uvec2 minInvocationsExclusiveScanAMD(uvec2);"
  1801. "uvec3 minInvocationsExclusiveScanAMD(uvec3);"
  1802. "uvec4 minInvocationsExclusiveScanAMD(uvec4);"
  1803. "double minInvocationsExclusiveScanAMD(double);"
  1804. "dvec2 minInvocationsExclusiveScanAMD(dvec2);"
  1805. "dvec3 minInvocationsExclusiveScanAMD(dvec3);"
  1806. "dvec4 minInvocationsExclusiveScanAMD(dvec4);"
  1807. "int64_t minInvocationsExclusiveScanAMD(int64_t);"
  1808. "i64vec2 minInvocationsExclusiveScanAMD(i64vec2);"
  1809. "i64vec3 minInvocationsExclusiveScanAMD(i64vec3);"
  1810. "i64vec4 minInvocationsExclusiveScanAMD(i64vec4);"
  1811. "uint64_t minInvocationsExclusiveScanAMD(uint64_t);"
  1812. "u64vec2 minInvocationsExclusiveScanAMD(u64vec2);"
  1813. "u64vec3 minInvocationsExclusiveScanAMD(u64vec3);"
  1814. "u64vec4 minInvocationsExclusiveScanAMD(u64vec4);"
  1815. "float16_t minInvocationsExclusiveScanAMD(float16_t);"
  1816. "f16vec2 minInvocationsExclusiveScanAMD(f16vec2);"
  1817. "f16vec3 minInvocationsExclusiveScanAMD(f16vec3);"
  1818. "f16vec4 minInvocationsExclusiveScanAMD(f16vec4);"
  1819. "int16_t minInvocationsExclusiveScanAMD(int16_t);"
  1820. "i16vec2 minInvocationsExclusiveScanAMD(i16vec2);"
  1821. "i16vec3 minInvocationsExclusiveScanAMD(i16vec3);"
  1822. "i16vec4 minInvocationsExclusiveScanAMD(i16vec4);"
  1823. "uint16_t minInvocationsExclusiveScanAMD(uint16_t);"
  1824. "u16vec2 minInvocationsExclusiveScanAMD(u16vec2);"
  1825. "u16vec3 minInvocationsExclusiveScanAMD(u16vec3);"
  1826. "u16vec4 minInvocationsExclusiveScanAMD(u16vec4);"
  1827. "float maxInvocationsAMD(float);"
  1828. "vec2 maxInvocationsAMD(vec2);"
  1829. "vec3 maxInvocationsAMD(vec3);"
  1830. "vec4 maxInvocationsAMD(vec4);"
  1831. "int maxInvocationsAMD(int);"
  1832. "ivec2 maxInvocationsAMD(ivec2);"
  1833. "ivec3 maxInvocationsAMD(ivec3);"
  1834. "ivec4 maxInvocationsAMD(ivec4);"
  1835. "uint maxInvocationsAMD(uint);"
  1836. "uvec2 maxInvocationsAMD(uvec2);"
  1837. "uvec3 maxInvocationsAMD(uvec3);"
  1838. "uvec4 maxInvocationsAMD(uvec4);"
  1839. "double maxInvocationsAMD(double);"
  1840. "dvec2 maxInvocationsAMD(dvec2);"
  1841. "dvec3 maxInvocationsAMD(dvec3);"
  1842. "dvec4 maxInvocationsAMD(dvec4);"
  1843. "int64_t maxInvocationsAMD(int64_t);"
  1844. "i64vec2 maxInvocationsAMD(i64vec2);"
  1845. "i64vec3 maxInvocationsAMD(i64vec3);"
  1846. "i64vec4 maxInvocationsAMD(i64vec4);"
  1847. "uint64_t maxInvocationsAMD(uint64_t);"
  1848. "u64vec2 maxInvocationsAMD(u64vec2);"
  1849. "u64vec3 maxInvocationsAMD(u64vec3);"
  1850. "u64vec4 maxInvocationsAMD(u64vec4);"
  1851. "float16_t maxInvocationsAMD(float16_t);"
  1852. "f16vec2 maxInvocationsAMD(f16vec2);"
  1853. "f16vec3 maxInvocationsAMD(f16vec3);"
  1854. "f16vec4 maxInvocationsAMD(f16vec4);"
  1855. "int16_t maxInvocationsAMD(int16_t);"
  1856. "i16vec2 maxInvocationsAMD(i16vec2);"
  1857. "i16vec3 maxInvocationsAMD(i16vec3);"
  1858. "i16vec4 maxInvocationsAMD(i16vec4);"
  1859. "uint16_t maxInvocationsAMD(uint16_t);"
  1860. "u16vec2 maxInvocationsAMD(u16vec2);"
  1861. "u16vec3 maxInvocationsAMD(u16vec3);"
  1862. "u16vec4 maxInvocationsAMD(u16vec4);"
  1863. "float maxInvocationsInclusiveScanAMD(float);"
  1864. "vec2 maxInvocationsInclusiveScanAMD(vec2);"
  1865. "vec3 maxInvocationsInclusiveScanAMD(vec3);"
  1866. "vec4 maxInvocationsInclusiveScanAMD(vec4);"
  1867. "int maxInvocationsInclusiveScanAMD(int);"
  1868. "ivec2 maxInvocationsInclusiveScanAMD(ivec2);"
  1869. "ivec3 maxInvocationsInclusiveScanAMD(ivec3);"
  1870. "ivec4 maxInvocationsInclusiveScanAMD(ivec4);"
  1871. "uint maxInvocationsInclusiveScanAMD(uint);"
  1872. "uvec2 maxInvocationsInclusiveScanAMD(uvec2);"
  1873. "uvec3 maxInvocationsInclusiveScanAMD(uvec3);"
  1874. "uvec4 maxInvocationsInclusiveScanAMD(uvec4);"
  1875. "double maxInvocationsInclusiveScanAMD(double);"
  1876. "dvec2 maxInvocationsInclusiveScanAMD(dvec2);"
  1877. "dvec3 maxInvocationsInclusiveScanAMD(dvec3);"
  1878. "dvec4 maxInvocationsInclusiveScanAMD(dvec4);"
  1879. "int64_t maxInvocationsInclusiveScanAMD(int64_t);"
  1880. "i64vec2 maxInvocationsInclusiveScanAMD(i64vec2);"
  1881. "i64vec3 maxInvocationsInclusiveScanAMD(i64vec3);"
  1882. "i64vec4 maxInvocationsInclusiveScanAMD(i64vec4);"
  1883. "uint64_t maxInvocationsInclusiveScanAMD(uint64_t);"
  1884. "u64vec2 maxInvocationsInclusiveScanAMD(u64vec2);"
  1885. "u64vec3 maxInvocationsInclusiveScanAMD(u64vec3);"
  1886. "u64vec4 maxInvocationsInclusiveScanAMD(u64vec4);"
  1887. "float16_t maxInvocationsInclusiveScanAMD(float16_t);"
  1888. "f16vec2 maxInvocationsInclusiveScanAMD(f16vec2);"
  1889. "f16vec3 maxInvocationsInclusiveScanAMD(f16vec3);"
  1890. "f16vec4 maxInvocationsInclusiveScanAMD(f16vec4);"
  1891. "int16_t maxInvocationsInclusiveScanAMD(int16_t);"
  1892. "i16vec2 maxInvocationsInclusiveScanAMD(i16vec2);"
  1893. "i16vec3 maxInvocationsInclusiveScanAMD(i16vec3);"
  1894. "i16vec4 maxInvocationsInclusiveScanAMD(i16vec4);"
  1895. "uint16_t maxInvocationsInclusiveScanAMD(uint16_t);"
  1896. "u16vec2 maxInvocationsInclusiveScanAMD(u16vec2);"
  1897. "u16vec3 maxInvocationsInclusiveScanAMD(u16vec3);"
  1898. "u16vec4 maxInvocationsInclusiveScanAMD(u16vec4);"
  1899. "float maxInvocationsExclusiveScanAMD(float);"
  1900. "vec2 maxInvocationsExclusiveScanAMD(vec2);"
  1901. "vec3 maxInvocationsExclusiveScanAMD(vec3);"
  1902. "vec4 maxInvocationsExclusiveScanAMD(vec4);"
  1903. "int maxInvocationsExclusiveScanAMD(int);"
  1904. "ivec2 maxInvocationsExclusiveScanAMD(ivec2);"
  1905. "ivec3 maxInvocationsExclusiveScanAMD(ivec3);"
  1906. "ivec4 maxInvocationsExclusiveScanAMD(ivec4);"
  1907. "uint maxInvocationsExclusiveScanAMD(uint);"
  1908. "uvec2 maxInvocationsExclusiveScanAMD(uvec2);"
  1909. "uvec3 maxInvocationsExclusiveScanAMD(uvec3);"
  1910. "uvec4 maxInvocationsExclusiveScanAMD(uvec4);"
  1911. "double maxInvocationsExclusiveScanAMD(double);"
  1912. "dvec2 maxInvocationsExclusiveScanAMD(dvec2);"
  1913. "dvec3 maxInvocationsExclusiveScanAMD(dvec3);"
  1914. "dvec4 maxInvocationsExclusiveScanAMD(dvec4);"
  1915. "int64_t maxInvocationsExclusiveScanAMD(int64_t);"
  1916. "i64vec2 maxInvocationsExclusiveScanAMD(i64vec2);"
  1917. "i64vec3 maxInvocationsExclusiveScanAMD(i64vec3);"
  1918. "i64vec4 maxInvocationsExclusiveScanAMD(i64vec4);"
  1919. "uint64_t maxInvocationsExclusiveScanAMD(uint64_t);"
  1920. "u64vec2 maxInvocationsExclusiveScanAMD(u64vec2);"
  1921. "u64vec3 maxInvocationsExclusiveScanAMD(u64vec3);"
  1922. "u64vec4 maxInvocationsExclusiveScanAMD(u64vec4);"
  1923. "float16_t maxInvocationsExclusiveScanAMD(float16_t);"
  1924. "f16vec2 maxInvocationsExclusiveScanAMD(f16vec2);"
  1925. "f16vec3 maxInvocationsExclusiveScanAMD(f16vec3);"
  1926. "f16vec4 maxInvocationsExclusiveScanAMD(f16vec4);"
  1927. "int16_t maxInvocationsExclusiveScanAMD(int16_t);"
  1928. "i16vec2 maxInvocationsExclusiveScanAMD(i16vec2);"
  1929. "i16vec3 maxInvocationsExclusiveScanAMD(i16vec3);"
  1930. "i16vec4 maxInvocationsExclusiveScanAMD(i16vec4);"
  1931. "uint16_t maxInvocationsExclusiveScanAMD(uint16_t);"
  1932. "u16vec2 maxInvocationsExclusiveScanAMD(u16vec2);"
  1933. "u16vec3 maxInvocationsExclusiveScanAMD(u16vec3);"
  1934. "u16vec4 maxInvocationsExclusiveScanAMD(u16vec4);"
  1935. "float addInvocationsAMD(float);"
  1936. "vec2 addInvocationsAMD(vec2);"
  1937. "vec3 addInvocationsAMD(vec3);"
  1938. "vec4 addInvocationsAMD(vec4);"
  1939. "int addInvocationsAMD(int);"
  1940. "ivec2 addInvocationsAMD(ivec2);"
  1941. "ivec3 addInvocationsAMD(ivec3);"
  1942. "ivec4 addInvocationsAMD(ivec4);"
  1943. "uint addInvocationsAMD(uint);"
  1944. "uvec2 addInvocationsAMD(uvec2);"
  1945. "uvec3 addInvocationsAMD(uvec3);"
  1946. "uvec4 addInvocationsAMD(uvec4);"
  1947. "double addInvocationsAMD(double);"
  1948. "dvec2 addInvocationsAMD(dvec2);"
  1949. "dvec3 addInvocationsAMD(dvec3);"
  1950. "dvec4 addInvocationsAMD(dvec4);"
  1951. "int64_t addInvocationsAMD(int64_t);"
  1952. "i64vec2 addInvocationsAMD(i64vec2);"
  1953. "i64vec3 addInvocationsAMD(i64vec3);"
  1954. "i64vec4 addInvocationsAMD(i64vec4);"
  1955. "uint64_t addInvocationsAMD(uint64_t);"
  1956. "u64vec2 addInvocationsAMD(u64vec2);"
  1957. "u64vec3 addInvocationsAMD(u64vec3);"
  1958. "u64vec4 addInvocationsAMD(u64vec4);"
  1959. "float16_t addInvocationsAMD(float16_t);"
  1960. "f16vec2 addInvocationsAMD(f16vec2);"
  1961. "f16vec3 addInvocationsAMD(f16vec3);"
  1962. "f16vec4 addInvocationsAMD(f16vec4);"
  1963. "int16_t addInvocationsAMD(int16_t);"
  1964. "i16vec2 addInvocationsAMD(i16vec2);"
  1965. "i16vec3 addInvocationsAMD(i16vec3);"
  1966. "i16vec4 addInvocationsAMD(i16vec4);"
  1967. "uint16_t addInvocationsAMD(uint16_t);"
  1968. "u16vec2 addInvocationsAMD(u16vec2);"
  1969. "u16vec3 addInvocationsAMD(u16vec3);"
  1970. "u16vec4 addInvocationsAMD(u16vec4);"
  1971. "float addInvocationsInclusiveScanAMD(float);"
  1972. "vec2 addInvocationsInclusiveScanAMD(vec2);"
  1973. "vec3 addInvocationsInclusiveScanAMD(vec3);"
  1974. "vec4 addInvocationsInclusiveScanAMD(vec4);"
  1975. "int addInvocationsInclusiveScanAMD(int);"
  1976. "ivec2 addInvocationsInclusiveScanAMD(ivec2);"
  1977. "ivec3 addInvocationsInclusiveScanAMD(ivec3);"
  1978. "ivec4 addInvocationsInclusiveScanAMD(ivec4);"
  1979. "uint addInvocationsInclusiveScanAMD(uint);"
  1980. "uvec2 addInvocationsInclusiveScanAMD(uvec2);"
  1981. "uvec3 addInvocationsInclusiveScanAMD(uvec3);"
  1982. "uvec4 addInvocationsInclusiveScanAMD(uvec4);"
  1983. "double addInvocationsInclusiveScanAMD(double);"
  1984. "dvec2 addInvocationsInclusiveScanAMD(dvec2);"
  1985. "dvec3 addInvocationsInclusiveScanAMD(dvec3);"
  1986. "dvec4 addInvocationsInclusiveScanAMD(dvec4);"
  1987. "int64_t addInvocationsInclusiveScanAMD(int64_t);"
  1988. "i64vec2 addInvocationsInclusiveScanAMD(i64vec2);"
  1989. "i64vec3 addInvocationsInclusiveScanAMD(i64vec3);"
  1990. "i64vec4 addInvocationsInclusiveScanAMD(i64vec4);"
  1991. "uint64_t addInvocationsInclusiveScanAMD(uint64_t);"
  1992. "u64vec2 addInvocationsInclusiveScanAMD(u64vec2);"
  1993. "u64vec3 addInvocationsInclusiveScanAMD(u64vec3);"
  1994. "u64vec4 addInvocationsInclusiveScanAMD(u64vec4);"
  1995. "float16_t addInvocationsInclusiveScanAMD(float16_t);"
  1996. "f16vec2 addInvocationsInclusiveScanAMD(f16vec2);"
  1997. "f16vec3 addInvocationsInclusiveScanAMD(f16vec3);"
  1998. "f16vec4 addInvocationsInclusiveScanAMD(f16vec4);"
  1999. "int16_t addInvocationsInclusiveScanAMD(int16_t);"
  2000. "i16vec2 addInvocationsInclusiveScanAMD(i16vec2);"
  2001. "i16vec3 addInvocationsInclusiveScanAMD(i16vec3);"
  2002. "i16vec4 addInvocationsInclusiveScanAMD(i16vec4);"
  2003. "uint16_t addInvocationsInclusiveScanAMD(uint16_t);"
  2004. "u16vec2 addInvocationsInclusiveScanAMD(u16vec2);"
  2005. "u16vec3 addInvocationsInclusiveScanAMD(u16vec3);"
  2006. "u16vec4 addInvocationsInclusiveScanAMD(u16vec4);"
  2007. "float addInvocationsExclusiveScanAMD(float);"
  2008. "vec2 addInvocationsExclusiveScanAMD(vec2);"
  2009. "vec3 addInvocationsExclusiveScanAMD(vec3);"
  2010. "vec4 addInvocationsExclusiveScanAMD(vec4);"
  2011. "int addInvocationsExclusiveScanAMD(int);"
  2012. "ivec2 addInvocationsExclusiveScanAMD(ivec2);"
  2013. "ivec3 addInvocationsExclusiveScanAMD(ivec3);"
  2014. "ivec4 addInvocationsExclusiveScanAMD(ivec4);"
  2015. "uint addInvocationsExclusiveScanAMD(uint);"
  2016. "uvec2 addInvocationsExclusiveScanAMD(uvec2);"
  2017. "uvec3 addInvocationsExclusiveScanAMD(uvec3);"
  2018. "uvec4 addInvocationsExclusiveScanAMD(uvec4);"
  2019. "double addInvocationsExclusiveScanAMD(double);"
  2020. "dvec2 addInvocationsExclusiveScanAMD(dvec2);"
  2021. "dvec3 addInvocationsExclusiveScanAMD(dvec3);"
  2022. "dvec4 addInvocationsExclusiveScanAMD(dvec4);"
  2023. "int64_t addInvocationsExclusiveScanAMD(int64_t);"
  2024. "i64vec2 addInvocationsExclusiveScanAMD(i64vec2);"
  2025. "i64vec3 addInvocationsExclusiveScanAMD(i64vec3);"
  2026. "i64vec4 addInvocationsExclusiveScanAMD(i64vec4);"
  2027. "uint64_t addInvocationsExclusiveScanAMD(uint64_t);"
  2028. "u64vec2 addInvocationsExclusiveScanAMD(u64vec2);"
  2029. "u64vec3 addInvocationsExclusiveScanAMD(u64vec3);"
  2030. "u64vec4 addInvocationsExclusiveScanAMD(u64vec4);"
  2031. "float16_t addInvocationsExclusiveScanAMD(float16_t);"
  2032. "f16vec2 addInvocationsExclusiveScanAMD(f16vec2);"
  2033. "f16vec3 addInvocationsExclusiveScanAMD(f16vec3);"
  2034. "f16vec4 addInvocationsExclusiveScanAMD(f16vec4);"
  2035. "int16_t addInvocationsExclusiveScanAMD(int16_t);"
  2036. "i16vec2 addInvocationsExclusiveScanAMD(i16vec2);"
  2037. "i16vec3 addInvocationsExclusiveScanAMD(i16vec3);"
  2038. "i16vec4 addInvocationsExclusiveScanAMD(i16vec4);"
  2039. "uint16_t addInvocationsExclusiveScanAMD(uint16_t);"
  2040. "u16vec2 addInvocationsExclusiveScanAMD(u16vec2);"
  2041. "u16vec3 addInvocationsExclusiveScanAMD(u16vec3);"
  2042. "u16vec4 addInvocationsExclusiveScanAMD(u16vec4);"
  2043. "float minInvocationsNonUniformAMD(float);"
  2044. "vec2 minInvocationsNonUniformAMD(vec2);"
  2045. "vec3 minInvocationsNonUniformAMD(vec3);"
  2046. "vec4 minInvocationsNonUniformAMD(vec4);"
  2047. "int minInvocationsNonUniformAMD(int);"
  2048. "ivec2 minInvocationsNonUniformAMD(ivec2);"
  2049. "ivec3 minInvocationsNonUniformAMD(ivec3);"
  2050. "ivec4 minInvocationsNonUniformAMD(ivec4);"
  2051. "uint minInvocationsNonUniformAMD(uint);"
  2052. "uvec2 minInvocationsNonUniformAMD(uvec2);"
  2053. "uvec3 minInvocationsNonUniformAMD(uvec3);"
  2054. "uvec4 minInvocationsNonUniformAMD(uvec4);"
  2055. "double minInvocationsNonUniformAMD(double);"
  2056. "dvec2 minInvocationsNonUniformAMD(dvec2);"
  2057. "dvec3 minInvocationsNonUniformAMD(dvec3);"
  2058. "dvec4 minInvocationsNonUniformAMD(dvec4);"
  2059. "int64_t minInvocationsNonUniformAMD(int64_t);"
  2060. "i64vec2 minInvocationsNonUniformAMD(i64vec2);"
  2061. "i64vec3 minInvocationsNonUniformAMD(i64vec3);"
  2062. "i64vec4 minInvocationsNonUniformAMD(i64vec4);"
  2063. "uint64_t minInvocationsNonUniformAMD(uint64_t);"
  2064. "u64vec2 minInvocationsNonUniformAMD(u64vec2);"
  2065. "u64vec3 minInvocationsNonUniformAMD(u64vec3);"
  2066. "u64vec4 minInvocationsNonUniformAMD(u64vec4);"
  2067. "float16_t minInvocationsNonUniformAMD(float16_t);"
  2068. "f16vec2 minInvocationsNonUniformAMD(f16vec2);"
  2069. "f16vec3 minInvocationsNonUniformAMD(f16vec3);"
  2070. "f16vec4 minInvocationsNonUniformAMD(f16vec4);"
  2071. "int16_t minInvocationsNonUniformAMD(int16_t);"
  2072. "i16vec2 minInvocationsNonUniformAMD(i16vec2);"
  2073. "i16vec3 minInvocationsNonUniformAMD(i16vec3);"
  2074. "i16vec4 minInvocationsNonUniformAMD(i16vec4);"
  2075. "uint16_t minInvocationsNonUniformAMD(uint16_t);"
  2076. "u16vec2 minInvocationsNonUniformAMD(u16vec2);"
  2077. "u16vec3 minInvocationsNonUniformAMD(u16vec3);"
  2078. "u16vec4 minInvocationsNonUniformAMD(u16vec4);"
  2079. "float minInvocationsInclusiveScanNonUniformAMD(float);"
  2080. "vec2 minInvocationsInclusiveScanNonUniformAMD(vec2);"
  2081. "vec3 minInvocationsInclusiveScanNonUniformAMD(vec3);"
  2082. "vec4 minInvocationsInclusiveScanNonUniformAMD(vec4);"
  2083. "int minInvocationsInclusiveScanNonUniformAMD(int);"
  2084. "ivec2 minInvocationsInclusiveScanNonUniformAMD(ivec2);"
  2085. "ivec3 minInvocationsInclusiveScanNonUniformAMD(ivec3);"
  2086. "ivec4 minInvocationsInclusiveScanNonUniformAMD(ivec4);"
  2087. "uint minInvocationsInclusiveScanNonUniformAMD(uint);"
  2088. "uvec2 minInvocationsInclusiveScanNonUniformAMD(uvec2);"
  2089. "uvec3 minInvocationsInclusiveScanNonUniformAMD(uvec3);"
  2090. "uvec4 minInvocationsInclusiveScanNonUniformAMD(uvec4);"
  2091. "double minInvocationsInclusiveScanNonUniformAMD(double);"
  2092. "dvec2 minInvocationsInclusiveScanNonUniformAMD(dvec2);"
  2093. "dvec3 minInvocationsInclusiveScanNonUniformAMD(dvec3);"
  2094. "dvec4 minInvocationsInclusiveScanNonUniformAMD(dvec4);"
  2095. "int64_t minInvocationsInclusiveScanNonUniformAMD(int64_t);"
  2096. "i64vec2 minInvocationsInclusiveScanNonUniformAMD(i64vec2);"
  2097. "i64vec3 minInvocationsInclusiveScanNonUniformAMD(i64vec3);"
  2098. "i64vec4 minInvocationsInclusiveScanNonUniformAMD(i64vec4);"
  2099. "uint64_t minInvocationsInclusiveScanNonUniformAMD(uint64_t);"
  2100. "u64vec2 minInvocationsInclusiveScanNonUniformAMD(u64vec2);"
  2101. "u64vec3 minInvocationsInclusiveScanNonUniformAMD(u64vec3);"
  2102. "u64vec4 minInvocationsInclusiveScanNonUniformAMD(u64vec4);"
  2103. "float16_t minInvocationsInclusiveScanNonUniformAMD(float16_t);"
  2104. "f16vec2 minInvocationsInclusiveScanNonUniformAMD(f16vec2);"
  2105. "f16vec3 minInvocationsInclusiveScanNonUniformAMD(f16vec3);"
  2106. "f16vec4 minInvocationsInclusiveScanNonUniformAMD(f16vec4);"
  2107. "int16_t minInvocationsInclusiveScanNonUniformAMD(int16_t);"
  2108. "i16vec2 minInvocationsInclusiveScanNonUniformAMD(i16vec2);"
  2109. "i16vec3 minInvocationsInclusiveScanNonUniformAMD(i16vec3);"
  2110. "i16vec4 minInvocationsInclusiveScanNonUniformAMD(i16vec4);"
  2111. "uint16_t minInvocationsInclusiveScanNonUniformAMD(uint16_t);"
  2112. "u16vec2 minInvocationsInclusiveScanNonUniformAMD(u16vec2);"
  2113. "u16vec3 minInvocationsInclusiveScanNonUniformAMD(u16vec3);"
  2114. "u16vec4 minInvocationsInclusiveScanNonUniformAMD(u16vec4);"
  2115. "float minInvocationsExclusiveScanNonUniformAMD(float);"
  2116. "vec2 minInvocationsExclusiveScanNonUniformAMD(vec2);"
  2117. "vec3 minInvocationsExclusiveScanNonUniformAMD(vec3);"
  2118. "vec4 minInvocationsExclusiveScanNonUniformAMD(vec4);"
  2119. "int minInvocationsExclusiveScanNonUniformAMD(int);"
  2120. "ivec2 minInvocationsExclusiveScanNonUniformAMD(ivec2);"
  2121. "ivec3 minInvocationsExclusiveScanNonUniformAMD(ivec3);"
  2122. "ivec4 minInvocationsExclusiveScanNonUniformAMD(ivec4);"
  2123. "uint minInvocationsExclusiveScanNonUniformAMD(uint);"
  2124. "uvec2 minInvocationsExclusiveScanNonUniformAMD(uvec2);"
  2125. "uvec3 minInvocationsExclusiveScanNonUniformAMD(uvec3);"
  2126. "uvec4 minInvocationsExclusiveScanNonUniformAMD(uvec4);"
  2127. "double minInvocationsExclusiveScanNonUniformAMD(double);"
  2128. "dvec2 minInvocationsExclusiveScanNonUniformAMD(dvec2);"
  2129. "dvec3 minInvocationsExclusiveScanNonUniformAMD(dvec3);"
  2130. "dvec4 minInvocationsExclusiveScanNonUniformAMD(dvec4);"
  2131. "int64_t minInvocationsExclusiveScanNonUniformAMD(int64_t);"
  2132. "i64vec2 minInvocationsExclusiveScanNonUniformAMD(i64vec2);"
  2133. "i64vec3 minInvocationsExclusiveScanNonUniformAMD(i64vec3);"
  2134. "i64vec4 minInvocationsExclusiveScanNonUniformAMD(i64vec4);"
  2135. "uint64_t minInvocationsExclusiveScanNonUniformAMD(uint64_t);"
  2136. "u64vec2 minInvocationsExclusiveScanNonUniformAMD(u64vec2);"
  2137. "u64vec3 minInvocationsExclusiveScanNonUniformAMD(u64vec3);"
  2138. "u64vec4 minInvocationsExclusiveScanNonUniformAMD(u64vec4);"
  2139. "float16_t minInvocationsExclusiveScanNonUniformAMD(float16_t);"
  2140. "f16vec2 minInvocationsExclusiveScanNonUniformAMD(f16vec2);"
  2141. "f16vec3 minInvocationsExclusiveScanNonUniformAMD(f16vec3);"
  2142. "f16vec4 minInvocationsExclusiveScanNonUniformAMD(f16vec4);"
  2143. "int16_t minInvocationsExclusiveScanNonUniformAMD(int16_t);"
  2144. "i16vec2 minInvocationsExclusiveScanNonUniformAMD(i16vec2);"
  2145. "i16vec3 minInvocationsExclusiveScanNonUniformAMD(i16vec3);"
  2146. "i16vec4 minInvocationsExclusiveScanNonUniformAMD(i16vec4);"
  2147. "uint16_t minInvocationsExclusiveScanNonUniformAMD(uint16_t);"
  2148. "u16vec2 minInvocationsExclusiveScanNonUniformAMD(u16vec2);"
  2149. "u16vec3 minInvocationsExclusiveScanNonUniformAMD(u16vec3);"
  2150. "u16vec4 minInvocationsExclusiveScanNonUniformAMD(u16vec4);"
  2151. "float maxInvocationsNonUniformAMD(float);"
  2152. "vec2 maxInvocationsNonUniformAMD(vec2);"
  2153. "vec3 maxInvocationsNonUniformAMD(vec3);"
  2154. "vec4 maxInvocationsNonUniformAMD(vec4);"
  2155. "int maxInvocationsNonUniformAMD(int);"
  2156. "ivec2 maxInvocationsNonUniformAMD(ivec2);"
  2157. "ivec3 maxInvocationsNonUniformAMD(ivec3);"
  2158. "ivec4 maxInvocationsNonUniformAMD(ivec4);"
  2159. "uint maxInvocationsNonUniformAMD(uint);"
  2160. "uvec2 maxInvocationsNonUniformAMD(uvec2);"
  2161. "uvec3 maxInvocationsNonUniformAMD(uvec3);"
  2162. "uvec4 maxInvocationsNonUniformAMD(uvec4);"
  2163. "double maxInvocationsNonUniformAMD(double);"
  2164. "dvec2 maxInvocationsNonUniformAMD(dvec2);"
  2165. "dvec3 maxInvocationsNonUniformAMD(dvec3);"
  2166. "dvec4 maxInvocationsNonUniformAMD(dvec4);"
  2167. "int64_t maxInvocationsNonUniformAMD(int64_t);"
  2168. "i64vec2 maxInvocationsNonUniformAMD(i64vec2);"
  2169. "i64vec3 maxInvocationsNonUniformAMD(i64vec3);"
  2170. "i64vec4 maxInvocationsNonUniformAMD(i64vec4);"
  2171. "uint64_t maxInvocationsNonUniformAMD(uint64_t);"
  2172. "u64vec2 maxInvocationsNonUniformAMD(u64vec2);"
  2173. "u64vec3 maxInvocationsNonUniformAMD(u64vec3);"
  2174. "u64vec4 maxInvocationsNonUniformAMD(u64vec4);"
  2175. "float16_t maxInvocationsNonUniformAMD(float16_t);"
  2176. "f16vec2 maxInvocationsNonUniformAMD(f16vec2);"
  2177. "f16vec3 maxInvocationsNonUniformAMD(f16vec3);"
  2178. "f16vec4 maxInvocationsNonUniformAMD(f16vec4);"
  2179. "int16_t maxInvocationsNonUniformAMD(int16_t);"
  2180. "i16vec2 maxInvocationsNonUniformAMD(i16vec2);"
  2181. "i16vec3 maxInvocationsNonUniformAMD(i16vec3);"
  2182. "i16vec4 maxInvocationsNonUniformAMD(i16vec4);"
  2183. "uint16_t maxInvocationsNonUniformAMD(uint16_t);"
  2184. "u16vec2 maxInvocationsNonUniformAMD(u16vec2);"
  2185. "u16vec3 maxInvocationsNonUniformAMD(u16vec3);"
  2186. "u16vec4 maxInvocationsNonUniformAMD(u16vec4);"
  2187. "float maxInvocationsInclusiveScanNonUniformAMD(float);"
  2188. "vec2 maxInvocationsInclusiveScanNonUniformAMD(vec2);"
  2189. "vec3 maxInvocationsInclusiveScanNonUniformAMD(vec3);"
  2190. "vec4 maxInvocationsInclusiveScanNonUniformAMD(vec4);"
  2191. "int maxInvocationsInclusiveScanNonUniformAMD(int);"
  2192. "ivec2 maxInvocationsInclusiveScanNonUniformAMD(ivec2);"
  2193. "ivec3 maxInvocationsInclusiveScanNonUniformAMD(ivec3);"
  2194. "ivec4 maxInvocationsInclusiveScanNonUniformAMD(ivec4);"
  2195. "uint maxInvocationsInclusiveScanNonUniformAMD(uint);"
  2196. "uvec2 maxInvocationsInclusiveScanNonUniformAMD(uvec2);"
  2197. "uvec3 maxInvocationsInclusiveScanNonUniformAMD(uvec3);"
  2198. "uvec4 maxInvocationsInclusiveScanNonUniformAMD(uvec4);"
  2199. "double maxInvocationsInclusiveScanNonUniformAMD(double);"
  2200. "dvec2 maxInvocationsInclusiveScanNonUniformAMD(dvec2);"
  2201. "dvec3 maxInvocationsInclusiveScanNonUniformAMD(dvec3);"
  2202. "dvec4 maxInvocationsInclusiveScanNonUniformAMD(dvec4);"
  2203. "int64_t maxInvocationsInclusiveScanNonUniformAMD(int64_t);"
  2204. "i64vec2 maxInvocationsInclusiveScanNonUniformAMD(i64vec2);"
  2205. "i64vec3 maxInvocationsInclusiveScanNonUniformAMD(i64vec3);"
  2206. "i64vec4 maxInvocationsInclusiveScanNonUniformAMD(i64vec4);"
  2207. "uint64_t maxInvocationsInclusiveScanNonUniformAMD(uint64_t);"
  2208. "u64vec2 maxInvocationsInclusiveScanNonUniformAMD(u64vec2);"
  2209. "u64vec3 maxInvocationsInclusiveScanNonUniformAMD(u64vec3);"
  2210. "u64vec4 maxInvocationsInclusiveScanNonUniformAMD(u64vec4);"
  2211. "float16_t maxInvocationsInclusiveScanNonUniformAMD(float16_t);"
  2212. "f16vec2 maxInvocationsInclusiveScanNonUniformAMD(f16vec2);"
  2213. "f16vec3 maxInvocationsInclusiveScanNonUniformAMD(f16vec3);"
  2214. "f16vec4 maxInvocationsInclusiveScanNonUniformAMD(f16vec4);"
  2215. "int16_t maxInvocationsInclusiveScanNonUniformAMD(int16_t);"
  2216. "i16vec2 maxInvocationsInclusiveScanNonUniformAMD(i16vec2);"
  2217. "i16vec3 maxInvocationsInclusiveScanNonUniformAMD(i16vec3);"
  2218. "i16vec4 maxInvocationsInclusiveScanNonUniformAMD(i16vec4);"
  2219. "uint16_t maxInvocationsInclusiveScanNonUniformAMD(uint16_t);"
  2220. "u16vec2 maxInvocationsInclusiveScanNonUniformAMD(u16vec2);"
  2221. "u16vec3 maxInvocationsInclusiveScanNonUniformAMD(u16vec3);"
  2222. "u16vec4 maxInvocationsInclusiveScanNonUniformAMD(u16vec4);"
  2223. "float maxInvocationsExclusiveScanNonUniformAMD(float);"
  2224. "vec2 maxInvocationsExclusiveScanNonUniformAMD(vec2);"
  2225. "vec3 maxInvocationsExclusiveScanNonUniformAMD(vec3);"
  2226. "vec4 maxInvocationsExclusiveScanNonUniformAMD(vec4);"
  2227. "int maxInvocationsExclusiveScanNonUniformAMD(int);"
  2228. "ivec2 maxInvocationsExclusiveScanNonUniformAMD(ivec2);"
  2229. "ivec3 maxInvocationsExclusiveScanNonUniformAMD(ivec3);"
  2230. "ivec4 maxInvocationsExclusiveScanNonUniformAMD(ivec4);"
  2231. "uint maxInvocationsExclusiveScanNonUniformAMD(uint);"
  2232. "uvec2 maxInvocationsExclusiveScanNonUniformAMD(uvec2);"
  2233. "uvec3 maxInvocationsExclusiveScanNonUniformAMD(uvec3);"
  2234. "uvec4 maxInvocationsExclusiveScanNonUniformAMD(uvec4);"
  2235. "double maxInvocationsExclusiveScanNonUniformAMD(double);"
  2236. "dvec2 maxInvocationsExclusiveScanNonUniformAMD(dvec2);"
  2237. "dvec3 maxInvocationsExclusiveScanNonUniformAMD(dvec3);"
  2238. "dvec4 maxInvocationsExclusiveScanNonUniformAMD(dvec4);"
  2239. "int64_t maxInvocationsExclusiveScanNonUniformAMD(int64_t);"
  2240. "i64vec2 maxInvocationsExclusiveScanNonUniformAMD(i64vec2);"
  2241. "i64vec3 maxInvocationsExclusiveScanNonUniformAMD(i64vec3);"
  2242. "i64vec4 maxInvocationsExclusiveScanNonUniformAMD(i64vec4);"
  2243. "uint64_t maxInvocationsExclusiveScanNonUniformAMD(uint64_t);"
  2244. "u64vec2 maxInvocationsExclusiveScanNonUniformAMD(u64vec2);"
  2245. "u64vec3 maxInvocationsExclusiveScanNonUniformAMD(u64vec3);"
  2246. "u64vec4 maxInvocationsExclusiveScanNonUniformAMD(u64vec4);"
  2247. "float16_t maxInvocationsExclusiveScanNonUniformAMD(float16_t);"
  2248. "f16vec2 maxInvocationsExclusiveScanNonUniformAMD(f16vec2);"
  2249. "f16vec3 maxInvocationsExclusiveScanNonUniformAMD(f16vec3);"
  2250. "f16vec4 maxInvocationsExclusiveScanNonUniformAMD(f16vec4);"
  2251. "int16_t maxInvocationsExclusiveScanNonUniformAMD(int16_t);"
  2252. "i16vec2 maxInvocationsExclusiveScanNonUniformAMD(i16vec2);"
  2253. "i16vec3 maxInvocationsExclusiveScanNonUniformAMD(i16vec3);"
  2254. "i16vec4 maxInvocationsExclusiveScanNonUniformAMD(i16vec4);"
  2255. "uint16_t maxInvocationsExclusiveScanNonUniformAMD(uint16_t);"
  2256. "u16vec2 maxInvocationsExclusiveScanNonUniformAMD(u16vec2);"
  2257. "u16vec3 maxInvocationsExclusiveScanNonUniformAMD(u16vec3);"
  2258. "u16vec4 maxInvocationsExclusiveScanNonUniformAMD(u16vec4);"
  2259. "float addInvocationsNonUniformAMD(float);"
  2260. "vec2 addInvocationsNonUniformAMD(vec2);"
  2261. "vec3 addInvocationsNonUniformAMD(vec3);"
  2262. "vec4 addInvocationsNonUniformAMD(vec4);"
  2263. "int addInvocationsNonUniformAMD(int);"
  2264. "ivec2 addInvocationsNonUniformAMD(ivec2);"
  2265. "ivec3 addInvocationsNonUniformAMD(ivec3);"
  2266. "ivec4 addInvocationsNonUniformAMD(ivec4);"
  2267. "uint addInvocationsNonUniformAMD(uint);"
  2268. "uvec2 addInvocationsNonUniformAMD(uvec2);"
  2269. "uvec3 addInvocationsNonUniformAMD(uvec3);"
  2270. "uvec4 addInvocationsNonUniformAMD(uvec4);"
  2271. "double addInvocationsNonUniformAMD(double);"
  2272. "dvec2 addInvocationsNonUniformAMD(dvec2);"
  2273. "dvec3 addInvocationsNonUniformAMD(dvec3);"
  2274. "dvec4 addInvocationsNonUniformAMD(dvec4);"
  2275. "int64_t addInvocationsNonUniformAMD(int64_t);"
  2276. "i64vec2 addInvocationsNonUniformAMD(i64vec2);"
  2277. "i64vec3 addInvocationsNonUniformAMD(i64vec3);"
  2278. "i64vec4 addInvocationsNonUniformAMD(i64vec4);"
  2279. "uint64_t addInvocationsNonUniformAMD(uint64_t);"
  2280. "u64vec2 addInvocationsNonUniformAMD(u64vec2);"
  2281. "u64vec3 addInvocationsNonUniformAMD(u64vec3);"
  2282. "u64vec4 addInvocationsNonUniformAMD(u64vec4);"
  2283. "float16_t addInvocationsNonUniformAMD(float16_t);"
  2284. "f16vec2 addInvocationsNonUniformAMD(f16vec2);"
  2285. "f16vec3 addInvocationsNonUniformAMD(f16vec3);"
  2286. "f16vec4 addInvocationsNonUniformAMD(f16vec4);"
  2287. "int16_t addInvocationsNonUniformAMD(int16_t);"
  2288. "i16vec2 addInvocationsNonUniformAMD(i16vec2);"
  2289. "i16vec3 addInvocationsNonUniformAMD(i16vec3);"
  2290. "i16vec4 addInvocationsNonUniformAMD(i16vec4);"
  2291. "uint16_t addInvocationsNonUniformAMD(uint16_t);"
  2292. "u16vec2 addInvocationsNonUniformAMD(u16vec2);"
  2293. "u16vec3 addInvocationsNonUniformAMD(u16vec3);"
  2294. "u16vec4 addInvocationsNonUniformAMD(u16vec4);"
  2295. "float addInvocationsInclusiveScanNonUniformAMD(float);"
  2296. "vec2 addInvocationsInclusiveScanNonUniformAMD(vec2);"
  2297. "vec3 addInvocationsInclusiveScanNonUniformAMD(vec3);"
  2298. "vec4 addInvocationsInclusiveScanNonUniformAMD(vec4);"
  2299. "int addInvocationsInclusiveScanNonUniformAMD(int);"
  2300. "ivec2 addInvocationsInclusiveScanNonUniformAMD(ivec2);"
  2301. "ivec3 addInvocationsInclusiveScanNonUniformAMD(ivec3);"
  2302. "ivec4 addInvocationsInclusiveScanNonUniformAMD(ivec4);"
  2303. "uint addInvocationsInclusiveScanNonUniformAMD(uint);"
  2304. "uvec2 addInvocationsInclusiveScanNonUniformAMD(uvec2);"
  2305. "uvec3 addInvocationsInclusiveScanNonUniformAMD(uvec3);"
  2306. "uvec4 addInvocationsInclusiveScanNonUniformAMD(uvec4);"
  2307. "double addInvocationsInclusiveScanNonUniformAMD(double);"
  2308. "dvec2 addInvocationsInclusiveScanNonUniformAMD(dvec2);"
  2309. "dvec3 addInvocationsInclusiveScanNonUniformAMD(dvec3);"
  2310. "dvec4 addInvocationsInclusiveScanNonUniformAMD(dvec4);"
  2311. "int64_t addInvocationsInclusiveScanNonUniformAMD(int64_t);"
  2312. "i64vec2 addInvocationsInclusiveScanNonUniformAMD(i64vec2);"
  2313. "i64vec3 addInvocationsInclusiveScanNonUniformAMD(i64vec3);"
  2314. "i64vec4 addInvocationsInclusiveScanNonUniformAMD(i64vec4);"
  2315. "uint64_t addInvocationsInclusiveScanNonUniformAMD(uint64_t);"
  2316. "u64vec2 addInvocationsInclusiveScanNonUniformAMD(u64vec2);"
  2317. "u64vec3 addInvocationsInclusiveScanNonUniformAMD(u64vec3);"
  2318. "u64vec4 addInvocationsInclusiveScanNonUniformAMD(u64vec4);"
  2319. "float16_t addInvocationsInclusiveScanNonUniformAMD(float16_t);"
  2320. "f16vec2 addInvocationsInclusiveScanNonUniformAMD(f16vec2);"
  2321. "f16vec3 addInvocationsInclusiveScanNonUniformAMD(f16vec3);"
  2322. "f16vec4 addInvocationsInclusiveScanNonUniformAMD(f16vec4);"
  2323. "int16_t addInvocationsInclusiveScanNonUniformAMD(int16_t);"
  2324. "i16vec2 addInvocationsInclusiveScanNonUniformAMD(i16vec2);"
  2325. "i16vec3 addInvocationsInclusiveScanNonUniformAMD(i16vec3);"
  2326. "i16vec4 addInvocationsInclusiveScanNonUniformAMD(i16vec4);"
  2327. "uint16_t addInvocationsInclusiveScanNonUniformAMD(uint16_t);"
  2328. "u16vec2 addInvocationsInclusiveScanNonUniformAMD(u16vec2);"
  2329. "u16vec3 addInvocationsInclusiveScanNonUniformAMD(u16vec3);"
  2330. "u16vec4 addInvocationsInclusiveScanNonUniformAMD(u16vec4);"
  2331. "float addInvocationsExclusiveScanNonUniformAMD(float);"
  2332. "vec2 addInvocationsExclusiveScanNonUniformAMD(vec2);"
  2333. "vec3 addInvocationsExclusiveScanNonUniformAMD(vec3);"
  2334. "vec4 addInvocationsExclusiveScanNonUniformAMD(vec4);"
  2335. "int addInvocationsExclusiveScanNonUniformAMD(int);"
  2336. "ivec2 addInvocationsExclusiveScanNonUniformAMD(ivec2);"
  2337. "ivec3 addInvocationsExclusiveScanNonUniformAMD(ivec3);"
  2338. "ivec4 addInvocationsExclusiveScanNonUniformAMD(ivec4);"
  2339. "uint addInvocationsExclusiveScanNonUniformAMD(uint);"
  2340. "uvec2 addInvocationsExclusiveScanNonUniformAMD(uvec2);"
  2341. "uvec3 addInvocationsExclusiveScanNonUniformAMD(uvec3);"
  2342. "uvec4 addInvocationsExclusiveScanNonUniformAMD(uvec4);"
  2343. "double addInvocationsExclusiveScanNonUniformAMD(double);"
  2344. "dvec2 addInvocationsExclusiveScanNonUniformAMD(dvec2);"
  2345. "dvec3 addInvocationsExclusiveScanNonUniformAMD(dvec3);"
  2346. "dvec4 addInvocationsExclusiveScanNonUniformAMD(dvec4);"
  2347. "int64_t addInvocationsExclusiveScanNonUniformAMD(int64_t);"
  2348. "i64vec2 addInvocationsExclusiveScanNonUniformAMD(i64vec2);"
  2349. "i64vec3 addInvocationsExclusiveScanNonUniformAMD(i64vec3);"
  2350. "i64vec4 addInvocationsExclusiveScanNonUniformAMD(i64vec4);"
  2351. "uint64_t addInvocationsExclusiveScanNonUniformAMD(uint64_t);"
  2352. "u64vec2 addInvocationsExclusiveScanNonUniformAMD(u64vec2);"
  2353. "u64vec3 addInvocationsExclusiveScanNonUniformAMD(u64vec3);"
  2354. "u64vec4 addInvocationsExclusiveScanNonUniformAMD(u64vec4);"
  2355. "float16_t addInvocationsExclusiveScanNonUniformAMD(float16_t);"
  2356. "f16vec2 addInvocationsExclusiveScanNonUniformAMD(f16vec2);"
  2357. "f16vec3 addInvocationsExclusiveScanNonUniformAMD(f16vec3);"
  2358. "f16vec4 addInvocationsExclusiveScanNonUniformAMD(f16vec4);"
  2359. "int16_t addInvocationsExclusiveScanNonUniformAMD(int16_t);"
  2360. "i16vec2 addInvocationsExclusiveScanNonUniformAMD(i16vec2);"
  2361. "i16vec3 addInvocationsExclusiveScanNonUniformAMD(i16vec3);"
  2362. "i16vec4 addInvocationsExclusiveScanNonUniformAMD(i16vec4);"
  2363. "uint16_t addInvocationsExclusiveScanNonUniformAMD(uint16_t);"
  2364. "u16vec2 addInvocationsExclusiveScanNonUniformAMD(u16vec2);"
  2365. "u16vec3 addInvocationsExclusiveScanNonUniformAMD(u16vec3);"
  2366. "u16vec4 addInvocationsExclusiveScanNonUniformAMD(u16vec4);"
  2367. "float swizzleInvocationsAMD(float, uvec4);"
  2368. "vec2 swizzleInvocationsAMD(vec2, uvec4);"
  2369. "vec3 swizzleInvocationsAMD(vec3, uvec4);"
  2370. "vec4 swizzleInvocationsAMD(vec4, uvec4);"
  2371. "int swizzleInvocationsAMD(int, uvec4);"
  2372. "ivec2 swizzleInvocationsAMD(ivec2, uvec4);"
  2373. "ivec3 swizzleInvocationsAMD(ivec3, uvec4);"
  2374. "ivec4 swizzleInvocationsAMD(ivec4, uvec4);"
  2375. "uint swizzleInvocationsAMD(uint, uvec4);"
  2376. "uvec2 swizzleInvocationsAMD(uvec2, uvec4);"
  2377. "uvec3 swizzleInvocationsAMD(uvec3, uvec4);"
  2378. "uvec4 swizzleInvocationsAMD(uvec4, uvec4);"
  2379. "float swizzleInvocationsMaskedAMD(float, uvec3);"
  2380. "vec2 swizzleInvocationsMaskedAMD(vec2, uvec3);"
  2381. "vec3 swizzleInvocationsMaskedAMD(vec3, uvec3);"
  2382. "vec4 swizzleInvocationsMaskedAMD(vec4, uvec3);"
  2383. "int swizzleInvocationsMaskedAMD(int, uvec3);"
  2384. "ivec2 swizzleInvocationsMaskedAMD(ivec2, uvec3);"
  2385. "ivec3 swizzleInvocationsMaskedAMD(ivec3, uvec3);"
  2386. "ivec4 swizzleInvocationsMaskedAMD(ivec4, uvec3);"
  2387. "uint swizzleInvocationsMaskedAMD(uint, uvec3);"
  2388. "uvec2 swizzleInvocationsMaskedAMD(uvec2, uvec3);"
  2389. "uvec3 swizzleInvocationsMaskedAMD(uvec3, uvec3);"
  2390. "uvec4 swizzleInvocationsMaskedAMD(uvec4, uvec3);"
  2391. "float writeInvocationAMD(float, float, uint);"
  2392. "vec2 writeInvocationAMD(vec2, vec2, uint);"
  2393. "vec3 writeInvocationAMD(vec3, vec3, uint);"
  2394. "vec4 writeInvocationAMD(vec4, vec4, uint);"
  2395. "int writeInvocationAMD(int, int, uint);"
  2396. "ivec2 writeInvocationAMD(ivec2, ivec2, uint);"
  2397. "ivec3 writeInvocationAMD(ivec3, ivec3, uint);"
  2398. "ivec4 writeInvocationAMD(ivec4, ivec4, uint);"
  2399. "uint writeInvocationAMD(uint, uint, uint);"
  2400. "uvec2 writeInvocationAMD(uvec2, uvec2, uint);"
  2401. "uvec3 writeInvocationAMD(uvec3, uvec3, uint);"
  2402. "uvec4 writeInvocationAMD(uvec4, uvec4, uint);"
  2403. "uint mbcntAMD(uint64_t);"
  2404. "\n");
  2405. }
  2406. // GL_AMD_gcn_shader
  2407. if (profile != EEsProfile && version >= 440) {
  2408. commonBuiltins.append(
  2409. "float cubeFaceIndexAMD(vec3);"
  2410. "vec2 cubeFaceCoordAMD(vec3);"
  2411. "uint64_t timeAMD();"
  2412. "in int gl_SIMDGroupSizeAMD;"
  2413. "\n");
  2414. }
  2415. // GL_AMD_shader_fragment_mask
  2416. if (profile != EEsProfile && version >= 450) {
  2417. commonBuiltins.append(
  2418. "uint fragmentMaskFetchAMD(sampler2DMS, ivec2);"
  2419. "uint fragmentMaskFetchAMD(isampler2DMS, ivec2);"
  2420. "uint fragmentMaskFetchAMD(usampler2DMS, ivec2);"
  2421. "uint fragmentMaskFetchAMD(sampler2DMSArray, ivec3);"
  2422. "uint fragmentMaskFetchAMD(isampler2DMSArray, ivec3);"
  2423. "uint fragmentMaskFetchAMD(usampler2DMSArray, ivec3);"
  2424. "vec4 fragmentFetchAMD(sampler2DMS, ivec2, uint);"
  2425. "ivec4 fragmentFetchAMD(isampler2DMS, ivec2, uint);"
  2426. "uvec4 fragmentFetchAMD(usampler2DMS, ivec2, uint);"
  2427. "vec4 fragmentFetchAMD(sampler2DMSArray, ivec3, uint);"
  2428. "ivec4 fragmentFetchAMD(isampler2DMSArray, ivec3, uint);"
  2429. "uvec4 fragmentFetchAMD(usampler2DMSArray, ivec3, uint);"
  2430. "\n");
  2431. }
  2432. if ((profile != EEsProfile && version >= 130) ||
  2433. (profile == EEsProfile && version >= 300)) {
  2434. commonBuiltins.append(
  2435. "uint countLeadingZeros(uint);"
  2436. "uvec2 countLeadingZeros(uvec2);"
  2437. "uvec3 countLeadingZeros(uvec3);"
  2438. "uvec4 countLeadingZeros(uvec4);"
  2439. "uint countTrailingZeros(uint);"
  2440. "uvec2 countTrailingZeros(uvec2);"
  2441. "uvec3 countTrailingZeros(uvec3);"
  2442. "uvec4 countTrailingZeros(uvec4);"
  2443. "uint absoluteDifference(int, int);"
  2444. "uvec2 absoluteDifference(ivec2, ivec2);"
  2445. "uvec3 absoluteDifference(ivec3, ivec3);"
  2446. "uvec4 absoluteDifference(ivec4, ivec4);"
  2447. "uint16_t absoluteDifference(int16_t, int16_t);"
  2448. "u16vec2 absoluteDifference(i16vec2, i16vec2);"
  2449. "u16vec3 absoluteDifference(i16vec3, i16vec3);"
  2450. "u16vec4 absoluteDifference(i16vec4, i16vec4);"
  2451. "uint64_t absoluteDifference(int64_t, int64_t);"
  2452. "u64vec2 absoluteDifference(i64vec2, i64vec2);"
  2453. "u64vec3 absoluteDifference(i64vec3, i64vec3);"
  2454. "u64vec4 absoluteDifference(i64vec4, i64vec4);"
  2455. "uint absoluteDifference(uint, uint);"
  2456. "uvec2 absoluteDifference(uvec2, uvec2);"
  2457. "uvec3 absoluteDifference(uvec3, uvec3);"
  2458. "uvec4 absoluteDifference(uvec4, uvec4);"
  2459. "uint16_t absoluteDifference(uint16_t, uint16_t);"
  2460. "u16vec2 absoluteDifference(u16vec2, u16vec2);"
  2461. "u16vec3 absoluteDifference(u16vec3, u16vec3);"
  2462. "u16vec4 absoluteDifference(u16vec4, u16vec4);"
  2463. "uint64_t absoluteDifference(uint64_t, uint64_t);"
  2464. "u64vec2 absoluteDifference(u64vec2, u64vec2);"
  2465. "u64vec3 absoluteDifference(u64vec3, u64vec3);"
  2466. "u64vec4 absoluteDifference(u64vec4, u64vec4);"
  2467. "int addSaturate(int, int);"
  2468. "ivec2 addSaturate(ivec2, ivec2);"
  2469. "ivec3 addSaturate(ivec3, ivec3);"
  2470. "ivec4 addSaturate(ivec4, ivec4);"
  2471. "int16_t addSaturate(int16_t, int16_t);"
  2472. "i16vec2 addSaturate(i16vec2, i16vec2);"
  2473. "i16vec3 addSaturate(i16vec3, i16vec3);"
  2474. "i16vec4 addSaturate(i16vec4, i16vec4);"
  2475. "int64_t addSaturate(int64_t, int64_t);"
  2476. "i64vec2 addSaturate(i64vec2, i64vec2);"
  2477. "i64vec3 addSaturate(i64vec3, i64vec3);"
  2478. "i64vec4 addSaturate(i64vec4, i64vec4);"
  2479. "uint addSaturate(uint, uint);"
  2480. "uvec2 addSaturate(uvec2, uvec2);"
  2481. "uvec3 addSaturate(uvec3, uvec3);"
  2482. "uvec4 addSaturate(uvec4, uvec4);"
  2483. "uint16_t addSaturate(uint16_t, uint16_t);"
  2484. "u16vec2 addSaturate(u16vec2, u16vec2);"
  2485. "u16vec3 addSaturate(u16vec3, u16vec3);"
  2486. "u16vec4 addSaturate(u16vec4, u16vec4);"
  2487. "uint64_t addSaturate(uint64_t, uint64_t);"
  2488. "u64vec2 addSaturate(u64vec2, u64vec2);"
  2489. "u64vec3 addSaturate(u64vec3, u64vec3);"
  2490. "u64vec4 addSaturate(u64vec4, u64vec4);"
  2491. "int subtractSaturate(int, int);"
  2492. "ivec2 subtractSaturate(ivec2, ivec2);"
  2493. "ivec3 subtractSaturate(ivec3, ivec3);"
  2494. "ivec4 subtractSaturate(ivec4, ivec4);"
  2495. "int16_t subtractSaturate(int16_t, int16_t);"
  2496. "i16vec2 subtractSaturate(i16vec2, i16vec2);"
  2497. "i16vec3 subtractSaturate(i16vec3, i16vec3);"
  2498. "i16vec4 subtractSaturate(i16vec4, i16vec4);"
  2499. "int64_t subtractSaturate(int64_t, int64_t);"
  2500. "i64vec2 subtractSaturate(i64vec2, i64vec2);"
  2501. "i64vec3 subtractSaturate(i64vec3, i64vec3);"
  2502. "i64vec4 subtractSaturate(i64vec4, i64vec4);"
  2503. "uint subtractSaturate(uint, uint);"
  2504. "uvec2 subtractSaturate(uvec2, uvec2);"
  2505. "uvec3 subtractSaturate(uvec3, uvec3);"
  2506. "uvec4 subtractSaturate(uvec4, uvec4);"
  2507. "uint16_t subtractSaturate(uint16_t, uint16_t);"
  2508. "u16vec2 subtractSaturate(u16vec2, u16vec2);"
  2509. "u16vec3 subtractSaturate(u16vec3, u16vec3);"
  2510. "u16vec4 subtractSaturate(u16vec4, u16vec4);"
  2511. "uint64_t subtractSaturate(uint64_t, uint64_t);"
  2512. "u64vec2 subtractSaturate(u64vec2, u64vec2);"
  2513. "u64vec3 subtractSaturate(u64vec3, u64vec3);"
  2514. "u64vec4 subtractSaturate(u64vec4, u64vec4);"
  2515. "int average(int, int);"
  2516. "ivec2 average(ivec2, ivec2);"
  2517. "ivec3 average(ivec3, ivec3);"
  2518. "ivec4 average(ivec4, ivec4);"
  2519. "int16_t average(int16_t, int16_t);"
  2520. "i16vec2 average(i16vec2, i16vec2);"
  2521. "i16vec3 average(i16vec3, i16vec3);"
  2522. "i16vec4 average(i16vec4, i16vec4);"
  2523. "int64_t average(int64_t, int64_t);"
  2524. "i64vec2 average(i64vec2, i64vec2);"
  2525. "i64vec3 average(i64vec3, i64vec3);"
  2526. "i64vec4 average(i64vec4, i64vec4);"
  2527. "uint average(uint, uint);"
  2528. "uvec2 average(uvec2, uvec2);"
  2529. "uvec3 average(uvec3, uvec3);"
  2530. "uvec4 average(uvec4, uvec4);"
  2531. "uint16_t average(uint16_t, uint16_t);"
  2532. "u16vec2 average(u16vec2, u16vec2);"
  2533. "u16vec3 average(u16vec3, u16vec3);"
  2534. "u16vec4 average(u16vec4, u16vec4);"
  2535. "uint64_t average(uint64_t, uint64_t);"
  2536. "u64vec2 average(u64vec2, u64vec2);"
  2537. "u64vec3 average(u64vec3, u64vec3);"
  2538. "u64vec4 average(u64vec4, u64vec4);"
  2539. "int averageRounded(int, int);"
  2540. "ivec2 averageRounded(ivec2, ivec2);"
  2541. "ivec3 averageRounded(ivec3, ivec3);"
  2542. "ivec4 averageRounded(ivec4, ivec4);"
  2543. "int16_t averageRounded(int16_t, int16_t);"
  2544. "i16vec2 averageRounded(i16vec2, i16vec2);"
  2545. "i16vec3 averageRounded(i16vec3, i16vec3);"
  2546. "i16vec4 averageRounded(i16vec4, i16vec4);"
  2547. "int64_t averageRounded(int64_t, int64_t);"
  2548. "i64vec2 averageRounded(i64vec2, i64vec2);"
  2549. "i64vec3 averageRounded(i64vec3, i64vec3);"
  2550. "i64vec4 averageRounded(i64vec4, i64vec4);"
  2551. "uint averageRounded(uint, uint);"
  2552. "uvec2 averageRounded(uvec2, uvec2);"
  2553. "uvec3 averageRounded(uvec3, uvec3);"
  2554. "uvec4 averageRounded(uvec4, uvec4);"
  2555. "uint16_t averageRounded(uint16_t, uint16_t);"
  2556. "u16vec2 averageRounded(u16vec2, u16vec2);"
  2557. "u16vec3 averageRounded(u16vec3, u16vec3);"
  2558. "u16vec4 averageRounded(u16vec4, u16vec4);"
  2559. "uint64_t averageRounded(uint64_t, uint64_t);"
  2560. "u64vec2 averageRounded(u64vec2, u64vec2);"
  2561. "u64vec3 averageRounded(u64vec3, u64vec3);"
  2562. "u64vec4 averageRounded(u64vec4, u64vec4);"
  2563. "int multiply32x16(int, int);"
  2564. "ivec2 multiply32x16(ivec2, ivec2);"
  2565. "ivec3 multiply32x16(ivec3, ivec3);"
  2566. "ivec4 multiply32x16(ivec4, ivec4);"
  2567. "uint multiply32x16(uint, uint);"
  2568. "uvec2 multiply32x16(uvec2, uvec2);"
  2569. "uvec3 multiply32x16(uvec3, uvec3);"
  2570. "uvec4 multiply32x16(uvec4, uvec4);"
  2571. "\n");
  2572. }
  2573. if ((profile != EEsProfile && version >= 450) ||
  2574. (profile == EEsProfile && version >= 320)) {
  2575. commonBuiltins.append(
  2576. "struct gl_TextureFootprint2DNV {"
  2577. "uvec2 anchor;"
  2578. "uvec2 offset;"
  2579. "uvec2 mask;"
  2580. "uint lod;"
  2581. "uint granularity;"
  2582. "};"
  2583. "struct gl_TextureFootprint3DNV {"
  2584. "uvec3 anchor;"
  2585. "uvec3 offset;"
  2586. "uvec2 mask;"
  2587. "uint lod;"
  2588. "uint granularity;"
  2589. "};"
  2590. "bool textureFootprintNV(sampler2D, vec2, int, bool, out gl_TextureFootprint2DNV);"
  2591. "bool textureFootprintNV(sampler3D, vec3, int, bool, out gl_TextureFootprint3DNV);"
  2592. "bool textureFootprintNV(sampler2D, vec2, int, bool, out gl_TextureFootprint2DNV, float);"
  2593. "bool textureFootprintNV(sampler3D, vec3, int, bool, out gl_TextureFootprint3DNV, float);"
  2594. "bool textureFootprintClampNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
  2595. "bool textureFootprintClampNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV);"
  2596. "bool textureFootprintClampNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV, float);"
  2597. "bool textureFootprintClampNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV, float);"
  2598. "bool textureFootprintLodNV(sampler2D, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
  2599. "bool textureFootprintLodNV(sampler3D, vec3, float, int, bool, out gl_TextureFootprint3DNV);"
  2600. "bool textureFootprintGradNV(sampler2D, vec2, vec2, vec2, int, bool, out gl_TextureFootprint2DNV);"
  2601. "bool textureFootprintGradClampNV(sampler2D, vec2, vec2, vec2, float, int, bool, out gl_TextureFootprint2DNV);"
  2602. "\n");
  2603. }
  2604. #endif // !GLSLANG_ANGLE
  2605. if ((profile == EEsProfile && version >= 300 && version < 310) ||
  2606. (profile != EEsProfile && version >= 150 && version < 450)) { // GL_EXT_shader_integer_mix
  2607. commonBuiltins.append("int mix(int, int, bool);"
  2608. "ivec2 mix(ivec2, ivec2, bvec2);"
  2609. "ivec3 mix(ivec3, ivec3, bvec3);"
  2610. "ivec4 mix(ivec4, ivec4, bvec4);"
  2611. "uint mix(uint, uint, bool );"
  2612. "uvec2 mix(uvec2, uvec2, bvec2);"
  2613. "uvec3 mix(uvec3, uvec3, bvec3);"
  2614. "uvec4 mix(uvec4, uvec4, bvec4);"
  2615. "bool mix(bool, bool, bool );"
  2616. "bvec2 mix(bvec2, bvec2, bvec2);"
  2617. "bvec3 mix(bvec3, bvec3, bvec3);"
  2618. "bvec4 mix(bvec4, bvec4, bvec4);"
  2619. "\n");
  2620. }
  2621. #ifndef GLSLANG_ANGLE
  2622. // GL_AMD_gpu_shader_half_float/Explicit types
  2623. if (profile != EEsProfile && version >= 450) {
  2624. commonBuiltins.append(
  2625. "float16_t radians(float16_t);"
  2626. "f16vec2 radians(f16vec2);"
  2627. "f16vec3 radians(f16vec3);"
  2628. "f16vec4 radians(f16vec4);"
  2629. "float16_t degrees(float16_t);"
  2630. "f16vec2 degrees(f16vec2);"
  2631. "f16vec3 degrees(f16vec3);"
  2632. "f16vec4 degrees(f16vec4);"
  2633. "float16_t sin(float16_t);"
  2634. "f16vec2 sin(f16vec2);"
  2635. "f16vec3 sin(f16vec3);"
  2636. "f16vec4 sin(f16vec4);"
  2637. "float16_t cos(float16_t);"
  2638. "f16vec2 cos(f16vec2);"
  2639. "f16vec3 cos(f16vec3);"
  2640. "f16vec4 cos(f16vec4);"
  2641. "float16_t tan(float16_t);"
  2642. "f16vec2 tan(f16vec2);"
  2643. "f16vec3 tan(f16vec3);"
  2644. "f16vec4 tan(f16vec4);"
  2645. "float16_t asin(float16_t);"
  2646. "f16vec2 asin(f16vec2);"
  2647. "f16vec3 asin(f16vec3);"
  2648. "f16vec4 asin(f16vec4);"
  2649. "float16_t acos(float16_t);"
  2650. "f16vec2 acos(f16vec2);"
  2651. "f16vec3 acos(f16vec3);"
  2652. "f16vec4 acos(f16vec4);"
  2653. "float16_t atan(float16_t, float16_t);"
  2654. "f16vec2 atan(f16vec2, f16vec2);"
  2655. "f16vec3 atan(f16vec3, f16vec3);"
  2656. "f16vec4 atan(f16vec4, f16vec4);"
  2657. "float16_t atan(float16_t);"
  2658. "f16vec2 atan(f16vec2);"
  2659. "f16vec3 atan(f16vec3);"
  2660. "f16vec4 atan(f16vec4);"
  2661. "float16_t sinh(float16_t);"
  2662. "f16vec2 sinh(f16vec2);"
  2663. "f16vec3 sinh(f16vec3);"
  2664. "f16vec4 sinh(f16vec4);"
  2665. "float16_t cosh(float16_t);"
  2666. "f16vec2 cosh(f16vec2);"
  2667. "f16vec3 cosh(f16vec3);"
  2668. "f16vec4 cosh(f16vec4);"
  2669. "float16_t tanh(float16_t);"
  2670. "f16vec2 tanh(f16vec2);"
  2671. "f16vec3 tanh(f16vec3);"
  2672. "f16vec4 tanh(f16vec4);"
  2673. "float16_t asinh(float16_t);"
  2674. "f16vec2 asinh(f16vec2);"
  2675. "f16vec3 asinh(f16vec3);"
  2676. "f16vec4 asinh(f16vec4);"
  2677. "float16_t acosh(float16_t);"
  2678. "f16vec2 acosh(f16vec2);"
  2679. "f16vec3 acosh(f16vec3);"
  2680. "f16vec4 acosh(f16vec4);"
  2681. "float16_t atanh(float16_t);"
  2682. "f16vec2 atanh(f16vec2);"
  2683. "f16vec3 atanh(f16vec3);"
  2684. "f16vec4 atanh(f16vec4);"
  2685. "float16_t pow(float16_t, float16_t);"
  2686. "f16vec2 pow(f16vec2, f16vec2);"
  2687. "f16vec3 pow(f16vec3, f16vec3);"
  2688. "f16vec4 pow(f16vec4, f16vec4);"
  2689. "float16_t exp(float16_t);"
  2690. "f16vec2 exp(f16vec2);"
  2691. "f16vec3 exp(f16vec3);"
  2692. "f16vec4 exp(f16vec4);"
  2693. "float16_t log(float16_t);"
  2694. "f16vec2 log(f16vec2);"
  2695. "f16vec3 log(f16vec3);"
  2696. "f16vec4 log(f16vec4);"
  2697. "float16_t exp2(float16_t);"
  2698. "f16vec2 exp2(f16vec2);"
  2699. "f16vec3 exp2(f16vec3);"
  2700. "f16vec4 exp2(f16vec4);"
  2701. "float16_t log2(float16_t);"
  2702. "f16vec2 log2(f16vec2);"
  2703. "f16vec3 log2(f16vec3);"
  2704. "f16vec4 log2(f16vec4);"
  2705. "float16_t sqrt(float16_t);"
  2706. "f16vec2 sqrt(f16vec2);"
  2707. "f16vec3 sqrt(f16vec3);"
  2708. "f16vec4 sqrt(f16vec4);"
  2709. "float16_t inversesqrt(float16_t);"
  2710. "f16vec2 inversesqrt(f16vec2);"
  2711. "f16vec3 inversesqrt(f16vec3);"
  2712. "f16vec4 inversesqrt(f16vec4);"
  2713. "float16_t abs(float16_t);"
  2714. "f16vec2 abs(f16vec2);"
  2715. "f16vec3 abs(f16vec3);"
  2716. "f16vec4 abs(f16vec4);"
  2717. "float16_t sign(float16_t);"
  2718. "f16vec2 sign(f16vec2);"
  2719. "f16vec3 sign(f16vec3);"
  2720. "f16vec4 sign(f16vec4);"
  2721. "float16_t floor(float16_t);"
  2722. "f16vec2 floor(f16vec2);"
  2723. "f16vec3 floor(f16vec3);"
  2724. "f16vec4 floor(f16vec4);"
  2725. "float16_t trunc(float16_t);"
  2726. "f16vec2 trunc(f16vec2);"
  2727. "f16vec3 trunc(f16vec3);"
  2728. "f16vec4 trunc(f16vec4);"
  2729. "float16_t round(float16_t);"
  2730. "f16vec2 round(f16vec2);"
  2731. "f16vec3 round(f16vec3);"
  2732. "f16vec4 round(f16vec4);"
  2733. "float16_t roundEven(float16_t);"
  2734. "f16vec2 roundEven(f16vec2);"
  2735. "f16vec3 roundEven(f16vec3);"
  2736. "f16vec4 roundEven(f16vec4);"
  2737. "float16_t ceil(float16_t);"
  2738. "f16vec2 ceil(f16vec2);"
  2739. "f16vec3 ceil(f16vec3);"
  2740. "f16vec4 ceil(f16vec4);"
  2741. "float16_t fract(float16_t);"
  2742. "f16vec2 fract(f16vec2);"
  2743. "f16vec3 fract(f16vec3);"
  2744. "f16vec4 fract(f16vec4);"
  2745. "float16_t mod(float16_t, float16_t);"
  2746. "f16vec2 mod(f16vec2, float16_t);"
  2747. "f16vec3 mod(f16vec3, float16_t);"
  2748. "f16vec4 mod(f16vec4, float16_t);"
  2749. "f16vec2 mod(f16vec2, f16vec2);"
  2750. "f16vec3 mod(f16vec3, f16vec3);"
  2751. "f16vec4 mod(f16vec4, f16vec4);"
  2752. "float16_t modf(float16_t, out float16_t);"
  2753. "f16vec2 modf(f16vec2, out f16vec2);"
  2754. "f16vec3 modf(f16vec3, out f16vec3);"
  2755. "f16vec4 modf(f16vec4, out f16vec4);"
  2756. "float16_t min(float16_t, float16_t);"
  2757. "f16vec2 min(f16vec2, float16_t);"
  2758. "f16vec3 min(f16vec3, float16_t);"
  2759. "f16vec4 min(f16vec4, float16_t);"
  2760. "f16vec2 min(f16vec2, f16vec2);"
  2761. "f16vec3 min(f16vec3, f16vec3);"
  2762. "f16vec4 min(f16vec4, f16vec4);"
  2763. "float16_t max(float16_t, float16_t);"
  2764. "f16vec2 max(f16vec2, float16_t);"
  2765. "f16vec3 max(f16vec3, float16_t);"
  2766. "f16vec4 max(f16vec4, float16_t);"
  2767. "f16vec2 max(f16vec2, f16vec2);"
  2768. "f16vec3 max(f16vec3, f16vec3);"
  2769. "f16vec4 max(f16vec4, f16vec4);"
  2770. "float16_t clamp(float16_t, float16_t, float16_t);"
  2771. "f16vec2 clamp(f16vec2, float16_t, float16_t);"
  2772. "f16vec3 clamp(f16vec3, float16_t, float16_t);"
  2773. "f16vec4 clamp(f16vec4, float16_t, float16_t);"
  2774. "f16vec2 clamp(f16vec2, f16vec2, f16vec2);"
  2775. "f16vec3 clamp(f16vec3, f16vec3, f16vec3);"
  2776. "f16vec4 clamp(f16vec4, f16vec4, f16vec4);"
  2777. "float16_t mix(float16_t, float16_t, float16_t);"
  2778. "f16vec2 mix(f16vec2, f16vec2, float16_t);"
  2779. "f16vec3 mix(f16vec3, f16vec3, float16_t);"
  2780. "f16vec4 mix(f16vec4, f16vec4, float16_t);"
  2781. "f16vec2 mix(f16vec2, f16vec2, f16vec2);"
  2782. "f16vec3 mix(f16vec3, f16vec3, f16vec3);"
  2783. "f16vec4 mix(f16vec4, f16vec4, f16vec4);"
  2784. "float16_t mix(float16_t, float16_t, bool);"
  2785. "f16vec2 mix(f16vec2, f16vec2, bvec2);"
  2786. "f16vec3 mix(f16vec3, f16vec3, bvec3);"
  2787. "f16vec4 mix(f16vec4, f16vec4, bvec4);"
  2788. "float16_t step(float16_t, float16_t);"
  2789. "f16vec2 step(f16vec2, f16vec2);"
  2790. "f16vec3 step(f16vec3, f16vec3);"
  2791. "f16vec4 step(f16vec4, f16vec4);"
  2792. "f16vec2 step(float16_t, f16vec2);"
  2793. "f16vec3 step(float16_t, f16vec3);"
  2794. "f16vec4 step(float16_t, f16vec4);"
  2795. "float16_t smoothstep(float16_t, float16_t, float16_t);"
  2796. "f16vec2 smoothstep(f16vec2, f16vec2, f16vec2);"
  2797. "f16vec3 smoothstep(f16vec3, f16vec3, f16vec3);"
  2798. "f16vec4 smoothstep(f16vec4, f16vec4, f16vec4);"
  2799. "f16vec2 smoothstep(float16_t, float16_t, f16vec2);"
  2800. "f16vec3 smoothstep(float16_t, float16_t, f16vec3);"
  2801. "f16vec4 smoothstep(float16_t, float16_t, f16vec4);"
  2802. "bool isnan(float16_t);"
  2803. "bvec2 isnan(f16vec2);"
  2804. "bvec3 isnan(f16vec3);"
  2805. "bvec4 isnan(f16vec4);"
  2806. "bool isinf(float16_t);"
  2807. "bvec2 isinf(f16vec2);"
  2808. "bvec3 isinf(f16vec3);"
  2809. "bvec4 isinf(f16vec4);"
  2810. "float16_t fma(float16_t, float16_t, float16_t);"
  2811. "f16vec2 fma(f16vec2, f16vec2, f16vec2);"
  2812. "f16vec3 fma(f16vec3, f16vec3, f16vec3);"
  2813. "f16vec4 fma(f16vec4, f16vec4, f16vec4);"
  2814. "float16_t frexp(float16_t, out int);"
  2815. "f16vec2 frexp(f16vec2, out ivec2);"
  2816. "f16vec3 frexp(f16vec3, out ivec3);"
  2817. "f16vec4 frexp(f16vec4, out ivec4);"
  2818. "float16_t ldexp(float16_t, in int);"
  2819. "f16vec2 ldexp(f16vec2, in ivec2);"
  2820. "f16vec3 ldexp(f16vec3, in ivec3);"
  2821. "f16vec4 ldexp(f16vec4, in ivec4);"
  2822. "uint packFloat2x16(f16vec2);"
  2823. "f16vec2 unpackFloat2x16(uint);"
  2824. "float16_t length(float16_t);"
  2825. "float16_t length(f16vec2);"
  2826. "float16_t length(f16vec3);"
  2827. "float16_t length(f16vec4);"
  2828. "float16_t distance(float16_t, float16_t);"
  2829. "float16_t distance(f16vec2, f16vec2);"
  2830. "float16_t distance(f16vec3, f16vec3);"
  2831. "float16_t distance(f16vec4, f16vec4);"
  2832. "float16_t dot(float16_t, float16_t);"
  2833. "float16_t dot(f16vec2, f16vec2);"
  2834. "float16_t dot(f16vec3, f16vec3);"
  2835. "float16_t dot(f16vec4, f16vec4);"
  2836. "f16vec3 cross(f16vec3, f16vec3);"
  2837. "float16_t normalize(float16_t);"
  2838. "f16vec2 normalize(f16vec2);"
  2839. "f16vec3 normalize(f16vec3);"
  2840. "f16vec4 normalize(f16vec4);"
  2841. "float16_t faceforward(float16_t, float16_t, float16_t);"
  2842. "f16vec2 faceforward(f16vec2, f16vec2, f16vec2);"
  2843. "f16vec3 faceforward(f16vec3, f16vec3, f16vec3);"
  2844. "f16vec4 faceforward(f16vec4, f16vec4, f16vec4);"
  2845. "float16_t reflect(float16_t, float16_t);"
  2846. "f16vec2 reflect(f16vec2, f16vec2);"
  2847. "f16vec3 reflect(f16vec3, f16vec3);"
  2848. "f16vec4 reflect(f16vec4, f16vec4);"
  2849. "float16_t refract(float16_t, float16_t, float16_t);"
  2850. "f16vec2 refract(f16vec2, f16vec2, float16_t);"
  2851. "f16vec3 refract(f16vec3, f16vec3, float16_t);"
  2852. "f16vec4 refract(f16vec4, f16vec4, float16_t);"
  2853. "f16mat2 matrixCompMult(f16mat2, f16mat2);"
  2854. "f16mat3 matrixCompMult(f16mat3, f16mat3);"
  2855. "f16mat4 matrixCompMult(f16mat4, f16mat4);"
  2856. "f16mat2x3 matrixCompMult(f16mat2x3, f16mat2x3);"
  2857. "f16mat2x4 matrixCompMult(f16mat2x4, f16mat2x4);"
  2858. "f16mat3x2 matrixCompMult(f16mat3x2, f16mat3x2);"
  2859. "f16mat3x4 matrixCompMult(f16mat3x4, f16mat3x4);"
  2860. "f16mat4x2 matrixCompMult(f16mat4x2, f16mat4x2);"
  2861. "f16mat4x3 matrixCompMult(f16mat4x3, f16mat4x3);"
  2862. "f16mat2 outerProduct(f16vec2, f16vec2);"
  2863. "f16mat3 outerProduct(f16vec3, f16vec3);"
  2864. "f16mat4 outerProduct(f16vec4, f16vec4);"
  2865. "f16mat2x3 outerProduct(f16vec3, f16vec2);"
  2866. "f16mat3x2 outerProduct(f16vec2, f16vec3);"
  2867. "f16mat2x4 outerProduct(f16vec4, f16vec2);"
  2868. "f16mat4x2 outerProduct(f16vec2, f16vec4);"
  2869. "f16mat3x4 outerProduct(f16vec4, f16vec3);"
  2870. "f16mat4x3 outerProduct(f16vec3, f16vec4);"
  2871. "f16mat2 transpose(f16mat2);"
  2872. "f16mat3 transpose(f16mat3);"
  2873. "f16mat4 transpose(f16mat4);"
  2874. "f16mat2x3 transpose(f16mat3x2);"
  2875. "f16mat3x2 transpose(f16mat2x3);"
  2876. "f16mat2x4 transpose(f16mat4x2);"
  2877. "f16mat4x2 transpose(f16mat2x4);"
  2878. "f16mat3x4 transpose(f16mat4x3);"
  2879. "f16mat4x3 transpose(f16mat3x4);"
  2880. "float16_t determinant(f16mat2);"
  2881. "float16_t determinant(f16mat3);"
  2882. "float16_t determinant(f16mat4);"
  2883. "f16mat2 inverse(f16mat2);"
  2884. "f16mat3 inverse(f16mat3);"
  2885. "f16mat4 inverse(f16mat4);"
  2886. "bvec2 lessThan(f16vec2, f16vec2);"
  2887. "bvec3 lessThan(f16vec3, f16vec3);"
  2888. "bvec4 lessThan(f16vec4, f16vec4);"
  2889. "bvec2 lessThanEqual(f16vec2, f16vec2);"
  2890. "bvec3 lessThanEqual(f16vec3, f16vec3);"
  2891. "bvec4 lessThanEqual(f16vec4, f16vec4);"
  2892. "bvec2 greaterThan(f16vec2, f16vec2);"
  2893. "bvec3 greaterThan(f16vec3, f16vec3);"
  2894. "bvec4 greaterThan(f16vec4, f16vec4);"
  2895. "bvec2 greaterThanEqual(f16vec2, f16vec2);"
  2896. "bvec3 greaterThanEqual(f16vec3, f16vec3);"
  2897. "bvec4 greaterThanEqual(f16vec4, f16vec4);"
  2898. "bvec2 equal(f16vec2, f16vec2);"
  2899. "bvec3 equal(f16vec3, f16vec3);"
  2900. "bvec4 equal(f16vec4, f16vec4);"
  2901. "bvec2 notEqual(f16vec2, f16vec2);"
  2902. "bvec3 notEqual(f16vec3, f16vec3);"
  2903. "bvec4 notEqual(f16vec4, f16vec4);"
  2904. "\n");
  2905. }
  2906. // Explicit types
  2907. if (profile != EEsProfile && version >= 450) {
  2908. commonBuiltins.append(
  2909. "int8_t abs(int8_t);"
  2910. "i8vec2 abs(i8vec2);"
  2911. "i8vec3 abs(i8vec3);"
  2912. "i8vec4 abs(i8vec4);"
  2913. "int8_t sign(int8_t);"
  2914. "i8vec2 sign(i8vec2);"
  2915. "i8vec3 sign(i8vec3);"
  2916. "i8vec4 sign(i8vec4);"
  2917. "int8_t min(int8_t x, int8_t y);"
  2918. "i8vec2 min(i8vec2 x, int8_t y);"
  2919. "i8vec3 min(i8vec3 x, int8_t y);"
  2920. "i8vec4 min(i8vec4 x, int8_t y);"
  2921. "i8vec2 min(i8vec2 x, i8vec2 y);"
  2922. "i8vec3 min(i8vec3 x, i8vec3 y);"
  2923. "i8vec4 min(i8vec4 x, i8vec4 y);"
  2924. "uint8_t min(uint8_t x, uint8_t y);"
  2925. "u8vec2 min(u8vec2 x, uint8_t y);"
  2926. "u8vec3 min(u8vec3 x, uint8_t y);"
  2927. "u8vec4 min(u8vec4 x, uint8_t y);"
  2928. "u8vec2 min(u8vec2 x, u8vec2 y);"
  2929. "u8vec3 min(u8vec3 x, u8vec3 y);"
  2930. "u8vec4 min(u8vec4 x, u8vec4 y);"
  2931. "int8_t max(int8_t x, int8_t y);"
  2932. "i8vec2 max(i8vec2 x, int8_t y);"
  2933. "i8vec3 max(i8vec3 x, int8_t y);"
  2934. "i8vec4 max(i8vec4 x, int8_t y);"
  2935. "i8vec2 max(i8vec2 x, i8vec2 y);"
  2936. "i8vec3 max(i8vec3 x, i8vec3 y);"
  2937. "i8vec4 max(i8vec4 x, i8vec4 y);"
  2938. "uint8_t max(uint8_t x, uint8_t y);"
  2939. "u8vec2 max(u8vec2 x, uint8_t y);"
  2940. "u8vec3 max(u8vec3 x, uint8_t y);"
  2941. "u8vec4 max(u8vec4 x, uint8_t y);"
  2942. "u8vec2 max(u8vec2 x, u8vec2 y);"
  2943. "u8vec3 max(u8vec3 x, u8vec3 y);"
  2944. "u8vec4 max(u8vec4 x, u8vec4 y);"
  2945. "int8_t clamp(int8_t x, int8_t minVal, int8_t maxVal);"
  2946. "i8vec2 clamp(i8vec2 x, int8_t minVal, int8_t maxVal);"
  2947. "i8vec3 clamp(i8vec3 x, int8_t minVal, int8_t maxVal);"
  2948. "i8vec4 clamp(i8vec4 x, int8_t minVal, int8_t maxVal);"
  2949. "i8vec2 clamp(i8vec2 x, i8vec2 minVal, i8vec2 maxVal);"
  2950. "i8vec3 clamp(i8vec3 x, i8vec3 minVal, i8vec3 maxVal);"
  2951. "i8vec4 clamp(i8vec4 x, i8vec4 minVal, i8vec4 maxVal);"
  2952. "uint8_t clamp(uint8_t x, uint8_t minVal, uint8_t maxVal);"
  2953. "u8vec2 clamp(u8vec2 x, uint8_t minVal, uint8_t maxVal);"
  2954. "u8vec3 clamp(u8vec3 x, uint8_t minVal, uint8_t maxVal);"
  2955. "u8vec4 clamp(u8vec4 x, uint8_t minVal, uint8_t maxVal);"
  2956. "u8vec2 clamp(u8vec2 x, u8vec2 minVal, u8vec2 maxVal);"
  2957. "u8vec3 clamp(u8vec3 x, u8vec3 minVal, u8vec3 maxVal);"
  2958. "u8vec4 clamp(u8vec4 x, u8vec4 minVal, u8vec4 maxVal);"
  2959. "int8_t mix(int8_t, int8_t, bool);"
  2960. "i8vec2 mix(i8vec2, i8vec2, bvec2);"
  2961. "i8vec3 mix(i8vec3, i8vec3, bvec3);"
  2962. "i8vec4 mix(i8vec4, i8vec4, bvec4);"
  2963. "uint8_t mix(uint8_t, uint8_t, bool);"
  2964. "u8vec2 mix(u8vec2, u8vec2, bvec2);"
  2965. "u8vec3 mix(u8vec3, u8vec3, bvec3);"
  2966. "u8vec4 mix(u8vec4, u8vec4, bvec4);"
  2967. "bvec2 lessThan(i8vec2, i8vec2);"
  2968. "bvec3 lessThan(i8vec3, i8vec3);"
  2969. "bvec4 lessThan(i8vec4, i8vec4);"
  2970. "bvec2 lessThan(u8vec2, u8vec2);"
  2971. "bvec3 lessThan(u8vec3, u8vec3);"
  2972. "bvec4 lessThan(u8vec4, u8vec4);"
  2973. "bvec2 lessThanEqual(i8vec2, i8vec2);"
  2974. "bvec3 lessThanEqual(i8vec3, i8vec3);"
  2975. "bvec4 lessThanEqual(i8vec4, i8vec4);"
  2976. "bvec2 lessThanEqual(u8vec2, u8vec2);"
  2977. "bvec3 lessThanEqual(u8vec3, u8vec3);"
  2978. "bvec4 lessThanEqual(u8vec4, u8vec4);"
  2979. "bvec2 greaterThan(i8vec2, i8vec2);"
  2980. "bvec3 greaterThan(i8vec3, i8vec3);"
  2981. "bvec4 greaterThan(i8vec4, i8vec4);"
  2982. "bvec2 greaterThan(u8vec2, u8vec2);"
  2983. "bvec3 greaterThan(u8vec3, u8vec3);"
  2984. "bvec4 greaterThan(u8vec4, u8vec4);"
  2985. "bvec2 greaterThanEqual(i8vec2, i8vec2);"
  2986. "bvec3 greaterThanEqual(i8vec3, i8vec3);"
  2987. "bvec4 greaterThanEqual(i8vec4, i8vec4);"
  2988. "bvec2 greaterThanEqual(u8vec2, u8vec2);"
  2989. "bvec3 greaterThanEqual(u8vec3, u8vec3);"
  2990. "bvec4 greaterThanEqual(u8vec4, u8vec4);"
  2991. "bvec2 equal(i8vec2, i8vec2);"
  2992. "bvec3 equal(i8vec3, i8vec3);"
  2993. "bvec4 equal(i8vec4, i8vec4);"
  2994. "bvec2 equal(u8vec2, u8vec2);"
  2995. "bvec3 equal(u8vec3, u8vec3);"
  2996. "bvec4 equal(u8vec4, u8vec4);"
  2997. "bvec2 notEqual(i8vec2, i8vec2);"
  2998. "bvec3 notEqual(i8vec3, i8vec3);"
  2999. "bvec4 notEqual(i8vec4, i8vec4);"
  3000. "bvec2 notEqual(u8vec2, u8vec2);"
  3001. "bvec3 notEqual(u8vec3, u8vec3);"
  3002. "bvec4 notEqual(u8vec4, u8vec4);"
  3003. " int8_t bitfieldExtract( int8_t, int8_t, int8_t);"
  3004. "i8vec2 bitfieldExtract(i8vec2, int8_t, int8_t);"
  3005. "i8vec3 bitfieldExtract(i8vec3, int8_t, int8_t);"
  3006. "i8vec4 bitfieldExtract(i8vec4, int8_t, int8_t);"
  3007. " uint8_t bitfieldExtract( uint8_t, int8_t, int8_t);"
  3008. "u8vec2 bitfieldExtract(u8vec2, int8_t, int8_t);"
  3009. "u8vec3 bitfieldExtract(u8vec3, int8_t, int8_t);"
  3010. "u8vec4 bitfieldExtract(u8vec4, int8_t, int8_t);"
  3011. " int8_t bitfieldInsert( int8_t base, int8_t, int8_t, int8_t);"
  3012. "i8vec2 bitfieldInsert(i8vec2 base, i8vec2, int8_t, int8_t);"
  3013. "i8vec3 bitfieldInsert(i8vec3 base, i8vec3, int8_t, int8_t);"
  3014. "i8vec4 bitfieldInsert(i8vec4 base, i8vec4, int8_t, int8_t);"
  3015. " uint8_t bitfieldInsert( uint8_t base, uint8_t, int8_t, int8_t);"
  3016. "u8vec2 bitfieldInsert(u8vec2 base, u8vec2, int8_t, int8_t);"
  3017. "u8vec3 bitfieldInsert(u8vec3 base, u8vec3, int8_t, int8_t);"
  3018. "u8vec4 bitfieldInsert(u8vec4 base, u8vec4, int8_t, int8_t);"
  3019. " int8_t bitCount( int8_t);"
  3020. "i8vec2 bitCount(i8vec2);"
  3021. "i8vec3 bitCount(i8vec3);"
  3022. "i8vec4 bitCount(i8vec4);"
  3023. " int8_t bitCount( uint8_t);"
  3024. "i8vec2 bitCount(u8vec2);"
  3025. "i8vec3 bitCount(u8vec3);"
  3026. "i8vec4 bitCount(u8vec4);"
  3027. " int8_t findLSB( int8_t);"
  3028. "i8vec2 findLSB(i8vec2);"
  3029. "i8vec3 findLSB(i8vec3);"
  3030. "i8vec4 findLSB(i8vec4);"
  3031. " int8_t findLSB( uint8_t);"
  3032. "i8vec2 findLSB(u8vec2);"
  3033. "i8vec3 findLSB(u8vec3);"
  3034. "i8vec4 findLSB(u8vec4);"
  3035. " int8_t findMSB( int8_t);"
  3036. "i8vec2 findMSB(i8vec2);"
  3037. "i8vec3 findMSB(i8vec3);"
  3038. "i8vec4 findMSB(i8vec4);"
  3039. " int8_t findMSB( uint8_t);"
  3040. "i8vec2 findMSB(u8vec2);"
  3041. "i8vec3 findMSB(u8vec3);"
  3042. "i8vec4 findMSB(u8vec4);"
  3043. "int16_t abs(int16_t);"
  3044. "i16vec2 abs(i16vec2);"
  3045. "i16vec3 abs(i16vec3);"
  3046. "i16vec4 abs(i16vec4);"
  3047. "int16_t sign(int16_t);"
  3048. "i16vec2 sign(i16vec2);"
  3049. "i16vec3 sign(i16vec3);"
  3050. "i16vec4 sign(i16vec4);"
  3051. "int16_t min(int16_t x, int16_t y);"
  3052. "i16vec2 min(i16vec2 x, int16_t y);"
  3053. "i16vec3 min(i16vec3 x, int16_t y);"
  3054. "i16vec4 min(i16vec4 x, int16_t y);"
  3055. "i16vec2 min(i16vec2 x, i16vec2 y);"
  3056. "i16vec3 min(i16vec3 x, i16vec3 y);"
  3057. "i16vec4 min(i16vec4 x, i16vec4 y);"
  3058. "uint16_t min(uint16_t x, uint16_t y);"
  3059. "u16vec2 min(u16vec2 x, uint16_t y);"
  3060. "u16vec3 min(u16vec3 x, uint16_t y);"
  3061. "u16vec4 min(u16vec4 x, uint16_t y);"
  3062. "u16vec2 min(u16vec2 x, u16vec2 y);"
  3063. "u16vec3 min(u16vec3 x, u16vec3 y);"
  3064. "u16vec4 min(u16vec4 x, u16vec4 y);"
  3065. "int16_t max(int16_t x, int16_t y);"
  3066. "i16vec2 max(i16vec2 x, int16_t y);"
  3067. "i16vec3 max(i16vec3 x, int16_t y);"
  3068. "i16vec4 max(i16vec4 x, int16_t y);"
  3069. "i16vec2 max(i16vec2 x, i16vec2 y);"
  3070. "i16vec3 max(i16vec3 x, i16vec3 y);"
  3071. "i16vec4 max(i16vec4 x, i16vec4 y);"
  3072. "uint16_t max(uint16_t x, uint16_t y);"
  3073. "u16vec2 max(u16vec2 x, uint16_t y);"
  3074. "u16vec3 max(u16vec3 x, uint16_t y);"
  3075. "u16vec4 max(u16vec4 x, uint16_t y);"
  3076. "u16vec2 max(u16vec2 x, u16vec2 y);"
  3077. "u16vec3 max(u16vec3 x, u16vec3 y);"
  3078. "u16vec4 max(u16vec4 x, u16vec4 y);"
  3079. "int16_t clamp(int16_t x, int16_t minVal, int16_t maxVal);"
  3080. "i16vec2 clamp(i16vec2 x, int16_t minVal, int16_t maxVal);"
  3081. "i16vec3 clamp(i16vec3 x, int16_t minVal, int16_t maxVal);"
  3082. "i16vec4 clamp(i16vec4 x, int16_t minVal, int16_t maxVal);"
  3083. "i16vec2 clamp(i16vec2 x, i16vec2 minVal, i16vec2 maxVal);"
  3084. "i16vec3 clamp(i16vec3 x, i16vec3 minVal, i16vec3 maxVal);"
  3085. "i16vec4 clamp(i16vec4 x, i16vec4 minVal, i16vec4 maxVal);"
  3086. "uint16_t clamp(uint16_t x, uint16_t minVal, uint16_t maxVal);"
  3087. "u16vec2 clamp(u16vec2 x, uint16_t minVal, uint16_t maxVal);"
  3088. "u16vec3 clamp(u16vec3 x, uint16_t minVal, uint16_t maxVal);"
  3089. "u16vec4 clamp(u16vec4 x, uint16_t minVal, uint16_t maxVal);"
  3090. "u16vec2 clamp(u16vec2 x, u16vec2 minVal, u16vec2 maxVal);"
  3091. "u16vec3 clamp(u16vec3 x, u16vec3 minVal, u16vec3 maxVal);"
  3092. "u16vec4 clamp(u16vec4 x, u16vec4 minVal, u16vec4 maxVal);"
  3093. "int16_t mix(int16_t, int16_t, bool);"
  3094. "i16vec2 mix(i16vec2, i16vec2, bvec2);"
  3095. "i16vec3 mix(i16vec3, i16vec3, bvec3);"
  3096. "i16vec4 mix(i16vec4, i16vec4, bvec4);"
  3097. "uint16_t mix(uint16_t, uint16_t, bool);"
  3098. "u16vec2 mix(u16vec2, u16vec2, bvec2);"
  3099. "u16vec3 mix(u16vec3, u16vec3, bvec3);"
  3100. "u16vec4 mix(u16vec4, u16vec4, bvec4);"
  3101. "float16_t frexp(float16_t, out int16_t);"
  3102. "f16vec2 frexp(f16vec2, out i16vec2);"
  3103. "f16vec3 frexp(f16vec3, out i16vec3);"
  3104. "f16vec4 frexp(f16vec4, out i16vec4);"
  3105. "float16_t ldexp(float16_t, int16_t);"
  3106. "f16vec2 ldexp(f16vec2, i16vec2);"
  3107. "f16vec3 ldexp(f16vec3, i16vec3);"
  3108. "f16vec4 ldexp(f16vec4, i16vec4);"
  3109. "int16_t halfBitsToInt16(float16_t);"
  3110. "i16vec2 halfBitsToInt16(f16vec2);"
  3111. "i16vec3 halhBitsToInt16(f16vec3);"
  3112. "i16vec4 halfBitsToInt16(f16vec4);"
  3113. "uint16_t halfBitsToUint16(float16_t);"
  3114. "u16vec2 halfBitsToUint16(f16vec2);"
  3115. "u16vec3 halfBitsToUint16(f16vec3);"
  3116. "u16vec4 halfBitsToUint16(f16vec4);"
  3117. "int16_t float16BitsToInt16(float16_t);"
  3118. "i16vec2 float16BitsToInt16(f16vec2);"
  3119. "i16vec3 float16BitsToInt16(f16vec3);"
  3120. "i16vec4 float16BitsToInt16(f16vec4);"
  3121. "uint16_t float16BitsToUint16(float16_t);"
  3122. "u16vec2 float16BitsToUint16(f16vec2);"
  3123. "u16vec3 float16BitsToUint16(f16vec3);"
  3124. "u16vec4 float16BitsToUint16(f16vec4);"
  3125. "float16_t int16BitsToFloat16(int16_t);"
  3126. "f16vec2 int16BitsToFloat16(i16vec2);"
  3127. "f16vec3 int16BitsToFloat16(i16vec3);"
  3128. "f16vec4 int16BitsToFloat16(i16vec4);"
  3129. "float16_t uint16BitsToFloat16(uint16_t);"
  3130. "f16vec2 uint16BitsToFloat16(u16vec2);"
  3131. "f16vec3 uint16BitsToFloat16(u16vec3);"
  3132. "f16vec4 uint16BitsToFloat16(u16vec4);"
  3133. "float16_t int16BitsToHalf(int16_t);"
  3134. "f16vec2 int16BitsToHalf(i16vec2);"
  3135. "f16vec3 int16BitsToHalf(i16vec3);"
  3136. "f16vec4 int16BitsToHalf(i16vec4);"
  3137. "float16_t uint16BitsToHalf(uint16_t);"
  3138. "f16vec2 uint16BitsToHalf(u16vec2);"
  3139. "f16vec3 uint16BitsToHalf(u16vec3);"
  3140. "f16vec4 uint16BitsToHalf(u16vec4);"
  3141. "int packInt2x16(i16vec2);"
  3142. "uint packUint2x16(u16vec2);"
  3143. "int64_t packInt4x16(i16vec4);"
  3144. "uint64_t packUint4x16(u16vec4);"
  3145. "i16vec2 unpackInt2x16(int);"
  3146. "u16vec2 unpackUint2x16(uint);"
  3147. "i16vec4 unpackInt4x16(int64_t);"
  3148. "u16vec4 unpackUint4x16(uint64_t);"
  3149. "bvec2 lessThan(i16vec2, i16vec2);"
  3150. "bvec3 lessThan(i16vec3, i16vec3);"
  3151. "bvec4 lessThan(i16vec4, i16vec4);"
  3152. "bvec2 lessThan(u16vec2, u16vec2);"
  3153. "bvec3 lessThan(u16vec3, u16vec3);"
  3154. "bvec4 lessThan(u16vec4, u16vec4);"
  3155. "bvec2 lessThanEqual(i16vec2, i16vec2);"
  3156. "bvec3 lessThanEqual(i16vec3, i16vec3);"
  3157. "bvec4 lessThanEqual(i16vec4, i16vec4);"
  3158. "bvec2 lessThanEqual(u16vec2, u16vec2);"
  3159. "bvec3 lessThanEqual(u16vec3, u16vec3);"
  3160. "bvec4 lessThanEqual(u16vec4, u16vec4);"
  3161. "bvec2 greaterThan(i16vec2, i16vec2);"
  3162. "bvec3 greaterThan(i16vec3, i16vec3);"
  3163. "bvec4 greaterThan(i16vec4, i16vec4);"
  3164. "bvec2 greaterThan(u16vec2, u16vec2);"
  3165. "bvec3 greaterThan(u16vec3, u16vec3);"
  3166. "bvec4 greaterThan(u16vec4, u16vec4);"
  3167. "bvec2 greaterThanEqual(i16vec2, i16vec2);"
  3168. "bvec3 greaterThanEqual(i16vec3, i16vec3);"
  3169. "bvec4 greaterThanEqual(i16vec4, i16vec4);"
  3170. "bvec2 greaterThanEqual(u16vec2, u16vec2);"
  3171. "bvec3 greaterThanEqual(u16vec3, u16vec3);"
  3172. "bvec4 greaterThanEqual(u16vec4, u16vec4);"
  3173. "bvec2 equal(i16vec2, i16vec2);"
  3174. "bvec3 equal(i16vec3, i16vec3);"
  3175. "bvec4 equal(i16vec4, i16vec4);"
  3176. "bvec2 equal(u16vec2, u16vec2);"
  3177. "bvec3 equal(u16vec3, u16vec3);"
  3178. "bvec4 equal(u16vec4, u16vec4);"
  3179. "bvec2 notEqual(i16vec2, i16vec2);"
  3180. "bvec3 notEqual(i16vec3, i16vec3);"
  3181. "bvec4 notEqual(i16vec4, i16vec4);"
  3182. "bvec2 notEqual(u16vec2, u16vec2);"
  3183. "bvec3 notEqual(u16vec3, u16vec3);"
  3184. "bvec4 notEqual(u16vec4, u16vec4);"
  3185. " int16_t bitfieldExtract( int16_t, int16_t, int16_t);"
  3186. "i16vec2 bitfieldExtract(i16vec2, int16_t, int16_t);"
  3187. "i16vec3 bitfieldExtract(i16vec3, int16_t, int16_t);"
  3188. "i16vec4 bitfieldExtract(i16vec4, int16_t, int16_t);"
  3189. " uint16_t bitfieldExtract( uint16_t, int16_t, int16_t);"
  3190. "u16vec2 bitfieldExtract(u16vec2, int16_t, int16_t);"
  3191. "u16vec3 bitfieldExtract(u16vec3, int16_t, int16_t);"
  3192. "u16vec4 bitfieldExtract(u16vec4, int16_t, int16_t);"
  3193. " int16_t bitfieldInsert( int16_t base, int16_t, int16_t, int16_t);"
  3194. "i16vec2 bitfieldInsert(i16vec2 base, i16vec2, int16_t, int16_t);"
  3195. "i16vec3 bitfieldInsert(i16vec3 base, i16vec3, int16_t, int16_t);"
  3196. "i16vec4 bitfieldInsert(i16vec4 base, i16vec4, int16_t, int16_t);"
  3197. " uint16_t bitfieldInsert( uint16_t base, uint16_t, int16_t, int16_t);"
  3198. "u16vec2 bitfieldInsert(u16vec2 base, u16vec2, int16_t, int16_t);"
  3199. "u16vec3 bitfieldInsert(u16vec3 base, u16vec3, int16_t, int16_t);"
  3200. "u16vec4 bitfieldInsert(u16vec4 base, u16vec4, int16_t, int16_t);"
  3201. " int16_t bitCount( int16_t);"
  3202. "i16vec2 bitCount(i16vec2);"
  3203. "i16vec3 bitCount(i16vec3);"
  3204. "i16vec4 bitCount(i16vec4);"
  3205. " int16_t bitCount( uint16_t);"
  3206. "i16vec2 bitCount(u16vec2);"
  3207. "i16vec3 bitCount(u16vec3);"
  3208. "i16vec4 bitCount(u16vec4);"
  3209. " int16_t findLSB( int16_t);"
  3210. "i16vec2 findLSB(i16vec2);"
  3211. "i16vec3 findLSB(i16vec3);"
  3212. "i16vec4 findLSB(i16vec4);"
  3213. " int16_t findLSB( uint16_t);"
  3214. "i16vec2 findLSB(u16vec2);"
  3215. "i16vec3 findLSB(u16vec3);"
  3216. "i16vec4 findLSB(u16vec4);"
  3217. " int16_t findMSB( int16_t);"
  3218. "i16vec2 findMSB(i16vec2);"
  3219. "i16vec3 findMSB(i16vec3);"
  3220. "i16vec4 findMSB(i16vec4);"
  3221. " int16_t findMSB( uint16_t);"
  3222. "i16vec2 findMSB(u16vec2);"
  3223. "i16vec3 findMSB(u16vec3);"
  3224. "i16vec4 findMSB(u16vec4);"
  3225. "int16_t pack16(i8vec2);"
  3226. "uint16_t pack16(u8vec2);"
  3227. "int32_t pack32(i8vec4);"
  3228. "uint32_t pack32(u8vec4);"
  3229. "int32_t pack32(i16vec2);"
  3230. "uint32_t pack32(u16vec2);"
  3231. "int64_t pack64(i16vec4);"
  3232. "uint64_t pack64(u16vec4);"
  3233. "int64_t pack64(i32vec2);"
  3234. "uint64_t pack64(u32vec2);"
  3235. "i8vec2 unpack8(int16_t);"
  3236. "u8vec2 unpack8(uint16_t);"
  3237. "i8vec4 unpack8(int32_t);"
  3238. "u8vec4 unpack8(uint32_t);"
  3239. "i16vec2 unpack16(int32_t);"
  3240. "u16vec2 unpack16(uint32_t);"
  3241. "i16vec4 unpack16(int64_t);"
  3242. "u16vec4 unpack16(uint64_t);"
  3243. "i32vec2 unpack32(int64_t);"
  3244. "u32vec2 unpack32(uint64_t);"
  3245. "float64_t radians(float64_t);"
  3246. "f64vec2 radians(f64vec2);"
  3247. "f64vec3 radians(f64vec3);"
  3248. "f64vec4 radians(f64vec4);"
  3249. "float64_t degrees(float64_t);"
  3250. "f64vec2 degrees(f64vec2);"
  3251. "f64vec3 degrees(f64vec3);"
  3252. "f64vec4 degrees(f64vec4);"
  3253. "float64_t sin(float64_t);"
  3254. "f64vec2 sin(f64vec2);"
  3255. "f64vec3 sin(f64vec3);"
  3256. "f64vec4 sin(f64vec4);"
  3257. "float64_t cos(float64_t);"
  3258. "f64vec2 cos(f64vec2);"
  3259. "f64vec3 cos(f64vec3);"
  3260. "f64vec4 cos(f64vec4);"
  3261. "float64_t tan(float64_t);"
  3262. "f64vec2 tan(f64vec2);"
  3263. "f64vec3 tan(f64vec3);"
  3264. "f64vec4 tan(f64vec4);"
  3265. "float64_t asin(float64_t);"
  3266. "f64vec2 asin(f64vec2);"
  3267. "f64vec3 asin(f64vec3);"
  3268. "f64vec4 asin(f64vec4);"
  3269. "float64_t acos(float64_t);"
  3270. "f64vec2 acos(f64vec2);"
  3271. "f64vec3 acos(f64vec3);"
  3272. "f64vec4 acos(f64vec4);"
  3273. "float64_t atan(float64_t, float64_t);"
  3274. "f64vec2 atan(f64vec2, f64vec2);"
  3275. "f64vec3 atan(f64vec3, f64vec3);"
  3276. "f64vec4 atan(f64vec4, f64vec4);"
  3277. "float64_t atan(float64_t);"
  3278. "f64vec2 atan(f64vec2);"
  3279. "f64vec3 atan(f64vec3);"
  3280. "f64vec4 atan(f64vec4);"
  3281. "float64_t sinh(float64_t);"
  3282. "f64vec2 sinh(f64vec2);"
  3283. "f64vec3 sinh(f64vec3);"
  3284. "f64vec4 sinh(f64vec4);"
  3285. "float64_t cosh(float64_t);"
  3286. "f64vec2 cosh(f64vec2);"
  3287. "f64vec3 cosh(f64vec3);"
  3288. "f64vec4 cosh(f64vec4);"
  3289. "float64_t tanh(float64_t);"
  3290. "f64vec2 tanh(f64vec2);"
  3291. "f64vec3 tanh(f64vec3);"
  3292. "f64vec4 tanh(f64vec4);"
  3293. "float64_t asinh(float64_t);"
  3294. "f64vec2 asinh(f64vec2);"
  3295. "f64vec3 asinh(f64vec3);"
  3296. "f64vec4 asinh(f64vec4);"
  3297. "float64_t acosh(float64_t);"
  3298. "f64vec2 acosh(f64vec2);"
  3299. "f64vec3 acosh(f64vec3);"
  3300. "f64vec4 acosh(f64vec4);"
  3301. "float64_t atanh(float64_t);"
  3302. "f64vec2 atanh(f64vec2);"
  3303. "f64vec3 atanh(f64vec3);"
  3304. "f64vec4 atanh(f64vec4);"
  3305. "float64_t pow(float64_t, float64_t);"
  3306. "f64vec2 pow(f64vec2, f64vec2);"
  3307. "f64vec3 pow(f64vec3, f64vec3);"
  3308. "f64vec4 pow(f64vec4, f64vec4);"
  3309. "float64_t exp(float64_t);"
  3310. "f64vec2 exp(f64vec2);"
  3311. "f64vec3 exp(f64vec3);"
  3312. "f64vec4 exp(f64vec4);"
  3313. "float64_t log(float64_t);"
  3314. "f64vec2 log(f64vec2);"
  3315. "f64vec3 log(f64vec3);"
  3316. "f64vec4 log(f64vec4);"
  3317. "float64_t exp2(float64_t);"
  3318. "f64vec2 exp2(f64vec2);"
  3319. "f64vec3 exp2(f64vec3);"
  3320. "f64vec4 exp2(f64vec4);"
  3321. "float64_t log2(float64_t);"
  3322. "f64vec2 log2(f64vec2);"
  3323. "f64vec3 log2(f64vec3);"
  3324. "f64vec4 log2(f64vec4);"
  3325. "\n");
  3326. }
  3327. if (profile != EEsProfile && version >= 450) {
  3328. stageBuiltins[EShLangFragment].append(derivativesAndControl64bits);
  3329. stageBuiltins[EShLangFragment].append(
  3330. "float64_t interpolateAtCentroid(float64_t);"
  3331. "f64vec2 interpolateAtCentroid(f64vec2);"
  3332. "f64vec3 interpolateAtCentroid(f64vec3);"
  3333. "f64vec4 interpolateAtCentroid(f64vec4);"
  3334. "float64_t interpolateAtSample(float64_t, int);"
  3335. "f64vec2 interpolateAtSample(f64vec2, int);"
  3336. "f64vec3 interpolateAtSample(f64vec3, int);"
  3337. "f64vec4 interpolateAtSample(f64vec4, int);"
  3338. "float64_t interpolateAtOffset(float64_t, f64vec2);"
  3339. "f64vec2 interpolateAtOffset(f64vec2, f64vec2);"
  3340. "f64vec3 interpolateAtOffset(f64vec3, f64vec2);"
  3341. "f64vec4 interpolateAtOffset(f64vec4, f64vec2);"
  3342. "\n");
  3343. }
  3344. #endif // !GLSLANG_ANGLE
  3345. //============================================================================
  3346. //
  3347. // Prototypes for built-in functions seen by vertex shaders only.
  3348. // (Except legacy lod functions, where it depends which release they are
  3349. // vertex only.)
  3350. //
  3351. //============================================================================
  3352. //
  3353. // Geometric Functions.
  3354. //
  3355. if (spvVersion.vulkan == 0 && IncludeLegacy(version, profile, spvVersion))
  3356. stageBuiltins[EShLangVertex].append("vec4 ftransform();");
  3357. #ifndef GLSLANG_ANGLE
  3358. //
  3359. // Original-style texture Functions with lod.
  3360. //
  3361. TString* s;
  3362. if (version == 100)
  3363. s = &stageBuiltins[EShLangVertex];
  3364. else
  3365. s = &commonBuiltins;
  3366. if ((profile == EEsProfile && version == 100) ||
  3367. profile == ECompatibilityProfile ||
  3368. (profile == ECoreProfile && version < 420) ||
  3369. profile == ENoProfile) {
  3370. if (spvVersion.spv == 0) {
  3371. s->append(
  3372. "vec4 texture2DLod(sampler2D, vec2, float);" // GL_ARB_shader_texture_lod
  3373. "vec4 texture2DProjLod(sampler2D, vec3, float);" // GL_ARB_shader_texture_lod
  3374. "vec4 texture2DProjLod(sampler2D, vec4, float);" // GL_ARB_shader_texture_lod
  3375. "vec4 texture3DLod(sampler3D, vec3, float);" // GL_ARB_shader_texture_lod // OES_texture_3D, but caught by keyword check
  3376. "vec4 texture3DProjLod(sampler3D, vec4, float);" // GL_ARB_shader_texture_lod // OES_texture_3D, but caught by keyword check
  3377. "vec4 textureCubeLod(samplerCube, vec3, float);" // GL_ARB_shader_texture_lod
  3378. "\n");
  3379. }
  3380. }
  3381. if ( profile == ECompatibilityProfile ||
  3382. (profile == ECoreProfile && version < 420) ||
  3383. profile == ENoProfile) {
  3384. if (spvVersion.spv == 0) {
  3385. s->append(
  3386. "vec4 texture1DLod(sampler1D, float, float);" // GL_ARB_shader_texture_lod
  3387. "vec4 texture1DProjLod(sampler1D, vec2, float);" // GL_ARB_shader_texture_lod
  3388. "vec4 texture1DProjLod(sampler1D, vec4, float);" // GL_ARB_shader_texture_lod
  3389. "vec4 shadow1DLod(sampler1DShadow, vec3, float);" // GL_ARB_shader_texture_lod
  3390. "vec4 shadow2DLod(sampler2DShadow, vec3, float);" // GL_ARB_shader_texture_lod
  3391. "vec4 shadow1DProjLod(sampler1DShadow, vec4, float);" // GL_ARB_shader_texture_lod
  3392. "vec4 shadow2DProjLod(sampler2DShadow, vec4, float);" // GL_ARB_shader_texture_lod
  3393. "vec4 texture1DGradARB(sampler1D, float, float, float);" // GL_ARB_shader_texture_lod
  3394. "vec4 texture1DProjGradARB(sampler1D, vec2, float, float);" // GL_ARB_shader_texture_lod
  3395. "vec4 texture1DProjGradARB(sampler1D, vec4, float, float);" // GL_ARB_shader_texture_lod
  3396. "vec4 texture2DGradARB(sampler2D, vec2, vec2, vec2);" // GL_ARB_shader_texture_lod
  3397. "vec4 texture2DProjGradARB(sampler2D, vec3, vec2, vec2);" // GL_ARB_shader_texture_lod
  3398. "vec4 texture2DProjGradARB(sampler2D, vec4, vec2, vec2);" // GL_ARB_shader_texture_lod
  3399. "vec4 texture3DGradARB(sampler3D, vec3, vec3, vec3);" // GL_ARB_shader_texture_lod
  3400. "vec4 texture3DProjGradARB(sampler3D, vec4, vec3, vec3);" // GL_ARB_shader_texture_lod
  3401. "vec4 textureCubeGradARB(samplerCube, vec3, vec3, vec3);" // GL_ARB_shader_texture_lod
  3402. "vec4 shadow1DGradARB(sampler1DShadow, vec3, float, float);" // GL_ARB_shader_texture_lod
  3403. "vec4 shadow1DProjGradARB( sampler1DShadow, vec4, float, float);" // GL_ARB_shader_texture_lod
  3404. "vec4 shadow2DGradARB(sampler2DShadow, vec3, vec2, vec2);" // GL_ARB_shader_texture_lod
  3405. "vec4 shadow2DProjGradARB( sampler2DShadow, vec4, vec2, vec2);" // GL_ARB_shader_texture_lod
  3406. "vec4 texture2DRectGradARB(sampler2DRect, vec2, vec2, vec2);" // GL_ARB_shader_texture_lod
  3407. "vec4 texture2DRectProjGradARB( sampler2DRect, vec3, vec2, vec2);" // GL_ARB_shader_texture_lod
  3408. "vec4 texture2DRectProjGradARB( sampler2DRect, vec4, vec2, vec2);" // GL_ARB_shader_texture_lod
  3409. "vec4 shadow2DRectGradARB( sampler2DRectShadow, vec3, vec2, vec2);" // GL_ARB_shader_texture_lod
  3410. "vec4 shadow2DRectProjGradARB(sampler2DRectShadow, vec4, vec2, vec2);" // GL_ARB_shader_texture_lod
  3411. "\n");
  3412. }
  3413. }
  3414. #endif // !GLSLANG_ANGLE
  3415. if ((profile != EEsProfile && version >= 150) ||
  3416. (profile == EEsProfile && version >= 310)) {
  3417. //============================================================================
  3418. //
  3419. // Prototypes for built-in functions seen by geometry shaders only.
  3420. //
  3421. //============================================================================
  3422. if (profile != EEsProfile && version >= 400) {
  3423. stageBuiltins[EShLangGeometry].append(
  3424. "void EmitStreamVertex(int);"
  3425. "void EndStreamPrimitive(int);"
  3426. );
  3427. }
  3428. stageBuiltins[EShLangGeometry].append(
  3429. "void EmitVertex();"
  3430. "void EndPrimitive();"
  3431. "\n");
  3432. }
  3433. #endif // !GLSLANG_WEB
  3434. //============================================================================
  3435. //
  3436. // Prototypes for all control functions.
  3437. //
  3438. //============================================================================
  3439. bool esBarrier = (profile == EEsProfile && version >= 310);
  3440. if ((profile != EEsProfile && version >= 150) || esBarrier)
  3441. stageBuiltins[EShLangTessControl].append(
  3442. "void barrier();"
  3443. );
  3444. if ((profile != EEsProfile && version >= 420) || esBarrier)
  3445. stageBuiltins[EShLangCompute].append(
  3446. "void barrier();"
  3447. );
  3448. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  3449. stageBuiltins[EShLangMeshNV].append(
  3450. "void barrier();"
  3451. );
  3452. stageBuiltins[EShLangTaskNV].append(
  3453. "void barrier();"
  3454. );
  3455. }
  3456. if ((profile != EEsProfile && version >= 130) || esBarrier)
  3457. commonBuiltins.append(
  3458. "void memoryBarrier();"
  3459. );
  3460. if ((profile != EEsProfile && version >= 420) || esBarrier) {
  3461. commonBuiltins.append(
  3462. "void memoryBarrierBuffer();"
  3463. );
  3464. stageBuiltins[EShLangCompute].append(
  3465. "void memoryBarrierShared();"
  3466. "void groupMemoryBarrier();"
  3467. );
  3468. }
  3469. #ifndef GLSLANG_WEB
  3470. if ((profile != EEsProfile && version >= 420) || esBarrier) {
  3471. if (spvVersion.vulkan == 0) {
  3472. commonBuiltins.append("void memoryBarrierAtomicCounter();");
  3473. }
  3474. commonBuiltins.append("void memoryBarrierImage();");
  3475. }
  3476. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  3477. stageBuiltins[EShLangMeshNV].append(
  3478. "void memoryBarrierShared();"
  3479. "void groupMemoryBarrier();"
  3480. );
  3481. stageBuiltins[EShLangTaskNV].append(
  3482. "void memoryBarrierShared();"
  3483. "void groupMemoryBarrier();"
  3484. );
  3485. }
  3486. commonBuiltins.append("void controlBarrier(int, int, int, int);\n"
  3487. "void memoryBarrier(int, int, int);\n");
  3488. commonBuiltins.append("void debugPrintfEXT();\n");
  3489. #ifndef GLSLANG_ANGLE
  3490. if (profile != EEsProfile && version >= 450) {
  3491. // coopMatStoreNV perhaps ought to have "out" on the buf parameter, but
  3492. // adding it introduces undesirable tempArgs on the stack. What we want
  3493. // is more like "buf" thought of as a pointer value being an in parameter.
  3494. stageBuiltins[EShLangCompute].append(
  3495. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent float16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3496. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent float[] buf, uint element, uint stride, bool colMajor);\n"
  3497. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent uint8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3498. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent uint16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3499. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent uint[] buf, uint element, uint stride, bool colMajor);\n"
  3500. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent uint64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3501. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent uvec2[] buf, uint element, uint stride, bool colMajor);\n"
  3502. "void coopMatLoadNV(out fcoopmatNV m, volatile coherent uvec4[] buf, uint element, uint stride, bool colMajor);\n"
  3503. "void coopMatStoreNV(fcoopmatNV m, volatile coherent float16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3504. "void coopMatStoreNV(fcoopmatNV m, volatile coherent float[] buf, uint element, uint stride, bool colMajor);\n"
  3505. "void coopMatStoreNV(fcoopmatNV m, volatile coherent float64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3506. "void coopMatStoreNV(fcoopmatNV m, volatile coherent uint8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3507. "void coopMatStoreNV(fcoopmatNV m, volatile coherent uint16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3508. "void coopMatStoreNV(fcoopmatNV m, volatile coherent uint[] buf, uint element, uint stride, bool colMajor);\n"
  3509. "void coopMatStoreNV(fcoopmatNV m, volatile coherent uint64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3510. "void coopMatStoreNV(fcoopmatNV m, volatile coherent uvec2[] buf, uint element, uint stride, bool colMajor);\n"
  3511. "void coopMatStoreNV(fcoopmatNV m, volatile coherent uvec4[] buf, uint element, uint stride, bool colMajor);\n"
  3512. "fcoopmatNV coopMatMulAddNV(fcoopmatNV A, fcoopmatNV B, fcoopmatNV C);\n"
  3513. "void coopMatLoadNV(out icoopmatNV m, volatile coherent int8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3514. "void coopMatLoadNV(out icoopmatNV m, volatile coherent int16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3515. "void coopMatLoadNV(out icoopmatNV m, volatile coherent int[] buf, uint element, uint stride, bool colMajor);\n"
  3516. "void coopMatLoadNV(out icoopmatNV m, volatile coherent int64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3517. "void coopMatLoadNV(out icoopmatNV m, volatile coherent ivec2[] buf, uint element, uint stride, bool colMajor);\n"
  3518. "void coopMatLoadNV(out icoopmatNV m, volatile coherent ivec4[] buf, uint element, uint stride, bool colMajor);\n"
  3519. "void coopMatLoadNV(out icoopmatNV m, volatile coherent uint8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3520. "void coopMatLoadNV(out icoopmatNV m, volatile coherent uint16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3521. "void coopMatLoadNV(out icoopmatNV m, volatile coherent uint[] buf, uint element, uint stride, bool colMajor);\n"
  3522. "void coopMatLoadNV(out icoopmatNV m, volatile coherent uint64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3523. "void coopMatLoadNV(out icoopmatNV m, volatile coherent uvec2[] buf, uint element, uint stride, bool colMajor);\n"
  3524. "void coopMatLoadNV(out icoopmatNV m, volatile coherent uvec4[] buf, uint element, uint stride, bool colMajor);\n"
  3525. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent int8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3526. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent int16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3527. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent int[] buf, uint element, uint stride, bool colMajor);\n"
  3528. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent int64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3529. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent ivec2[] buf, uint element, uint stride, bool colMajor);\n"
  3530. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent ivec4[] buf, uint element, uint stride, bool colMajor);\n"
  3531. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent uint8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3532. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent uint16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3533. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent uint[] buf, uint element, uint stride, bool colMajor);\n"
  3534. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent uint64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3535. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent uvec2[] buf, uint element, uint stride, bool colMajor);\n"
  3536. "void coopMatLoadNV(out ucoopmatNV m, volatile coherent uvec4[] buf, uint element, uint stride, bool colMajor);\n"
  3537. "void coopMatStoreNV(icoopmatNV m, volatile coherent int8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3538. "void coopMatStoreNV(icoopmatNV m, volatile coherent int16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3539. "void coopMatStoreNV(icoopmatNV m, volatile coherent int[] buf, uint element, uint stride, bool colMajor);\n"
  3540. "void coopMatStoreNV(icoopmatNV m, volatile coherent int64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3541. "void coopMatStoreNV(icoopmatNV m, volatile coherent ivec2[] buf, uint element, uint stride, bool colMajor);\n"
  3542. "void coopMatStoreNV(icoopmatNV m, volatile coherent ivec4[] buf, uint element, uint stride, bool colMajor);\n"
  3543. "void coopMatStoreNV(icoopmatNV m, volatile coherent uint8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3544. "void coopMatStoreNV(icoopmatNV m, volatile coherent uint16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3545. "void coopMatStoreNV(icoopmatNV m, volatile coherent uint[] buf, uint element, uint stride, bool colMajor);\n"
  3546. "void coopMatStoreNV(icoopmatNV m, volatile coherent uint64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3547. "void coopMatStoreNV(icoopmatNV m, volatile coherent uvec2[] buf, uint element, uint stride, bool colMajor);\n"
  3548. "void coopMatStoreNV(icoopmatNV m, volatile coherent uvec4[] buf, uint element, uint stride, bool colMajor);\n"
  3549. "void coopMatStoreNV(ucoopmatNV m, volatile coherent int8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3550. "void coopMatStoreNV(ucoopmatNV m, volatile coherent int16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3551. "void coopMatStoreNV(ucoopmatNV m, volatile coherent int[] buf, uint element, uint stride, bool colMajor);\n"
  3552. "void coopMatStoreNV(ucoopmatNV m, volatile coherent int64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3553. "void coopMatStoreNV(ucoopmatNV m, volatile coherent ivec2[] buf, uint element, uint stride, bool colMajor);\n"
  3554. "void coopMatStoreNV(ucoopmatNV m, volatile coherent ivec4[] buf, uint element, uint stride, bool colMajor);\n"
  3555. "void coopMatStoreNV(ucoopmatNV m, volatile coherent uint8_t[] buf, uint element, uint stride, bool colMajor);\n"
  3556. "void coopMatStoreNV(ucoopmatNV m, volatile coherent uint16_t[] buf, uint element, uint stride, bool colMajor);\n"
  3557. "void coopMatStoreNV(ucoopmatNV m, volatile coherent uint[] buf, uint element, uint stride, bool colMajor);\n"
  3558. "void coopMatStoreNV(ucoopmatNV m, volatile coherent uint64_t[] buf, uint element, uint stride, bool colMajor);\n"
  3559. "void coopMatStoreNV(ucoopmatNV m, volatile coherent uvec2[] buf, uint element, uint stride, bool colMajor);\n"
  3560. "void coopMatStoreNV(ucoopmatNV m, volatile coherent uvec4[] buf, uint element, uint stride, bool colMajor);\n"
  3561. "icoopmatNV coopMatMulAddNV(icoopmatNV A, icoopmatNV B, icoopmatNV C);\n"
  3562. "ucoopmatNV coopMatMulAddNV(ucoopmatNV A, ucoopmatNV B, ucoopmatNV C);\n"
  3563. );
  3564. }
  3565. //============================================================================
  3566. //
  3567. // Prototypes for built-in functions seen by fragment shaders only.
  3568. //
  3569. //============================================================================
  3570. //
  3571. // Original-style texture Functions with bias.
  3572. //
  3573. if (spvVersion.spv == 0 && (profile != EEsProfile || version == 100)) {
  3574. stageBuiltins[EShLangFragment].append(
  3575. "vec4 texture2D(sampler2D, vec2, float);"
  3576. "vec4 texture2DProj(sampler2D, vec3, float);"
  3577. "vec4 texture2DProj(sampler2D, vec4, float);"
  3578. "vec4 texture3D(sampler3D, vec3, float);" // OES_texture_3D
  3579. "vec4 texture3DProj(sampler3D, vec4, float);" // OES_texture_3D
  3580. "vec4 textureCube(samplerCube, vec3, float);"
  3581. "\n");
  3582. }
  3583. if (spvVersion.spv == 0 && (profile != EEsProfile && version > 100)) {
  3584. stageBuiltins[EShLangFragment].append(
  3585. "vec4 texture1D(sampler1D, float, float);"
  3586. "vec4 texture1DProj(sampler1D, vec2, float);"
  3587. "vec4 texture1DProj(sampler1D, vec4, float);"
  3588. "vec4 shadow1D(sampler1DShadow, vec3, float);"
  3589. "vec4 shadow2D(sampler2DShadow, vec3, float);"
  3590. "vec4 shadow1DProj(sampler1DShadow, vec4, float);"
  3591. "vec4 shadow2DProj(sampler2DShadow, vec4, float);"
  3592. "\n");
  3593. }
  3594. if (spvVersion.spv == 0 && profile == EEsProfile) {
  3595. stageBuiltins[EShLangFragment].append(
  3596. "vec4 texture2DLodEXT(sampler2D, vec2, float);" // GL_EXT_shader_texture_lod
  3597. "vec4 texture2DProjLodEXT(sampler2D, vec3, float);" // GL_EXT_shader_texture_lod
  3598. "vec4 texture2DProjLodEXT(sampler2D, vec4, float);" // GL_EXT_shader_texture_lod
  3599. "vec4 textureCubeLodEXT(samplerCube, vec3, float);" // GL_EXT_shader_texture_lod
  3600. "\n");
  3601. }
  3602. #endif // !GLSLANG_ANGLE
  3603. // GL_ARB_derivative_control
  3604. if (profile != EEsProfile && version >= 400) {
  3605. stageBuiltins[EShLangFragment].append(derivativeControls);
  3606. stageBuiltins[EShLangFragment].append("\n");
  3607. }
  3608. // GL_OES_shader_multisample_interpolation
  3609. if ((profile == EEsProfile && version >= 310) ||
  3610. (profile != EEsProfile && version >= 400)) {
  3611. stageBuiltins[EShLangFragment].append(
  3612. "float interpolateAtCentroid(float);"
  3613. "vec2 interpolateAtCentroid(vec2);"
  3614. "vec3 interpolateAtCentroid(vec3);"
  3615. "vec4 interpolateAtCentroid(vec4);"
  3616. "float interpolateAtSample(float, int);"
  3617. "vec2 interpolateAtSample(vec2, int);"
  3618. "vec3 interpolateAtSample(vec3, int);"
  3619. "vec4 interpolateAtSample(vec4, int);"
  3620. "float interpolateAtOffset(float, vec2);"
  3621. "vec2 interpolateAtOffset(vec2, vec2);"
  3622. "vec3 interpolateAtOffset(vec3, vec2);"
  3623. "vec4 interpolateAtOffset(vec4, vec2);"
  3624. "\n");
  3625. }
  3626. stageBuiltins[EShLangFragment].append(
  3627. "void beginInvocationInterlockARB(void);"
  3628. "void endInvocationInterlockARB(void);");
  3629. stageBuiltins[EShLangFragment].append(
  3630. "bool helperInvocationEXT();"
  3631. "\n");
  3632. #ifndef GLSLANG_ANGLE
  3633. // GL_AMD_shader_explicit_vertex_parameter
  3634. if (profile != EEsProfile && version >= 450) {
  3635. stageBuiltins[EShLangFragment].append(
  3636. "float interpolateAtVertexAMD(float, uint);"
  3637. "vec2 interpolateAtVertexAMD(vec2, uint);"
  3638. "vec3 interpolateAtVertexAMD(vec3, uint);"
  3639. "vec4 interpolateAtVertexAMD(vec4, uint);"
  3640. "int interpolateAtVertexAMD(int, uint);"
  3641. "ivec2 interpolateAtVertexAMD(ivec2, uint);"
  3642. "ivec3 interpolateAtVertexAMD(ivec3, uint);"
  3643. "ivec4 interpolateAtVertexAMD(ivec4, uint);"
  3644. "uint interpolateAtVertexAMD(uint, uint);"
  3645. "uvec2 interpolateAtVertexAMD(uvec2, uint);"
  3646. "uvec3 interpolateAtVertexAMD(uvec3, uint);"
  3647. "uvec4 interpolateAtVertexAMD(uvec4, uint);"
  3648. "float16_t interpolateAtVertexAMD(float16_t, uint);"
  3649. "f16vec2 interpolateAtVertexAMD(f16vec2, uint);"
  3650. "f16vec3 interpolateAtVertexAMD(f16vec3, uint);"
  3651. "f16vec4 interpolateAtVertexAMD(f16vec4, uint);"
  3652. "\n");
  3653. }
  3654. // GL_AMD_gpu_shader_half_float
  3655. if (profile != EEsProfile && version >= 450) {
  3656. stageBuiltins[EShLangFragment].append(derivativesAndControl16bits);
  3657. stageBuiltins[EShLangFragment].append("\n");
  3658. stageBuiltins[EShLangFragment].append(
  3659. "float16_t interpolateAtCentroid(float16_t);"
  3660. "f16vec2 interpolateAtCentroid(f16vec2);"
  3661. "f16vec3 interpolateAtCentroid(f16vec3);"
  3662. "f16vec4 interpolateAtCentroid(f16vec4);"
  3663. "float16_t interpolateAtSample(float16_t, int);"
  3664. "f16vec2 interpolateAtSample(f16vec2, int);"
  3665. "f16vec3 interpolateAtSample(f16vec3, int);"
  3666. "f16vec4 interpolateAtSample(f16vec4, int);"
  3667. "float16_t interpolateAtOffset(float16_t, f16vec2);"
  3668. "f16vec2 interpolateAtOffset(f16vec2, f16vec2);"
  3669. "f16vec3 interpolateAtOffset(f16vec3, f16vec2);"
  3670. "f16vec4 interpolateAtOffset(f16vec4, f16vec2);"
  3671. "\n");
  3672. }
  3673. // GL_ARB_shader_clock & GL_EXT_shader_realtime_clock
  3674. if (profile != EEsProfile && version >= 450) {
  3675. commonBuiltins.append(
  3676. "uvec2 clock2x32ARB();"
  3677. "uint64_t clockARB();"
  3678. "uvec2 clockRealtime2x32EXT();"
  3679. "uint64_t clockRealtimeEXT();"
  3680. "\n");
  3681. }
  3682. // GL_AMD_shader_fragment_mask
  3683. if (profile != EEsProfile && version >= 450 && spvVersion.vulkan > 0) {
  3684. stageBuiltins[EShLangFragment].append(
  3685. "uint fragmentMaskFetchAMD(subpassInputMS);"
  3686. "uint fragmentMaskFetchAMD(isubpassInputMS);"
  3687. "uint fragmentMaskFetchAMD(usubpassInputMS);"
  3688. "vec4 fragmentFetchAMD(subpassInputMS, uint);"
  3689. "ivec4 fragmentFetchAMD(isubpassInputMS, uint);"
  3690. "uvec4 fragmentFetchAMD(usubpassInputMS, uint);"
  3691. "\n");
  3692. }
  3693. // Builtins for GL_NV_ray_tracing/GL_EXT_ray_tracing/GL_EXT_ray_query
  3694. if (profile != EEsProfile && version >= 460) {
  3695. commonBuiltins.append("void rayQueryInitializeEXT(rayQueryEXT, accelerationStructureEXT, uint, uint, vec3, float, vec3, float);"
  3696. "void rayQueryTerminateEXT(rayQueryEXT);"
  3697. "void rayQueryGenerateIntersectionEXT(rayQueryEXT, float);"
  3698. "void rayQueryConfirmIntersectionEXT(rayQueryEXT);"
  3699. "bool rayQueryProceedEXT(rayQueryEXT);"
  3700. "uint rayQueryGetIntersectionTypeEXT(rayQueryEXT, bool);"
  3701. "float rayQueryGetRayTMinEXT(rayQueryEXT);"
  3702. "uint rayQueryGetRayFlagsEXT(rayQueryEXT);"
  3703. "vec3 rayQueryGetWorldRayOriginEXT(rayQueryEXT);"
  3704. "vec3 rayQueryGetWorldRayDirectionEXT(rayQueryEXT);"
  3705. "float rayQueryGetIntersectionTEXT(rayQueryEXT, bool);"
  3706. "int rayQueryGetIntersectionInstanceCustomIndexEXT(rayQueryEXT, bool);"
  3707. "int rayQueryGetIntersectionInstanceIdEXT(rayQueryEXT, bool);"
  3708. "uint rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT(rayQueryEXT, bool);"
  3709. "int rayQueryGetIntersectionGeometryIndexEXT(rayQueryEXT, bool);"
  3710. "int rayQueryGetIntersectionPrimitiveIndexEXT(rayQueryEXT, bool);"
  3711. "vec2 rayQueryGetIntersectionBarycentricsEXT(rayQueryEXT, bool);"
  3712. "bool rayQueryGetIntersectionFrontFaceEXT(rayQueryEXT, bool);"
  3713. "bool rayQueryGetIntersectionCandidateAABBOpaqueEXT(rayQueryEXT);"
  3714. "vec3 rayQueryGetIntersectionObjectRayDirectionEXT(rayQueryEXT, bool);"
  3715. "vec3 rayQueryGetIntersectionObjectRayOriginEXT(rayQueryEXT, bool);"
  3716. "mat4x3 rayQueryGetIntersectionObjectToWorldEXT(rayQueryEXT, bool);"
  3717. "mat4x3 rayQueryGetIntersectionWorldToObjectEXT(rayQueryEXT, bool);"
  3718. "\n");
  3719. stageBuiltins[EShLangRayGen].append(
  3720. "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
  3721. "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
  3722. "void executeCallableNV(uint, int);"
  3723. "void executeCallableEXT(uint, int);"
  3724. "\n");
  3725. stageBuiltins[EShLangIntersect].append(
  3726. "bool reportIntersectionNV(float, uint);"
  3727. "bool reportIntersectionEXT(float, uint);"
  3728. "\n");
  3729. stageBuiltins[EShLangAnyHit].append(
  3730. "void ignoreIntersectionNV();"
  3731. "void terminateRayNV();"
  3732. "\n");
  3733. stageBuiltins[EShLangClosestHit].append(
  3734. "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
  3735. "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
  3736. "void executeCallableNV(uint, int);"
  3737. "void executeCallableEXT(uint, int);"
  3738. "\n");
  3739. stageBuiltins[EShLangMiss].append(
  3740. "void traceNV(accelerationStructureNV,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
  3741. "void traceRayEXT(accelerationStructureEXT,uint,uint,uint,uint,uint,vec3,float,vec3,float,int);"
  3742. "void executeCallableNV(uint, int);"
  3743. "void executeCallableEXT(uint, int);"
  3744. "\n");
  3745. stageBuiltins[EShLangCallable].append(
  3746. "void executeCallableNV(uint, int);"
  3747. "void executeCallableEXT(uint, int);"
  3748. "\n");
  3749. }
  3750. #endif // !GLSLANG_ANGLE
  3751. //E_SPV_NV_compute_shader_derivatives
  3752. if ((profile == EEsProfile && version >= 320) || (profile != EEsProfile && version >= 450)) {
  3753. stageBuiltins[EShLangCompute].append(derivativeControls);
  3754. stageBuiltins[EShLangCompute].append("\n");
  3755. }
  3756. #ifndef GLSLANG_ANGLE
  3757. if (profile != EEsProfile && version >= 450) {
  3758. stageBuiltins[EShLangCompute].append(derivativesAndControl16bits);
  3759. stageBuiltins[EShLangCompute].append(derivativesAndControl64bits);
  3760. stageBuiltins[EShLangCompute].append("\n");
  3761. }
  3762. // Builtins for GL_NV_mesh_shader
  3763. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  3764. stageBuiltins[EShLangMeshNV].append(
  3765. "void writePackedPrimitiveIndices4x8NV(uint, uint);"
  3766. "\n");
  3767. }
  3768. #endif // !GLSLANG_ANGLE
  3769. #endif // !GLSLANG_WEB
  3770. //============================================================================
  3771. //
  3772. // Standard Uniforms
  3773. //
  3774. //============================================================================
  3775. //
  3776. // Depth range in window coordinates, p. 33
  3777. //
  3778. if (spvVersion.spv == 0) {
  3779. commonBuiltins.append(
  3780. "struct gl_DepthRangeParameters {"
  3781. );
  3782. if (profile == EEsProfile) {
  3783. commonBuiltins.append(
  3784. "highp float near;" // n
  3785. "highp float far;" // f
  3786. "highp float diff;" // f - n
  3787. );
  3788. } else {
  3789. #ifndef GLSLANG_WEB
  3790. commonBuiltins.append(
  3791. "float near;" // n
  3792. "float far;" // f
  3793. "float diff;" // f - n
  3794. );
  3795. #endif
  3796. }
  3797. commonBuiltins.append(
  3798. "};"
  3799. "uniform gl_DepthRangeParameters gl_DepthRange;"
  3800. "\n");
  3801. }
  3802. #if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
  3803. if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) {
  3804. //
  3805. // Matrix state. p. 31, 32, 37, 39, 40.
  3806. //
  3807. commonBuiltins.append(
  3808. "uniform mat4 gl_ModelViewMatrix;"
  3809. "uniform mat4 gl_ProjectionMatrix;"
  3810. "uniform mat4 gl_ModelViewProjectionMatrix;"
  3811. //
  3812. // Derived matrix state that provides inverse and transposed versions
  3813. // of the matrices above.
  3814. //
  3815. "uniform mat3 gl_NormalMatrix;"
  3816. "uniform mat4 gl_ModelViewMatrixInverse;"
  3817. "uniform mat4 gl_ProjectionMatrixInverse;"
  3818. "uniform mat4 gl_ModelViewProjectionMatrixInverse;"
  3819. "uniform mat4 gl_ModelViewMatrixTranspose;"
  3820. "uniform mat4 gl_ProjectionMatrixTranspose;"
  3821. "uniform mat4 gl_ModelViewProjectionMatrixTranspose;"
  3822. "uniform mat4 gl_ModelViewMatrixInverseTranspose;"
  3823. "uniform mat4 gl_ProjectionMatrixInverseTranspose;"
  3824. "uniform mat4 gl_ModelViewProjectionMatrixInverseTranspose;"
  3825. //
  3826. // Normal scaling p. 39.
  3827. //
  3828. "uniform float gl_NormalScale;"
  3829. //
  3830. // Point Size, p. 66, 67.
  3831. //
  3832. "struct gl_PointParameters {"
  3833. "float size;"
  3834. "float sizeMin;"
  3835. "float sizeMax;"
  3836. "float fadeThresholdSize;"
  3837. "float distanceConstantAttenuation;"
  3838. "float distanceLinearAttenuation;"
  3839. "float distanceQuadraticAttenuation;"
  3840. "};"
  3841. "uniform gl_PointParameters gl_Point;"
  3842. //
  3843. // Material State p. 50, 55.
  3844. //
  3845. "struct gl_MaterialParameters {"
  3846. "vec4 emission;" // Ecm
  3847. "vec4 ambient;" // Acm
  3848. "vec4 diffuse;" // Dcm
  3849. "vec4 specular;" // Scm
  3850. "float shininess;" // Srm
  3851. "};"
  3852. "uniform gl_MaterialParameters gl_FrontMaterial;"
  3853. "uniform gl_MaterialParameters gl_BackMaterial;"
  3854. //
  3855. // Light State p 50, 53, 55.
  3856. //
  3857. "struct gl_LightSourceParameters {"
  3858. "vec4 ambient;" // Acli
  3859. "vec4 diffuse;" // Dcli
  3860. "vec4 specular;" // Scli
  3861. "vec4 position;" // Ppli
  3862. "vec4 halfVector;" // Derived: Hi
  3863. "vec3 spotDirection;" // Sdli
  3864. "float spotExponent;" // Srli
  3865. "float spotCutoff;" // Crli
  3866. // (range: [0.0,90.0], 180.0)
  3867. "float spotCosCutoff;" // Derived: cos(Crli)
  3868. // (range: [1.0,0.0],-1.0)
  3869. "float constantAttenuation;" // K0
  3870. "float linearAttenuation;" // K1
  3871. "float quadraticAttenuation;"// K2
  3872. "};"
  3873. "struct gl_LightModelParameters {"
  3874. "vec4 ambient;" // Acs
  3875. "};"
  3876. "uniform gl_LightModelParameters gl_LightModel;"
  3877. //
  3878. // Derived state from products of light and material.
  3879. //
  3880. "struct gl_LightModelProducts {"
  3881. "vec4 sceneColor;" // Derived. Ecm + Acm * Acs
  3882. "};"
  3883. "uniform gl_LightModelProducts gl_FrontLightModelProduct;"
  3884. "uniform gl_LightModelProducts gl_BackLightModelProduct;"
  3885. "struct gl_LightProducts {"
  3886. "vec4 ambient;" // Acm * Acli
  3887. "vec4 diffuse;" // Dcm * Dcli
  3888. "vec4 specular;" // Scm * Scli
  3889. "};"
  3890. //
  3891. // Fog p. 161
  3892. //
  3893. "struct gl_FogParameters {"
  3894. "vec4 color;"
  3895. "float density;"
  3896. "float start;"
  3897. "float end;"
  3898. "float scale;" // 1 / (gl_FogEnd - gl_FogStart)
  3899. "};"
  3900. "uniform gl_FogParameters gl_Fog;"
  3901. "\n");
  3902. }
  3903. #endif // !GLSLANG_WEB && !GLSLANG_ANGLE
  3904. //============================================================================
  3905. //
  3906. // Define the interface to the compute shader.
  3907. //
  3908. //============================================================================
  3909. if ((profile != EEsProfile && version >= 420) ||
  3910. (profile == EEsProfile && version >= 310)) {
  3911. stageBuiltins[EShLangCompute].append(
  3912. "in highp uvec3 gl_NumWorkGroups;"
  3913. "const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);"
  3914. "in highp uvec3 gl_WorkGroupID;"
  3915. "in highp uvec3 gl_LocalInvocationID;"
  3916. "in highp uvec3 gl_GlobalInvocationID;"
  3917. "in highp uint gl_LocalInvocationIndex;"
  3918. "\n");
  3919. }
  3920. if ((profile != EEsProfile && version >= 140) ||
  3921. (profile == EEsProfile && version >= 310)) {
  3922. stageBuiltins[EShLangCompute].append(
  3923. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  3924. "\n");
  3925. }
  3926. #ifndef GLSLANG_WEB
  3927. #ifndef GLSLANG_ANGLE
  3928. //============================================================================
  3929. //
  3930. // Define the interface to the mesh/task shader.
  3931. //
  3932. //============================================================================
  3933. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  3934. // per-vertex attributes
  3935. stageBuiltins[EShLangMeshNV].append(
  3936. "out gl_MeshPerVertexNV {"
  3937. "vec4 gl_Position;"
  3938. "float gl_PointSize;"
  3939. "float gl_ClipDistance[];"
  3940. "float gl_CullDistance[];"
  3941. "perviewNV vec4 gl_PositionPerViewNV[];"
  3942. "perviewNV float gl_ClipDistancePerViewNV[][];"
  3943. "perviewNV float gl_CullDistancePerViewNV[][];"
  3944. "} gl_MeshVerticesNV[];"
  3945. );
  3946. // per-primitive attributes
  3947. stageBuiltins[EShLangMeshNV].append(
  3948. "perprimitiveNV out gl_MeshPerPrimitiveNV {"
  3949. "int gl_PrimitiveID;"
  3950. "int gl_Layer;"
  3951. "int gl_ViewportIndex;"
  3952. "int gl_ViewportMask[];"
  3953. "perviewNV int gl_LayerPerViewNV[];"
  3954. "perviewNV int gl_ViewportMaskPerViewNV[][];"
  3955. "} gl_MeshPrimitivesNV[];"
  3956. );
  3957. stageBuiltins[EShLangMeshNV].append(
  3958. "out uint gl_PrimitiveCountNV;"
  3959. "out uint gl_PrimitiveIndicesNV[];"
  3960. "in uint gl_MeshViewCountNV;"
  3961. "in uint gl_MeshViewIndicesNV[4];"
  3962. "const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);"
  3963. "in highp uvec3 gl_WorkGroupID;"
  3964. "in highp uvec3 gl_LocalInvocationID;"
  3965. "in highp uvec3 gl_GlobalInvocationID;"
  3966. "in highp uint gl_LocalInvocationIndex;"
  3967. "\n");
  3968. stageBuiltins[EShLangTaskNV].append(
  3969. "out uint gl_TaskCountNV;"
  3970. "const highp uvec3 gl_WorkGroupSize = uvec3(1,1,1);"
  3971. "in highp uvec3 gl_WorkGroupID;"
  3972. "in highp uvec3 gl_LocalInvocationID;"
  3973. "in highp uvec3 gl_GlobalInvocationID;"
  3974. "in highp uint gl_LocalInvocationIndex;"
  3975. "in uint gl_MeshViewCountNV;"
  3976. "in uint gl_MeshViewIndicesNV[4];"
  3977. "\n");
  3978. }
  3979. if (profile != EEsProfile && version >= 450) {
  3980. stageBuiltins[EShLangMeshNV].append(
  3981. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  3982. "in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters
  3983. "\n");
  3984. stageBuiltins[EShLangTaskNV].append(
  3985. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  3986. "in int gl_DrawIDARB;" // GL_ARB_shader_draw_parameters
  3987. "\n");
  3988. if (version >= 460) {
  3989. stageBuiltins[EShLangMeshNV].append(
  3990. "in int gl_DrawID;"
  3991. "\n");
  3992. stageBuiltins[EShLangTaskNV].append(
  3993. "in int gl_DrawID;"
  3994. "\n");
  3995. }
  3996. }
  3997. #endif // !GLSLANG_ANGLE
  3998. //============================================================================
  3999. //
  4000. // Define the interface to the vertex shader.
  4001. //
  4002. //============================================================================
  4003. if (profile != EEsProfile) {
  4004. if (version < 130) {
  4005. stageBuiltins[EShLangVertex].append(
  4006. "attribute vec4 gl_Color;"
  4007. "attribute vec4 gl_SecondaryColor;"
  4008. "attribute vec3 gl_Normal;"
  4009. "attribute vec4 gl_Vertex;"
  4010. "attribute vec4 gl_MultiTexCoord0;"
  4011. "attribute vec4 gl_MultiTexCoord1;"
  4012. "attribute vec4 gl_MultiTexCoord2;"
  4013. "attribute vec4 gl_MultiTexCoord3;"
  4014. "attribute vec4 gl_MultiTexCoord4;"
  4015. "attribute vec4 gl_MultiTexCoord5;"
  4016. "attribute vec4 gl_MultiTexCoord6;"
  4017. "attribute vec4 gl_MultiTexCoord7;"
  4018. "attribute float gl_FogCoord;"
  4019. "\n");
  4020. } else if (IncludeLegacy(version, profile, spvVersion)) {
  4021. stageBuiltins[EShLangVertex].append(
  4022. "in vec4 gl_Color;"
  4023. "in vec4 gl_SecondaryColor;"
  4024. "in vec3 gl_Normal;"
  4025. "in vec4 gl_Vertex;"
  4026. "in vec4 gl_MultiTexCoord0;"
  4027. "in vec4 gl_MultiTexCoord1;"
  4028. "in vec4 gl_MultiTexCoord2;"
  4029. "in vec4 gl_MultiTexCoord3;"
  4030. "in vec4 gl_MultiTexCoord4;"
  4031. "in vec4 gl_MultiTexCoord5;"
  4032. "in vec4 gl_MultiTexCoord6;"
  4033. "in vec4 gl_MultiTexCoord7;"
  4034. "in float gl_FogCoord;"
  4035. "\n");
  4036. }
  4037. if (version < 150) {
  4038. if (version < 130) {
  4039. stageBuiltins[EShLangVertex].append(
  4040. " vec4 gl_ClipVertex;" // needs qualifier fixed later
  4041. "varying vec4 gl_FrontColor;"
  4042. "varying vec4 gl_BackColor;"
  4043. "varying vec4 gl_FrontSecondaryColor;"
  4044. "varying vec4 gl_BackSecondaryColor;"
  4045. "varying vec4 gl_TexCoord[];"
  4046. "varying float gl_FogFragCoord;"
  4047. "\n");
  4048. } else if (IncludeLegacy(version, profile, spvVersion)) {
  4049. stageBuiltins[EShLangVertex].append(
  4050. " vec4 gl_ClipVertex;" // needs qualifier fixed later
  4051. "out vec4 gl_FrontColor;"
  4052. "out vec4 gl_BackColor;"
  4053. "out vec4 gl_FrontSecondaryColor;"
  4054. "out vec4 gl_BackSecondaryColor;"
  4055. "out vec4 gl_TexCoord[];"
  4056. "out float gl_FogFragCoord;"
  4057. "\n");
  4058. }
  4059. stageBuiltins[EShLangVertex].append(
  4060. "vec4 gl_Position;" // needs qualifier fixed later
  4061. "float gl_PointSize;" // needs qualifier fixed later
  4062. );
  4063. if (version == 130 || version == 140)
  4064. stageBuiltins[EShLangVertex].append(
  4065. "out float gl_ClipDistance[];"
  4066. );
  4067. } else {
  4068. // version >= 150
  4069. stageBuiltins[EShLangVertex].append(
  4070. "out gl_PerVertex {"
  4071. "vec4 gl_Position;" // needs qualifier fixed later
  4072. "float gl_PointSize;" // needs qualifier fixed later
  4073. "float gl_ClipDistance[];"
  4074. );
  4075. if (IncludeLegacy(version, profile, spvVersion))
  4076. stageBuiltins[EShLangVertex].append(
  4077. "vec4 gl_ClipVertex;" // needs qualifier fixed later
  4078. "vec4 gl_FrontColor;"
  4079. "vec4 gl_BackColor;"
  4080. "vec4 gl_FrontSecondaryColor;"
  4081. "vec4 gl_BackSecondaryColor;"
  4082. "vec4 gl_TexCoord[];"
  4083. "float gl_FogFragCoord;"
  4084. );
  4085. if (version >= 450)
  4086. stageBuiltins[EShLangVertex].append(
  4087. "float gl_CullDistance[];"
  4088. );
  4089. stageBuiltins[EShLangVertex].append(
  4090. "};"
  4091. "\n");
  4092. }
  4093. if (version >= 130 && spvVersion.vulkan == 0)
  4094. stageBuiltins[EShLangVertex].append(
  4095. "int gl_VertexID;" // needs qualifier fixed later
  4096. );
  4097. if (version >= 140 && spvVersion.vulkan == 0)
  4098. stageBuiltins[EShLangVertex].append(
  4099. "int gl_InstanceID;" // needs qualifier fixed later
  4100. );
  4101. if (spvVersion.vulkan > 0 && version >= 140)
  4102. stageBuiltins[EShLangVertex].append(
  4103. "in int gl_VertexIndex;"
  4104. "in int gl_InstanceIndex;"
  4105. );
  4106. if (version >= 440) {
  4107. stageBuiltins[EShLangVertex].append(
  4108. "in int gl_BaseVertexARB;"
  4109. "in int gl_BaseInstanceARB;"
  4110. "in int gl_DrawIDARB;"
  4111. );
  4112. }
  4113. if (version >= 410) {
  4114. stageBuiltins[EShLangVertex].append(
  4115. "out int gl_ViewportIndex;"
  4116. "out int gl_Layer;"
  4117. );
  4118. }
  4119. if (version >= 460) {
  4120. stageBuiltins[EShLangVertex].append(
  4121. "in int gl_BaseVertex;"
  4122. "in int gl_BaseInstance;"
  4123. "in int gl_DrawID;"
  4124. );
  4125. }
  4126. if (version >= 450)
  4127. stageBuiltins[EShLangVertex].append(
  4128. "out int gl_ViewportMask[];" // GL_NV_viewport_array2
  4129. "out int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering
  4130. "out vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  4131. "out vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4132. "out int gl_ViewportMaskPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4133. );
  4134. } else {
  4135. // ES profile
  4136. if (version == 100) {
  4137. stageBuiltins[EShLangVertex].append(
  4138. "highp vec4 gl_Position;" // needs qualifier fixed later
  4139. "mediump float gl_PointSize;" // needs qualifier fixed later
  4140. );
  4141. } else {
  4142. if (spvVersion.vulkan == 0)
  4143. stageBuiltins[EShLangVertex].append(
  4144. "in highp int gl_VertexID;" // needs qualifier fixed later
  4145. "in highp int gl_InstanceID;" // needs qualifier fixed later
  4146. );
  4147. if (spvVersion.vulkan > 0)
  4148. #endif
  4149. stageBuiltins[EShLangVertex].append(
  4150. "in highp int gl_VertexIndex;"
  4151. "in highp int gl_InstanceIndex;"
  4152. );
  4153. #ifndef GLSLANG_WEB
  4154. if (version < 310)
  4155. #endif
  4156. stageBuiltins[EShLangVertex].append(
  4157. "highp vec4 gl_Position;" // needs qualifier fixed later
  4158. "highp float gl_PointSize;" // needs qualifier fixed later
  4159. );
  4160. #ifndef GLSLANG_WEB
  4161. else
  4162. stageBuiltins[EShLangVertex].append(
  4163. "out gl_PerVertex {"
  4164. "highp vec4 gl_Position;" // needs qualifier fixed later
  4165. "highp float gl_PointSize;" // needs qualifier fixed later
  4166. "};"
  4167. );
  4168. }
  4169. }
  4170. if ((profile != EEsProfile && version >= 140) ||
  4171. (profile == EEsProfile && version >= 310)) {
  4172. stageBuiltins[EShLangVertex].append(
  4173. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  4174. "in highp int gl_ViewIndex;" // GL_EXT_multiview
  4175. "\n");
  4176. }
  4177. if (version >= 300 /* both ES and non-ES */) {
  4178. stageBuiltins[EShLangVertex].append(
  4179. "in highp uint gl_ViewID_OVR;" // GL_OVR_multiview, GL_OVR_multiview2
  4180. "\n");
  4181. }
  4182. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
  4183. stageBuiltins[EShLangVertex].append(
  4184. "out highp int gl_PrimitiveShadingRateEXT;" // GL_EXT_fragment_shading_rate
  4185. "\n");
  4186. }
  4187. //============================================================================
  4188. //
  4189. // Define the interface to the geometry shader.
  4190. //
  4191. //============================================================================
  4192. if (profile == ECoreProfile || profile == ECompatibilityProfile) {
  4193. stageBuiltins[EShLangGeometry].append(
  4194. "in gl_PerVertex {"
  4195. "vec4 gl_Position;"
  4196. "float gl_PointSize;"
  4197. "float gl_ClipDistance[];"
  4198. );
  4199. if (profile == ECompatibilityProfile)
  4200. stageBuiltins[EShLangGeometry].append(
  4201. "vec4 gl_ClipVertex;"
  4202. "vec4 gl_FrontColor;"
  4203. "vec4 gl_BackColor;"
  4204. "vec4 gl_FrontSecondaryColor;"
  4205. "vec4 gl_BackSecondaryColor;"
  4206. "vec4 gl_TexCoord[];"
  4207. "float gl_FogFragCoord;"
  4208. );
  4209. if (version >= 450)
  4210. stageBuiltins[EShLangGeometry].append(
  4211. "float gl_CullDistance[];"
  4212. "vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  4213. "vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4214. );
  4215. stageBuiltins[EShLangGeometry].append(
  4216. "} gl_in[];"
  4217. "in int gl_PrimitiveIDIn;"
  4218. "out gl_PerVertex {"
  4219. "vec4 gl_Position;"
  4220. "float gl_PointSize;"
  4221. "float gl_ClipDistance[];"
  4222. "\n");
  4223. if (profile == ECompatibilityProfile && version >= 400)
  4224. stageBuiltins[EShLangGeometry].append(
  4225. "vec4 gl_ClipVertex;"
  4226. "vec4 gl_FrontColor;"
  4227. "vec4 gl_BackColor;"
  4228. "vec4 gl_FrontSecondaryColor;"
  4229. "vec4 gl_BackSecondaryColor;"
  4230. "vec4 gl_TexCoord[];"
  4231. "float gl_FogFragCoord;"
  4232. );
  4233. if (version >= 450)
  4234. stageBuiltins[EShLangGeometry].append(
  4235. "float gl_CullDistance[];"
  4236. );
  4237. stageBuiltins[EShLangGeometry].append(
  4238. "};"
  4239. "out int gl_PrimitiveID;"
  4240. "out int gl_Layer;");
  4241. if (version >= 150)
  4242. stageBuiltins[EShLangGeometry].append(
  4243. "out int gl_ViewportIndex;"
  4244. );
  4245. if (profile == ECompatibilityProfile && version < 400)
  4246. stageBuiltins[EShLangGeometry].append(
  4247. "out vec4 gl_ClipVertex;"
  4248. );
  4249. if (version >= 400)
  4250. stageBuiltins[EShLangGeometry].append(
  4251. "in int gl_InvocationID;"
  4252. );
  4253. if (version >= 450)
  4254. stageBuiltins[EShLangGeometry].append(
  4255. "out int gl_ViewportMask[];" // GL_NV_viewport_array2
  4256. "out int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering
  4257. "out vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  4258. "out vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4259. "out int gl_ViewportMaskPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4260. );
  4261. stageBuiltins[EShLangGeometry].append("\n");
  4262. } else if (profile == EEsProfile && version >= 310) {
  4263. stageBuiltins[EShLangGeometry].append(
  4264. "in gl_PerVertex {"
  4265. "highp vec4 gl_Position;"
  4266. "highp float gl_PointSize;"
  4267. "} gl_in[];"
  4268. "\n"
  4269. "in highp int gl_PrimitiveIDIn;"
  4270. "in highp int gl_InvocationID;"
  4271. "\n"
  4272. "out gl_PerVertex {"
  4273. "highp vec4 gl_Position;"
  4274. "highp float gl_PointSize;"
  4275. "};"
  4276. "\n"
  4277. "out highp int gl_PrimitiveID;"
  4278. "out highp int gl_Layer;"
  4279. "\n"
  4280. );
  4281. }
  4282. if ((profile != EEsProfile && version >= 140) ||
  4283. (profile == EEsProfile && version >= 310)) {
  4284. stageBuiltins[EShLangGeometry].append(
  4285. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  4286. "in highp int gl_ViewIndex;" // GL_EXT_multiview
  4287. "\n");
  4288. }
  4289. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
  4290. stageBuiltins[EShLangGeometry].append(
  4291. "out highp int gl_PrimitiveShadingRateEXT;" // GL_EXT_fragment_shading_rate
  4292. "\n");
  4293. }
  4294. //============================================================================
  4295. //
  4296. // Define the interface to the tessellation control shader.
  4297. //
  4298. //============================================================================
  4299. if (profile != EEsProfile && version >= 150) {
  4300. // Note: "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
  4301. // as it depends on the resource sizing of gl_MaxPatchVertices.
  4302. stageBuiltins[EShLangTessControl].append(
  4303. "in int gl_PatchVerticesIn;"
  4304. "in int gl_PrimitiveID;"
  4305. "in int gl_InvocationID;"
  4306. "out gl_PerVertex {"
  4307. "vec4 gl_Position;"
  4308. "float gl_PointSize;"
  4309. "float gl_ClipDistance[];"
  4310. );
  4311. if (profile == ECompatibilityProfile)
  4312. stageBuiltins[EShLangTessControl].append(
  4313. "vec4 gl_ClipVertex;"
  4314. "vec4 gl_FrontColor;"
  4315. "vec4 gl_BackColor;"
  4316. "vec4 gl_FrontSecondaryColor;"
  4317. "vec4 gl_BackSecondaryColor;"
  4318. "vec4 gl_TexCoord[];"
  4319. "float gl_FogFragCoord;"
  4320. );
  4321. if (version >= 450)
  4322. stageBuiltins[EShLangTessControl].append(
  4323. "float gl_CullDistance[];"
  4324. "int gl_ViewportMask[];" // GL_NV_viewport_array2
  4325. "vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  4326. "int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering
  4327. "vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4328. "int gl_ViewportMaskPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4329. );
  4330. stageBuiltins[EShLangTessControl].append(
  4331. "} gl_out[];"
  4332. "patch out float gl_TessLevelOuter[4];"
  4333. "patch out float gl_TessLevelInner[2];"
  4334. "\n");
  4335. if (version >= 410)
  4336. stageBuiltins[EShLangTessControl].append(
  4337. "out int gl_ViewportIndex;"
  4338. "out int gl_Layer;"
  4339. "\n");
  4340. } else {
  4341. // Note: "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
  4342. // as it depends on the resource sizing of gl_MaxPatchVertices.
  4343. stageBuiltins[EShLangTessControl].append(
  4344. "in highp int gl_PatchVerticesIn;"
  4345. "in highp int gl_PrimitiveID;"
  4346. "in highp int gl_InvocationID;"
  4347. "out gl_PerVertex {"
  4348. "highp vec4 gl_Position;"
  4349. "highp float gl_PointSize;"
  4350. );
  4351. stageBuiltins[EShLangTessControl].append(
  4352. "} gl_out[];"
  4353. "patch out highp float gl_TessLevelOuter[4];"
  4354. "patch out highp float gl_TessLevelInner[2];"
  4355. "patch out highp vec4 gl_BoundingBoxOES[2];"
  4356. "patch out highp vec4 gl_BoundingBoxEXT[2];"
  4357. "\n");
  4358. if (profile == EEsProfile && version >= 320) {
  4359. stageBuiltins[EShLangTessControl].append(
  4360. "patch out highp vec4 gl_BoundingBox[2];"
  4361. "\n"
  4362. );
  4363. }
  4364. }
  4365. if ((profile != EEsProfile && version >= 140) ||
  4366. (profile == EEsProfile && version >= 310)) {
  4367. stageBuiltins[EShLangTessControl].append(
  4368. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  4369. "in highp int gl_ViewIndex;" // GL_EXT_multiview
  4370. "\n");
  4371. }
  4372. //============================================================================
  4373. //
  4374. // Define the interface to the tessellation evaluation shader.
  4375. //
  4376. //============================================================================
  4377. if (profile != EEsProfile && version >= 150) {
  4378. // Note: "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
  4379. // as it depends on the resource sizing of gl_MaxPatchVertices.
  4380. stageBuiltins[EShLangTessEvaluation].append(
  4381. "in int gl_PatchVerticesIn;"
  4382. "in int gl_PrimitiveID;"
  4383. "in vec3 gl_TessCoord;"
  4384. "patch in float gl_TessLevelOuter[4];"
  4385. "patch in float gl_TessLevelInner[2];"
  4386. "out gl_PerVertex {"
  4387. "vec4 gl_Position;"
  4388. "float gl_PointSize;"
  4389. "float gl_ClipDistance[];"
  4390. );
  4391. if (version >= 400 && profile == ECompatibilityProfile)
  4392. stageBuiltins[EShLangTessEvaluation].append(
  4393. "vec4 gl_ClipVertex;"
  4394. "vec4 gl_FrontColor;"
  4395. "vec4 gl_BackColor;"
  4396. "vec4 gl_FrontSecondaryColor;"
  4397. "vec4 gl_BackSecondaryColor;"
  4398. "vec4 gl_TexCoord[];"
  4399. "float gl_FogFragCoord;"
  4400. );
  4401. if (version >= 450)
  4402. stageBuiltins[EShLangTessEvaluation].append(
  4403. "float gl_CullDistance[];"
  4404. );
  4405. stageBuiltins[EShLangTessEvaluation].append(
  4406. "};"
  4407. "\n");
  4408. if (version >= 410)
  4409. stageBuiltins[EShLangTessEvaluation].append(
  4410. "out int gl_ViewportIndex;"
  4411. "out int gl_Layer;"
  4412. "\n");
  4413. if (version >= 450)
  4414. stageBuiltins[EShLangTessEvaluation].append(
  4415. "out int gl_ViewportMask[];" // GL_NV_viewport_array2
  4416. "out vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  4417. "out int gl_SecondaryViewportMaskNV[];" // GL_NV_stereo_view_rendering
  4418. "out vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4419. "out int gl_ViewportMaskPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  4420. );
  4421. } else if (profile == EEsProfile && version >= 310) {
  4422. // Note: "in gl_PerVertex {...} gl_in[gl_MaxPatchVertices];" is declared in initialize() below,
  4423. // as it depends on the resource sizing of gl_MaxPatchVertices.
  4424. stageBuiltins[EShLangTessEvaluation].append(
  4425. "in highp int gl_PatchVerticesIn;"
  4426. "in highp int gl_PrimitiveID;"
  4427. "in highp vec3 gl_TessCoord;"
  4428. "patch in highp float gl_TessLevelOuter[4];"
  4429. "patch in highp float gl_TessLevelInner[2];"
  4430. "out gl_PerVertex {"
  4431. "highp vec4 gl_Position;"
  4432. "highp float gl_PointSize;"
  4433. );
  4434. stageBuiltins[EShLangTessEvaluation].append(
  4435. "};"
  4436. "\n");
  4437. }
  4438. if ((profile != EEsProfile && version >= 140) ||
  4439. (profile == EEsProfile && version >= 310)) {
  4440. stageBuiltins[EShLangTessEvaluation].append(
  4441. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  4442. "in highp int gl_ViewIndex;" // GL_EXT_multiview
  4443. "\n");
  4444. }
  4445. //============================================================================
  4446. //
  4447. // Define the interface to the fragment shader.
  4448. //
  4449. //============================================================================
  4450. if (profile != EEsProfile) {
  4451. stageBuiltins[EShLangFragment].append(
  4452. "vec4 gl_FragCoord;" // needs qualifier fixed later
  4453. "bool gl_FrontFacing;" // needs qualifier fixed later
  4454. "float gl_FragDepth;" // needs qualifier fixed later
  4455. );
  4456. if (version >= 120)
  4457. stageBuiltins[EShLangFragment].append(
  4458. "vec2 gl_PointCoord;" // needs qualifier fixed later
  4459. );
  4460. if (version >= 140)
  4461. stageBuiltins[EShLangFragment].append(
  4462. "out int gl_FragStencilRefARB;"
  4463. );
  4464. if (IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && version < 420))
  4465. stageBuiltins[EShLangFragment].append(
  4466. "vec4 gl_FragColor;" // needs qualifier fixed later
  4467. );
  4468. if (version < 130) {
  4469. stageBuiltins[EShLangFragment].append(
  4470. "varying vec4 gl_Color;"
  4471. "varying vec4 gl_SecondaryColor;"
  4472. "varying vec4 gl_TexCoord[];"
  4473. "varying float gl_FogFragCoord;"
  4474. );
  4475. } else {
  4476. stageBuiltins[EShLangFragment].append(
  4477. "in float gl_ClipDistance[];"
  4478. );
  4479. if (IncludeLegacy(version, profile, spvVersion)) {
  4480. if (version < 150)
  4481. stageBuiltins[EShLangFragment].append(
  4482. "in float gl_FogFragCoord;"
  4483. "in vec4 gl_TexCoord[];"
  4484. "in vec4 gl_Color;"
  4485. "in vec4 gl_SecondaryColor;"
  4486. );
  4487. else
  4488. stageBuiltins[EShLangFragment].append(
  4489. "in gl_PerFragment {"
  4490. "in float gl_FogFragCoord;"
  4491. "in vec4 gl_TexCoord[];"
  4492. "in vec4 gl_Color;"
  4493. "in vec4 gl_SecondaryColor;"
  4494. "};"
  4495. );
  4496. }
  4497. }
  4498. if (version >= 150)
  4499. stageBuiltins[EShLangFragment].append(
  4500. "flat in int gl_PrimitiveID;"
  4501. );
  4502. if (version >= 130) { // ARB_sample_shading
  4503. stageBuiltins[EShLangFragment].append(
  4504. "flat in int gl_SampleID;"
  4505. " in vec2 gl_SamplePosition;"
  4506. " out int gl_SampleMask[];"
  4507. );
  4508. if (spvVersion.spv == 0) {
  4509. stageBuiltins[EShLangFragment].append(
  4510. "uniform int gl_NumSamples;"
  4511. );
  4512. }
  4513. }
  4514. if (version >= 400)
  4515. stageBuiltins[EShLangFragment].append(
  4516. "flat in int gl_SampleMaskIn[];"
  4517. );
  4518. if (version >= 430)
  4519. stageBuiltins[EShLangFragment].append(
  4520. "flat in int gl_Layer;"
  4521. "flat in int gl_ViewportIndex;"
  4522. );
  4523. if (version >= 450)
  4524. stageBuiltins[EShLangFragment].append(
  4525. "in float gl_CullDistance[];"
  4526. "bool gl_HelperInvocation;" // needs qualifier fixed later
  4527. );
  4528. if (version >= 450)
  4529. stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density
  4530. "flat in ivec2 gl_FragSizeEXT;"
  4531. "flat in int gl_FragInvocationCountEXT;"
  4532. );
  4533. if (version >= 450)
  4534. stageBuiltins[EShLangFragment].append(
  4535. "in vec2 gl_BaryCoordNoPerspAMD;"
  4536. "in vec2 gl_BaryCoordNoPerspCentroidAMD;"
  4537. "in vec2 gl_BaryCoordNoPerspSampleAMD;"
  4538. "in vec2 gl_BaryCoordSmoothAMD;"
  4539. "in vec2 gl_BaryCoordSmoothCentroidAMD;"
  4540. "in vec2 gl_BaryCoordSmoothSampleAMD;"
  4541. "in vec3 gl_BaryCoordPullModelAMD;"
  4542. );
  4543. if (version >= 430)
  4544. stageBuiltins[EShLangFragment].append(
  4545. "in bool gl_FragFullyCoveredNV;"
  4546. );
  4547. if (version >= 450)
  4548. stageBuiltins[EShLangFragment].append(
  4549. "flat in ivec2 gl_FragmentSizeNV;" // GL_NV_shading_rate_image
  4550. "flat in int gl_InvocationsPerPixelNV;"
  4551. "in vec3 gl_BaryCoordNV;" // GL_NV_fragment_shader_barycentric
  4552. "in vec3 gl_BaryCoordNoPerspNV;"
  4553. );
  4554. if (version >= 450)
  4555. stageBuiltins[EShLangFragment].append(
  4556. "flat in int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
  4557. );
  4558. } else {
  4559. // ES profile
  4560. if (version == 100) {
  4561. stageBuiltins[EShLangFragment].append(
  4562. "mediump vec4 gl_FragCoord;" // needs qualifier fixed later
  4563. " bool gl_FrontFacing;" // needs qualifier fixed later
  4564. "mediump vec4 gl_FragColor;" // needs qualifier fixed later
  4565. "mediump vec2 gl_PointCoord;" // needs qualifier fixed later
  4566. );
  4567. }
  4568. #endif
  4569. if (version >= 300) {
  4570. stageBuiltins[EShLangFragment].append(
  4571. "highp vec4 gl_FragCoord;" // needs qualifier fixed later
  4572. " bool gl_FrontFacing;" // needs qualifier fixed later
  4573. "mediump vec2 gl_PointCoord;" // needs qualifier fixed later
  4574. "highp float gl_FragDepth;" // needs qualifier fixed later
  4575. );
  4576. }
  4577. #ifndef GLSLANG_WEB
  4578. if (version >= 310) {
  4579. stageBuiltins[EShLangFragment].append(
  4580. "bool gl_HelperInvocation;" // needs qualifier fixed later
  4581. "flat in highp int gl_PrimitiveID;" // needs qualifier fixed later
  4582. "flat in highp int gl_Layer;" // needs qualifier fixed later
  4583. );
  4584. stageBuiltins[EShLangFragment].append( // GL_OES_sample_variables
  4585. "flat in lowp int gl_SampleID;"
  4586. " in mediump vec2 gl_SamplePosition;"
  4587. "flat in highp int gl_SampleMaskIn[];"
  4588. " out highp int gl_SampleMask[];"
  4589. );
  4590. if (spvVersion.spv == 0)
  4591. stageBuiltins[EShLangFragment].append( // GL_OES_sample_variables
  4592. "uniform lowp int gl_NumSamples;"
  4593. );
  4594. }
  4595. stageBuiltins[EShLangFragment].append(
  4596. "highp float gl_FragDepthEXT;" // GL_EXT_frag_depth
  4597. );
  4598. if (version >= 310)
  4599. stageBuiltins[EShLangFragment].append( // GL_EXT_fragment_invocation_density
  4600. "flat in ivec2 gl_FragSizeEXT;"
  4601. "flat in int gl_FragInvocationCountEXT;"
  4602. );
  4603. if (version >= 320)
  4604. stageBuiltins[EShLangFragment].append( // GL_NV_shading_rate_image
  4605. "flat in ivec2 gl_FragmentSizeNV;"
  4606. "flat in int gl_InvocationsPerPixelNV;"
  4607. );
  4608. if (version >= 320)
  4609. stageBuiltins[EShLangFragment].append(
  4610. "in vec3 gl_BaryCoordNV;"
  4611. "in vec3 gl_BaryCoordNoPerspNV;"
  4612. );
  4613. if (version >= 310)
  4614. stageBuiltins[EShLangFragment].append(
  4615. "flat in highp int gl_ShadingRateEXT;" // GL_EXT_fragment_shading_rate
  4616. );
  4617. }
  4618. #endif
  4619. stageBuiltins[EShLangFragment].append("\n");
  4620. if (version >= 130)
  4621. add2ndGenerationSamplingImaging(version, profile, spvVersion);
  4622. #ifndef GLSLANG_WEB
  4623. if ((profile != EEsProfile && version >= 140) ||
  4624. (profile == EEsProfile && version >= 310)) {
  4625. stageBuiltins[EShLangFragment].append(
  4626. "flat in highp int gl_DeviceIndex;" // GL_EXT_device_group
  4627. "flat in highp int gl_ViewIndex;" // GL_EXT_multiview
  4628. "\n");
  4629. }
  4630. if (version >= 300 /* both ES and non-ES */) {
  4631. stageBuiltins[EShLangFragment].append(
  4632. "flat in highp uint gl_ViewID_OVR;" // GL_OVR_multiview, GL_OVR_multiview2
  4633. "\n");
  4634. }
  4635. #ifndef GLSLANG_ANGLE
  4636. // GL_ARB_shader_ballot
  4637. if (profile != EEsProfile && version >= 450) {
  4638. const char* ballotDecls =
  4639. "uniform uint gl_SubGroupSizeARB;"
  4640. "in uint gl_SubGroupInvocationARB;"
  4641. "in uint64_t gl_SubGroupEqMaskARB;"
  4642. "in uint64_t gl_SubGroupGeMaskARB;"
  4643. "in uint64_t gl_SubGroupGtMaskARB;"
  4644. "in uint64_t gl_SubGroupLeMaskARB;"
  4645. "in uint64_t gl_SubGroupLtMaskARB;"
  4646. "\n";
  4647. const char* rtBallotDecls =
  4648. "uniform volatile uint gl_SubGroupSizeARB;"
  4649. "in volatile uint gl_SubGroupInvocationARB;"
  4650. "in volatile uint64_t gl_SubGroupEqMaskARB;"
  4651. "in volatile uint64_t gl_SubGroupGeMaskARB;"
  4652. "in volatile uint64_t gl_SubGroupGtMaskARB;"
  4653. "in volatile uint64_t gl_SubGroupLeMaskARB;"
  4654. "in volatile uint64_t gl_SubGroupLtMaskARB;"
  4655. "\n";
  4656. const char* fragmentBallotDecls =
  4657. "uniform uint gl_SubGroupSizeARB;"
  4658. "flat in uint gl_SubGroupInvocationARB;"
  4659. "flat in uint64_t gl_SubGroupEqMaskARB;"
  4660. "flat in uint64_t gl_SubGroupGeMaskARB;"
  4661. "flat in uint64_t gl_SubGroupGtMaskARB;"
  4662. "flat in uint64_t gl_SubGroupLeMaskARB;"
  4663. "flat in uint64_t gl_SubGroupLtMaskARB;"
  4664. "\n";
  4665. stageBuiltins[EShLangVertex] .append(ballotDecls);
  4666. stageBuiltins[EShLangTessControl] .append(ballotDecls);
  4667. stageBuiltins[EShLangTessEvaluation].append(ballotDecls);
  4668. stageBuiltins[EShLangGeometry] .append(ballotDecls);
  4669. stageBuiltins[EShLangCompute] .append(ballotDecls);
  4670. stageBuiltins[EShLangFragment] .append(fragmentBallotDecls);
  4671. stageBuiltins[EShLangMeshNV] .append(ballotDecls);
  4672. stageBuiltins[EShLangTaskNV] .append(ballotDecls);
  4673. stageBuiltins[EShLangRayGen] .append(rtBallotDecls);
  4674. stageBuiltins[EShLangIntersect] .append(rtBallotDecls);
  4675. // No volatile qualifier on these builtins in any-hit
  4676. stageBuiltins[EShLangAnyHit] .append(ballotDecls);
  4677. stageBuiltins[EShLangClosestHit] .append(rtBallotDecls);
  4678. stageBuiltins[EShLangMiss] .append(rtBallotDecls);
  4679. stageBuiltins[EShLangCallable] .append(rtBallotDecls);
  4680. }
  4681. // GL_KHR_shader_subgroup
  4682. if ((profile == EEsProfile && version >= 310) ||
  4683. (profile != EEsProfile && version >= 140)) {
  4684. const char* subgroupDecls =
  4685. "in mediump uint gl_SubgroupSize;"
  4686. "in mediump uint gl_SubgroupInvocationID;"
  4687. "in highp uvec4 gl_SubgroupEqMask;"
  4688. "in highp uvec4 gl_SubgroupGeMask;"
  4689. "in highp uvec4 gl_SubgroupGtMask;"
  4690. "in highp uvec4 gl_SubgroupLeMask;"
  4691. "in highp uvec4 gl_SubgroupLtMask;"
  4692. // GL_NV_shader_sm_builtins
  4693. "in highp uint gl_WarpsPerSMNV;"
  4694. "in highp uint gl_SMCountNV;"
  4695. "in highp uint gl_WarpIDNV;"
  4696. "in highp uint gl_SMIDNV;"
  4697. "\n";
  4698. const char* fragmentSubgroupDecls =
  4699. "flat in mediump uint gl_SubgroupSize;"
  4700. "flat in mediump uint gl_SubgroupInvocationID;"
  4701. "flat in highp uvec4 gl_SubgroupEqMask;"
  4702. "flat in highp uvec4 gl_SubgroupGeMask;"
  4703. "flat in highp uvec4 gl_SubgroupGtMask;"
  4704. "flat in highp uvec4 gl_SubgroupLeMask;"
  4705. "flat in highp uvec4 gl_SubgroupLtMask;"
  4706. // GL_NV_shader_sm_builtins
  4707. "flat in highp uint gl_WarpsPerSMNV;"
  4708. "flat in highp uint gl_SMCountNV;"
  4709. "flat in highp uint gl_WarpIDNV;"
  4710. "flat in highp uint gl_SMIDNV;"
  4711. "\n";
  4712. const char* computeSubgroupDecls =
  4713. "in highp uint gl_NumSubgroups;"
  4714. "in highp uint gl_SubgroupID;"
  4715. "\n";
  4716. // These builtins are volatile for RT stages
  4717. const char* rtSubgroupDecls =
  4718. "in mediump volatile uint gl_SubgroupSize;"
  4719. "in mediump volatile uint gl_SubgroupInvocationID;"
  4720. "in highp volatile uvec4 gl_SubgroupEqMask;"
  4721. "in highp volatile uvec4 gl_SubgroupGeMask;"
  4722. "in highp volatile uvec4 gl_SubgroupGtMask;"
  4723. "in highp volatile uvec4 gl_SubgroupLeMask;"
  4724. "in highp volatile uvec4 gl_SubgroupLtMask;"
  4725. // GL_NV_shader_sm_builtins
  4726. "in highp uint gl_WarpsPerSMNV;"
  4727. "in highp uint gl_SMCountNV;"
  4728. "in highp volatile uint gl_WarpIDNV;"
  4729. "in highp volatile uint gl_SMIDNV;"
  4730. "\n";
  4731. stageBuiltins[EShLangVertex] .append(subgroupDecls);
  4732. stageBuiltins[EShLangTessControl] .append(subgroupDecls);
  4733. stageBuiltins[EShLangTessEvaluation].append(subgroupDecls);
  4734. stageBuiltins[EShLangGeometry] .append(subgroupDecls);
  4735. stageBuiltins[EShLangCompute] .append(subgroupDecls);
  4736. stageBuiltins[EShLangCompute] .append(computeSubgroupDecls);
  4737. stageBuiltins[EShLangFragment] .append(fragmentSubgroupDecls);
  4738. stageBuiltins[EShLangMeshNV] .append(subgroupDecls);
  4739. stageBuiltins[EShLangMeshNV] .append(computeSubgroupDecls);
  4740. stageBuiltins[EShLangTaskNV] .append(subgroupDecls);
  4741. stageBuiltins[EShLangTaskNV] .append(computeSubgroupDecls);
  4742. stageBuiltins[EShLangRayGen] .append(rtSubgroupDecls);
  4743. stageBuiltins[EShLangIntersect] .append(rtSubgroupDecls);
  4744. // No volatile qualifier on these builtins in any-hit
  4745. stageBuiltins[EShLangAnyHit] .append(subgroupDecls);
  4746. stageBuiltins[EShLangClosestHit] .append(rtSubgroupDecls);
  4747. stageBuiltins[EShLangMiss] .append(rtSubgroupDecls);
  4748. stageBuiltins[EShLangCallable] .append(rtSubgroupDecls);
  4749. }
  4750. // GL_NV_ray_tracing/GL_EXT_ray_tracing
  4751. if (profile != EEsProfile && version >= 460) {
  4752. const char *constRayFlags =
  4753. "const uint gl_RayFlagsNoneNV = 0U;"
  4754. "const uint gl_RayFlagsNoneEXT = 0U;"
  4755. "const uint gl_RayFlagsOpaqueNV = 1U;"
  4756. "const uint gl_RayFlagsOpaqueEXT = 1U;"
  4757. "const uint gl_RayFlagsNoOpaqueNV = 2U;"
  4758. "const uint gl_RayFlagsNoOpaqueEXT = 2U;"
  4759. "const uint gl_RayFlagsTerminateOnFirstHitNV = 4U;"
  4760. "const uint gl_RayFlagsTerminateOnFirstHitEXT = 4U;"
  4761. "const uint gl_RayFlagsSkipClosestHitShaderNV = 8U;"
  4762. "const uint gl_RayFlagsSkipClosestHitShaderEXT = 8U;"
  4763. "const uint gl_RayFlagsCullBackFacingTrianglesNV = 16U;"
  4764. "const uint gl_RayFlagsCullBackFacingTrianglesEXT = 16U;"
  4765. "const uint gl_RayFlagsCullFrontFacingTrianglesNV = 32U;"
  4766. "const uint gl_RayFlagsCullFrontFacingTrianglesEXT = 32U;"
  4767. "const uint gl_RayFlagsCullOpaqueNV = 64U;"
  4768. "const uint gl_RayFlagsCullOpaqueEXT = 64U;"
  4769. "const uint gl_RayFlagsCullNoOpaqueNV = 128U;"
  4770. "const uint gl_RayFlagsCullNoOpaqueEXT = 128U;"
  4771. "const uint gl_RayFlagsSkipTrianglesEXT = 256U;"
  4772. "const uint gl_RayFlagsSkipAABBEXT = 512U;"
  4773. "const uint gl_HitKindFrontFacingTriangleEXT = 254U;"
  4774. "const uint gl_HitKindBackFacingTriangleEXT = 255U;"
  4775. "\n";
  4776. const char *constRayQueryIntersection =
  4777. "const uint gl_RayQueryCandidateIntersectionEXT = 0U;"
  4778. "const uint gl_RayQueryCommittedIntersectionEXT = 1U;"
  4779. "const uint gl_RayQueryCommittedIntersectionNoneEXT = 0U;"
  4780. "const uint gl_RayQueryCommittedIntersectionTriangleEXT = 1U;"
  4781. "const uint gl_RayQueryCommittedIntersectionGeneratedEXT = 2U;"
  4782. "const uint gl_RayQueryCandidateIntersectionTriangleEXT = 0U;"
  4783. "const uint gl_RayQueryCandidateIntersectionAABBEXT = 1U;"
  4784. "\n";
  4785. const char *rayGenDecls =
  4786. "in uvec3 gl_LaunchIDNV;"
  4787. "in uvec3 gl_LaunchIDEXT;"
  4788. "in uvec3 gl_LaunchSizeNV;"
  4789. "in uvec3 gl_LaunchSizeEXT;"
  4790. "\n";
  4791. const char *intersectDecls =
  4792. "in uvec3 gl_LaunchIDNV;"
  4793. "in uvec3 gl_LaunchIDEXT;"
  4794. "in uvec3 gl_LaunchSizeNV;"
  4795. "in uvec3 gl_LaunchSizeEXT;"
  4796. "in int gl_PrimitiveID;"
  4797. "in int gl_InstanceID;"
  4798. "in int gl_InstanceCustomIndexNV;"
  4799. "in int gl_InstanceCustomIndexEXT;"
  4800. "in int gl_GeometryIndexEXT;"
  4801. "in vec3 gl_WorldRayOriginNV;"
  4802. "in vec3 gl_WorldRayOriginEXT;"
  4803. "in vec3 gl_WorldRayDirectionNV;"
  4804. "in vec3 gl_WorldRayDirectionEXT;"
  4805. "in vec3 gl_ObjectRayOriginNV;"
  4806. "in vec3 gl_ObjectRayOriginEXT;"
  4807. "in vec3 gl_ObjectRayDirectionNV;"
  4808. "in vec3 gl_ObjectRayDirectionEXT;"
  4809. "in float gl_RayTminNV;"
  4810. "in float gl_RayTminEXT;"
  4811. "in float gl_RayTmaxNV;"
  4812. "in volatile float gl_RayTmaxEXT;"
  4813. "in mat4x3 gl_ObjectToWorldNV;"
  4814. "in mat4x3 gl_ObjectToWorldEXT;"
  4815. "in mat3x4 gl_ObjectToWorld3x4EXT;"
  4816. "in mat4x3 gl_WorldToObjectNV;"
  4817. "in mat4x3 gl_WorldToObjectEXT;"
  4818. "in mat3x4 gl_WorldToObject3x4EXT;"
  4819. "in uint gl_IncomingRayFlagsNV;"
  4820. "in uint gl_IncomingRayFlagsEXT;"
  4821. "\n";
  4822. const char *hitDecls =
  4823. "in uvec3 gl_LaunchIDNV;"
  4824. "in uvec3 gl_LaunchIDEXT;"
  4825. "in uvec3 gl_LaunchSizeNV;"
  4826. "in uvec3 gl_LaunchSizeEXT;"
  4827. "in int gl_PrimitiveID;"
  4828. "in int gl_InstanceID;"
  4829. "in int gl_InstanceCustomIndexNV;"
  4830. "in int gl_InstanceCustomIndexEXT;"
  4831. "in int gl_GeometryIndexEXT;"
  4832. "in vec3 gl_WorldRayOriginNV;"
  4833. "in vec3 gl_WorldRayOriginEXT;"
  4834. "in vec3 gl_WorldRayDirectionNV;"
  4835. "in vec3 gl_WorldRayDirectionEXT;"
  4836. "in vec3 gl_ObjectRayOriginNV;"
  4837. "in vec3 gl_ObjectRayOriginEXT;"
  4838. "in vec3 gl_ObjectRayDirectionNV;"
  4839. "in vec3 gl_ObjectRayDirectionEXT;"
  4840. "in float gl_RayTminNV;"
  4841. "in float gl_RayTminEXT;"
  4842. "in float gl_RayTmaxNV;"
  4843. "in float gl_RayTmaxEXT;"
  4844. "in float gl_HitTNV;"
  4845. "in float gl_HitTEXT;"
  4846. "in uint gl_HitKindNV;"
  4847. "in uint gl_HitKindEXT;"
  4848. "in mat4x3 gl_ObjectToWorldNV;"
  4849. "in mat4x3 gl_ObjectToWorldEXT;"
  4850. "in mat3x4 gl_ObjectToWorld3x4EXT;"
  4851. "in mat4x3 gl_WorldToObjectNV;"
  4852. "in mat4x3 gl_WorldToObjectEXT;"
  4853. "in mat3x4 gl_WorldToObject3x4EXT;"
  4854. "in uint gl_IncomingRayFlagsNV;"
  4855. "in uint gl_IncomingRayFlagsEXT;"
  4856. "\n";
  4857. const char *missDecls =
  4858. "in uvec3 gl_LaunchIDNV;"
  4859. "in uvec3 gl_LaunchIDEXT;"
  4860. "in uvec3 gl_LaunchSizeNV;"
  4861. "in uvec3 gl_LaunchSizeEXT;"
  4862. "in vec3 gl_WorldRayOriginNV;"
  4863. "in vec3 gl_WorldRayOriginEXT;"
  4864. "in vec3 gl_WorldRayDirectionNV;"
  4865. "in vec3 gl_WorldRayDirectionEXT;"
  4866. "in vec3 gl_ObjectRayOriginNV;"
  4867. "in vec3 gl_ObjectRayDirectionNV;"
  4868. "in float gl_RayTminNV;"
  4869. "in float gl_RayTminEXT;"
  4870. "in float gl_RayTmaxNV;"
  4871. "in float gl_RayTmaxEXT;"
  4872. "in uint gl_IncomingRayFlagsNV;"
  4873. "in uint gl_IncomingRayFlagsEXT;"
  4874. "\n";
  4875. const char *callableDecls =
  4876. "in uvec3 gl_LaunchIDNV;"
  4877. "in uvec3 gl_LaunchIDEXT;"
  4878. "in uvec3 gl_LaunchSizeNV;"
  4879. "in uvec3 gl_LaunchSizeEXT;"
  4880. "\n";
  4881. commonBuiltins.append(constRayQueryIntersection);
  4882. commonBuiltins.append(constRayFlags);
  4883. stageBuiltins[EShLangRayGen].append(rayGenDecls);
  4884. stageBuiltins[EShLangIntersect].append(intersectDecls);
  4885. stageBuiltins[EShLangAnyHit].append(hitDecls);
  4886. stageBuiltins[EShLangClosestHit].append(hitDecls);
  4887. stageBuiltins[EShLangMiss].append(missDecls);
  4888. stageBuiltins[EShLangCallable].append(callableDecls);
  4889. }
  4890. if ((profile != EEsProfile && version >= 140)) {
  4891. const char *deviceIndex =
  4892. "in highp int gl_DeviceIndex;" // GL_EXT_device_group
  4893. "\n";
  4894. stageBuiltins[EShLangRayGen].append(deviceIndex);
  4895. stageBuiltins[EShLangIntersect].append(deviceIndex);
  4896. stageBuiltins[EShLangAnyHit].append(deviceIndex);
  4897. stageBuiltins[EShLangClosestHit].append(deviceIndex);
  4898. stageBuiltins[EShLangMiss].append(deviceIndex);
  4899. }
  4900. if ((profile != EEsProfile && version >= 420) ||
  4901. (profile == EEsProfile && version >= 310)) {
  4902. commonBuiltins.append("const int gl_ScopeDevice = 1;\n");
  4903. commonBuiltins.append("const int gl_ScopeWorkgroup = 2;\n");
  4904. commonBuiltins.append("const int gl_ScopeSubgroup = 3;\n");
  4905. commonBuiltins.append("const int gl_ScopeInvocation = 4;\n");
  4906. commonBuiltins.append("const int gl_ScopeQueueFamily = 5;\n");
  4907. commonBuiltins.append("const int gl_ScopeShaderCallEXT = 6;\n");
  4908. commonBuiltins.append("const int gl_SemanticsRelaxed = 0x0;\n");
  4909. commonBuiltins.append("const int gl_SemanticsAcquire = 0x2;\n");
  4910. commonBuiltins.append("const int gl_SemanticsRelease = 0x4;\n");
  4911. commonBuiltins.append("const int gl_SemanticsAcquireRelease = 0x8;\n");
  4912. commonBuiltins.append("const int gl_SemanticsMakeAvailable = 0x2000;\n");
  4913. commonBuiltins.append("const int gl_SemanticsMakeVisible = 0x4000;\n");
  4914. commonBuiltins.append("const int gl_SemanticsVolatile = 0x8000;\n");
  4915. commonBuiltins.append("const int gl_StorageSemanticsNone = 0x0;\n");
  4916. commonBuiltins.append("const int gl_StorageSemanticsBuffer = 0x40;\n");
  4917. commonBuiltins.append("const int gl_StorageSemanticsShared = 0x100;\n");
  4918. commonBuiltins.append("const int gl_StorageSemanticsImage = 0x800;\n");
  4919. commonBuiltins.append("const int gl_StorageSemanticsOutput = 0x1000;\n");
  4920. }
  4921. // Adding these to common built-ins triggers an assert due to a memory corruption in related code when testing
  4922. // So instead add to each stage individually, avoiding the GLSLang bug
  4923. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 310)) {
  4924. for (int stage=EShLangVertex; stage<EShLangCount; stage++)
  4925. {
  4926. stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag2VerticalPixelsEXT = 1;\n");
  4927. stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4VerticalPixelsEXT = 2;\n");
  4928. stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag2HorizontalPixelsEXT = 4;\n");
  4929. stageBuiltins[static_cast<EShLanguage>(stage)].append("const highp int gl_ShadingRateFlag4HorizontalPixelsEXT = 8;\n");
  4930. }
  4931. }
  4932. // GL_EXT_shader_image_int64
  4933. if ((profile != EEsProfile && version >= 420) ||
  4934. (profile == EEsProfile && version >= 310)) {
  4935. const TBasicType bTypes[] = { EbtInt64, EbtUint64 };
  4936. for (int ms = 0; ms <= 1; ++ms) { // loop over "bool" multisample or not
  4937. for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not
  4938. for (int dim = Esd1D; dim < EsdSubpass; ++dim) { // 1D, ..., buffer
  4939. if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)
  4940. continue;
  4941. if ((dim == Esd3D || dim == EsdRect || dim == EsdBuffer) && arrayed)
  4942. continue;
  4943. if (dim != Esd2D && ms)
  4944. continue;
  4945. // Loop over the bTypes
  4946. for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) {
  4947. //
  4948. // Now, make all the function prototypes for the type we just built...
  4949. //
  4950. TSampler sampler;
  4951. sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,
  4952. false,
  4953. ms ? true : false);
  4954. TString typeName = sampler.getString();
  4955. addQueryFunctions(sampler, typeName, version, profile);
  4956. addImageFunctions(sampler, typeName, version, profile);
  4957. }
  4958. }
  4959. }
  4960. }
  4961. }
  4962. #endif // !GLSLANG_ANGLE
  4963. #endif // !GLSLANG_WEB
  4964. // printf("%s\n", commonBuiltins.c_str());
  4965. // printf("%s\n", stageBuiltins[EShLangFragment].c_str());
  4966. }
  4967. //
  4968. // Helper function for initialize(), to add the second set of names for texturing,
  4969. // when adding context-independent built-in functions.
  4970. //
  4971. void TBuiltIns::add2ndGenerationSamplingImaging(int version, EProfile profile, const SpvVersion& spvVersion)
  4972. {
  4973. //
  4974. // In this function proper, enumerate the types, then calls the next set of functions
  4975. // to enumerate all the uses for that type.
  4976. //
  4977. // enumerate all the types
  4978. const TBasicType bTypes[] = { EbtFloat, EbtInt, EbtUint,
  4979. #if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
  4980. EbtFloat16
  4981. #endif
  4982. };
  4983. #ifdef GLSLANG_WEB
  4984. bool skipBuffer = true;
  4985. bool skipCubeArrayed = true;
  4986. const int image = 0;
  4987. #else
  4988. bool skipBuffer = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 140);
  4989. bool skipCubeArrayed = (profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 130);
  4990. for (int image = 0; image <= 1; ++image) // loop over "bool" image vs sampler
  4991. #endif
  4992. {
  4993. for (int shadow = 0; shadow <= 1; ++shadow) { // loop over "bool" shadow or not
  4994. #ifdef GLSLANG_WEB
  4995. const int ms = 0;
  4996. #else
  4997. for (int ms = 0; ms <= 1; ++ms) // loop over "bool" multisample or not
  4998. #endif
  4999. {
  5000. if ((ms || image) && shadow)
  5001. continue;
  5002. if (ms && profile != EEsProfile && version < 150)
  5003. continue;
  5004. if (ms && image && profile == EEsProfile)
  5005. continue;
  5006. if (ms && profile == EEsProfile && version < 310)
  5007. continue;
  5008. for (int arrayed = 0; arrayed <= 1; ++arrayed) { // loop over "bool" arrayed or not
  5009. #ifdef GLSLANG_WEB
  5010. for (int dim = Esd2D; dim <= EsdCube; ++dim) { // 2D, 3D, and Cube
  5011. #else
  5012. #if defined(GLSLANG_ANGLE)
  5013. for (int dim = Esd2D; dim < EsdNumDims; ++dim) { // 2D, ..., buffer, subpass
  5014. #else
  5015. for (int dim = Esd1D; dim < EsdNumDims; ++dim) { // 1D, ..., buffer, subpass
  5016. #endif
  5017. if (dim == EsdSubpass && spvVersion.vulkan == 0)
  5018. continue;
  5019. if (dim == EsdSubpass && (image || shadow || arrayed))
  5020. continue;
  5021. if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)
  5022. continue;
  5023. if (dim == EsdSubpass && spvVersion.vulkan == 0)
  5024. continue;
  5025. if (dim == EsdSubpass && (image || shadow || arrayed))
  5026. continue;
  5027. if ((dim == Esd1D || dim == EsdRect) && profile == EEsProfile)
  5028. continue;
  5029. if (dim != Esd2D && dim != EsdSubpass && ms)
  5030. continue;
  5031. if (dim == EsdBuffer && skipBuffer)
  5032. continue;
  5033. if (dim == EsdBuffer && (shadow || arrayed || ms))
  5034. continue;
  5035. if (ms && arrayed && profile == EEsProfile && version < 310)
  5036. continue;
  5037. #endif
  5038. if (dim == Esd3D && shadow)
  5039. continue;
  5040. if (dim == EsdCube && arrayed && skipCubeArrayed)
  5041. continue;
  5042. if ((dim == Esd3D || dim == EsdRect) && arrayed)
  5043. continue;
  5044. // Loop over the bTypes
  5045. for (size_t bType = 0; bType < sizeof(bTypes)/sizeof(TBasicType); ++bType) {
  5046. #ifndef GLSLANG_WEB
  5047. if (bTypes[bType] == EbtFloat16 && (profile == EEsProfile || version < 450))
  5048. continue;
  5049. if (dim == EsdRect && version < 140 && bType > 0)
  5050. continue;
  5051. #endif
  5052. if (shadow && (bTypes[bType] == EbtInt || bTypes[bType] == EbtUint))
  5053. continue;
  5054. //
  5055. // Now, make all the function prototypes for the type we just built...
  5056. //
  5057. TSampler sampler;
  5058. #ifndef GLSLANG_WEB
  5059. if (dim == EsdSubpass) {
  5060. sampler.setSubpass(bTypes[bType], ms ? true : false);
  5061. } else
  5062. #endif
  5063. if (image) {
  5064. sampler.setImage(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,
  5065. shadow ? true : false,
  5066. ms ? true : false);
  5067. } else {
  5068. sampler.set(bTypes[bType], (TSamplerDim)dim, arrayed ? true : false,
  5069. shadow ? true : false,
  5070. ms ? true : false);
  5071. }
  5072. TString typeName = sampler.getString();
  5073. #ifndef GLSLANG_WEB
  5074. if (dim == EsdSubpass) {
  5075. addSubpassSampling(sampler, typeName, version, profile);
  5076. continue;
  5077. }
  5078. #endif
  5079. addQueryFunctions(sampler, typeName, version, profile);
  5080. if (image)
  5081. addImageFunctions(sampler, typeName, version, profile);
  5082. else {
  5083. addSamplingFunctions(sampler, typeName, version, profile);
  5084. #ifndef GLSLANG_WEB
  5085. addGatherFunctions(sampler, typeName, version, profile);
  5086. if (spvVersion.vulkan > 0 && sampler.isCombined() && !sampler.shadow) {
  5087. // Base Vulkan allows texelFetch() for
  5088. // textureBuffer (i.e. without sampler).
  5089. //
  5090. // GL_EXT_samplerless_texture_functions
  5091. // allows texelFetch() and query functions
  5092. // (other than textureQueryLod()) for all
  5093. // texture types.
  5094. sampler.setTexture(sampler.type, sampler.dim, sampler.arrayed, sampler.shadow,
  5095. sampler.ms);
  5096. TString textureTypeName = sampler.getString();
  5097. addSamplingFunctions(sampler, textureTypeName, version, profile);
  5098. addQueryFunctions(sampler, textureTypeName, version, profile);
  5099. }
  5100. #endif
  5101. }
  5102. }
  5103. }
  5104. }
  5105. }
  5106. }
  5107. }
  5108. //
  5109. // sparseTexelsResidentARB()
  5110. //
  5111. if (profile != EEsProfile && version >= 450) {
  5112. commonBuiltins.append("bool sparseTexelsResidentARB(int code);\n");
  5113. }
  5114. }
  5115. //
  5116. // Helper function for add2ndGenerationSamplingImaging(),
  5117. // when adding context-independent built-in functions.
  5118. //
  5119. // Add all the query functions for the given type.
  5120. //
  5121. void TBuiltIns::addQueryFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
  5122. {
  5123. //
  5124. // textureSize() and imageSize()
  5125. //
  5126. int sizeDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0) - (sampler.dim == EsdCube ? 1 : 0);
  5127. #ifdef GLSLANG_WEB
  5128. commonBuiltins.append("highp ");
  5129. commonBuiltins.append("ivec");
  5130. commonBuiltins.append(postfixes[sizeDims]);
  5131. commonBuiltins.append(" textureSize(");
  5132. commonBuiltins.append(typeName);
  5133. commonBuiltins.append(",int);\n");
  5134. return;
  5135. #endif
  5136. if (sampler.isImage() && ((profile == EEsProfile && version < 310) || (profile != EEsProfile && version < 420)))
  5137. return;
  5138. if (profile == EEsProfile)
  5139. commonBuiltins.append("highp ");
  5140. if (sizeDims == 1)
  5141. commonBuiltins.append("int");
  5142. else {
  5143. commonBuiltins.append("ivec");
  5144. commonBuiltins.append(postfixes[sizeDims]);
  5145. }
  5146. if (sampler.isImage())
  5147. commonBuiltins.append(" imageSize(readonly writeonly volatile coherent ");
  5148. else
  5149. commonBuiltins.append(" textureSize(");
  5150. commonBuiltins.append(typeName);
  5151. if (! sampler.isImage() && ! sampler.isRect() && ! sampler.isBuffer() && ! sampler.isMultiSample())
  5152. commonBuiltins.append(",int);\n");
  5153. else
  5154. commonBuiltins.append(");\n");
  5155. //
  5156. // textureSamples() and imageSamples()
  5157. //
  5158. // GL_ARB_shader_texture_image_samples
  5159. // TODO: spec issue? there are no memory qualifiers; how to query a writeonly/readonly image, etc?
  5160. if (profile != EEsProfile && version >= 430 && sampler.isMultiSample()) {
  5161. commonBuiltins.append("int ");
  5162. if (sampler.isImage())
  5163. commonBuiltins.append("imageSamples(readonly writeonly volatile coherent ");
  5164. else
  5165. commonBuiltins.append("textureSamples(");
  5166. commonBuiltins.append(typeName);
  5167. commonBuiltins.append(");\n");
  5168. }
  5169. //
  5170. // textureQueryLod(), fragment stage only
  5171. // Also enabled with extension GL_ARB_texture_query_lod
  5172. if (profile != EEsProfile && version >= 150 && sampler.isCombined() && sampler.dim != EsdRect &&
  5173. ! sampler.isMultiSample() && ! sampler.isBuffer()) {
  5174. for (int f16TexAddr = 0; f16TexAddr < 2; ++f16TexAddr) {
  5175. if (f16TexAddr && sampler.type != EbtFloat16)
  5176. continue;
  5177. stageBuiltins[EShLangFragment].append("vec2 textureQueryLod(");
  5178. stageBuiltins[EShLangFragment].append(typeName);
  5179. if (dimMap[sampler.dim] == 1)
  5180. if (f16TexAddr)
  5181. stageBuiltins[EShLangFragment].append(", float16_t");
  5182. else
  5183. stageBuiltins[EShLangFragment].append(", float");
  5184. else {
  5185. if (f16TexAddr)
  5186. stageBuiltins[EShLangFragment].append(", f16vec");
  5187. else
  5188. stageBuiltins[EShLangFragment].append(", vec");
  5189. stageBuiltins[EShLangFragment].append(postfixes[dimMap[sampler.dim]]);
  5190. }
  5191. stageBuiltins[EShLangFragment].append(");\n");
  5192. }
  5193. stageBuiltins[EShLangCompute].append("vec2 textureQueryLod(");
  5194. stageBuiltins[EShLangCompute].append(typeName);
  5195. if (dimMap[sampler.dim] == 1)
  5196. stageBuiltins[EShLangCompute].append(", float");
  5197. else {
  5198. stageBuiltins[EShLangCompute].append(", vec");
  5199. stageBuiltins[EShLangCompute].append(postfixes[dimMap[sampler.dim]]);
  5200. }
  5201. stageBuiltins[EShLangCompute].append(");\n");
  5202. }
  5203. //
  5204. // textureQueryLevels()
  5205. //
  5206. if (profile != EEsProfile && version >= 430 && ! sampler.isImage() && sampler.dim != EsdRect &&
  5207. ! sampler.isMultiSample() && ! sampler.isBuffer()) {
  5208. commonBuiltins.append("int textureQueryLevels(");
  5209. commonBuiltins.append(typeName);
  5210. commonBuiltins.append(");\n");
  5211. }
  5212. }
  5213. //
  5214. // Helper function for add2ndGenerationSamplingImaging(),
  5215. // when adding context-independent built-in functions.
  5216. //
  5217. // Add all the image access functions for the given type.
  5218. //
  5219. void TBuiltIns::addImageFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
  5220. {
  5221. int dims = dimMap[sampler.dim];
  5222. // most things with an array add a dimension, except for cubemaps
  5223. if (sampler.arrayed && sampler.dim != EsdCube)
  5224. ++dims;
  5225. TString imageParams = typeName;
  5226. if (dims == 1)
  5227. imageParams.append(", int");
  5228. else {
  5229. imageParams.append(", ivec");
  5230. imageParams.append(postfixes[dims]);
  5231. }
  5232. if (sampler.isMultiSample())
  5233. imageParams.append(", int");
  5234. if (profile == EEsProfile)
  5235. commonBuiltins.append("highp ");
  5236. commonBuiltins.append(prefixes[sampler.type]);
  5237. commonBuiltins.append("vec4 imageLoad(readonly volatile coherent ");
  5238. commonBuiltins.append(imageParams);
  5239. commonBuiltins.append(");\n");
  5240. commonBuiltins.append("void imageStore(writeonly volatile coherent ");
  5241. commonBuiltins.append(imageParams);
  5242. commonBuiltins.append(", ");
  5243. commonBuiltins.append(prefixes[sampler.type]);
  5244. commonBuiltins.append("vec4);\n");
  5245. if (! sampler.is1D() && ! sampler.isBuffer() && profile != EEsProfile && version >= 450) {
  5246. commonBuiltins.append("int sparseImageLoadARB(readonly volatile coherent ");
  5247. commonBuiltins.append(imageParams);
  5248. commonBuiltins.append(", out ");
  5249. commonBuiltins.append(prefixes[sampler.type]);
  5250. commonBuiltins.append("vec4");
  5251. commonBuiltins.append(");\n");
  5252. }
  5253. if ( profile != EEsProfile ||
  5254. (profile == EEsProfile && version >= 310)) {
  5255. if (sampler.type == EbtInt || sampler.type == EbtUint || sampler.type == EbtInt64 || sampler.type == EbtUint64 ) {
  5256. const char* dataType;
  5257. switch (sampler.type) {
  5258. case(EbtInt): dataType = "highp int"; break;
  5259. case(EbtUint): dataType = "highp uint"; break;
  5260. case(EbtInt64): dataType = "highp int64_t"; break;
  5261. case(EbtUint64): dataType = "highp uint64_t"; break;
  5262. default: dataType = "";
  5263. }
  5264. const int numBuiltins = 7;
  5265. static const char* atomicFunc[numBuiltins] = {
  5266. " imageAtomicAdd(volatile coherent ",
  5267. " imageAtomicMin(volatile coherent ",
  5268. " imageAtomicMax(volatile coherent ",
  5269. " imageAtomicAnd(volatile coherent ",
  5270. " imageAtomicOr(volatile coherent ",
  5271. " imageAtomicXor(volatile coherent ",
  5272. " imageAtomicExchange(volatile coherent "
  5273. };
  5274. // Loop twice to add prototypes with/without scope/semantics
  5275. for (int j = 0; j < 2; ++j) {
  5276. for (size_t i = 0; i < numBuiltins; ++i) {
  5277. commonBuiltins.append(dataType);
  5278. commonBuiltins.append(atomicFunc[i]);
  5279. commonBuiltins.append(imageParams);
  5280. commonBuiltins.append(", ");
  5281. commonBuiltins.append(dataType);
  5282. if (j == 1) {
  5283. commonBuiltins.append(", int, int, int");
  5284. }
  5285. commonBuiltins.append(");\n");
  5286. }
  5287. commonBuiltins.append(dataType);
  5288. commonBuiltins.append(" imageAtomicCompSwap(volatile coherent ");
  5289. commonBuiltins.append(imageParams);
  5290. commonBuiltins.append(", ");
  5291. commonBuiltins.append(dataType);
  5292. commonBuiltins.append(", ");
  5293. commonBuiltins.append(dataType);
  5294. if (j == 1) {
  5295. commonBuiltins.append(", int, int, int, int, int");
  5296. }
  5297. commonBuiltins.append(");\n");
  5298. }
  5299. commonBuiltins.append(dataType);
  5300. commonBuiltins.append(" imageAtomicLoad(volatile coherent ");
  5301. commonBuiltins.append(imageParams);
  5302. commonBuiltins.append(", int, int, int);\n");
  5303. commonBuiltins.append("void imageAtomicStore(volatile coherent ");
  5304. commonBuiltins.append(imageParams);
  5305. commonBuiltins.append(", ");
  5306. commonBuiltins.append(dataType);
  5307. commonBuiltins.append(", int, int, int);\n");
  5308. } else {
  5309. // not int or uint
  5310. // GL_ARB_ES3_1_compatibility
  5311. // TODO: spec issue: are there restrictions on the kind of layout() that can be used? what about dropping memory qualifiers?
  5312. if (profile == EEsProfile && version >= 310) {
  5313. commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
  5314. commonBuiltins.append(imageParams);
  5315. commonBuiltins.append(", float);\n");
  5316. }
  5317. if (profile != EEsProfile && version >= 450) {
  5318. commonBuiltins.append("float imageAtomicAdd(volatile coherent ");
  5319. commonBuiltins.append(imageParams);
  5320. commonBuiltins.append(", float);\n");
  5321. commonBuiltins.append("float imageAtomicAdd(volatile coherent ");
  5322. commonBuiltins.append(imageParams);
  5323. commonBuiltins.append(", float");
  5324. commonBuiltins.append(", int, int, int);\n");
  5325. commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
  5326. commonBuiltins.append(imageParams);
  5327. commonBuiltins.append(", float);\n");
  5328. commonBuiltins.append("float imageAtomicExchange(volatile coherent ");
  5329. commonBuiltins.append(imageParams);
  5330. commonBuiltins.append(", float");
  5331. commonBuiltins.append(", int, int, int);\n");
  5332. commonBuiltins.append("float imageAtomicLoad(readonly volatile coherent ");
  5333. commonBuiltins.append(imageParams);
  5334. commonBuiltins.append(", int, int, int);\n");
  5335. commonBuiltins.append("void imageAtomicStore(writeonly volatile coherent ");
  5336. commonBuiltins.append(imageParams);
  5337. commonBuiltins.append(", float");
  5338. commonBuiltins.append(", int, int, int);\n");
  5339. }
  5340. }
  5341. }
  5342. if (sampler.dim == EsdRect || sampler.dim == EsdBuffer || sampler.shadow || sampler.isMultiSample())
  5343. return;
  5344. if (profile == EEsProfile || version < 450)
  5345. return;
  5346. TString imageLodParams = typeName;
  5347. if (dims == 1)
  5348. imageLodParams.append(", int");
  5349. else {
  5350. imageLodParams.append(", ivec");
  5351. imageLodParams.append(postfixes[dims]);
  5352. }
  5353. imageLodParams.append(", int");
  5354. commonBuiltins.append(prefixes[sampler.type]);
  5355. commonBuiltins.append("vec4 imageLoadLodAMD(readonly volatile coherent ");
  5356. commonBuiltins.append(imageLodParams);
  5357. commonBuiltins.append(");\n");
  5358. commonBuiltins.append("void imageStoreLodAMD(writeonly volatile coherent ");
  5359. commonBuiltins.append(imageLodParams);
  5360. commonBuiltins.append(", ");
  5361. commonBuiltins.append(prefixes[sampler.type]);
  5362. commonBuiltins.append("vec4);\n");
  5363. if (! sampler.is1D()) {
  5364. commonBuiltins.append("int sparseImageLoadLodAMD(readonly volatile coherent ");
  5365. commonBuiltins.append(imageLodParams);
  5366. commonBuiltins.append(", out ");
  5367. commonBuiltins.append(prefixes[sampler.type]);
  5368. commonBuiltins.append("vec4");
  5369. commonBuiltins.append(");\n");
  5370. }
  5371. }
  5372. //
  5373. // Helper function for initialize(),
  5374. // when adding context-independent built-in functions.
  5375. //
  5376. // Add all the subpass access functions for the given type.
  5377. //
  5378. void TBuiltIns::addSubpassSampling(TSampler sampler, const TString& typeName, int /*version*/, EProfile /*profile*/)
  5379. {
  5380. stageBuiltins[EShLangFragment].append(prefixes[sampler.type]);
  5381. stageBuiltins[EShLangFragment].append("vec4 subpassLoad");
  5382. stageBuiltins[EShLangFragment].append("(");
  5383. stageBuiltins[EShLangFragment].append(typeName.c_str());
  5384. if (sampler.isMultiSample())
  5385. stageBuiltins[EShLangFragment].append(", int");
  5386. stageBuiltins[EShLangFragment].append(");\n");
  5387. }
  5388. //
  5389. // Helper function for add2ndGenerationSamplingImaging(),
  5390. // when adding context-independent built-in functions.
  5391. //
  5392. // Add all the texture lookup functions for the given type.
  5393. //
  5394. void TBuiltIns::addSamplingFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
  5395. {
  5396. #ifdef GLSLANG_WEB
  5397. profile = EEsProfile;
  5398. version = 310;
  5399. #elif defined(GLSLANG_ANGLE)
  5400. profile = ECoreProfile;
  5401. version = 450;
  5402. #endif
  5403. //
  5404. // texturing
  5405. //
  5406. for (int proj = 0; proj <= 1; ++proj) { // loop over "bool" projective or not
  5407. if (proj && (sampler.dim == EsdCube || sampler.isBuffer() || sampler.arrayed || sampler.isMultiSample()
  5408. || !sampler.isCombined()))
  5409. continue;
  5410. for (int lod = 0; lod <= 1; ++lod) {
  5411. if (lod && (sampler.isBuffer() || sampler.isRect() || sampler.isMultiSample() || !sampler.isCombined()))
  5412. continue;
  5413. if (lod && sampler.dim == Esd2D && sampler.arrayed && sampler.shadow)
  5414. continue;
  5415. if (lod && sampler.dim == EsdCube && sampler.shadow)
  5416. continue;
  5417. for (int bias = 0; bias <= 1; ++bias) {
  5418. if (bias && (lod || sampler.isMultiSample() || !sampler.isCombined()))
  5419. continue;
  5420. if (bias && (sampler.dim == Esd2D || sampler.dim == EsdCube) && sampler.shadow && sampler.arrayed)
  5421. continue;
  5422. if (bias && (sampler.isRect() || sampler.isBuffer()))
  5423. continue;
  5424. for (int offset = 0; offset <= 1; ++offset) { // loop over "bool" offset or not
  5425. if (proj + offset + bias + lod > 3)
  5426. continue;
  5427. if (offset && (sampler.dim == EsdCube || sampler.isBuffer() || sampler.isMultiSample()))
  5428. continue;
  5429. for (int fetch = 0; fetch <= 1; ++fetch) { // loop over "bool" fetch or not
  5430. if (proj + offset + fetch + bias + lod > 3)
  5431. continue;
  5432. if (fetch && (lod || bias))
  5433. continue;
  5434. if (fetch && (sampler.shadow || sampler.dim == EsdCube))
  5435. continue;
  5436. if (fetch == 0 && (sampler.isMultiSample() || sampler.isBuffer()
  5437. || !sampler.isCombined()))
  5438. continue;
  5439. for (int grad = 0; grad <= 1; ++grad) { // loop over "bool" grad or not
  5440. if (grad && (lod || bias || sampler.isMultiSample() || !sampler.isCombined()))
  5441. continue;
  5442. if (grad && sampler.isBuffer())
  5443. continue;
  5444. if (proj + offset + fetch + grad + bias + lod > 3)
  5445. continue;
  5446. for (int extraProj = 0; extraProj <= 1; ++extraProj) {
  5447. bool compare = false;
  5448. int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
  5449. // skip dummy unused second component for 1D non-array shadows
  5450. if (sampler.shadow && totalDims < 2)
  5451. totalDims = 2;
  5452. totalDims += (sampler.shadow ? 1 : 0) + proj;
  5453. if (totalDims > 4 && sampler.shadow) {
  5454. compare = true;
  5455. totalDims = 4;
  5456. }
  5457. assert(totalDims <= 4);
  5458. if (extraProj && ! proj)
  5459. continue;
  5460. if (extraProj && (sampler.dim == Esd3D || sampler.shadow || !sampler.isCombined()))
  5461. continue;
  5462. // loop over 16-bit floating-point texel addressing
  5463. #if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
  5464. const int f16TexAddr = 0;
  5465. #else
  5466. for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr)
  5467. #endif
  5468. {
  5469. if (f16TexAddr && sampler.type != EbtFloat16)
  5470. continue;
  5471. if (f16TexAddr && sampler.shadow && ! compare) {
  5472. compare = true; // compare argument is always present
  5473. totalDims--;
  5474. }
  5475. // loop over "bool" lod clamp
  5476. #if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
  5477. const int lodClamp = 0;
  5478. #else
  5479. for (int lodClamp = 0; lodClamp <= 1 ;++lodClamp)
  5480. #endif
  5481. {
  5482. if (lodClamp && (profile == EEsProfile || version < 450))
  5483. continue;
  5484. if (lodClamp && (proj || lod || fetch))
  5485. continue;
  5486. // loop over "bool" sparse or not
  5487. #if defined(GLSLANG_WEB) || defined(GLSLANG_ANGLE)
  5488. const int sparse = 0;
  5489. #else
  5490. for (int sparse = 0; sparse <= 1; ++sparse)
  5491. #endif
  5492. {
  5493. if (sparse && (profile == EEsProfile || version < 450))
  5494. continue;
  5495. // Sparse sampling is not for 1D/1D array texture, buffer texture, and
  5496. // projective texture
  5497. if (sparse && (sampler.is1D() || sampler.isBuffer() || proj))
  5498. continue;
  5499. TString s;
  5500. // return type
  5501. if (sparse)
  5502. s.append("int ");
  5503. else {
  5504. if (sampler.shadow)
  5505. if (sampler.type == EbtFloat16)
  5506. s.append("float16_t ");
  5507. else
  5508. s.append("float ");
  5509. else {
  5510. s.append(prefixes[sampler.type]);
  5511. s.append("vec4 ");
  5512. }
  5513. }
  5514. // name
  5515. if (sparse) {
  5516. if (fetch)
  5517. s.append("sparseTexel");
  5518. else
  5519. s.append("sparseTexture");
  5520. }
  5521. else {
  5522. if (fetch)
  5523. s.append("texel");
  5524. else
  5525. s.append("texture");
  5526. }
  5527. if (proj)
  5528. s.append("Proj");
  5529. if (lod)
  5530. s.append("Lod");
  5531. if (grad)
  5532. s.append("Grad");
  5533. if (fetch)
  5534. s.append("Fetch");
  5535. if (offset)
  5536. s.append("Offset");
  5537. if (lodClamp)
  5538. s.append("Clamp");
  5539. if (lodClamp != 0 || sparse)
  5540. s.append("ARB");
  5541. s.append("(");
  5542. // sampler type
  5543. s.append(typeName);
  5544. // P coordinate
  5545. if (extraProj) {
  5546. if (f16TexAddr)
  5547. s.append(",f16vec4");
  5548. else
  5549. s.append(",vec4");
  5550. } else {
  5551. s.append(",");
  5552. TBasicType t = fetch ? EbtInt : (f16TexAddr ? EbtFloat16 : EbtFloat);
  5553. if (totalDims == 1)
  5554. s.append(TType::getBasicString(t));
  5555. else {
  5556. s.append(prefixes[t]);
  5557. s.append("vec");
  5558. s.append(postfixes[totalDims]);
  5559. }
  5560. }
  5561. // non-optional compare
  5562. if (compare)
  5563. s.append(",float");
  5564. // non-optional lod argument (lod that's not driven by lod loop) or sample
  5565. if ((fetch && !sampler.isBuffer() &&
  5566. !sampler.isRect() && !sampler.isMultiSample())
  5567. || (sampler.isMultiSample() && fetch))
  5568. s.append(",int");
  5569. // non-optional lod
  5570. if (lod) {
  5571. if (f16TexAddr)
  5572. s.append(",float16_t");
  5573. else
  5574. s.append(",float");
  5575. }
  5576. // gradient arguments
  5577. if (grad) {
  5578. if (dimMap[sampler.dim] == 1) {
  5579. if (f16TexAddr)
  5580. s.append(",float16_t,float16_t");
  5581. else
  5582. s.append(",float,float");
  5583. } else {
  5584. if (f16TexAddr)
  5585. s.append(",f16vec");
  5586. else
  5587. s.append(",vec");
  5588. s.append(postfixes[dimMap[sampler.dim]]);
  5589. if (f16TexAddr)
  5590. s.append(",f16vec");
  5591. else
  5592. s.append(",vec");
  5593. s.append(postfixes[dimMap[sampler.dim]]);
  5594. }
  5595. }
  5596. // offset
  5597. if (offset) {
  5598. if (dimMap[sampler.dim] == 1)
  5599. s.append(",int");
  5600. else {
  5601. s.append(",ivec");
  5602. s.append(postfixes[dimMap[sampler.dim]]);
  5603. }
  5604. }
  5605. // lod clamp
  5606. if (lodClamp) {
  5607. if (f16TexAddr)
  5608. s.append(",float16_t");
  5609. else
  5610. s.append(",float");
  5611. }
  5612. // texel out (for sparse texture)
  5613. if (sparse) {
  5614. s.append(",out ");
  5615. if (sampler.shadow)
  5616. if (sampler.type == EbtFloat16)
  5617. s.append("float16_t");
  5618. else
  5619. s.append("float");
  5620. else {
  5621. s.append(prefixes[sampler.type]);
  5622. s.append("vec4");
  5623. }
  5624. }
  5625. // optional bias
  5626. if (bias) {
  5627. if (f16TexAddr)
  5628. s.append(",float16_t");
  5629. else
  5630. s.append(",float");
  5631. }
  5632. s.append(");\n");
  5633. // Add to the per-language set of built-ins
  5634. if (bias || lodClamp != 0) {
  5635. stageBuiltins[EShLangFragment].append(s);
  5636. stageBuiltins[EShLangCompute].append(s);
  5637. } else
  5638. commonBuiltins.append(s);
  5639. }
  5640. }
  5641. }
  5642. }
  5643. }
  5644. }
  5645. }
  5646. }
  5647. }
  5648. }
  5649. }
  5650. //
  5651. // Helper function for add2ndGenerationSamplingImaging(),
  5652. // when adding context-independent built-in functions.
  5653. //
  5654. // Add all the texture gather functions for the given type.
  5655. //
  5656. void TBuiltIns::addGatherFunctions(TSampler sampler, const TString& typeName, int version, EProfile profile)
  5657. {
  5658. #ifdef GLSLANG_WEB
  5659. profile = EEsProfile;
  5660. version = 310;
  5661. #elif defined(GLSLANG_ANGLE)
  5662. profile = ECoreProfile;
  5663. version = 450;
  5664. #endif
  5665. switch (sampler.dim) {
  5666. case Esd2D:
  5667. case EsdRect:
  5668. case EsdCube:
  5669. break;
  5670. default:
  5671. return;
  5672. }
  5673. if (sampler.isMultiSample())
  5674. return;
  5675. if (version < 140 && sampler.dim == EsdRect && sampler.type != EbtFloat)
  5676. return;
  5677. for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
  5678. if (f16TexAddr && sampler.type != EbtFloat16)
  5679. continue;
  5680. for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets
  5681. for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
  5682. if (comp > 0 && sampler.shadow)
  5683. continue;
  5684. if (offset > 0 && sampler.dim == EsdCube)
  5685. continue;
  5686. for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
  5687. if (sparse && (profile == EEsProfile || version < 450))
  5688. continue;
  5689. TString s;
  5690. // return type
  5691. if (sparse)
  5692. s.append("int ");
  5693. else {
  5694. s.append(prefixes[sampler.type]);
  5695. s.append("vec4 ");
  5696. }
  5697. // name
  5698. if (sparse)
  5699. s.append("sparseTextureGather");
  5700. else
  5701. s.append("textureGather");
  5702. switch (offset) {
  5703. case 1:
  5704. s.append("Offset");
  5705. break;
  5706. case 2:
  5707. s.append("Offsets");
  5708. break;
  5709. default:
  5710. break;
  5711. }
  5712. if (sparse)
  5713. s.append("ARB");
  5714. s.append("(");
  5715. // sampler type argument
  5716. s.append(typeName);
  5717. // P coordinate argument
  5718. if (f16TexAddr)
  5719. s.append(",f16vec");
  5720. else
  5721. s.append(",vec");
  5722. int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
  5723. s.append(postfixes[totalDims]);
  5724. // refZ argument
  5725. if (sampler.shadow)
  5726. s.append(",float");
  5727. // offset argument
  5728. if (offset > 0) {
  5729. s.append(",ivec2");
  5730. if (offset == 2)
  5731. s.append("[4]");
  5732. }
  5733. // texel out (for sparse texture)
  5734. if (sparse) {
  5735. s.append(",out ");
  5736. s.append(prefixes[sampler.type]);
  5737. s.append("vec4 ");
  5738. }
  5739. // comp argument
  5740. if (comp)
  5741. s.append(",int");
  5742. s.append(");\n");
  5743. commonBuiltins.append(s);
  5744. }
  5745. }
  5746. }
  5747. }
  5748. if (sampler.dim == EsdRect || sampler.shadow)
  5749. return;
  5750. if (profile == EEsProfile || version < 450)
  5751. return;
  5752. for (int bias = 0; bias < 2; ++bias) { // loop over presence of bias argument
  5753. for (int lod = 0; lod < 2; ++lod) { // loop over presence of lod argument
  5754. if ((lod && bias) || (lod == 0 && bias == 0))
  5755. continue;
  5756. for (int f16TexAddr = 0; f16TexAddr <= 1; ++f16TexAddr) { // loop over 16-bit floating-point texel addressing
  5757. if (f16TexAddr && sampler.type != EbtFloat16)
  5758. continue;
  5759. for (int offset = 0; offset < 3; ++offset) { // loop over three forms of offset in the call name: none, Offset, and Offsets
  5760. for (int comp = 0; comp < 2; ++comp) { // loop over presence of comp argument
  5761. if (comp == 0 && bias)
  5762. continue;
  5763. if (offset > 0 && sampler.dim == EsdCube)
  5764. continue;
  5765. for (int sparse = 0; sparse <= 1; ++sparse) { // loop over "bool" sparse or not
  5766. if (sparse && (profile == EEsProfile || version < 450))
  5767. continue;
  5768. TString s;
  5769. // return type
  5770. if (sparse)
  5771. s.append("int ");
  5772. else {
  5773. s.append(prefixes[sampler.type]);
  5774. s.append("vec4 ");
  5775. }
  5776. // name
  5777. if (sparse)
  5778. s.append("sparseTextureGather");
  5779. else
  5780. s.append("textureGather");
  5781. if (lod)
  5782. s.append("Lod");
  5783. switch (offset) {
  5784. case 1:
  5785. s.append("Offset");
  5786. break;
  5787. case 2:
  5788. s.append("Offsets");
  5789. break;
  5790. default:
  5791. break;
  5792. }
  5793. if (lod)
  5794. s.append("AMD");
  5795. else if (sparse)
  5796. s.append("ARB");
  5797. s.append("(");
  5798. // sampler type argument
  5799. s.append(typeName);
  5800. // P coordinate argument
  5801. if (f16TexAddr)
  5802. s.append(",f16vec");
  5803. else
  5804. s.append(",vec");
  5805. int totalDims = dimMap[sampler.dim] + (sampler.arrayed ? 1 : 0);
  5806. s.append(postfixes[totalDims]);
  5807. // lod argument
  5808. if (lod) {
  5809. if (f16TexAddr)
  5810. s.append(",float16_t");
  5811. else
  5812. s.append(",float");
  5813. }
  5814. // offset argument
  5815. if (offset > 0) {
  5816. s.append(",ivec2");
  5817. if (offset == 2)
  5818. s.append("[4]");
  5819. }
  5820. // texel out (for sparse texture)
  5821. if (sparse) {
  5822. s.append(",out ");
  5823. s.append(prefixes[sampler.type]);
  5824. s.append("vec4 ");
  5825. }
  5826. // comp argument
  5827. if (comp)
  5828. s.append(",int");
  5829. // bias argument
  5830. if (bias) {
  5831. if (f16TexAddr)
  5832. s.append(",float16_t");
  5833. else
  5834. s.append(",float");
  5835. }
  5836. s.append(");\n");
  5837. if (bias)
  5838. stageBuiltins[EShLangFragment].append(s);
  5839. else
  5840. commonBuiltins.append(s);
  5841. }
  5842. }
  5843. }
  5844. }
  5845. }
  5846. }
  5847. }
  5848. //
  5849. // Add context-dependent built-in functions and variables that are present
  5850. // for the given version and profile. All the results are put into just the
  5851. // commonBuiltins, because it is called for just a specific stage. So,
  5852. // add stage-specific entries to the commonBuiltins, and only if that stage
  5853. // was requested.
  5854. //
  5855. void TBuiltIns::initialize(const TBuiltInResource &resources, int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language)
  5856. {
  5857. #ifdef GLSLANG_WEB
  5858. version = 310;
  5859. profile = EEsProfile;
  5860. #elif defined(GLSLANG_ANGLE)
  5861. version = 450;
  5862. profile = ECoreProfile;
  5863. #endif
  5864. //
  5865. // Initialize the context-dependent (resource-dependent) built-in strings for parsing.
  5866. //
  5867. //============================================================================
  5868. //
  5869. // Standard Uniforms
  5870. //
  5871. //============================================================================
  5872. TString& s = commonBuiltins;
  5873. const int maxSize = 200;
  5874. char builtInConstant[maxSize];
  5875. //
  5876. // Build string of implementation dependent constants.
  5877. //
  5878. if (profile == EEsProfile) {
  5879. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
  5880. s.append(builtInConstant);
  5881. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxVertexUniformVectors = %d;", resources.maxVertexUniformVectors);
  5882. s.append(builtInConstant);
  5883. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
  5884. s.append(builtInConstant);
  5885. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
  5886. s.append(builtInConstant);
  5887. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
  5888. s.append(builtInConstant);
  5889. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxFragmentUniformVectors = %d;", resources.maxFragmentUniformVectors);
  5890. s.append(builtInConstant);
  5891. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
  5892. s.append(builtInConstant);
  5893. if (version == 100) {
  5894. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxVaryingVectors = %d;", resources.maxVaryingVectors);
  5895. s.append(builtInConstant);
  5896. } else {
  5897. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxVertexOutputVectors = %d;", resources.maxVertexOutputVectors);
  5898. s.append(builtInConstant);
  5899. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxFragmentInputVectors = %d;", resources.maxFragmentInputVectors);
  5900. s.append(builtInConstant);
  5901. snprintf(builtInConstant, maxSize, "const mediump int gl_MinProgramTexelOffset = %d;", resources.minProgramTexelOffset);
  5902. s.append(builtInConstant);
  5903. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxProgramTexelOffset = %d;", resources.maxProgramTexelOffset);
  5904. s.append(builtInConstant);
  5905. }
  5906. #ifndef GLSLANG_WEB
  5907. if (version >= 310) {
  5908. // geometry
  5909. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryInputComponents = %d;", resources.maxGeometryInputComponents);
  5910. s.append(builtInConstant);
  5911. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputComponents = %d;", resources.maxGeometryOutputComponents);
  5912. s.append(builtInConstant);
  5913. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryImageUniforms = %d;", resources.maxGeometryImageUniforms);
  5914. s.append(builtInConstant);
  5915. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTextureImageUnits = %d;", resources.maxGeometryTextureImageUnits);
  5916. s.append(builtInConstant);
  5917. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputVertices = %d;", resources.maxGeometryOutputVertices);
  5918. s.append(builtInConstant);
  5919. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTotalOutputComponents = %d;", resources.maxGeometryTotalOutputComponents);
  5920. s.append(builtInConstant);
  5921. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryUniformComponents = %d;", resources.maxGeometryUniformComponents);
  5922. s.append(builtInConstant);
  5923. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounters = %d;", resources.maxGeometryAtomicCounters);
  5924. s.append(builtInConstant);
  5925. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounterBuffers = %d;", resources.maxGeometryAtomicCounterBuffers);
  5926. s.append(builtInConstant);
  5927. // tessellation
  5928. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlInputComponents = %d;", resources.maxTessControlInputComponents);
  5929. s.append(builtInConstant);
  5930. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlOutputComponents = %d;", resources.maxTessControlOutputComponents);
  5931. s.append(builtInConstant);
  5932. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTextureImageUnits = %d;", resources.maxTessControlTextureImageUnits);
  5933. s.append(builtInConstant);
  5934. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlUniformComponents = %d;", resources.maxTessControlUniformComponents);
  5935. s.append(builtInConstant);
  5936. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTotalOutputComponents = %d;", resources.maxTessControlTotalOutputComponents);
  5937. s.append(builtInConstant);
  5938. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationInputComponents = %d;", resources.maxTessEvaluationInputComponents);
  5939. s.append(builtInConstant);
  5940. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationOutputComponents = %d;", resources.maxTessEvaluationOutputComponents);
  5941. s.append(builtInConstant);
  5942. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationTextureImageUnits = %d;", resources.maxTessEvaluationTextureImageUnits);
  5943. s.append(builtInConstant);
  5944. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationUniformComponents = %d;", resources.maxTessEvaluationUniformComponents);
  5945. s.append(builtInConstant);
  5946. snprintf(builtInConstant, maxSize, "const int gl_MaxTessPatchComponents = %d;", resources.maxTessPatchComponents);
  5947. s.append(builtInConstant);
  5948. snprintf(builtInConstant, maxSize, "const int gl_MaxPatchVertices = %d;", resources.maxPatchVertices);
  5949. s.append(builtInConstant);
  5950. snprintf(builtInConstant, maxSize, "const int gl_MaxTessGenLevel = %d;", resources.maxTessGenLevel);
  5951. s.append(builtInConstant);
  5952. // this is here instead of with the others in initialize(version, profile) due to the dependence on gl_MaxPatchVertices
  5953. if (language == EShLangTessControl || language == EShLangTessEvaluation) {
  5954. s.append(
  5955. "in gl_PerVertex {"
  5956. "highp vec4 gl_Position;"
  5957. "highp float gl_PointSize;"
  5958. "highp vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  5959. "highp vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  5960. "} gl_in[gl_MaxPatchVertices];"
  5961. "\n");
  5962. }
  5963. }
  5964. if (version >= 320) {
  5965. // tessellation
  5966. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlImageUniforms = %d;", resources.maxTessControlImageUniforms);
  5967. s.append(builtInConstant);
  5968. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationImageUniforms = %d;", resources.maxTessEvaluationImageUniforms);
  5969. s.append(builtInConstant);
  5970. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounters = %d;", resources.maxTessControlAtomicCounters);
  5971. s.append(builtInConstant);
  5972. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounters = %d;", resources.maxTessEvaluationAtomicCounters);
  5973. s.append(builtInConstant);
  5974. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounterBuffers = %d;", resources.maxTessControlAtomicCounterBuffers);
  5975. s.append(builtInConstant);
  5976. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounterBuffers = %d;", resources.maxTessEvaluationAtomicCounterBuffers);
  5977. s.append(builtInConstant);
  5978. }
  5979. if (version >= 100) {
  5980. // GL_EXT_blend_func_extended
  5981. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxDualSourceDrawBuffersEXT = %d;", resources.maxDualSourceDrawBuffersEXT);
  5982. s.append(builtInConstant);
  5983. // this is here instead of with the others in initialize(version, profile) due to the dependence on gl_MaxDualSourceDrawBuffersEXT
  5984. if (language == EShLangFragment) {
  5985. s.append(
  5986. "mediump vec4 gl_SecondaryFragColorEXT;"
  5987. "mediump vec4 gl_SecondaryFragDataEXT[gl_MaxDualSourceDrawBuffersEXT];"
  5988. "\n");
  5989. }
  5990. }
  5991. } else {
  5992. // non-ES profile
  5993. if (version > 400) {
  5994. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexUniformVectors = %d;", resources.maxVertexUniformVectors);
  5995. s.append(builtInConstant);
  5996. snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentUniformVectors = %d;", resources.maxFragmentUniformVectors);
  5997. s.append(builtInConstant);
  5998. }
  5999. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAttribs = %d;", resources.maxVertexAttribs);
  6000. s.append(builtInConstant);
  6001. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexTextureImageUnits = %d;", resources.maxVertexTextureImageUnits);
  6002. s.append(builtInConstant);
  6003. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedTextureImageUnits = %d;", resources.maxCombinedTextureImageUnits);
  6004. s.append(builtInConstant);
  6005. snprintf(builtInConstant, maxSize, "const int gl_MaxTextureImageUnits = %d;", resources.maxTextureImageUnits);
  6006. s.append(builtInConstant);
  6007. snprintf(builtInConstant, maxSize, "const int gl_MaxDrawBuffers = %d;", resources.maxDrawBuffers);
  6008. s.append(builtInConstant);
  6009. snprintf(builtInConstant, maxSize, "const int gl_MaxLights = %d;", resources.maxLights);
  6010. s.append(builtInConstant);
  6011. snprintf(builtInConstant, maxSize, "const int gl_MaxClipPlanes = %d;", resources.maxClipPlanes);
  6012. s.append(builtInConstant);
  6013. snprintf(builtInConstant, maxSize, "const int gl_MaxTextureUnits = %d;", resources.maxTextureUnits);
  6014. s.append(builtInConstant);
  6015. snprintf(builtInConstant, maxSize, "const int gl_MaxTextureCoords = %d;", resources.maxTextureCoords);
  6016. s.append(builtInConstant);
  6017. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexUniformComponents = %d;", resources.maxVertexUniformComponents);
  6018. s.append(builtInConstant);
  6019. if (version < 150 || ARBCompatibility) {
  6020. snprintf(builtInConstant, maxSize, "const int gl_MaxVaryingFloats = %d;", resources.maxVaryingFloats);
  6021. s.append(builtInConstant);
  6022. }
  6023. snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentUniformComponents = %d;", resources.maxFragmentUniformComponents);
  6024. s.append(builtInConstant);
  6025. if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion)) {
  6026. //
  6027. // OpenGL'uniform' state. Page numbers are in reference to version
  6028. // 1.4 of the OpenGL specification.
  6029. //
  6030. //
  6031. // Matrix state. p. 31, 32, 37, 39, 40.
  6032. //
  6033. s.append("uniform mat4 gl_TextureMatrix[gl_MaxTextureCoords];"
  6034. //
  6035. // Derived matrix state that provides inverse and transposed versions
  6036. // of the matrices above.
  6037. //
  6038. "uniform mat4 gl_TextureMatrixInverse[gl_MaxTextureCoords];"
  6039. "uniform mat4 gl_TextureMatrixTranspose[gl_MaxTextureCoords];"
  6040. "uniform mat4 gl_TextureMatrixInverseTranspose[gl_MaxTextureCoords];"
  6041. //
  6042. // Clip planes p. 42.
  6043. //
  6044. "uniform vec4 gl_ClipPlane[gl_MaxClipPlanes];"
  6045. //
  6046. // Light State p 50, 53, 55.
  6047. //
  6048. "uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];"
  6049. //
  6050. // Derived state from products of light.
  6051. //
  6052. "uniform gl_LightProducts gl_FrontLightProduct[gl_MaxLights];"
  6053. "uniform gl_LightProducts gl_BackLightProduct[gl_MaxLights];"
  6054. //
  6055. // Texture Environment and Generation, p. 152, p. 40-42.
  6056. //
  6057. "uniform vec4 gl_TextureEnvColor[gl_MaxTextureImageUnits];"
  6058. "uniform vec4 gl_EyePlaneS[gl_MaxTextureCoords];"
  6059. "uniform vec4 gl_EyePlaneT[gl_MaxTextureCoords];"
  6060. "uniform vec4 gl_EyePlaneR[gl_MaxTextureCoords];"
  6061. "uniform vec4 gl_EyePlaneQ[gl_MaxTextureCoords];"
  6062. "uniform vec4 gl_ObjectPlaneS[gl_MaxTextureCoords];"
  6063. "uniform vec4 gl_ObjectPlaneT[gl_MaxTextureCoords];"
  6064. "uniform vec4 gl_ObjectPlaneR[gl_MaxTextureCoords];"
  6065. "uniform vec4 gl_ObjectPlaneQ[gl_MaxTextureCoords];");
  6066. }
  6067. if (version >= 130) {
  6068. snprintf(builtInConstant, maxSize, "const int gl_MaxClipDistances = %d;", resources.maxClipDistances);
  6069. s.append(builtInConstant);
  6070. snprintf(builtInConstant, maxSize, "const int gl_MaxVaryingComponents = %d;", resources.maxVaryingComponents);
  6071. s.append(builtInConstant);
  6072. // GL_ARB_shading_language_420pack
  6073. snprintf(builtInConstant, maxSize, "const mediump int gl_MinProgramTexelOffset = %d;", resources.minProgramTexelOffset);
  6074. s.append(builtInConstant);
  6075. snprintf(builtInConstant, maxSize, "const mediump int gl_MaxProgramTexelOffset = %d;", resources.maxProgramTexelOffset);
  6076. s.append(builtInConstant);
  6077. }
  6078. // geometry
  6079. if (version >= 150) {
  6080. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryInputComponents = %d;", resources.maxGeometryInputComponents);
  6081. s.append(builtInConstant);
  6082. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputComponents = %d;", resources.maxGeometryOutputComponents);
  6083. s.append(builtInConstant);
  6084. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTextureImageUnits = %d;", resources.maxGeometryTextureImageUnits);
  6085. s.append(builtInConstant);
  6086. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryOutputVertices = %d;", resources.maxGeometryOutputVertices);
  6087. s.append(builtInConstant);
  6088. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryTotalOutputComponents = %d;", resources.maxGeometryTotalOutputComponents);
  6089. s.append(builtInConstant);
  6090. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryUniformComponents = %d;", resources.maxGeometryUniformComponents);
  6091. s.append(builtInConstant);
  6092. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryVaryingComponents = %d;", resources.maxGeometryVaryingComponents);
  6093. s.append(builtInConstant);
  6094. }
  6095. if (version >= 150) {
  6096. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexOutputComponents = %d;", resources.maxVertexOutputComponents);
  6097. s.append(builtInConstant);
  6098. snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentInputComponents = %d;", resources.maxFragmentInputComponents);
  6099. s.append(builtInConstant);
  6100. }
  6101. // tessellation
  6102. if (version >= 150) {
  6103. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlInputComponents = %d;", resources.maxTessControlInputComponents);
  6104. s.append(builtInConstant);
  6105. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlOutputComponents = %d;", resources.maxTessControlOutputComponents);
  6106. s.append(builtInConstant);
  6107. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTextureImageUnits = %d;", resources.maxTessControlTextureImageUnits);
  6108. s.append(builtInConstant);
  6109. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlUniformComponents = %d;", resources.maxTessControlUniformComponents);
  6110. s.append(builtInConstant);
  6111. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlTotalOutputComponents = %d;", resources.maxTessControlTotalOutputComponents);
  6112. s.append(builtInConstant);
  6113. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationInputComponents = %d;", resources.maxTessEvaluationInputComponents);
  6114. s.append(builtInConstant);
  6115. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationOutputComponents = %d;", resources.maxTessEvaluationOutputComponents);
  6116. s.append(builtInConstant);
  6117. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationTextureImageUnits = %d;", resources.maxTessEvaluationTextureImageUnits);
  6118. s.append(builtInConstant);
  6119. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationUniformComponents = %d;", resources.maxTessEvaluationUniformComponents);
  6120. s.append(builtInConstant);
  6121. snprintf(builtInConstant, maxSize, "const int gl_MaxTessPatchComponents = %d;", resources.maxTessPatchComponents);
  6122. s.append(builtInConstant);
  6123. snprintf(builtInConstant, maxSize, "const int gl_MaxTessGenLevel = %d;", resources.maxTessGenLevel);
  6124. s.append(builtInConstant);
  6125. snprintf(builtInConstant, maxSize, "const int gl_MaxPatchVertices = %d;", resources.maxPatchVertices);
  6126. s.append(builtInConstant);
  6127. // this is here instead of with the others in initialize(version, profile) due to the dependence on gl_MaxPatchVertices
  6128. if (language == EShLangTessControl || language == EShLangTessEvaluation) {
  6129. s.append(
  6130. "in gl_PerVertex {"
  6131. "vec4 gl_Position;"
  6132. "float gl_PointSize;"
  6133. "float gl_ClipDistance[];"
  6134. );
  6135. if (profile == ECompatibilityProfile)
  6136. s.append(
  6137. "vec4 gl_ClipVertex;"
  6138. "vec4 gl_FrontColor;"
  6139. "vec4 gl_BackColor;"
  6140. "vec4 gl_FrontSecondaryColor;"
  6141. "vec4 gl_BackSecondaryColor;"
  6142. "vec4 gl_TexCoord[];"
  6143. "float gl_FogFragCoord;"
  6144. );
  6145. if (profile != EEsProfile && version >= 450)
  6146. s.append(
  6147. "float gl_CullDistance[];"
  6148. "vec4 gl_SecondaryPositionNV;" // GL_NV_stereo_view_rendering
  6149. "vec4 gl_PositionPerViewNV[];" // GL_NVX_multiview_per_view_attributes
  6150. );
  6151. s.append(
  6152. "} gl_in[gl_MaxPatchVertices];"
  6153. "\n");
  6154. }
  6155. }
  6156. if (version >= 150) {
  6157. snprintf(builtInConstant, maxSize, "const int gl_MaxViewports = %d;", resources.maxViewports);
  6158. s.append(builtInConstant);
  6159. }
  6160. // images
  6161. if (version >= 130) {
  6162. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedImageUnitsAndFragmentOutputs = %d;", resources.maxCombinedImageUnitsAndFragmentOutputs);
  6163. s.append(builtInConstant);
  6164. snprintf(builtInConstant, maxSize, "const int gl_MaxImageSamples = %d;", resources.maxImageSamples);
  6165. s.append(builtInConstant);
  6166. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlImageUniforms = %d;", resources.maxTessControlImageUniforms);
  6167. s.append(builtInConstant);
  6168. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationImageUniforms = %d;", resources.maxTessEvaluationImageUniforms);
  6169. s.append(builtInConstant);
  6170. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryImageUniforms = %d;", resources.maxGeometryImageUniforms);
  6171. s.append(builtInConstant);
  6172. }
  6173. // enhanced layouts
  6174. if (version >= 430) {
  6175. snprintf(builtInConstant, maxSize, "const int gl_MaxTransformFeedbackBuffers = %d;", resources.maxTransformFeedbackBuffers);
  6176. s.append(builtInConstant);
  6177. snprintf(builtInConstant, maxSize, "const int gl_MaxTransformFeedbackInterleavedComponents = %d;", resources.maxTransformFeedbackInterleavedComponents);
  6178. s.append(builtInConstant);
  6179. }
  6180. #endif
  6181. }
  6182. // compute
  6183. if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) {
  6184. snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupCount = ivec3(%d,%d,%d);", resources.maxComputeWorkGroupCountX,
  6185. resources.maxComputeWorkGroupCountY,
  6186. resources.maxComputeWorkGroupCountZ);
  6187. s.append(builtInConstant);
  6188. snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxComputeWorkGroupSize = ivec3(%d,%d,%d);", resources.maxComputeWorkGroupSizeX,
  6189. resources.maxComputeWorkGroupSizeY,
  6190. resources.maxComputeWorkGroupSizeZ);
  6191. s.append(builtInConstant);
  6192. snprintf(builtInConstant, maxSize, "const int gl_MaxComputeUniformComponents = %d;", resources.maxComputeUniformComponents);
  6193. s.append(builtInConstant);
  6194. snprintf(builtInConstant, maxSize, "const int gl_MaxComputeTextureImageUnits = %d;", resources.maxComputeTextureImageUnits);
  6195. s.append(builtInConstant);
  6196. s.append("\n");
  6197. }
  6198. #ifndef GLSLANG_WEB
  6199. // images (some in compute below)
  6200. if ((profile == EEsProfile && version >= 310) ||
  6201. (profile != EEsProfile && version >= 130)) {
  6202. snprintf(builtInConstant, maxSize, "const int gl_MaxImageUnits = %d;", resources.maxImageUnits);
  6203. s.append(builtInConstant);
  6204. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedShaderOutputResources = %d;", resources.maxCombinedShaderOutputResources);
  6205. s.append(builtInConstant);
  6206. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexImageUniforms = %d;", resources.maxVertexImageUniforms);
  6207. s.append(builtInConstant);
  6208. snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentImageUniforms = %d;", resources.maxFragmentImageUniforms);
  6209. s.append(builtInConstant);
  6210. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedImageUniforms = %d;", resources.maxCombinedImageUniforms);
  6211. s.append(builtInConstant);
  6212. }
  6213. // compute
  6214. if ((profile == EEsProfile && version >= 310) || (profile != EEsProfile && version >= 420)) {
  6215. snprintf(builtInConstant, maxSize, "const int gl_MaxComputeImageUniforms = %d;", resources.maxComputeImageUniforms);
  6216. s.append(builtInConstant);
  6217. snprintf(builtInConstant, maxSize, "const int gl_MaxComputeAtomicCounters = %d;", resources.maxComputeAtomicCounters);
  6218. s.append(builtInConstant);
  6219. snprintf(builtInConstant, maxSize, "const int gl_MaxComputeAtomicCounterBuffers = %d;", resources.maxComputeAtomicCounterBuffers);
  6220. s.append(builtInConstant);
  6221. s.append("\n");
  6222. }
  6223. #ifndef GLSLANG_ANGLE
  6224. // atomic counters (some in compute below)
  6225. if ((profile == EEsProfile && version >= 310) ||
  6226. (profile != EEsProfile && version >= 420)) {
  6227. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAtomicCounters = %d;", resources. maxVertexAtomicCounters);
  6228. s.append(builtInConstant);
  6229. snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentAtomicCounters = %d;", resources. maxFragmentAtomicCounters);
  6230. s.append(builtInConstant);
  6231. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedAtomicCounters = %d;", resources. maxCombinedAtomicCounters);
  6232. s.append(builtInConstant);
  6233. snprintf(builtInConstant, maxSize, "const int gl_MaxAtomicCounterBindings = %d;", resources. maxAtomicCounterBindings);
  6234. s.append(builtInConstant);
  6235. snprintf(builtInConstant, maxSize, "const int gl_MaxVertexAtomicCounterBuffers = %d;", resources. maxVertexAtomicCounterBuffers);
  6236. s.append(builtInConstant);
  6237. snprintf(builtInConstant, maxSize, "const int gl_MaxFragmentAtomicCounterBuffers = %d;", resources. maxFragmentAtomicCounterBuffers);
  6238. s.append(builtInConstant);
  6239. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedAtomicCounterBuffers = %d;", resources. maxCombinedAtomicCounterBuffers);
  6240. s.append(builtInConstant);
  6241. snprintf(builtInConstant, maxSize, "const int gl_MaxAtomicCounterBufferSize = %d;", resources. maxAtomicCounterBufferSize);
  6242. s.append(builtInConstant);
  6243. }
  6244. if (profile != EEsProfile && version >= 420) {
  6245. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounters = %d;", resources. maxTessControlAtomicCounters);
  6246. s.append(builtInConstant);
  6247. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounters = %d;", resources. maxTessEvaluationAtomicCounters);
  6248. s.append(builtInConstant);
  6249. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounters = %d;", resources. maxGeometryAtomicCounters);
  6250. s.append(builtInConstant);
  6251. snprintf(builtInConstant, maxSize, "const int gl_MaxTessControlAtomicCounterBuffers = %d;", resources. maxTessControlAtomicCounterBuffers);
  6252. s.append(builtInConstant);
  6253. snprintf(builtInConstant, maxSize, "const int gl_MaxTessEvaluationAtomicCounterBuffers = %d;", resources. maxTessEvaluationAtomicCounterBuffers);
  6254. s.append(builtInConstant);
  6255. snprintf(builtInConstant, maxSize, "const int gl_MaxGeometryAtomicCounterBuffers = %d;", resources. maxGeometryAtomicCounterBuffers);
  6256. s.append(builtInConstant);
  6257. s.append("\n");
  6258. }
  6259. #endif // !GLSLANG_ANGLE
  6260. // GL_ARB_cull_distance
  6261. if (profile != EEsProfile && version >= 450) {
  6262. snprintf(builtInConstant, maxSize, "const int gl_MaxCullDistances = %d;", resources.maxCullDistances);
  6263. s.append(builtInConstant);
  6264. snprintf(builtInConstant, maxSize, "const int gl_MaxCombinedClipAndCullDistances = %d;", resources.maxCombinedClipAndCullDistances);
  6265. s.append(builtInConstant);
  6266. }
  6267. // GL_ARB_ES3_1_compatibility
  6268. if ((profile != EEsProfile && version >= 450) ||
  6269. (profile == EEsProfile && version >= 310)) {
  6270. snprintf(builtInConstant, maxSize, "const int gl_MaxSamples = %d;", resources.maxSamples);
  6271. s.append(builtInConstant);
  6272. }
  6273. #ifndef GLSLANG_ANGLE
  6274. // SPV_NV_mesh_shader
  6275. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  6276. snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputVerticesNV = %d;", resources.maxMeshOutputVerticesNV);
  6277. s.append(builtInConstant);
  6278. snprintf(builtInConstant, maxSize, "const int gl_MaxMeshOutputPrimitivesNV = %d;", resources.maxMeshOutputPrimitivesNV);
  6279. s.append(builtInConstant);
  6280. snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxMeshWorkGroupSizeNV = ivec3(%d,%d,%d);", resources.maxMeshWorkGroupSizeX_NV,
  6281. resources.maxMeshWorkGroupSizeY_NV,
  6282. resources.maxMeshWorkGroupSizeZ_NV);
  6283. s.append(builtInConstant);
  6284. snprintf(builtInConstant, maxSize, "const ivec3 gl_MaxTaskWorkGroupSizeNV = ivec3(%d,%d,%d);", resources.maxTaskWorkGroupSizeX_NV,
  6285. resources.maxTaskWorkGroupSizeY_NV,
  6286. resources.maxTaskWorkGroupSizeZ_NV);
  6287. s.append(builtInConstant);
  6288. snprintf(builtInConstant, maxSize, "const int gl_MaxMeshViewCountNV = %d;", resources.maxMeshViewCountNV);
  6289. s.append(builtInConstant);
  6290. s.append("\n");
  6291. }
  6292. #endif
  6293. #endif
  6294. s.append("\n");
  6295. }
  6296. //
  6297. // To support special built-ins that have a special qualifier that cannot be declared textually
  6298. // in a shader, like gl_Position.
  6299. //
  6300. // This lets the type of the built-in be declared textually, and then have just its qualifier be
  6301. // updated afterward.
  6302. //
  6303. // Safe to call even if name is not present.
  6304. //
  6305. // Only use this for built-in variables that have a special qualifier in TStorageQualifier.
  6306. // New built-in variables should use a generic (textually declarable) qualifier in
  6307. // TStoraregQualifier and only call BuiltInVariable().
  6308. //
  6309. static void SpecialQualifier(const char* name, TStorageQualifier qualifier, TBuiltInVariable builtIn, TSymbolTable& symbolTable)
  6310. {
  6311. TSymbol* symbol = symbolTable.find(name);
  6312. if (symbol == nullptr)
  6313. return;
  6314. TQualifier& symQualifier = symbol->getWritableType().getQualifier();
  6315. symQualifier.storage = qualifier;
  6316. symQualifier.builtIn = builtIn;
  6317. }
  6318. //
  6319. // To tag built-in variables with their TBuiltInVariable enum. Use this when the
  6320. // normal declaration text already gets the qualifier right, and all that's needed
  6321. // is setting the builtIn field. This should be the normal way for all new
  6322. // built-in variables.
  6323. //
  6324. // If SpecialQualifier() was called, this does not need to be called.
  6325. //
  6326. // Safe to call even if name is not present.
  6327. //
  6328. static void BuiltInVariable(const char* name, TBuiltInVariable builtIn, TSymbolTable& symbolTable)
  6329. {
  6330. TSymbol* symbol = symbolTable.find(name);
  6331. if (symbol == nullptr)
  6332. return;
  6333. TQualifier& symQualifier = symbol->getWritableType().getQualifier();
  6334. symQualifier.builtIn = builtIn;
  6335. }
  6336. //
  6337. // For built-in variables inside a named block.
  6338. // SpecialQualifier() won't ever go inside a block; their member's qualifier come
  6339. // from the qualification of the block.
  6340. //
  6341. // See comments above for other detail.
  6342. //
  6343. static void BuiltInVariable(const char* blockName, const char* name, TBuiltInVariable builtIn, TSymbolTable& symbolTable)
  6344. {
  6345. TSymbol* symbol = symbolTable.find(blockName);
  6346. if (symbol == nullptr)
  6347. return;
  6348. TTypeList& structure = *symbol->getWritableType().getWritableStruct();
  6349. for (int i = 0; i < (int)structure.size(); ++i) {
  6350. if (structure[i].type->getFieldName().compare(name) == 0) {
  6351. structure[i].type->getQualifier().builtIn = builtIn;
  6352. return;
  6353. }
  6354. }
  6355. }
  6356. //
  6357. // Finish adding/processing context-independent built-in symbols.
  6358. // 1) Programmatically add symbols that could not be added by simple text strings above.
  6359. // 2) Map built-in functions to operators, for those that will turn into an operation node
  6360. // instead of remaining a function call.
  6361. // 3) Tag extension-related symbols added to their base version with their extensions, so
  6362. // that if an early version has the extension turned off, there is an error reported on use.
  6363. //
  6364. void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable)
  6365. {
  6366. #ifdef GLSLANG_WEB
  6367. version = 310;
  6368. profile = EEsProfile;
  6369. #elif defined(GLSLANG_ANGLE)
  6370. version = 450;
  6371. profile = ECoreProfile;
  6372. #endif
  6373. //
  6374. // Tag built-in variables and functions with additional qualifier and extension information
  6375. // that cannot be declared with the text strings.
  6376. //
  6377. // N.B.: a symbol should only be tagged once, and this function is called multiple times, once
  6378. // per stage that's used for this profile. So
  6379. // - generally, stick common ones in the fragment stage to ensure they are tagged exactly once
  6380. // - for ES, which has different precisions for different stages, the coarsest-grained tagging
  6381. // for a built-in used in many stages needs to be once for the fragment stage and once for
  6382. // the vertex stage
  6383. switch(language) {
  6384. case EShLangVertex:
  6385. if (spvVersion.vulkan > 0) {
  6386. BuiltInVariable("gl_VertexIndex", EbvVertexIndex, symbolTable);
  6387. BuiltInVariable("gl_InstanceIndex", EbvInstanceIndex, symbolTable);
  6388. }
  6389. #ifndef GLSLANG_WEB
  6390. if (spvVersion.vulkan == 0) {
  6391. SpecialQualifier("gl_VertexID", EvqVertexId, EbvVertexId, symbolTable);
  6392. SpecialQualifier("gl_InstanceID", EvqInstanceId, EbvInstanceId, symbolTable);
  6393. }
  6394. if (profile != EEsProfile) {
  6395. if (version >= 440) {
  6396. symbolTable.setVariableExtensions("gl_BaseVertexARB", 1, &E_GL_ARB_shader_draw_parameters);
  6397. symbolTable.setVariableExtensions("gl_BaseInstanceARB", 1, &E_GL_ARB_shader_draw_parameters);
  6398. symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters);
  6399. BuiltInVariable("gl_BaseVertexARB", EbvBaseVertex, symbolTable);
  6400. BuiltInVariable("gl_BaseInstanceARB", EbvBaseInstance, symbolTable);
  6401. BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable);
  6402. }
  6403. if (version >= 460) {
  6404. BuiltInVariable("gl_BaseVertex", EbvBaseVertex, symbolTable);
  6405. BuiltInVariable("gl_BaseInstance", EbvBaseInstance, symbolTable);
  6406. BuiltInVariable("gl_DrawID", EbvDrawId, symbolTable);
  6407. }
  6408. symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
  6409. symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
  6410. symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
  6411. symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
  6412. symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
  6413. symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
  6414. symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
  6415. symbolTable.setFunctionExtensions("ballotARB", 1, &E_GL_ARB_shader_ballot);
  6416. symbolTable.setFunctionExtensions("readInvocationARB", 1, &E_GL_ARB_shader_ballot);
  6417. symbolTable.setFunctionExtensions("readFirstInvocationARB", 1, &E_GL_ARB_shader_ballot);
  6418. if (version >= 430) {
  6419. symbolTable.setFunctionExtensions("anyInvocationARB", 1, &E_GL_ARB_shader_group_vote);
  6420. symbolTable.setFunctionExtensions("allInvocationsARB", 1, &E_GL_ARB_shader_group_vote);
  6421. symbolTable.setFunctionExtensions("allInvocationsEqualARB", 1, &E_GL_ARB_shader_group_vote);
  6422. }
  6423. }
  6424. if (profile != EEsProfile) {
  6425. symbolTable.setFunctionExtensions("minInvocationsAMD", 1, &E_GL_AMD_shader_ballot);
  6426. symbolTable.setFunctionExtensions("maxInvocationsAMD", 1, &E_GL_AMD_shader_ballot);
  6427. symbolTable.setFunctionExtensions("addInvocationsAMD", 1, &E_GL_AMD_shader_ballot);
  6428. symbolTable.setFunctionExtensions("minInvocationsNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6429. symbolTable.setFunctionExtensions("maxInvocationsNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6430. symbolTable.setFunctionExtensions("addInvocationsNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6431. symbolTable.setFunctionExtensions("swizzleInvocationsAMD", 1, &E_GL_AMD_shader_ballot);
  6432. symbolTable.setFunctionExtensions("swizzleInvocationsWithPatternAMD", 1, &E_GL_AMD_shader_ballot);
  6433. symbolTable.setFunctionExtensions("writeInvocationAMD", 1, &E_GL_AMD_shader_ballot);
  6434. symbolTable.setFunctionExtensions("mbcntAMD", 1, &E_GL_AMD_shader_ballot);
  6435. symbolTable.setFunctionExtensions("minInvocationsInclusiveScanAMD", 1, &E_GL_AMD_shader_ballot);
  6436. symbolTable.setFunctionExtensions("maxInvocationsInclusiveScanAMD", 1, &E_GL_AMD_shader_ballot);
  6437. symbolTable.setFunctionExtensions("addInvocationsInclusiveScanAMD", 1, &E_GL_AMD_shader_ballot);
  6438. symbolTable.setFunctionExtensions("minInvocationsInclusiveScanNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6439. symbolTable.setFunctionExtensions("maxInvocationsInclusiveScanNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6440. symbolTable.setFunctionExtensions("addInvocationsInclusiveScanNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6441. symbolTable.setFunctionExtensions("minInvocationsExclusiveScanAMD", 1, &E_GL_AMD_shader_ballot);
  6442. symbolTable.setFunctionExtensions("maxInvocationsExclusiveScanAMD", 1, &E_GL_AMD_shader_ballot);
  6443. symbolTable.setFunctionExtensions("addInvocationsExclusiveScanAMD", 1, &E_GL_AMD_shader_ballot);
  6444. symbolTable.setFunctionExtensions("minInvocationsExclusiveScanNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6445. symbolTable.setFunctionExtensions("maxInvocationsExclusiveScanNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6446. symbolTable.setFunctionExtensions("addInvocationsExclusiveScanNonUniformAMD", 1, &E_GL_AMD_shader_ballot);
  6447. }
  6448. if (profile != EEsProfile) {
  6449. symbolTable.setFunctionExtensions("min3", 1, &E_GL_AMD_shader_trinary_minmax);
  6450. symbolTable.setFunctionExtensions("max3", 1, &E_GL_AMD_shader_trinary_minmax);
  6451. symbolTable.setFunctionExtensions("mid3", 1, &E_GL_AMD_shader_trinary_minmax);
  6452. }
  6453. if (profile != EEsProfile) {
  6454. symbolTable.setVariableExtensions("gl_SIMDGroupSizeAMD", 1, &E_GL_AMD_gcn_shader);
  6455. SpecialQualifier("gl_SIMDGroupSizeAMD", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  6456. symbolTable.setFunctionExtensions("cubeFaceIndexAMD", 1, &E_GL_AMD_gcn_shader);
  6457. symbolTable.setFunctionExtensions("cubeFaceCoordAMD", 1, &E_GL_AMD_gcn_shader);
  6458. symbolTable.setFunctionExtensions("timeAMD", 1, &E_GL_AMD_gcn_shader);
  6459. }
  6460. if (profile != EEsProfile) {
  6461. symbolTable.setFunctionExtensions("fragmentMaskFetchAMD", 1, &E_GL_AMD_shader_fragment_mask);
  6462. symbolTable.setFunctionExtensions("fragmentFetchAMD", 1, &E_GL_AMD_shader_fragment_mask);
  6463. }
  6464. symbolTable.setFunctionExtensions("countLeadingZeros", 1, &E_GL_INTEL_shader_integer_functions2);
  6465. symbolTable.setFunctionExtensions("countTrailingZeros", 1, &E_GL_INTEL_shader_integer_functions2);
  6466. symbolTable.setFunctionExtensions("absoluteDifference", 1, &E_GL_INTEL_shader_integer_functions2);
  6467. symbolTable.setFunctionExtensions("addSaturate", 1, &E_GL_INTEL_shader_integer_functions2);
  6468. symbolTable.setFunctionExtensions("subtractSaturate", 1, &E_GL_INTEL_shader_integer_functions2);
  6469. symbolTable.setFunctionExtensions("average", 1, &E_GL_INTEL_shader_integer_functions2);
  6470. symbolTable.setFunctionExtensions("averageRounded", 1, &E_GL_INTEL_shader_integer_functions2);
  6471. symbolTable.setFunctionExtensions("multiply32x16", 1, &E_GL_INTEL_shader_integer_functions2);
  6472. symbolTable.setFunctionExtensions("textureFootprintNV", 1, &E_GL_NV_shader_texture_footprint);
  6473. symbolTable.setFunctionExtensions("textureFootprintClampNV", 1, &E_GL_NV_shader_texture_footprint);
  6474. symbolTable.setFunctionExtensions("textureFootprintLodNV", 1, &E_GL_NV_shader_texture_footprint);
  6475. symbolTable.setFunctionExtensions("textureFootprintGradNV", 1, &E_GL_NV_shader_texture_footprint);
  6476. symbolTable.setFunctionExtensions("textureFootprintGradClampNV", 1, &E_GL_NV_shader_texture_footprint);
  6477. // Compatibility variables, vertex only
  6478. if (spvVersion.spv == 0) {
  6479. BuiltInVariable("gl_Color", EbvColor, symbolTable);
  6480. BuiltInVariable("gl_SecondaryColor", EbvSecondaryColor, symbolTable);
  6481. BuiltInVariable("gl_Normal", EbvNormal, symbolTable);
  6482. BuiltInVariable("gl_Vertex", EbvVertex, symbolTable);
  6483. BuiltInVariable("gl_MultiTexCoord0", EbvMultiTexCoord0, symbolTable);
  6484. BuiltInVariable("gl_MultiTexCoord1", EbvMultiTexCoord1, symbolTable);
  6485. BuiltInVariable("gl_MultiTexCoord2", EbvMultiTexCoord2, symbolTable);
  6486. BuiltInVariable("gl_MultiTexCoord3", EbvMultiTexCoord3, symbolTable);
  6487. BuiltInVariable("gl_MultiTexCoord4", EbvMultiTexCoord4, symbolTable);
  6488. BuiltInVariable("gl_MultiTexCoord5", EbvMultiTexCoord5, symbolTable);
  6489. BuiltInVariable("gl_MultiTexCoord6", EbvMultiTexCoord6, symbolTable);
  6490. BuiltInVariable("gl_MultiTexCoord7", EbvMultiTexCoord7, symbolTable);
  6491. BuiltInVariable("gl_FogCoord", EbvFogFragCoord, symbolTable);
  6492. }
  6493. if (profile == EEsProfile) {
  6494. if (spvVersion.spv == 0) {
  6495. symbolTable.setFunctionExtensions("texture2DGradEXT", 1, &E_GL_EXT_shader_texture_lod);
  6496. symbolTable.setFunctionExtensions("texture2DProjGradEXT", 1, &E_GL_EXT_shader_texture_lod);
  6497. symbolTable.setFunctionExtensions("textureCubeGradEXT", 1, &E_GL_EXT_shader_texture_lod);
  6498. if (version == 310)
  6499. symbolTable.setFunctionExtensions("textureGatherOffsets", Num_AEP_gpu_shader5, AEP_gpu_shader5);
  6500. }
  6501. if (version == 310)
  6502. symbolTable.setFunctionExtensions("fma", Num_AEP_gpu_shader5, AEP_gpu_shader5);
  6503. }
  6504. if (profile == EEsProfile && version < 320) {
  6505. symbolTable.setFunctionExtensions("imageAtomicAdd", 1, &E_GL_OES_shader_image_atomic);
  6506. symbolTable.setFunctionExtensions("imageAtomicMin", 1, &E_GL_OES_shader_image_atomic);
  6507. symbolTable.setFunctionExtensions("imageAtomicMax", 1, &E_GL_OES_shader_image_atomic);
  6508. symbolTable.setFunctionExtensions("imageAtomicAnd", 1, &E_GL_OES_shader_image_atomic);
  6509. symbolTable.setFunctionExtensions("imageAtomicOr", 1, &E_GL_OES_shader_image_atomic);
  6510. symbolTable.setFunctionExtensions("imageAtomicXor", 1, &E_GL_OES_shader_image_atomic);
  6511. symbolTable.setFunctionExtensions("imageAtomicExchange", 1, &E_GL_OES_shader_image_atomic);
  6512. symbolTable.setFunctionExtensions("imageAtomicCompSwap", 1, &E_GL_OES_shader_image_atomic);
  6513. }
  6514. if (version >= 300 /* both ES and non-ES */) {
  6515. symbolTable.setVariableExtensions("gl_ViewID_OVR", Num_OVR_multiview_EXTs, OVR_multiview_EXTs);
  6516. BuiltInVariable("gl_ViewID_OVR", EbvViewIndex, symbolTable);
  6517. }
  6518. if (profile == EEsProfile) {
  6519. symbolTable.setFunctionExtensions("shadow2DEXT", 1, &E_GL_EXT_shadow_samplers);
  6520. symbolTable.setFunctionExtensions("shadow2DProjEXT", 1, &E_GL_EXT_shadow_samplers);
  6521. }
  6522. // Fall through
  6523. case EShLangTessControl:
  6524. if (profile == EEsProfile && version >= 310) {
  6525. BuiltInVariable("gl_BoundingBoxEXT", EbvBoundingBox, symbolTable);
  6526. symbolTable.setVariableExtensions("gl_BoundingBoxEXT", 1,
  6527. &E_GL_EXT_primitive_bounding_box);
  6528. BuiltInVariable("gl_BoundingBoxOES", EbvBoundingBox, symbolTable);
  6529. symbolTable.setVariableExtensions("gl_BoundingBoxOES", 1,
  6530. &E_GL_OES_primitive_bounding_box);
  6531. if (version >= 320) {
  6532. BuiltInVariable("gl_BoundingBox", EbvBoundingBox, symbolTable);
  6533. }
  6534. }
  6535. // Fall through
  6536. case EShLangTessEvaluation:
  6537. case EShLangGeometry:
  6538. #endif // !GLSLANG_WEB
  6539. SpecialQualifier("gl_Position", EvqPosition, EbvPosition, symbolTable);
  6540. SpecialQualifier("gl_PointSize", EvqPointSize, EbvPointSize, symbolTable);
  6541. BuiltInVariable("gl_in", "gl_Position", EbvPosition, symbolTable);
  6542. BuiltInVariable("gl_in", "gl_PointSize", EbvPointSize, symbolTable);
  6543. BuiltInVariable("gl_out", "gl_Position", EbvPosition, symbolTable);
  6544. BuiltInVariable("gl_out", "gl_PointSize", EbvPointSize, symbolTable);
  6545. #ifndef GLSLANG_WEB
  6546. SpecialQualifier("gl_ClipVertex", EvqClipVertex, EbvClipVertex, symbolTable);
  6547. BuiltInVariable("gl_in", "gl_ClipDistance", EbvClipDistance, symbolTable);
  6548. BuiltInVariable("gl_in", "gl_CullDistance", EbvCullDistance, symbolTable);
  6549. BuiltInVariable("gl_out", "gl_ClipDistance", EbvClipDistance, symbolTable);
  6550. BuiltInVariable("gl_out", "gl_CullDistance", EbvCullDistance, symbolTable);
  6551. BuiltInVariable("gl_ClipDistance", EbvClipDistance, symbolTable);
  6552. BuiltInVariable("gl_CullDistance", EbvCullDistance, symbolTable);
  6553. BuiltInVariable("gl_PrimitiveIDIn", EbvPrimitiveId, symbolTable);
  6554. BuiltInVariable("gl_PrimitiveID", EbvPrimitiveId, symbolTable);
  6555. BuiltInVariable("gl_InvocationID", EbvInvocationId, symbolTable);
  6556. BuiltInVariable("gl_Layer", EbvLayer, symbolTable);
  6557. BuiltInVariable("gl_ViewportIndex", EbvViewportIndex, symbolTable);
  6558. if (language != EShLangGeometry) {
  6559. symbolTable.setVariableExtensions("gl_Layer", Num_viewportEXTs, viewportEXTs);
  6560. symbolTable.setVariableExtensions("gl_ViewportIndex", Num_viewportEXTs, viewportEXTs);
  6561. }
  6562. symbolTable.setVariableExtensions("gl_ViewportMask", 1, &E_GL_NV_viewport_array2);
  6563. symbolTable.setVariableExtensions("gl_SecondaryPositionNV", 1, &E_GL_NV_stereo_view_rendering);
  6564. symbolTable.setVariableExtensions("gl_SecondaryViewportMaskNV", 1, &E_GL_NV_stereo_view_rendering);
  6565. symbolTable.setVariableExtensions("gl_PositionPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
  6566. symbolTable.setVariableExtensions("gl_ViewportMaskPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
  6567. BuiltInVariable("gl_ViewportMask", EbvViewportMaskNV, symbolTable);
  6568. BuiltInVariable("gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
  6569. BuiltInVariable("gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
  6570. BuiltInVariable("gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
  6571. BuiltInVariable("gl_ViewportMaskPerViewNV", EbvViewportMaskPerViewNV, symbolTable);
  6572. if (language == EShLangVertex || language == EShLangGeometry) {
  6573. symbolTable.setVariableExtensions("gl_in", "gl_SecondaryPositionNV", 1, &E_GL_NV_stereo_view_rendering);
  6574. symbolTable.setVariableExtensions("gl_in", "gl_PositionPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
  6575. BuiltInVariable("gl_in", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
  6576. BuiltInVariable("gl_in", "gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
  6577. }
  6578. symbolTable.setVariableExtensions("gl_out", "gl_ViewportMask", 1, &E_GL_NV_viewport_array2);
  6579. symbolTable.setVariableExtensions("gl_out", "gl_SecondaryPositionNV", 1, &E_GL_NV_stereo_view_rendering);
  6580. symbolTable.setVariableExtensions("gl_out", "gl_SecondaryViewportMaskNV", 1, &E_GL_NV_stereo_view_rendering);
  6581. symbolTable.setVariableExtensions("gl_out", "gl_PositionPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
  6582. symbolTable.setVariableExtensions("gl_out", "gl_ViewportMaskPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
  6583. BuiltInVariable("gl_out", "gl_ViewportMask", EbvViewportMaskNV, symbolTable);
  6584. BuiltInVariable("gl_out", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
  6585. BuiltInVariable("gl_out", "gl_SecondaryViewportMaskNV", EbvSecondaryViewportMaskNV, symbolTable);
  6586. BuiltInVariable("gl_out", "gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
  6587. BuiltInVariable("gl_out", "gl_ViewportMaskPerViewNV", EbvViewportMaskPerViewNV, symbolTable);
  6588. BuiltInVariable("gl_PatchVerticesIn", EbvPatchVertices, symbolTable);
  6589. BuiltInVariable("gl_TessLevelOuter", EbvTessLevelOuter, symbolTable);
  6590. BuiltInVariable("gl_TessLevelInner", EbvTessLevelInner, symbolTable);
  6591. BuiltInVariable("gl_TessCoord", EbvTessCoord, symbolTable);
  6592. if (version < 410)
  6593. symbolTable.setVariableExtensions("gl_ViewportIndex", 1, &E_GL_ARB_viewport_array);
  6594. // Compatibility variables
  6595. BuiltInVariable("gl_in", "gl_ClipVertex", EbvClipVertex, symbolTable);
  6596. BuiltInVariable("gl_in", "gl_FrontColor", EbvFrontColor, symbolTable);
  6597. BuiltInVariable("gl_in", "gl_BackColor", EbvBackColor, symbolTable);
  6598. BuiltInVariable("gl_in", "gl_FrontSecondaryColor", EbvFrontSecondaryColor, symbolTable);
  6599. BuiltInVariable("gl_in", "gl_BackSecondaryColor", EbvBackSecondaryColor, symbolTable);
  6600. BuiltInVariable("gl_in", "gl_TexCoord", EbvTexCoord, symbolTable);
  6601. BuiltInVariable("gl_in", "gl_FogFragCoord", EbvFogFragCoord, symbolTable);
  6602. BuiltInVariable("gl_out", "gl_ClipVertex", EbvClipVertex, symbolTable);
  6603. BuiltInVariable("gl_out", "gl_FrontColor", EbvFrontColor, symbolTable);
  6604. BuiltInVariable("gl_out", "gl_BackColor", EbvBackColor, symbolTable);
  6605. BuiltInVariable("gl_out", "gl_FrontSecondaryColor", EbvFrontSecondaryColor, symbolTable);
  6606. BuiltInVariable("gl_out", "gl_BackSecondaryColor", EbvBackSecondaryColor, symbolTable);
  6607. BuiltInVariable("gl_out", "gl_TexCoord", EbvTexCoord, symbolTable);
  6608. BuiltInVariable("gl_out", "gl_FogFragCoord", EbvFogFragCoord, symbolTable);
  6609. BuiltInVariable("gl_ClipVertex", EbvClipVertex, symbolTable);
  6610. BuiltInVariable("gl_FrontColor", EbvFrontColor, symbolTable);
  6611. BuiltInVariable("gl_BackColor", EbvBackColor, symbolTable);
  6612. BuiltInVariable("gl_FrontSecondaryColor", EbvFrontSecondaryColor, symbolTable);
  6613. BuiltInVariable("gl_BackSecondaryColor", EbvBackSecondaryColor, symbolTable);
  6614. BuiltInVariable("gl_TexCoord", EbvTexCoord, symbolTable);
  6615. BuiltInVariable("gl_FogFragCoord", EbvFogFragCoord, symbolTable);
  6616. // gl_PointSize, when it needs to be tied to an extension, is always a member of a block.
  6617. // (Sometimes with an instance name, sometimes anonymous).
  6618. if (profile == EEsProfile) {
  6619. if (language == EShLangGeometry) {
  6620. symbolTable.setVariableExtensions("gl_PointSize", Num_AEP_geometry_point_size, AEP_geometry_point_size);
  6621. symbolTable.setVariableExtensions("gl_in", "gl_PointSize", Num_AEP_geometry_point_size, AEP_geometry_point_size);
  6622. } else if (language == EShLangTessEvaluation || language == EShLangTessControl) {
  6623. // gl_in tessellation settings of gl_PointSize are in the context-dependent paths
  6624. symbolTable.setVariableExtensions("gl_PointSize", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);
  6625. symbolTable.setVariableExtensions("gl_out", "gl_PointSize", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);
  6626. }
  6627. }
  6628. if ((profile != EEsProfile && version >= 140) ||
  6629. (profile == EEsProfile && version >= 310)) {
  6630. symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
  6631. BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
  6632. symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
  6633. BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
  6634. }
  6635. if (profile != EEsProfile) {
  6636. BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
  6637. BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
  6638. BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
  6639. BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
  6640. BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
  6641. BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
  6642. if (spvVersion.vulkan > 0)
  6643. // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
  6644. SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  6645. else
  6646. BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
  6647. }
  6648. // GL_KHR_shader_subgroup
  6649. if ((profile == EEsProfile && version >= 310) ||
  6650. (profile != EEsProfile && version >= 140)) {
  6651. symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
  6652. symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
  6653. symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  6654. symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  6655. symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  6656. symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  6657. symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  6658. BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
  6659. BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
  6660. BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
  6661. BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
  6662. BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
  6663. BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
  6664. BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
  6665. // GL_NV_shader_sm_builtins
  6666. symbolTable.setVariableExtensions("gl_WarpsPerSMNV", 1, &E_GL_NV_shader_sm_builtins);
  6667. symbolTable.setVariableExtensions("gl_SMCountNV", 1, &E_GL_NV_shader_sm_builtins);
  6668. symbolTable.setVariableExtensions("gl_WarpIDNV", 1, &E_GL_NV_shader_sm_builtins);
  6669. symbolTable.setVariableExtensions("gl_SMIDNV", 1, &E_GL_NV_shader_sm_builtins);
  6670. BuiltInVariable("gl_WarpsPerSMNV", EbvWarpsPerSM, symbolTable);
  6671. BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable);
  6672. BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
  6673. BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
  6674. }
  6675. if (language == EShLangGeometry || language == EShLangVertex) {
  6676. if ((profile == EEsProfile && version >= 310) ||
  6677. (profile != EEsProfile && version >= 450)) {
  6678. symbolTable.setVariableExtensions("gl_PrimitiveShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate);
  6679. BuiltInVariable("gl_PrimitiveShadingRateEXT", EbvPrimitiveShadingRateKHR, symbolTable);
  6680. symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  6681. symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  6682. symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  6683. symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  6684. }
  6685. }
  6686. #endif // !GLSLANG_WEB
  6687. break;
  6688. case EShLangFragment:
  6689. SpecialQualifier("gl_FrontFacing", EvqFace, EbvFace, symbolTable);
  6690. SpecialQualifier("gl_FragCoord", EvqFragCoord, EbvFragCoord, symbolTable);
  6691. SpecialQualifier("gl_PointCoord", EvqPointCoord, EbvPointCoord, symbolTable);
  6692. if (spvVersion.spv == 0)
  6693. SpecialQualifier("gl_FragColor", EvqFragColor, EbvFragColor, symbolTable);
  6694. else {
  6695. TSymbol* symbol = symbolTable.find("gl_FragColor");
  6696. if (symbol) {
  6697. symbol->getWritableType().getQualifier().storage = EvqVaryingOut;
  6698. symbol->getWritableType().getQualifier().layoutLocation = 0;
  6699. }
  6700. }
  6701. SpecialQualifier("gl_FragDepth", EvqFragDepth, EbvFragDepth, symbolTable);
  6702. #ifndef GLSLANG_WEB
  6703. SpecialQualifier("gl_FragDepthEXT", EvqFragDepth, EbvFragDepth, symbolTable);
  6704. SpecialQualifier("gl_HelperInvocation", EvqVaryingIn, EbvHelperInvocation, symbolTable);
  6705. BuiltInVariable("gl_ClipDistance", EbvClipDistance, symbolTable);
  6706. BuiltInVariable("gl_CullDistance", EbvCullDistance, symbolTable);
  6707. BuiltInVariable("gl_PrimitiveID", EbvPrimitiveId, symbolTable);
  6708. if (profile != EEsProfile && version >= 140) {
  6709. symbolTable.setVariableExtensions("gl_FragStencilRefARB", 1, &E_GL_ARB_shader_stencil_export);
  6710. BuiltInVariable("gl_FragStencilRefARB", EbvFragStencilRef, symbolTable);
  6711. }
  6712. if (profile != EEsProfile && version < 400) {
  6713. symbolTable.setFunctionExtensions("textureQueryLod", 1, &E_GL_ARB_texture_query_lod);
  6714. }
  6715. if (profile != EEsProfile && version >= 460) {
  6716. symbolTable.setFunctionExtensions("rayQueryInitializeEXT", 1, &E_GL_EXT_ray_query);
  6717. symbolTable.setFunctionExtensions("rayQueryTerminateEXT", 1, &E_GL_EXT_ray_query);
  6718. symbolTable.setFunctionExtensions("rayQueryGenerateIntersectionEXT", 1, &E_GL_EXT_ray_query);
  6719. symbolTable.setFunctionExtensions("rayQueryConfirmIntersectionEXT", 1, &E_GL_EXT_ray_query);
  6720. symbolTable.setFunctionExtensions("rayQueryProceedEXT", 1, &E_GL_EXT_ray_query);
  6721. symbolTable.setFunctionExtensions("rayQueryGetIntersectionTypeEXT", 1, &E_GL_EXT_ray_query);
  6722. symbolTable.setFunctionExtensions("rayQueryGetIntersectionTEXT", 1, &E_GL_EXT_ray_query);
  6723. symbolTable.setFunctionExtensions("rayQueryGetRayFlagsEXT", 1, &E_GL_EXT_ray_query);
  6724. symbolTable.setFunctionExtensions("rayQueryGetRayTMinEXT", 1, &E_GL_EXT_ray_query);
  6725. symbolTable.setFunctionExtensions("rayQueryGetIntersectionInstanceCustomIndexEXT", 1, &E_GL_EXT_ray_query);
  6726. symbolTable.setFunctionExtensions("rayQueryGetIntersectionInstanceIdEXT", 1, &E_GL_EXT_ray_query);
  6727. symbolTable.setFunctionExtensions("rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT", 1, &E_GL_EXT_ray_query);
  6728. symbolTable.setFunctionExtensions("rayQueryGetIntersectionGeometryIndexEXT", 1, &E_GL_EXT_ray_query);
  6729. symbolTable.setFunctionExtensions("rayQueryGetIntersectionPrimitiveIndexEXT", 1, &E_GL_EXT_ray_query);
  6730. symbolTable.setFunctionExtensions("rayQueryGetIntersectionBarycentricsEXT", 1, &E_GL_EXT_ray_query);
  6731. symbolTable.setFunctionExtensions("rayQueryGetIntersectionFrontFaceEXT", 1, &E_GL_EXT_ray_query);
  6732. symbolTable.setFunctionExtensions("rayQueryGetIntersectionCandidateAABBOpaqueEXT", 1, &E_GL_EXT_ray_query);
  6733. symbolTable.setFunctionExtensions("rayQueryGetIntersectionObjectRayDirectionEXT", 1, &E_GL_EXT_ray_query);
  6734. symbolTable.setFunctionExtensions("rayQueryGetIntersectionObjectRayOriginEXT", 1, &E_GL_EXT_ray_query);
  6735. symbolTable.setFunctionExtensions("rayQueryGetIntersectionObjectToWorldEXT", 1, &E_GL_EXT_ray_query);
  6736. symbolTable.setFunctionExtensions("rayQueryGetIntersectionWorldToObjectEXT", 1, &E_GL_EXT_ray_query);
  6737. symbolTable.setFunctionExtensions("rayQueryGetWorldRayOriginEXT", 1, &E_GL_EXT_ray_query);
  6738. symbolTable.setFunctionExtensions("rayQueryGetWorldRayDirectionEXT", 1, &E_GL_EXT_ray_query);
  6739. symbolTable.setVariableExtensions("gl_RayFlagsSkipAABBEXT", 1, &E_GL_EXT_ray_flags_primitive_culling);
  6740. symbolTable.setVariableExtensions("gl_RayFlagsSkipTrianglesEXT", 1, &E_GL_EXT_ray_flags_primitive_culling);
  6741. }
  6742. if ((profile != EEsProfile && version >= 130) ||
  6743. (profile == EEsProfile && version >= 310)) {
  6744. BuiltInVariable("gl_SampleID", EbvSampleId, symbolTable);
  6745. BuiltInVariable("gl_SamplePosition", EbvSamplePosition, symbolTable);
  6746. BuiltInVariable("gl_SampleMask", EbvSampleMask, symbolTable);
  6747. if (profile != EEsProfile && version < 400) {
  6748. BuiltInVariable("gl_NumSamples", EbvSampleMask, symbolTable);
  6749. symbolTable.setVariableExtensions("gl_SampleMask", 1, &E_GL_ARB_sample_shading);
  6750. symbolTable.setVariableExtensions("gl_SampleID", 1, &E_GL_ARB_sample_shading);
  6751. symbolTable.setVariableExtensions("gl_SamplePosition", 1, &E_GL_ARB_sample_shading);
  6752. symbolTable.setVariableExtensions("gl_NumSamples", 1, &E_GL_ARB_sample_shading);
  6753. } else {
  6754. BuiltInVariable("gl_SampleMaskIn", EbvSampleMask, symbolTable);
  6755. if (profile == EEsProfile && version < 320) {
  6756. symbolTable.setVariableExtensions("gl_SampleID", 1, &E_GL_OES_sample_variables);
  6757. symbolTable.setVariableExtensions("gl_SamplePosition", 1, &E_GL_OES_sample_variables);
  6758. symbolTable.setVariableExtensions("gl_SampleMaskIn", 1, &E_GL_OES_sample_variables);
  6759. symbolTable.setVariableExtensions("gl_SampleMask", 1, &E_GL_OES_sample_variables);
  6760. symbolTable.setVariableExtensions("gl_NumSamples", 1, &E_GL_OES_sample_variables);
  6761. }
  6762. }
  6763. }
  6764. BuiltInVariable("gl_Layer", EbvLayer, symbolTable);
  6765. BuiltInVariable("gl_ViewportIndex", EbvViewportIndex, symbolTable);
  6766. // Compatibility variables
  6767. BuiltInVariable("gl_in", "gl_FogFragCoord", EbvFogFragCoord, symbolTable);
  6768. BuiltInVariable("gl_in", "gl_TexCoord", EbvTexCoord, symbolTable);
  6769. BuiltInVariable("gl_in", "gl_Color", EbvColor, symbolTable);
  6770. BuiltInVariable("gl_in", "gl_SecondaryColor", EbvSecondaryColor, symbolTable);
  6771. BuiltInVariable("gl_FogFragCoord", EbvFogFragCoord, symbolTable);
  6772. BuiltInVariable("gl_TexCoord", EbvTexCoord, symbolTable);
  6773. BuiltInVariable("gl_Color", EbvColor, symbolTable);
  6774. BuiltInVariable("gl_SecondaryColor", EbvSecondaryColor, symbolTable);
  6775. // built-in functions
  6776. if (profile == EEsProfile) {
  6777. if (spvVersion.spv == 0) {
  6778. symbolTable.setFunctionExtensions("texture2DLodEXT", 1, &E_GL_EXT_shader_texture_lod);
  6779. symbolTable.setFunctionExtensions("texture2DProjLodEXT", 1, &E_GL_EXT_shader_texture_lod);
  6780. symbolTable.setFunctionExtensions("textureCubeLodEXT", 1, &E_GL_EXT_shader_texture_lod);
  6781. symbolTable.setFunctionExtensions("texture2DGradEXT", 1, &E_GL_EXT_shader_texture_lod);
  6782. symbolTable.setFunctionExtensions("texture2DProjGradEXT", 1, &E_GL_EXT_shader_texture_lod);
  6783. symbolTable.setFunctionExtensions("textureCubeGradEXT", 1, &E_GL_EXT_shader_texture_lod);
  6784. if (version < 320)
  6785. symbolTable.setFunctionExtensions("textureGatherOffsets", Num_AEP_gpu_shader5, AEP_gpu_shader5);
  6786. }
  6787. if (version == 100) {
  6788. symbolTable.setFunctionExtensions("dFdx", 1, &E_GL_OES_standard_derivatives);
  6789. symbolTable.setFunctionExtensions("dFdy", 1, &E_GL_OES_standard_derivatives);
  6790. symbolTable.setFunctionExtensions("fwidth", 1, &E_GL_OES_standard_derivatives);
  6791. }
  6792. if (version == 310) {
  6793. symbolTable.setFunctionExtensions("fma", Num_AEP_gpu_shader5, AEP_gpu_shader5);
  6794. symbolTable.setFunctionExtensions("interpolateAtCentroid", 1, &E_GL_OES_shader_multisample_interpolation);
  6795. symbolTable.setFunctionExtensions("interpolateAtSample", 1, &E_GL_OES_shader_multisample_interpolation);
  6796. symbolTable.setFunctionExtensions("interpolateAtOffset", 1, &E_GL_OES_shader_multisample_interpolation);
  6797. }
  6798. } else if (version < 130) {
  6799. if (spvVersion.spv == 0) {
  6800. symbolTable.setFunctionExtensions("texture1DLod", 1, &E_GL_ARB_shader_texture_lod);
  6801. symbolTable.setFunctionExtensions("texture2DLod", 1, &E_GL_ARB_shader_texture_lod);
  6802. symbolTable.setFunctionExtensions("texture3DLod", 1, &E_GL_ARB_shader_texture_lod);
  6803. symbolTable.setFunctionExtensions("textureCubeLod", 1, &E_GL_ARB_shader_texture_lod);
  6804. symbolTable.setFunctionExtensions("texture1DProjLod", 1, &E_GL_ARB_shader_texture_lod);
  6805. symbolTable.setFunctionExtensions("texture2DProjLod", 1, &E_GL_ARB_shader_texture_lod);
  6806. symbolTable.setFunctionExtensions("texture3DProjLod", 1, &E_GL_ARB_shader_texture_lod);
  6807. symbolTable.setFunctionExtensions("shadow1DLod", 1, &E_GL_ARB_shader_texture_lod);
  6808. symbolTable.setFunctionExtensions("shadow2DLod", 1, &E_GL_ARB_shader_texture_lod);
  6809. symbolTable.setFunctionExtensions("shadow1DProjLod", 1, &E_GL_ARB_shader_texture_lod);
  6810. symbolTable.setFunctionExtensions("shadow2DProjLod", 1, &E_GL_ARB_shader_texture_lod);
  6811. }
  6812. }
  6813. // E_GL_ARB_shader_texture_lod functions usable only with the extension enabled
  6814. if (profile != EEsProfile && spvVersion.spv == 0) {
  6815. symbolTable.setFunctionExtensions("texture1DGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6816. symbolTable.setFunctionExtensions("texture1DProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6817. symbolTable.setFunctionExtensions("texture2DGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6818. symbolTable.setFunctionExtensions("texture2DProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6819. symbolTable.setFunctionExtensions("texture3DGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6820. symbolTable.setFunctionExtensions("texture3DProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6821. symbolTable.setFunctionExtensions("textureCubeGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6822. symbolTable.setFunctionExtensions("shadow1DGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6823. symbolTable.setFunctionExtensions("shadow1DProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6824. symbolTable.setFunctionExtensions("shadow2DGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6825. symbolTable.setFunctionExtensions("shadow2DProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6826. symbolTable.setFunctionExtensions("texture2DRectGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6827. symbolTable.setFunctionExtensions("texture2DRectProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6828. symbolTable.setFunctionExtensions("shadow2DRectGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6829. symbolTable.setFunctionExtensions("shadow2DRectProjGradARB", 1, &E_GL_ARB_shader_texture_lod);
  6830. }
  6831. // E_GL_ARB_shader_image_load_store
  6832. if (profile != EEsProfile && version < 420)
  6833. symbolTable.setFunctionExtensions("memoryBarrier", 1, &E_GL_ARB_shader_image_load_store);
  6834. // All the image access functions are protected by checks on the type of the first argument.
  6835. // E_GL_ARB_shader_atomic_counters
  6836. if (profile != EEsProfile && version < 420) {
  6837. symbolTable.setFunctionExtensions("atomicCounterIncrement", 1, &E_GL_ARB_shader_atomic_counters);
  6838. symbolTable.setFunctionExtensions("atomicCounterDecrement", 1, &E_GL_ARB_shader_atomic_counters);
  6839. symbolTable.setFunctionExtensions("atomicCounter" , 1, &E_GL_ARB_shader_atomic_counters);
  6840. }
  6841. // E_GL_ARB_derivative_control
  6842. if (profile != EEsProfile && version < 450) {
  6843. symbolTable.setFunctionExtensions("dFdxFine", 1, &E_GL_ARB_derivative_control);
  6844. symbolTable.setFunctionExtensions("dFdyFine", 1, &E_GL_ARB_derivative_control);
  6845. symbolTable.setFunctionExtensions("fwidthFine", 1, &E_GL_ARB_derivative_control);
  6846. symbolTable.setFunctionExtensions("dFdxCoarse", 1, &E_GL_ARB_derivative_control);
  6847. symbolTable.setFunctionExtensions("dFdyCoarse", 1, &E_GL_ARB_derivative_control);
  6848. symbolTable.setFunctionExtensions("fwidthCoarse", 1, &E_GL_ARB_derivative_control);
  6849. }
  6850. // E_GL_ARB_sparse_texture2
  6851. if (profile != EEsProfile)
  6852. {
  6853. symbolTable.setFunctionExtensions("sparseTextureARB", 1, &E_GL_ARB_sparse_texture2);
  6854. symbolTable.setFunctionExtensions("sparseTextureLodARB", 1, &E_GL_ARB_sparse_texture2);
  6855. symbolTable.setFunctionExtensions("sparseTextureOffsetARB", 1, &E_GL_ARB_sparse_texture2);
  6856. symbolTable.setFunctionExtensions("sparseTexelFetchARB", 1, &E_GL_ARB_sparse_texture2);
  6857. symbolTable.setFunctionExtensions("sparseTexelFetchOffsetARB", 1, &E_GL_ARB_sparse_texture2);
  6858. symbolTable.setFunctionExtensions("sparseTextureLodOffsetARB", 1, &E_GL_ARB_sparse_texture2);
  6859. symbolTable.setFunctionExtensions("sparseTextureGradARB", 1, &E_GL_ARB_sparse_texture2);
  6860. symbolTable.setFunctionExtensions("sparseTextureGradOffsetARB", 1, &E_GL_ARB_sparse_texture2);
  6861. symbolTable.setFunctionExtensions("sparseTextureGatherARB", 1, &E_GL_ARB_sparse_texture2);
  6862. symbolTable.setFunctionExtensions("sparseTextureGatherOffsetARB", 1, &E_GL_ARB_sparse_texture2);
  6863. symbolTable.setFunctionExtensions("sparseTextureGatherOffsetsARB", 1, &E_GL_ARB_sparse_texture2);
  6864. symbolTable.setFunctionExtensions("sparseImageLoadARB", 1, &E_GL_ARB_sparse_texture2);
  6865. symbolTable.setFunctionExtensions("sparseTexelsResident", 1, &E_GL_ARB_sparse_texture2);
  6866. }
  6867. // E_GL_ARB_sparse_texture_clamp
  6868. if (profile != EEsProfile)
  6869. {
  6870. symbolTable.setFunctionExtensions("sparseTextureClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6871. symbolTable.setFunctionExtensions("sparseTextureOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6872. symbolTable.setFunctionExtensions("sparseTextureGradClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6873. symbolTable.setFunctionExtensions("sparseTextureGradOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6874. symbolTable.setFunctionExtensions("textureClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6875. symbolTable.setFunctionExtensions("textureOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6876. symbolTable.setFunctionExtensions("textureGradClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6877. symbolTable.setFunctionExtensions("textureGradOffsetClampARB", 1, &E_GL_ARB_sparse_texture_clamp);
  6878. }
  6879. // E_GL_AMD_shader_explicit_vertex_parameter
  6880. if (profile != EEsProfile) {
  6881. symbolTable.setVariableExtensions("gl_BaryCoordNoPerspAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6882. symbolTable.setVariableExtensions("gl_BaryCoordNoPerspCentroidAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6883. symbolTable.setVariableExtensions("gl_BaryCoordNoPerspSampleAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6884. symbolTable.setVariableExtensions("gl_BaryCoordSmoothAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6885. symbolTable.setVariableExtensions("gl_BaryCoordSmoothCentroidAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6886. symbolTable.setVariableExtensions("gl_BaryCoordSmoothSampleAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6887. symbolTable.setVariableExtensions("gl_BaryCoordPullModelAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6888. symbolTable.setFunctionExtensions("interpolateAtVertexAMD", 1, &E_GL_AMD_shader_explicit_vertex_parameter);
  6889. BuiltInVariable("gl_BaryCoordNoPerspAMD", EbvBaryCoordNoPersp, symbolTable);
  6890. BuiltInVariable("gl_BaryCoordNoPerspCentroidAMD", EbvBaryCoordNoPerspCentroid, symbolTable);
  6891. BuiltInVariable("gl_BaryCoordNoPerspSampleAMD", EbvBaryCoordNoPerspSample, symbolTable);
  6892. BuiltInVariable("gl_BaryCoordSmoothAMD", EbvBaryCoordSmooth, symbolTable);
  6893. BuiltInVariable("gl_BaryCoordSmoothCentroidAMD", EbvBaryCoordSmoothCentroid, symbolTable);
  6894. BuiltInVariable("gl_BaryCoordSmoothSampleAMD", EbvBaryCoordSmoothSample, symbolTable);
  6895. BuiltInVariable("gl_BaryCoordPullModelAMD", EbvBaryCoordPullModel, symbolTable);
  6896. }
  6897. // E_GL_AMD_texture_gather_bias_lod
  6898. if (profile != EEsProfile) {
  6899. symbolTable.setFunctionExtensions("textureGatherLodAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
  6900. symbolTable.setFunctionExtensions("textureGatherLodOffsetAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
  6901. symbolTable.setFunctionExtensions("textureGatherLodOffsetsAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
  6902. symbolTable.setFunctionExtensions("sparseTextureGatherLodAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
  6903. symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
  6904. symbolTable.setFunctionExtensions("sparseTextureGatherLodOffsetsAMD", 1, &E_GL_AMD_texture_gather_bias_lod);
  6905. }
  6906. // E_GL_AMD_shader_image_load_store_lod
  6907. if (profile != EEsProfile) {
  6908. symbolTable.setFunctionExtensions("imageLoadLodAMD", 1, &E_GL_AMD_shader_image_load_store_lod);
  6909. symbolTable.setFunctionExtensions("imageStoreLodAMD", 1, &E_GL_AMD_shader_image_load_store_lod);
  6910. symbolTable.setFunctionExtensions("sparseImageLoadLodAMD", 1, &E_GL_AMD_shader_image_load_store_lod);
  6911. }
  6912. if (profile != EEsProfile && version >= 430) {
  6913. symbolTable.setVariableExtensions("gl_FragFullyCoveredNV", 1, &E_GL_NV_conservative_raster_underestimation);
  6914. BuiltInVariable("gl_FragFullyCoveredNV", EbvFragFullyCoveredNV, symbolTable);
  6915. }
  6916. if ((profile != EEsProfile && version >= 450) ||
  6917. (profile == EEsProfile && version >= 320)) {
  6918. symbolTable.setVariableExtensions("gl_FragmentSizeNV", 1, &E_GL_NV_shading_rate_image);
  6919. symbolTable.setVariableExtensions("gl_InvocationsPerPixelNV", 1, &E_GL_NV_shading_rate_image);
  6920. BuiltInVariable("gl_FragmentSizeNV", EbvFragmentSizeNV, symbolTable);
  6921. BuiltInVariable("gl_InvocationsPerPixelNV", EbvInvocationsPerPixelNV, symbolTable);
  6922. symbolTable.setVariableExtensions("gl_BaryCoordNV", 1, &E_GL_NV_fragment_shader_barycentric);
  6923. symbolTable.setVariableExtensions("gl_BaryCoordNoPerspNV", 1, &E_GL_NV_fragment_shader_barycentric);
  6924. BuiltInVariable("gl_BaryCoordNV", EbvBaryCoordNV, symbolTable);
  6925. BuiltInVariable("gl_BaryCoordNoPerspNV", EbvBaryCoordNoPerspNV, symbolTable);
  6926. }
  6927. if ((profile != EEsProfile && version >= 450) ||
  6928. (profile == EEsProfile && version >= 310)) {
  6929. symbolTable.setVariableExtensions("gl_FragSizeEXT", 1, &E_GL_EXT_fragment_invocation_density);
  6930. symbolTable.setVariableExtensions("gl_FragInvocationCountEXT", 1, &E_GL_EXT_fragment_invocation_density);
  6931. BuiltInVariable("gl_FragSizeEXT", EbvFragSizeEXT, symbolTable);
  6932. BuiltInVariable("gl_FragInvocationCountEXT", EbvFragInvocationCountEXT, symbolTable);
  6933. }
  6934. symbolTable.setVariableExtensions("gl_FragDepthEXT", 1, &E_GL_EXT_frag_depth);
  6935. symbolTable.setFunctionExtensions("clockARB", 1, &E_GL_ARB_shader_clock);
  6936. symbolTable.setFunctionExtensions("clock2x32ARB", 1, &E_GL_ARB_shader_clock);
  6937. symbolTable.setFunctionExtensions("clockRealtimeEXT", 1, &E_GL_EXT_shader_realtime_clock);
  6938. symbolTable.setFunctionExtensions("clockRealtime2x32EXT", 1, &E_GL_EXT_shader_realtime_clock);
  6939. if (profile == EEsProfile && version < 320) {
  6940. symbolTable.setVariableExtensions("gl_PrimitiveID", Num_AEP_geometry_shader, AEP_geometry_shader);
  6941. symbolTable.setVariableExtensions("gl_Layer", Num_AEP_geometry_shader, AEP_geometry_shader);
  6942. }
  6943. if (profile == EEsProfile && version < 320) {
  6944. symbolTable.setFunctionExtensions("imageAtomicAdd", 1, &E_GL_OES_shader_image_atomic);
  6945. symbolTable.setFunctionExtensions("imageAtomicMin", 1, &E_GL_OES_shader_image_atomic);
  6946. symbolTable.setFunctionExtensions("imageAtomicMax", 1, &E_GL_OES_shader_image_atomic);
  6947. symbolTable.setFunctionExtensions("imageAtomicAnd", 1, &E_GL_OES_shader_image_atomic);
  6948. symbolTable.setFunctionExtensions("imageAtomicOr", 1, &E_GL_OES_shader_image_atomic);
  6949. symbolTable.setFunctionExtensions("imageAtomicXor", 1, &E_GL_OES_shader_image_atomic);
  6950. symbolTable.setFunctionExtensions("imageAtomicExchange", 1, &E_GL_OES_shader_image_atomic);
  6951. symbolTable.setFunctionExtensions("imageAtomicCompSwap", 1, &E_GL_OES_shader_image_atomic);
  6952. }
  6953. if (profile != EEsProfile && version < 330 ) {
  6954. symbolTable.setFunctionExtensions("floatBitsToInt", 1, &E_GL_ARB_shader_bit_encoding);
  6955. symbolTable.setFunctionExtensions("floatBitsToUint", 1, &E_GL_ARB_shader_bit_encoding);
  6956. symbolTable.setFunctionExtensions("intBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
  6957. symbolTable.setFunctionExtensions("uintBitsToFloat", 1, &E_GL_ARB_shader_bit_encoding);
  6958. }
  6959. if (profile != EEsProfile && version < 430 ) {
  6960. symbolTable.setFunctionExtensions("imageSize", 1, &E_GL_ARB_shader_image_size);
  6961. }
  6962. // GL_ARB_shader_storage_buffer_object
  6963. if (profile != EEsProfile && version < 430 ) {
  6964. symbolTable.setFunctionExtensions("atomicAdd", 1, &E_GL_ARB_shader_storage_buffer_object);
  6965. symbolTable.setFunctionExtensions("atomicMin", 1, &E_GL_ARB_shader_storage_buffer_object);
  6966. symbolTable.setFunctionExtensions("atomicMax", 1, &E_GL_ARB_shader_storage_buffer_object);
  6967. symbolTable.setFunctionExtensions("atomicAnd", 1, &E_GL_ARB_shader_storage_buffer_object);
  6968. symbolTable.setFunctionExtensions("atomicOr", 1, &E_GL_ARB_shader_storage_buffer_object);
  6969. symbolTable.setFunctionExtensions("atomicXor", 1, &E_GL_ARB_shader_storage_buffer_object);
  6970. symbolTable.setFunctionExtensions("atomicExchange", 1, &E_GL_ARB_shader_storage_buffer_object);
  6971. symbolTable.setFunctionExtensions("atomicCompSwap", 1, &E_GL_ARB_shader_storage_buffer_object);
  6972. }
  6973. // GL_ARB_shading_language_packing
  6974. if (profile != EEsProfile && version < 400 ) {
  6975. symbolTable.setFunctionExtensions("packUnorm2x16", 1, &E_GL_ARB_shading_language_packing);
  6976. symbolTable.setFunctionExtensions("unpackUnorm2x16", 1, &E_GL_ARB_shading_language_packing);
  6977. symbolTable.setFunctionExtensions("packSnorm4x8", 1, &E_GL_ARB_shading_language_packing);
  6978. symbolTable.setFunctionExtensions("packUnorm4x8", 1, &E_GL_ARB_shading_language_packing);
  6979. symbolTable.setFunctionExtensions("unpackSnorm4x8", 1, &E_GL_ARB_shading_language_packing);
  6980. symbolTable.setFunctionExtensions("unpackUnorm4x8", 1, &E_GL_ARB_shading_language_packing);
  6981. }
  6982. if (profile != EEsProfile && version < 420 ) {
  6983. symbolTable.setFunctionExtensions("packSnorm2x16", 1, &E_GL_ARB_shading_language_packing);
  6984. symbolTable.setFunctionExtensions("unpackSnorm2x16", 1, &E_GL_ARB_shading_language_packing);
  6985. symbolTable.setFunctionExtensions("unpackHalf2x16", 1, &E_GL_ARB_shading_language_packing);
  6986. symbolTable.setFunctionExtensions("packHalf2x16", 1, &E_GL_ARB_shading_language_packing);
  6987. }
  6988. symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
  6989. BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
  6990. symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
  6991. BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
  6992. if (version >= 300 /* both ES and non-ES */) {
  6993. symbolTable.setVariableExtensions("gl_ViewID_OVR", Num_OVR_multiview_EXTs, OVR_multiview_EXTs);
  6994. BuiltInVariable("gl_ViewID_OVR", EbvViewIndex, symbolTable);
  6995. }
  6996. // GL_ARB_shader_ballot
  6997. if (profile != EEsProfile) {
  6998. symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
  6999. symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
  7000. symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
  7001. symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7002. symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7003. symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7004. symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7005. BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
  7006. BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
  7007. BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
  7008. BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
  7009. BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
  7010. BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
  7011. if (spvVersion.vulkan > 0)
  7012. // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
  7013. SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  7014. else
  7015. BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
  7016. }
  7017. // GL_KHR_shader_subgroup
  7018. if ((profile == EEsProfile && version >= 310) ||
  7019. (profile != EEsProfile && version >= 140)) {
  7020. symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
  7021. symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
  7022. symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7023. symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7024. symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7025. symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7026. symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7027. BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
  7028. BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
  7029. BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
  7030. BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
  7031. BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
  7032. BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
  7033. BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
  7034. symbolTable.setFunctionExtensions("subgroupBarrier", 1, &E_GL_KHR_shader_subgroup_basic);
  7035. symbolTable.setFunctionExtensions("subgroupMemoryBarrier", 1, &E_GL_KHR_shader_subgroup_basic);
  7036. symbolTable.setFunctionExtensions("subgroupMemoryBarrierBuffer", 1, &E_GL_KHR_shader_subgroup_basic);
  7037. symbolTable.setFunctionExtensions("subgroupMemoryBarrierImage", 1, &E_GL_KHR_shader_subgroup_basic);
  7038. symbolTable.setFunctionExtensions("subgroupElect", 1, &E_GL_KHR_shader_subgroup_basic);
  7039. symbolTable.setFunctionExtensions("subgroupAll", 1, &E_GL_KHR_shader_subgroup_vote);
  7040. symbolTable.setFunctionExtensions("subgroupAny", 1, &E_GL_KHR_shader_subgroup_vote);
  7041. symbolTable.setFunctionExtensions("subgroupAllEqual", 1, &E_GL_KHR_shader_subgroup_vote);
  7042. symbolTable.setFunctionExtensions("subgroupBroadcast", 1, &E_GL_KHR_shader_subgroup_ballot);
  7043. symbolTable.setFunctionExtensions("subgroupBroadcastFirst", 1, &E_GL_KHR_shader_subgroup_ballot);
  7044. symbolTable.setFunctionExtensions("subgroupBallot", 1, &E_GL_KHR_shader_subgroup_ballot);
  7045. symbolTable.setFunctionExtensions("subgroupInverseBallot", 1, &E_GL_KHR_shader_subgroup_ballot);
  7046. symbolTable.setFunctionExtensions("subgroupBallotBitExtract", 1, &E_GL_KHR_shader_subgroup_ballot);
  7047. symbolTable.setFunctionExtensions("subgroupBallotBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
  7048. symbolTable.setFunctionExtensions("subgroupBallotInclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
  7049. symbolTable.setFunctionExtensions("subgroupBallotExclusiveBitCount", 1, &E_GL_KHR_shader_subgroup_ballot);
  7050. symbolTable.setFunctionExtensions("subgroupBallotFindLSB", 1, &E_GL_KHR_shader_subgroup_ballot);
  7051. symbolTable.setFunctionExtensions("subgroupBallotFindMSB", 1, &E_GL_KHR_shader_subgroup_ballot);
  7052. symbolTable.setFunctionExtensions("subgroupShuffle", 1, &E_GL_KHR_shader_subgroup_shuffle);
  7053. symbolTable.setFunctionExtensions("subgroupShuffleXor", 1, &E_GL_KHR_shader_subgroup_shuffle);
  7054. symbolTable.setFunctionExtensions("subgroupShuffleUp", 1, &E_GL_KHR_shader_subgroup_shuffle_relative);
  7055. symbolTable.setFunctionExtensions("subgroupShuffleDown", 1, &E_GL_KHR_shader_subgroup_shuffle_relative);
  7056. symbolTable.setFunctionExtensions("subgroupAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7057. symbolTable.setFunctionExtensions("subgroupMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7058. symbolTable.setFunctionExtensions("subgroupMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7059. symbolTable.setFunctionExtensions("subgroupMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7060. symbolTable.setFunctionExtensions("subgroupAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7061. symbolTable.setFunctionExtensions("subgroupOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7062. symbolTable.setFunctionExtensions("subgroupXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7063. symbolTable.setFunctionExtensions("subgroupInclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7064. symbolTable.setFunctionExtensions("subgroupInclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7065. symbolTable.setFunctionExtensions("subgroupInclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7066. symbolTable.setFunctionExtensions("subgroupInclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7067. symbolTable.setFunctionExtensions("subgroupInclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7068. symbolTable.setFunctionExtensions("subgroupInclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7069. symbolTable.setFunctionExtensions("subgroupInclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7070. symbolTable.setFunctionExtensions("subgroupExclusiveAdd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7071. symbolTable.setFunctionExtensions("subgroupExclusiveMul", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7072. symbolTable.setFunctionExtensions("subgroupExclusiveMin", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7073. symbolTable.setFunctionExtensions("subgroupExclusiveMax", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7074. symbolTable.setFunctionExtensions("subgroupExclusiveAnd", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7075. symbolTable.setFunctionExtensions("subgroupExclusiveOr", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7076. symbolTable.setFunctionExtensions("subgroupExclusiveXor", 1, &E_GL_KHR_shader_subgroup_arithmetic);
  7077. symbolTable.setFunctionExtensions("subgroupClusteredAdd", 1, &E_GL_KHR_shader_subgroup_clustered);
  7078. symbolTable.setFunctionExtensions("subgroupClusteredMul", 1, &E_GL_KHR_shader_subgroup_clustered);
  7079. symbolTable.setFunctionExtensions("subgroupClusteredMin", 1, &E_GL_KHR_shader_subgroup_clustered);
  7080. symbolTable.setFunctionExtensions("subgroupClusteredMax", 1, &E_GL_KHR_shader_subgroup_clustered);
  7081. symbolTable.setFunctionExtensions("subgroupClusteredAnd", 1, &E_GL_KHR_shader_subgroup_clustered);
  7082. symbolTable.setFunctionExtensions("subgroupClusteredOr", 1, &E_GL_KHR_shader_subgroup_clustered);
  7083. symbolTable.setFunctionExtensions("subgroupClusteredXor", 1, &E_GL_KHR_shader_subgroup_clustered);
  7084. symbolTable.setFunctionExtensions("subgroupQuadBroadcast", 1, &E_GL_KHR_shader_subgroup_quad);
  7085. symbolTable.setFunctionExtensions("subgroupQuadSwapHorizontal", 1, &E_GL_KHR_shader_subgroup_quad);
  7086. symbolTable.setFunctionExtensions("subgroupQuadSwapVertical", 1, &E_GL_KHR_shader_subgroup_quad);
  7087. symbolTable.setFunctionExtensions("subgroupQuadSwapDiagonal", 1, &E_GL_KHR_shader_subgroup_quad);
  7088. symbolTable.setFunctionExtensions("subgroupPartitionNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7089. symbolTable.setFunctionExtensions("subgroupPartitionedAddNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7090. symbolTable.setFunctionExtensions("subgroupPartitionedMulNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7091. symbolTable.setFunctionExtensions("subgroupPartitionedMinNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7092. symbolTable.setFunctionExtensions("subgroupPartitionedMaxNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7093. symbolTable.setFunctionExtensions("subgroupPartitionedAndNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7094. symbolTable.setFunctionExtensions("subgroupPartitionedOrNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7095. symbolTable.setFunctionExtensions("subgroupPartitionedXorNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7096. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveAddNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7097. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMulNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7098. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMinNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7099. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveMaxNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7100. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveAndNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7101. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveOrNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7102. symbolTable.setFunctionExtensions("subgroupPartitionedInclusiveXorNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7103. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveAddNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7104. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMulNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7105. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMinNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7106. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveMaxNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7107. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveAndNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7108. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveOrNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7109. symbolTable.setFunctionExtensions("subgroupPartitionedExclusiveXorNV", 1, &E_GL_NV_shader_subgroup_partitioned);
  7110. // GL_NV_shader_sm_builtins
  7111. symbolTable.setVariableExtensions("gl_WarpsPerSMNV", 1, &E_GL_NV_shader_sm_builtins);
  7112. symbolTable.setVariableExtensions("gl_SMCountNV", 1, &E_GL_NV_shader_sm_builtins);
  7113. symbolTable.setVariableExtensions("gl_WarpIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7114. symbolTable.setVariableExtensions("gl_SMIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7115. BuiltInVariable("gl_WarpsPerSMNV", EbvWarpsPerSM, symbolTable);
  7116. BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable);
  7117. BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
  7118. BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
  7119. }
  7120. if (profile == EEsProfile) {
  7121. symbolTable.setFunctionExtensions("shadow2DEXT", 1, &E_GL_EXT_shadow_samplers);
  7122. symbolTable.setFunctionExtensions("shadow2DProjEXT", 1, &E_GL_EXT_shadow_samplers);
  7123. }
  7124. if (spvVersion.vulkan > 0) {
  7125. symbolTable.setVariableExtensions("gl_ScopeDevice", 1, &E_GL_KHR_memory_scope_semantics);
  7126. symbolTable.setVariableExtensions("gl_ScopeWorkgroup", 1, &E_GL_KHR_memory_scope_semantics);
  7127. symbolTable.setVariableExtensions("gl_ScopeSubgroup", 1, &E_GL_KHR_memory_scope_semantics);
  7128. symbolTable.setVariableExtensions("gl_ScopeInvocation", 1, &E_GL_KHR_memory_scope_semantics);
  7129. symbolTable.setVariableExtensions("gl_SemanticsRelaxed", 1, &E_GL_KHR_memory_scope_semantics);
  7130. symbolTable.setVariableExtensions("gl_SemanticsAcquire", 1, &E_GL_KHR_memory_scope_semantics);
  7131. symbolTable.setVariableExtensions("gl_SemanticsRelease", 1, &E_GL_KHR_memory_scope_semantics);
  7132. symbolTable.setVariableExtensions("gl_SemanticsAcquireRelease", 1, &E_GL_KHR_memory_scope_semantics);
  7133. symbolTable.setVariableExtensions("gl_SemanticsMakeAvailable", 1, &E_GL_KHR_memory_scope_semantics);
  7134. symbolTable.setVariableExtensions("gl_SemanticsMakeVisible", 1, &E_GL_KHR_memory_scope_semantics);
  7135. symbolTable.setVariableExtensions("gl_SemanticsVolatile", 1, &E_GL_KHR_memory_scope_semantics);
  7136. symbolTable.setVariableExtensions("gl_StorageSemanticsNone", 1, &E_GL_KHR_memory_scope_semantics);
  7137. symbolTable.setVariableExtensions("gl_StorageSemanticsBuffer", 1, &E_GL_KHR_memory_scope_semantics);
  7138. symbolTable.setVariableExtensions("gl_StorageSemanticsShared", 1, &E_GL_KHR_memory_scope_semantics);
  7139. symbolTable.setVariableExtensions("gl_StorageSemanticsImage", 1, &E_GL_KHR_memory_scope_semantics);
  7140. symbolTable.setVariableExtensions("gl_StorageSemanticsOutput", 1, &E_GL_KHR_memory_scope_semantics);
  7141. }
  7142. symbolTable.setFunctionExtensions("helperInvocationEXT", 1, &E_GL_EXT_demote_to_helper_invocation);
  7143. if ((profile == EEsProfile && version >= 310) ||
  7144. (profile != EEsProfile && version >= 450)) {
  7145. symbolTable.setVariableExtensions("gl_ShadingRateEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7146. BuiltInVariable("gl_ShadingRateEXT", EbvShadingRateKHR, symbolTable);
  7147. symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7148. symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7149. symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7150. symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7151. }
  7152. #endif // !GLSLANG_WEB
  7153. break;
  7154. case EShLangCompute:
  7155. BuiltInVariable("gl_NumWorkGroups", EbvNumWorkGroups, symbolTable);
  7156. BuiltInVariable("gl_WorkGroupSize", EbvWorkGroupSize, symbolTable);
  7157. BuiltInVariable("gl_WorkGroupID", EbvWorkGroupId, symbolTable);
  7158. BuiltInVariable("gl_LocalInvocationID", EbvLocalInvocationId, symbolTable);
  7159. BuiltInVariable("gl_GlobalInvocationID", EbvGlobalInvocationId, symbolTable);
  7160. BuiltInVariable("gl_LocalInvocationIndex", EbvLocalInvocationIndex, symbolTable);
  7161. BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
  7162. BuiltInVariable("gl_ViewIndex", EbvViewIndex, symbolTable);
  7163. #ifndef GLSLANG_WEB
  7164. if ((profile != EEsProfile && version >= 140) ||
  7165. (profile == EEsProfile && version >= 310)) {
  7166. symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
  7167. symbolTable.setVariableExtensions("gl_ViewIndex", 1, &E_GL_EXT_multiview);
  7168. }
  7169. if (profile != EEsProfile && version < 430) {
  7170. symbolTable.setVariableExtensions("gl_NumWorkGroups", 1, &E_GL_ARB_compute_shader);
  7171. symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_ARB_compute_shader);
  7172. symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_ARB_compute_shader);
  7173. symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_ARB_compute_shader);
  7174. symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_ARB_compute_shader);
  7175. symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_ARB_compute_shader);
  7176. symbolTable.setVariableExtensions("gl_MaxComputeWorkGroupCount", 1, &E_GL_ARB_compute_shader);
  7177. symbolTable.setVariableExtensions("gl_MaxComputeWorkGroupSize", 1, &E_GL_ARB_compute_shader);
  7178. symbolTable.setVariableExtensions("gl_MaxComputeUniformComponents", 1, &E_GL_ARB_compute_shader);
  7179. symbolTable.setVariableExtensions("gl_MaxComputeTextureImageUnits", 1, &E_GL_ARB_compute_shader);
  7180. symbolTable.setVariableExtensions("gl_MaxComputeImageUniforms", 1, &E_GL_ARB_compute_shader);
  7181. symbolTable.setVariableExtensions("gl_MaxComputeAtomicCounters", 1, &E_GL_ARB_compute_shader);
  7182. symbolTable.setVariableExtensions("gl_MaxComputeAtomicCounterBuffers", 1, &E_GL_ARB_compute_shader);
  7183. symbolTable.setFunctionExtensions("barrier", 1, &E_GL_ARB_compute_shader);
  7184. symbolTable.setFunctionExtensions("memoryBarrierAtomicCounter", 1, &E_GL_ARB_compute_shader);
  7185. symbolTable.setFunctionExtensions("memoryBarrierBuffer", 1, &E_GL_ARB_compute_shader);
  7186. symbolTable.setFunctionExtensions("memoryBarrierImage", 1, &E_GL_ARB_compute_shader);
  7187. symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_ARB_compute_shader);
  7188. symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_ARB_compute_shader);
  7189. }
  7190. symbolTable.setFunctionExtensions("controlBarrier", 1, &E_GL_KHR_memory_scope_semantics);
  7191. symbolTable.setFunctionExtensions("debugPrintfEXT", 1, &E_GL_EXT_debug_printf);
  7192. // GL_ARB_shader_ballot
  7193. if (profile != EEsProfile) {
  7194. symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
  7195. symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
  7196. symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
  7197. symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7198. symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7199. symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7200. symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7201. BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
  7202. BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
  7203. BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
  7204. BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
  7205. BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
  7206. BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
  7207. if (spvVersion.vulkan > 0)
  7208. // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
  7209. SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  7210. else
  7211. BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
  7212. }
  7213. // GL_KHR_shader_subgroup
  7214. if ((profile == EEsProfile && version >= 310) ||
  7215. (profile != EEsProfile && version >= 140)) {
  7216. symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
  7217. symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
  7218. symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7219. symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7220. symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7221. symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7222. symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7223. BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
  7224. BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
  7225. BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
  7226. BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
  7227. BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
  7228. BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
  7229. BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
  7230. // GL_NV_shader_sm_builtins
  7231. symbolTable.setVariableExtensions("gl_WarpsPerSMNV", 1, &E_GL_NV_shader_sm_builtins);
  7232. symbolTable.setVariableExtensions("gl_SMCountNV", 1, &E_GL_NV_shader_sm_builtins);
  7233. symbolTable.setVariableExtensions("gl_WarpIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7234. symbolTable.setVariableExtensions("gl_SMIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7235. BuiltInVariable("gl_WarpsPerSMNV", EbvWarpsPerSM, symbolTable);
  7236. BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable);
  7237. BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
  7238. BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
  7239. }
  7240. // GL_KHR_shader_subgroup
  7241. if ((profile == EEsProfile && version >= 310) ||
  7242. (profile != EEsProfile && version >= 140)) {
  7243. symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
  7244. symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
  7245. BuiltInVariable("gl_NumSubgroups", EbvNumSubgroups, symbolTable);
  7246. BuiltInVariable("gl_SubgroupID", EbvSubgroupID, symbolTable);
  7247. symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
  7248. }
  7249. {
  7250. const char *coopExt[2] = { E_GL_NV_cooperative_matrix, E_GL_NV_integer_cooperative_matrix };
  7251. symbolTable.setFunctionExtensions("coopMatLoadNV", 2, coopExt);
  7252. symbolTable.setFunctionExtensions("coopMatStoreNV", 2, coopExt);
  7253. symbolTable.setFunctionExtensions("coopMatMulAddNV", 2, coopExt);
  7254. }
  7255. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  7256. symbolTable.setFunctionExtensions("dFdx", 1, &E_GL_NV_compute_shader_derivatives);
  7257. symbolTable.setFunctionExtensions("dFdy", 1, &E_GL_NV_compute_shader_derivatives);
  7258. symbolTable.setFunctionExtensions("fwidth", 1, &E_GL_NV_compute_shader_derivatives);
  7259. symbolTable.setFunctionExtensions("dFdxFine", 1, &E_GL_NV_compute_shader_derivatives);
  7260. symbolTable.setFunctionExtensions("dFdyFine", 1, &E_GL_NV_compute_shader_derivatives);
  7261. symbolTable.setFunctionExtensions("fwidthFine", 1, &E_GL_NV_compute_shader_derivatives);
  7262. symbolTable.setFunctionExtensions("dFdxCoarse", 1, &E_GL_NV_compute_shader_derivatives);
  7263. symbolTable.setFunctionExtensions("dFdyCoarse", 1, &E_GL_NV_compute_shader_derivatives);
  7264. symbolTable.setFunctionExtensions("fwidthCoarse", 1, &E_GL_NV_compute_shader_derivatives);
  7265. }
  7266. if ((profile == EEsProfile && version >= 310) ||
  7267. (profile != EEsProfile && version >= 450)) {
  7268. symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7269. symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7270. symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7271. symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7272. }
  7273. #endif // !GLSLANG_WEB
  7274. break;
  7275. #if !defined(GLSLANG_WEB) && !defined(GLSLANG_ANGLE)
  7276. case EShLangRayGen:
  7277. case EShLangIntersect:
  7278. case EShLangAnyHit:
  7279. case EShLangClosestHit:
  7280. case EShLangMiss:
  7281. case EShLangCallable:
  7282. if (profile != EEsProfile && version >= 460) {
  7283. const char *rtexts[] = { E_GL_NV_ray_tracing, E_GL_EXT_ray_tracing };
  7284. symbolTable.setVariableExtensions("gl_LaunchIDNV", 1, &E_GL_NV_ray_tracing);
  7285. symbolTable.setVariableExtensions("gl_LaunchIDEXT", 1, &E_GL_EXT_ray_tracing);
  7286. symbolTable.setVariableExtensions("gl_LaunchSizeNV", 1, &E_GL_NV_ray_tracing);
  7287. symbolTable.setVariableExtensions("gl_LaunchSizeEXT", 1, &E_GL_EXT_ray_tracing);
  7288. symbolTable.setVariableExtensions("gl_PrimitiveID", 2, rtexts);
  7289. symbolTable.setVariableExtensions("gl_InstanceID", 2, rtexts);
  7290. symbolTable.setVariableExtensions("gl_InstanceCustomIndexNV", 1, &E_GL_NV_ray_tracing);
  7291. symbolTable.setVariableExtensions("gl_InstanceCustomIndexEXT", 1, &E_GL_EXT_ray_tracing);
  7292. symbolTable.setVariableExtensions("gl_GeometryIndexEXT", 1, &E_GL_EXT_ray_tracing);
  7293. symbolTable.setVariableExtensions("gl_WorldRayOriginNV", 1, &E_GL_NV_ray_tracing);
  7294. symbolTable.setVariableExtensions("gl_WorldRayOriginEXT", 1, &E_GL_EXT_ray_tracing);
  7295. symbolTable.setVariableExtensions("gl_WorldRayDirectionNV", 1, &E_GL_NV_ray_tracing);
  7296. symbolTable.setVariableExtensions("gl_WorldRayDirectionEXT", 1, &E_GL_EXT_ray_tracing);
  7297. symbolTable.setVariableExtensions("gl_ObjectRayOriginNV", 1, &E_GL_NV_ray_tracing);
  7298. symbolTable.setVariableExtensions("gl_ObjectRayOriginEXT", 1, &E_GL_EXT_ray_tracing);
  7299. symbolTable.setVariableExtensions("gl_ObjectRayDirectionNV", 1, &E_GL_NV_ray_tracing);
  7300. symbolTable.setVariableExtensions("gl_ObjectRayDirectionEXT", 1, &E_GL_EXT_ray_tracing);
  7301. symbolTable.setVariableExtensions("gl_RayTminNV", 1, &E_GL_NV_ray_tracing);
  7302. symbolTable.setVariableExtensions("gl_RayTminEXT", 1, &E_GL_EXT_ray_tracing);
  7303. symbolTable.setVariableExtensions("gl_RayTmaxNV", 1, &E_GL_NV_ray_tracing);
  7304. symbolTable.setVariableExtensions("gl_RayTmaxEXT", 1, &E_GL_EXT_ray_tracing);
  7305. symbolTable.setVariableExtensions("gl_HitTNV", 1, &E_GL_NV_ray_tracing);
  7306. symbolTable.setVariableExtensions("gl_HitTEXT", 1, &E_GL_EXT_ray_tracing);
  7307. symbolTable.setVariableExtensions("gl_HitKindNV", 1, &E_GL_NV_ray_tracing);
  7308. symbolTable.setVariableExtensions("gl_HitKindEXT", 1, &E_GL_EXT_ray_tracing);
  7309. symbolTable.setVariableExtensions("gl_ObjectToWorldNV", 1, &E_GL_NV_ray_tracing);
  7310. symbolTable.setVariableExtensions("gl_ObjectToWorldEXT", 1, &E_GL_EXT_ray_tracing);
  7311. symbolTable.setVariableExtensions("gl_ObjectToWorld3x4EXT", 1, &E_GL_EXT_ray_tracing);
  7312. symbolTable.setVariableExtensions("gl_WorldToObjectNV", 1, &E_GL_NV_ray_tracing);
  7313. symbolTable.setVariableExtensions("gl_WorldToObjectEXT", 1, &E_GL_EXT_ray_tracing);
  7314. symbolTable.setVariableExtensions("gl_WorldToObject3x4EXT", 1, &E_GL_EXT_ray_tracing);
  7315. symbolTable.setVariableExtensions("gl_IncomingRayFlagsNV", 1, &E_GL_NV_ray_tracing);
  7316. symbolTable.setVariableExtensions("gl_IncomingRayFlagsEXT", 1, &E_GL_EXT_ray_tracing);
  7317. symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
  7318. symbolTable.setFunctionExtensions("traceNV", 1, &E_GL_NV_ray_tracing);
  7319. symbolTable.setFunctionExtensions("traceRayEXT", 1, &E_GL_EXT_ray_tracing);
  7320. symbolTable.setFunctionExtensions("reportIntersectionNV", 1, &E_GL_NV_ray_tracing);
  7321. symbolTable.setFunctionExtensions("reportIntersectionEXT", 1, &E_GL_EXT_ray_tracing);
  7322. symbolTable.setFunctionExtensions("ignoreIntersectionNV", 1, &E_GL_NV_ray_tracing);
  7323. symbolTable.setFunctionExtensions("terminateRayNV", 1, &E_GL_NV_ray_tracing);
  7324. symbolTable.setFunctionExtensions("executeCallableNV", 1, &E_GL_NV_ray_tracing);
  7325. symbolTable.setFunctionExtensions("executeCallableEXT", 1, &E_GL_EXT_ray_tracing);
  7326. BuiltInVariable("gl_LaunchIDNV", EbvLaunchId, symbolTable);
  7327. BuiltInVariable("gl_LaunchIDEXT", EbvLaunchId, symbolTable);
  7328. BuiltInVariable("gl_LaunchSizeNV", EbvLaunchSize, symbolTable);
  7329. BuiltInVariable("gl_LaunchSizeEXT", EbvLaunchSize, symbolTable);
  7330. BuiltInVariable("gl_PrimitiveID", EbvPrimitiveId, symbolTable);
  7331. BuiltInVariable("gl_InstanceID", EbvInstanceId, symbolTable);
  7332. BuiltInVariable("gl_InstanceCustomIndexNV", EbvInstanceCustomIndex,symbolTable);
  7333. BuiltInVariable("gl_InstanceCustomIndexEXT", EbvInstanceCustomIndex,symbolTable);
  7334. BuiltInVariable("gl_GeometryIndexEXT", EbvGeometryIndex, symbolTable);
  7335. BuiltInVariable("gl_WorldRayOriginNV", EbvWorldRayOrigin, symbolTable);
  7336. BuiltInVariable("gl_WorldRayOriginEXT", EbvWorldRayOrigin, symbolTable);
  7337. BuiltInVariable("gl_WorldRayDirectionNV", EbvWorldRayDirection, symbolTable);
  7338. BuiltInVariable("gl_WorldRayDirectionEXT", EbvWorldRayDirection, symbolTable);
  7339. BuiltInVariable("gl_ObjectRayOriginNV", EbvObjectRayOrigin, symbolTable);
  7340. BuiltInVariable("gl_ObjectRayOriginEXT", EbvObjectRayOrigin, symbolTable);
  7341. BuiltInVariable("gl_ObjectRayDirectionNV", EbvObjectRayDirection, symbolTable);
  7342. BuiltInVariable("gl_ObjectRayDirectionEXT", EbvObjectRayDirection, symbolTable);
  7343. BuiltInVariable("gl_RayTminNV", EbvRayTmin, symbolTable);
  7344. BuiltInVariable("gl_RayTminEXT", EbvRayTmin, symbolTable);
  7345. BuiltInVariable("gl_RayTmaxNV", EbvRayTmax, symbolTable);
  7346. BuiltInVariable("gl_RayTmaxEXT", EbvRayTmax, symbolTable);
  7347. BuiltInVariable("gl_HitTNV", EbvHitT, symbolTable);
  7348. BuiltInVariable("gl_HitTEXT", EbvHitT, symbolTable);
  7349. BuiltInVariable("gl_HitKindNV", EbvHitKind, symbolTable);
  7350. BuiltInVariable("gl_HitKindEXT", EbvHitKind, symbolTable);
  7351. BuiltInVariable("gl_ObjectToWorldNV", EbvObjectToWorld, symbolTable);
  7352. BuiltInVariable("gl_ObjectToWorldEXT", EbvObjectToWorld, symbolTable);
  7353. BuiltInVariable("gl_ObjectToWorld3x4EXT", EbvObjectToWorld3x4, symbolTable);
  7354. BuiltInVariable("gl_WorldToObjectNV", EbvWorldToObject, symbolTable);
  7355. BuiltInVariable("gl_WorldToObjectEXT", EbvWorldToObject, symbolTable);
  7356. BuiltInVariable("gl_WorldToObject3x4EXT", EbvWorldToObject3x4, symbolTable);
  7357. BuiltInVariable("gl_IncomingRayFlagsNV", EbvIncomingRayFlags, symbolTable);
  7358. BuiltInVariable("gl_IncomingRayFlagsEXT", EbvIncomingRayFlags, symbolTable);
  7359. BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
  7360. // GL_ARB_shader_ballot
  7361. symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
  7362. symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
  7363. symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
  7364. symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7365. symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7366. symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7367. symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7368. BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
  7369. BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
  7370. BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
  7371. BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
  7372. BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
  7373. BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
  7374. if (spvVersion.vulkan > 0)
  7375. // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
  7376. SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  7377. else
  7378. BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
  7379. // GL_KHR_shader_subgroup
  7380. symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
  7381. symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
  7382. symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
  7383. symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
  7384. symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7385. symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7386. symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7387. symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7388. symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7389. BuiltInVariable("gl_NumSubgroups", EbvNumSubgroups, symbolTable);
  7390. BuiltInVariable("gl_SubgroupID", EbvSubgroupID, symbolTable);
  7391. BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
  7392. BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
  7393. BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
  7394. BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
  7395. BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
  7396. BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
  7397. BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
  7398. // GL_NV_shader_sm_builtins
  7399. symbolTable.setVariableExtensions("gl_WarpsPerSMNV", 1, &E_GL_NV_shader_sm_builtins);
  7400. symbolTable.setVariableExtensions("gl_SMCountNV", 1, &E_GL_NV_shader_sm_builtins);
  7401. symbolTable.setVariableExtensions("gl_WarpIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7402. symbolTable.setVariableExtensions("gl_SMIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7403. BuiltInVariable("gl_WarpsPerSMNV", EbvWarpsPerSM, symbolTable);
  7404. BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable);
  7405. BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
  7406. BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
  7407. }
  7408. if ((profile == EEsProfile && version >= 310) ||
  7409. (profile != EEsProfile && version >= 450)) {
  7410. symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7411. symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7412. symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7413. symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7414. }
  7415. break;
  7416. case EShLangMeshNV:
  7417. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  7418. // per-vertex builtins
  7419. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_Position", 1, &E_GL_NV_mesh_shader);
  7420. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_PointSize", 1, &E_GL_NV_mesh_shader);
  7421. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_ClipDistance", 1, &E_GL_NV_mesh_shader);
  7422. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_CullDistance", 1, &E_GL_NV_mesh_shader);
  7423. BuiltInVariable("gl_MeshVerticesNV", "gl_Position", EbvPosition, symbolTable);
  7424. BuiltInVariable("gl_MeshVerticesNV", "gl_PointSize", EbvPointSize, symbolTable);
  7425. BuiltInVariable("gl_MeshVerticesNV", "gl_ClipDistance", EbvClipDistance, symbolTable);
  7426. BuiltInVariable("gl_MeshVerticesNV", "gl_CullDistance", EbvCullDistance, symbolTable);
  7427. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_PositionPerViewNV", 1, &E_GL_NV_mesh_shader);
  7428. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_ClipDistancePerViewNV", 1, &E_GL_NV_mesh_shader);
  7429. symbolTable.setVariableExtensions("gl_MeshVerticesNV", "gl_CullDistancePerViewNV", 1, &E_GL_NV_mesh_shader);
  7430. BuiltInVariable("gl_MeshVerticesNV", "gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
  7431. BuiltInVariable("gl_MeshVerticesNV", "gl_ClipDistancePerViewNV", EbvClipDistancePerViewNV, symbolTable);
  7432. BuiltInVariable("gl_MeshVerticesNV", "gl_CullDistancePerViewNV", EbvCullDistancePerViewNV, symbolTable);
  7433. // per-primitive builtins
  7434. symbolTable.setVariableExtensions("gl_MeshPrimitivesNV", "gl_PrimitiveID", 1, &E_GL_NV_mesh_shader);
  7435. symbolTable.setVariableExtensions("gl_MeshPrimitivesNV", "gl_Layer", 1, &E_GL_NV_mesh_shader);
  7436. symbolTable.setVariableExtensions("gl_MeshPrimitivesNV", "gl_ViewportIndex", 1, &E_GL_NV_mesh_shader);
  7437. symbolTable.setVariableExtensions("gl_MeshPrimitivesNV", "gl_ViewportMask", 1, &E_GL_NV_mesh_shader);
  7438. BuiltInVariable("gl_MeshPrimitivesNV", "gl_PrimitiveID", EbvPrimitiveId, symbolTable);
  7439. BuiltInVariable("gl_MeshPrimitivesNV", "gl_Layer", EbvLayer, symbolTable);
  7440. BuiltInVariable("gl_MeshPrimitivesNV", "gl_ViewportIndex", EbvViewportIndex, symbolTable);
  7441. BuiltInVariable("gl_MeshPrimitivesNV", "gl_ViewportMask", EbvViewportMaskNV, symbolTable);
  7442. // per-view per-primitive builtins
  7443. symbolTable.setVariableExtensions("gl_MeshPrimitivesNV", "gl_LayerPerViewNV", 1, &E_GL_NV_mesh_shader);
  7444. symbolTable.setVariableExtensions("gl_MeshPrimitivesNV", "gl_ViewportMaskPerViewNV", 1, &E_GL_NV_mesh_shader);
  7445. BuiltInVariable("gl_MeshPrimitivesNV", "gl_LayerPerViewNV", EbvLayerPerViewNV, symbolTable);
  7446. BuiltInVariable("gl_MeshPrimitivesNV", "gl_ViewportMaskPerViewNV", EbvViewportMaskPerViewNV, symbolTable);
  7447. // other builtins
  7448. symbolTable.setVariableExtensions("gl_PrimitiveCountNV", 1, &E_GL_NV_mesh_shader);
  7449. symbolTable.setVariableExtensions("gl_PrimitiveIndicesNV", 1, &E_GL_NV_mesh_shader);
  7450. symbolTable.setVariableExtensions("gl_MeshViewCountNV", 1, &E_GL_NV_mesh_shader);
  7451. symbolTable.setVariableExtensions("gl_MeshViewIndicesNV", 1, &E_GL_NV_mesh_shader);
  7452. symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader);
  7453. symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader);
  7454. symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_NV_mesh_shader);
  7455. symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_NV_mesh_shader);
  7456. symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader);
  7457. BuiltInVariable("gl_PrimitiveCountNV", EbvPrimitiveCountNV, symbolTable);
  7458. BuiltInVariable("gl_PrimitiveIndicesNV", EbvPrimitiveIndicesNV, symbolTable);
  7459. BuiltInVariable("gl_MeshViewCountNV", EbvMeshViewCountNV, symbolTable);
  7460. BuiltInVariable("gl_MeshViewIndicesNV", EbvMeshViewIndicesNV, symbolTable);
  7461. BuiltInVariable("gl_WorkGroupSize", EbvWorkGroupSize, symbolTable);
  7462. BuiltInVariable("gl_WorkGroupID", EbvWorkGroupId, symbolTable);
  7463. BuiltInVariable("gl_LocalInvocationID", EbvLocalInvocationId, symbolTable);
  7464. BuiltInVariable("gl_GlobalInvocationID", EbvGlobalInvocationId, symbolTable);
  7465. BuiltInVariable("gl_LocalInvocationIndex", EbvLocalInvocationIndex, symbolTable);
  7466. // builtin constants
  7467. symbolTable.setVariableExtensions("gl_MaxMeshOutputVerticesNV", 1, &E_GL_NV_mesh_shader);
  7468. symbolTable.setVariableExtensions("gl_MaxMeshOutputPrimitivesNV", 1, &E_GL_NV_mesh_shader);
  7469. symbolTable.setVariableExtensions("gl_MaxMeshWorkGroupSizeNV", 1, &E_GL_NV_mesh_shader);
  7470. symbolTable.setVariableExtensions("gl_MaxMeshViewCountNV", 1, &E_GL_NV_mesh_shader);
  7471. // builtin functions
  7472. symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader);
  7473. symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader);
  7474. symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader);
  7475. }
  7476. if (profile != EEsProfile && version >= 450) {
  7477. // GL_EXT_device_group
  7478. symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
  7479. BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
  7480. // GL_ARB_shader_draw_parameters
  7481. symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters);
  7482. BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable);
  7483. if (version >= 460) {
  7484. BuiltInVariable("gl_DrawID", EbvDrawId, symbolTable);
  7485. }
  7486. // GL_ARB_shader_ballot
  7487. symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
  7488. symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
  7489. symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
  7490. symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7491. symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7492. symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7493. symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7494. BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
  7495. BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
  7496. BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
  7497. BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
  7498. BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
  7499. BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
  7500. if (spvVersion.vulkan > 0)
  7501. // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
  7502. SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  7503. else
  7504. BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
  7505. }
  7506. // GL_KHR_shader_subgroup
  7507. if ((profile == EEsProfile && version >= 310) ||
  7508. (profile != EEsProfile && version >= 140)) {
  7509. symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
  7510. symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
  7511. symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
  7512. symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
  7513. symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7514. symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7515. symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7516. symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7517. symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7518. BuiltInVariable("gl_NumSubgroups", EbvNumSubgroups, symbolTable);
  7519. BuiltInVariable("gl_SubgroupID", EbvSubgroupID, symbolTable);
  7520. BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
  7521. BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
  7522. BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
  7523. BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
  7524. BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
  7525. BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
  7526. BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
  7527. symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
  7528. // GL_NV_shader_sm_builtins
  7529. symbolTable.setVariableExtensions("gl_WarpsPerSMNV", 1, &E_GL_NV_shader_sm_builtins);
  7530. symbolTable.setVariableExtensions("gl_SMCountNV", 1, &E_GL_NV_shader_sm_builtins);
  7531. symbolTable.setVariableExtensions("gl_WarpIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7532. symbolTable.setVariableExtensions("gl_SMIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7533. BuiltInVariable("gl_WarpsPerSMNV", EbvWarpsPerSM, symbolTable);
  7534. BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable);
  7535. BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
  7536. BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
  7537. }
  7538. if ((profile == EEsProfile && version >= 310) ||
  7539. (profile != EEsProfile && version >= 450)) {
  7540. symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7541. symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7542. symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7543. symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7544. }
  7545. break;
  7546. case EShLangTaskNV:
  7547. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  7548. symbolTable.setVariableExtensions("gl_TaskCountNV", 1, &E_GL_NV_mesh_shader);
  7549. symbolTable.setVariableExtensions("gl_WorkGroupSize", 1, &E_GL_NV_mesh_shader);
  7550. symbolTable.setVariableExtensions("gl_WorkGroupID", 1, &E_GL_NV_mesh_shader);
  7551. symbolTable.setVariableExtensions("gl_LocalInvocationID", 1, &E_GL_NV_mesh_shader);
  7552. symbolTable.setVariableExtensions("gl_GlobalInvocationID", 1, &E_GL_NV_mesh_shader);
  7553. symbolTable.setVariableExtensions("gl_LocalInvocationIndex", 1, &E_GL_NV_mesh_shader);
  7554. symbolTable.setVariableExtensions("gl_MeshViewCountNV", 1, &E_GL_NV_mesh_shader);
  7555. symbolTable.setVariableExtensions("gl_MeshViewIndicesNV", 1, &E_GL_NV_mesh_shader);
  7556. BuiltInVariable("gl_TaskCountNV", EbvTaskCountNV, symbolTable);
  7557. BuiltInVariable("gl_WorkGroupSize", EbvWorkGroupSize, symbolTable);
  7558. BuiltInVariable("gl_WorkGroupID", EbvWorkGroupId, symbolTable);
  7559. BuiltInVariable("gl_LocalInvocationID", EbvLocalInvocationId, symbolTable);
  7560. BuiltInVariable("gl_GlobalInvocationID", EbvGlobalInvocationId, symbolTable);
  7561. BuiltInVariable("gl_LocalInvocationIndex", EbvLocalInvocationIndex, symbolTable);
  7562. BuiltInVariable("gl_MeshViewCountNV", EbvMeshViewCountNV, symbolTable);
  7563. BuiltInVariable("gl_MeshViewIndicesNV", EbvMeshViewIndicesNV, symbolTable);
  7564. symbolTable.setVariableExtensions("gl_MaxTaskWorkGroupSizeNV", 1, &E_GL_NV_mesh_shader);
  7565. symbolTable.setVariableExtensions("gl_MaxMeshViewCountNV", 1, &E_GL_NV_mesh_shader);
  7566. symbolTable.setFunctionExtensions("barrier", 1, &E_GL_NV_mesh_shader);
  7567. symbolTable.setFunctionExtensions("memoryBarrierShared", 1, &E_GL_NV_mesh_shader);
  7568. symbolTable.setFunctionExtensions("groupMemoryBarrier", 1, &E_GL_NV_mesh_shader);
  7569. }
  7570. if (profile != EEsProfile && version >= 450) {
  7571. // GL_EXT_device_group
  7572. symbolTable.setVariableExtensions("gl_DeviceIndex", 1, &E_GL_EXT_device_group);
  7573. BuiltInVariable("gl_DeviceIndex", EbvDeviceIndex, symbolTable);
  7574. // GL_ARB_shader_draw_parameters
  7575. symbolTable.setVariableExtensions("gl_DrawIDARB", 1, &E_GL_ARB_shader_draw_parameters);
  7576. BuiltInVariable("gl_DrawIDARB", EbvDrawId, symbolTable);
  7577. if (version >= 460) {
  7578. BuiltInVariable("gl_DrawID", EbvDrawId, symbolTable);
  7579. }
  7580. // GL_ARB_shader_ballot
  7581. symbolTable.setVariableExtensions("gl_SubGroupSizeARB", 1, &E_GL_ARB_shader_ballot);
  7582. symbolTable.setVariableExtensions("gl_SubGroupInvocationARB", 1, &E_GL_ARB_shader_ballot);
  7583. symbolTable.setVariableExtensions("gl_SubGroupEqMaskARB", 1, &E_GL_ARB_shader_ballot);
  7584. symbolTable.setVariableExtensions("gl_SubGroupGeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7585. symbolTable.setVariableExtensions("gl_SubGroupGtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7586. symbolTable.setVariableExtensions("gl_SubGroupLeMaskARB", 1, &E_GL_ARB_shader_ballot);
  7587. symbolTable.setVariableExtensions("gl_SubGroupLtMaskARB", 1, &E_GL_ARB_shader_ballot);
  7588. BuiltInVariable("gl_SubGroupInvocationARB", EbvSubGroupInvocation, symbolTable);
  7589. BuiltInVariable("gl_SubGroupEqMaskARB", EbvSubGroupEqMask, symbolTable);
  7590. BuiltInVariable("gl_SubGroupGeMaskARB", EbvSubGroupGeMask, symbolTable);
  7591. BuiltInVariable("gl_SubGroupGtMaskARB", EbvSubGroupGtMask, symbolTable);
  7592. BuiltInVariable("gl_SubGroupLeMaskARB", EbvSubGroupLeMask, symbolTable);
  7593. BuiltInVariable("gl_SubGroupLtMaskARB", EbvSubGroupLtMask, symbolTable);
  7594. if (spvVersion.vulkan > 0)
  7595. // Treat "gl_SubGroupSizeARB" as shader input instead of uniform for Vulkan
  7596. SpecialQualifier("gl_SubGroupSizeARB", EvqVaryingIn, EbvSubGroupSize, symbolTable);
  7597. else
  7598. BuiltInVariable("gl_SubGroupSizeARB", EbvSubGroupSize, symbolTable);
  7599. }
  7600. // GL_KHR_shader_subgroup
  7601. if ((profile == EEsProfile && version >= 310) ||
  7602. (profile != EEsProfile && version >= 140)) {
  7603. symbolTable.setVariableExtensions("gl_NumSubgroups", 1, &E_GL_KHR_shader_subgroup_basic);
  7604. symbolTable.setVariableExtensions("gl_SubgroupID", 1, &E_GL_KHR_shader_subgroup_basic);
  7605. symbolTable.setVariableExtensions("gl_SubgroupSize", 1, &E_GL_KHR_shader_subgroup_basic);
  7606. symbolTable.setVariableExtensions("gl_SubgroupInvocationID", 1, &E_GL_KHR_shader_subgroup_basic);
  7607. symbolTable.setVariableExtensions("gl_SubgroupEqMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7608. symbolTable.setVariableExtensions("gl_SubgroupGeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7609. symbolTable.setVariableExtensions("gl_SubgroupGtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7610. symbolTable.setVariableExtensions("gl_SubgroupLeMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7611. symbolTable.setVariableExtensions("gl_SubgroupLtMask", 1, &E_GL_KHR_shader_subgroup_ballot);
  7612. BuiltInVariable("gl_NumSubgroups", EbvNumSubgroups, symbolTable);
  7613. BuiltInVariable("gl_SubgroupID", EbvSubgroupID, symbolTable);
  7614. BuiltInVariable("gl_SubgroupSize", EbvSubgroupSize2, symbolTable);
  7615. BuiltInVariable("gl_SubgroupInvocationID", EbvSubgroupInvocation2, symbolTable);
  7616. BuiltInVariable("gl_SubgroupEqMask", EbvSubgroupEqMask2, symbolTable);
  7617. BuiltInVariable("gl_SubgroupGeMask", EbvSubgroupGeMask2, symbolTable);
  7618. BuiltInVariable("gl_SubgroupGtMask", EbvSubgroupGtMask2, symbolTable);
  7619. BuiltInVariable("gl_SubgroupLeMask", EbvSubgroupLeMask2, symbolTable);
  7620. BuiltInVariable("gl_SubgroupLtMask", EbvSubgroupLtMask2, symbolTable);
  7621. symbolTable.setFunctionExtensions("subgroupMemoryBarrierShared", 1, &E_GL_KHR_shader_subgroup_basic);
  7622. // GL_NV_shader_sm_builtins
  7623. symbolTable.setVariableExtensions("gl_WarpsPerSMNV", 1, &E_GL_NV_shader_sm_builtins);
  7624. symbolTable.setVariableExtensions("gl_SMCountNV", 1, &E_GL_NV_shader_sm_builtins);
  7625. symbolTable.setVariableExtensions("gl_WarpIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7626. symbolTable.setVariableExtensions("gl_SMIDNV", 1, &E_GL_NV_shader_sm_builtins);
  7627. BuiltInVariable("gl_WarpsPerSMNV", EbvWarpsPerSM, symbolTable);
  7628. BuiltInVariable("gl_SMCountNV", EbvSMCount, symbolTable);
  7629. BuiltInVariable("gl_WarpIDNV", EbvWarpID, symbolTable);
  7630. BuiltInVariable("gl_SMIDNV", EbvSMID, symbolTable);
  7631. }
  7632. if ((profile == EEsProfile && version >= 310) ||
  7633. (profile != EEsProfile && version >= 450)) {
  7634. symbolTable.setVariableExtensions("gl_ShadingRateFlag2VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7635. symbolTable.setVariableExtensions("gl_ShadingRateFlag4VerticalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7636. symbolTable.setVariableExtensions("gl_ShadingRateFlag2HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7637. symbolTable.setVariableExtensions("gl_ShadingRateFlag4HorizontalPixelsEXT", 1, &E_GL_EXT_fragment_shading_rate);
  7638. }
  7639. break;
  7640. #endif
  7641. default:
  7642. assert(false && "Language not supported");
  7643. break;
  7644. }
  7645. //
  7646. // Next, identify which built-ins have a mapping to an operator.
  7647. // If PureOperatorBuiltins is false, those that are not identified as such are
  7648. // expected to be resolved through a library of functions, versus as
  7649. // operations.
  7650. //
  7651. relateTabledBuiltins(version, profile, spvVersion, language, symbolTable);
  7652. #ifndef GLSLANG_WEB
  7653. symbolTable.relateToOperator("doubleBitsToInt64", EOpDoubleBitsToInt64);
  7654. symbolTable.relateToOperator("doubleBitsToUint64", EOpDoubleBitsToUint64);
  7655. symbolTable.relateToOperator("int64BitsToDouble", EOpInt64BitsToDouble);
  7656. symbolTable.relateToOperator("uint64BitsToDouble", EOpUint64BitsToDouble);
  7657. symbolTable.relateToOperator("halfBitsToInt16", EOpFloat16BitsToInt16);
  7658. symbolTable.relateToOperator("halfBitsToUint16", EOpFloat16BitsToUint16);
  7659. symbolTable.relateToOperator("float16BitsToInt16", EOpFloat16BitsToInt16);
  7660. symbolTable.relateToOperator("float16BitsToUint16", EOpFloat16BitsToUint16);
  7661. symbolTable.relateToOperator("int16BitsToFloat16", EOpInt16BitsToFloat16);
  7662. symbolTable.relateToOperator("uint16BitsToFloat16", EOpUint16BitsToFloat16);
  7663. symbolTable.relateToOperator("int16BitsToHalf", EOpInt16BitsToFloat16);
  7664. symbolTable.relateToOperator("uint16BitsToHalf", EOpUint16BitsToFloat16);
  7665. symbolTable.relateToOperator("packSnorm4x8", EOpPackSnorm4x8);
  7666. symbolTable.relateToOperator("unpackSnorm4x8", EOpUnpackSnorm4x8);
  7667. symbolTable.relateToOperator("packUnorm4x8", EOpPackUnorm4x8);
  7668. symbolTable.relateToOperator("unpackUnorm4x8", EOpUnpackUnorm4x8);
  7669. symbolTable.relateToOperator("packDouble2x32", EOpPackDouble2x32);
  7670. symbolTable.relateToOperator("unpackDouble2x32", EOpUnpackDouble2x32);
  7671. symbolTable.relateToOperator("packInt2x32", EOpPackInt2x32);
  7672. symbolTable.relateToOperator("unpackInt2x32", EOpUnpackInt2x32);
  7673. symbolTable.relateToOperator("packUint2x32", EOpPackUint2x32);
  7674. symbolTable.relateToOperator("unpackUint2x32", EOpUnpackUint2x32);
  7675. symbolTable.relateToOperator("packInt2x16", EOpPackInt2x16);
  7676. symbolTable.relateToOperator("unpackInt2x16", EOpUnpackInt2x16);
  7677. symbolTable.relateToOperator("packUint2x16", EOpPackUint2x16);
  7678. symbolTable.relateToOperator("unpackUint2x16", EOpUnpackUint2x16);
  7679. symbolTable.relateToOperator("packInt4x16", EOpPackInt4x16);
  7680. symbolTable.relateToOperator("unpackInt4x16", EOpUnpackInt4x16);
  7681. symbolTable.relateToOperator("packUint4x16", EOpPackUint4x16);
  7682. symbolTable.relateToOperator("unpackUint4x16", EOpUnpackUint4x16);
  7683. symbolTable.relateToOperator("packFloat2x16", EOpPackFloat2x16);
  7684. symbolTable.relateToOperator("unpackFloat2x16", EOpUnpackFloat2x16);
  7685. symbolTable.relateToOperator("pack16", EOpPack16);
  7686. symbolTable.relateToOperator("pack32", EOpPack32);
  7687. symbolTable.relateToOperator("pack64", EOpPack64);
  7688. symbolTable.relateToOperator("unpack32", EOpUnpack32);
  7689. symbolTable.relateToOperator("unpack16", EOpUnpack16);
  7690. symbolTable.relateToOperator("unpack8", EOpUnpack8);
  7691. symbolTable.relateToOperator("controlBarrier", EOpBarrier);
  7692. symbolTable.relateToOperator("memoryBarrierAtomicCounter", EOpMemoryBarrierAtomicCounter);
  7693. symbolTable.relateToOperator("memoryBarrierImage", EOpMemoryBarrierImage);
  7694. symbolTable.relateToOperator("atomicLoad", EOpAtomicLoad);
  7695. symbolTable.relateToOperator("atomicStore", EOpAtomicStore);
  7696. symbolTable.relateToOperator("atomicCounterIncrement", EOpAtomicCounterIncrement);
  7697. symbolTable.relateToOperator("atomicCounterDecrement", EOpAtomicCounterDecrement);
  7698. symbolTable.relateToOperator("atomicCounter", EOpAtomicCounter);
  7699. symbolTable.relateToOperator("clockARB", EOpReadClockSubgroupKHR);
  7700. symbolTable.relateToOperator("clock2x32ARB", EOpReadClockSubgroupKHR);
  7701. symbolTable.relateToOperator("clockRealtimeEXT", EOpReadClockDeviceKHR);
  7702. symbolTable.relateToOperator("clockRealtime2x32EXT", EOpReadClockDeviceKHR);
  7703. if (profile != EEsProfile && version >= 460) {
  7704. symbolTable.relateToOperator("atomicCounterAdd", EOpAtomicCounterAdd);
  7705. symbolTable.relateToOperator("atomicCounterSubtract", EOpAtomicCounterSubtract);
  7706. symbolTable.relateToOperator("atomicCounterMin", EOpAtomicCounterMin);
  7707. symbolTable.relateToOperator("atomicCounterMax", EOpAtomicCounterMax);
  7708. symbolTable.relateToOperator("atomicCounterAnd", EOpAtomicCounterAnd);
  7709. symbolTable.relateToOperator("atomicCounterOr", EOpAtomicCounterOr);
  7710. symbolTable.relateToOperator("atomicCounterXor", EOpAtomicCounterXor);
  7711. symbolTable.relateToOperator("atomicCounterExchange", EOpAtomicCounterExchange);
  7712. symbolTable.relateToOperator("atomicCounterCompSwap", EOpAtomicCounterCompSwap);
  7713. }
  7714. symbolTable.relateToOperator("fma", EOpFma);
  7715. symbolTable.relateToOperator("frexp", EOpFrexp);
  7716. symbolTable.relateToOperator("ldexp", EOpLdexp);
  7717. symbolTable.relateToOperator("uaddCarry", EOpAddCarry);
  7718. symbolTable.relateToOperator("usubBorrow", EOpSubBorrow);
  7719. symbolTable.relateToOperator("umulExtended", EOpUMulExtended);
  7720. symbolTable.relateToOperator("imulExtended", EOpIMulExtended);
  7721. symbolTable.relateToOperator("bitfieldExtract", EOpBitfieldExtract);
  7722. symbolTable.relateToOperator("bitfieldInsert", EOpBitfieldInsert);
  7723. symbolTable.relateToOperator("bitfieldReverse", EOpBitFieldReverse);
  7724. symbolTable.relateToOperator("bitCount", EOpBitCount);
  7725. symbolTable.relateToOperator("findLSB", EOpFindLSB);
  7726. symbolTable.relateToOperator("findMSB", EOpFindMSB);
  7727. symbolTable.relateToOperator("helperInvocationEXT", EOpIsHelperInvocation);
  7728. symbolTable.relateToOperator("countLeadingZeros", EOpCountLeadingZeros);
  7729. symbolTable.relateToOperator("countTrailingZeros", EOpCountTrailingZeros);
  7730. symbolTable.relateToOperator("absoluteDifference", EOpAbsDifference);
  7731. symbolTable.relateToOperator("addSaturate", EOpAddSaturate);
  7732. symbolTable.relateToOperator("subtractSaturate", EOpSubSaturate);
  7733. symbolTable.relateToOperator("average", EOpAverage);
  7734. symbolTable.relateToOperator("averageRounded", EOpAverageRounded);
  7735. symbolTable.relateToOperator("multiply32x16", EOpMul32x16);
  7736. symbolTable.relateToOperator("debugPrintfEXT", EOpDebugPrintf);
  7737. if (PureOperatorBuiltins) {
  7738. symbolTable.relateToOperator("imageSize", EOpImageQuerySize);
  7739. symbolTable.relateToOperator("imageSamples", EOpImageQuerySamples);
  7740. symbolTable.relateToOperator("imageLoad", EOpImageLoad);
  7741. symbolTable.relateToOperator("imageStore", EOpImageStore);
  7742. symbolTable.relateToOperator("imageAtomicAdd", EOpImageAtomicAdd);
  7743. symbolTable.relateToOperator("imageAtomicMin", EOpImageAtomicMin);
  7744. symbolTable.relateToOperator("imageAtomicMax", EOpImageAtomicMax);
  7745. symbolTable.relateToOperator("imageAtomicAnd", EOpImageAtomicAnd);
  7746. symbolTable.relateToOperator("imageAtomicOr", EOpImageAtomicOr);
  7747. symbolTable.relateToOperator("imageAtomicXor", EOpImageAtomicXor);
  7748. symbolTable.relateToOperator("imageAtomicExchange", EOpImageAtomicExchange);
  7749. symbolTable.relateToOperator("imageAtomicCompSwap", EOpImageAtomicCompSwap);
  7750. symbolTable.relateToOperator("imageAtomicLoad", EOpImageAtomicLoad);
  7751. symbolTable.relateToOperator("imageAtomicStore", EOpImageAtomicStore);
  7752. symbolTable.relateToOperator("subpassLoad", EOpSubpassLoad);
  7753. symbolTable.relateToOperator("subpassLoadMS", EOpSubpassLoadMS);
  7754. symbolTable.relateToOperator("textureGather", EOpTextureGather);
  7755. symbolTable.relateToOperator("textureGatherOffset", EOpTextureGatherOffset);
  7756. symbolTable.relateToOperator("textureGatherOffsets", EOpTextureGatherOffsets);
  7757. symbolTable.relateToOperator("noise1", EOpNoise);
  7758. symbolTable.relateToOperator("noise2", EOpNoise);
  7759. symbolTable.relateToOperator("noise3", EOpNoise);
  7760. symbolTable.relateToOperator("noise4", EOpNoise);
  7761. symbolTable.relateToOperator("textureFootprintNV", EOpImageSampleFootprintNV);
  7762. symbolTable.relateToOperator("textureFootprintClampNV", EOpImageSampleFootprintClampNV);
  7763. symbolTable.relateToOperator("textureFootprintLodNV", EOpImageSampleFootprintLodNV);
  7764. symbolTable.relateToOperator("textureFootprintGradNV", EOpImageSampleFootprintGradNV);
  7765. symbolTable.relateToOperator("textureFootprintGradClampNV", EOpImageSampleFootprintGradClampNV);
  7766. if (spvVersion.spv == 0 && IncludeLegacy(version, profile, spvVersion))
  7767. symbolTable.relateToOperator("ftransform", EOpFtransform);
  7768. if (spvVersion.spv == 0 && (IncludeLegacy(version, profile, spvVersion) ||
  7769. (profile == EEsProfile && version == 100))) {
  7770. symbolTable.relateToOperator("texture1D", EOpTexture);
  7771. symbolTable.relateToOperator("texture1DGradARB", EOpTextureGrad);
  7772. symbolTable.relateToOperator("texture1DProj", EOpTextureProj);
  7773. symbolTable.relateToOperator("texture1DProjGradARB", EOpTextureProjGrad);
  7774. symbolTable.relateToOperator("texture1DLod", EOpTextureLod);
  7775. symbolTable.relateToOperator("texture1DProjLod", EOpTextureProjLod);
  7776. symbolTable.relateToOperator("texture2DRect", EOpTexture);
  7777. symbolTable.relateToOperator("texture2DRectProj", EOpTextureProj);
  7778. symbolTable.relateToOperator("texture2DRectGradARB", EOpTextureGrad);
  7779. symbolTable.relateToOperator("texture2DRectProjGradARB", EOpTextureProjGrad);
  7780. symbolTable.relateToOperator("shadow2DRect", EOpTexture);
  7781. symbolTable.relateToOperator("shadow2DRectProj", EOpTextureProj);
  7782. symbolTable.relateToOperator("shadow2DRectGradARB", EOpTextureGrad);
  7783. symbolTable.relateToOperator("shadow2DRectProjGradARB", EOpTextureProjGrad);
  7784. symbolTable.relateToOperator("texture2D", EOpTexture);
  7785. symbolTable.relateToOperator("texture2DProj", EOpTextureProj);
  7786. symbolTable.relateToOperator("texture2DGradEXT", EOpTextureGrad);
  7787. symbolTable.relateToOperator("texture2DGradARB", EOpTextureGrad);
  7788. symbolTable.relateToOperator("texture2DProjGradEXT", EOpTextureProjGrad);
  7789. symbolTable.relateToOperator("texture2DProjGradARB", EOpTextureProjGrad);
  7790. symbolTable.relateToOperator("texture2DLod", EOpTextureLod);
  7791. symbolTable.relateToOperator("texture2DLodEXT", EOpTextureLod);
  7792. symbolTable.relateToOperator("texture2DProjLod", EOpTextureProjLod);
  7793. symbolTable.relateToOperator("texture2DProjLodEXT", EOpTextureProjLod);
  7794. symbolTable.relateToOperator("texture3D", EOpTexture);
  7795. symbolTable.relateToOperator("texture3DGradARB", EOpTextureGrad);
  7796. symbolTable.relateToOperator("texture3DProj", EOpTextureProj);
  7797. symbolTable.relateToOperator("texture3DProjGradARB", EOpTextureProjGrad);
  7798. symbolTable.relateToOperator("texture3DLod", EOpTextureLod);
  7799. symbolTable.relateToOperator("texture3DProjLod", EOpTextureProjLod);
  7800. symbolTable.relateToOperator("textureCube", EOpTexture);
  7801. symbolTable.relateToOperator("textureCubeGradEXT", EOpTextureGrad);
  7802. symbolTable.relateToOperator("textureCubeGradARB", EOpTextureGrad);
  7803. symbolTable.relateToOperator("textureCubeLod", EOpTextureLod);
  7804. symbolTable.relateToOperator("textureCubeLodEXT", EOpTextureLod);
  7805. symbolTable.relateToOperator("shadow1D", EOpTexture);
  7806. symbolTable.relateToOperator("shadow1DGradARB", EOpTextureGrad);
  7807. symbolTable.relateToOperator("shadow2D", EOpTexture);
  7808. symbolTable.relateToOperator("shadow2DGradARB", EOpTextureGrad);
  7809. symbolTable.relateToOperator("shadow1DProj", EOpTextureProj);
  7810. symbolTable.relateToOperator("shadow2DProj", EOpTextureProj);
  7811. symbolTable.relateToOperator("shadow1DProjGradARB", EOpTextureProjGrad);
  7812. symbolTable.relateToOperator("shadow2DProjGradARB", EOpTextureProjGrad);
  7813. symbolTable.relateToOperator("shadow1DLod", EOpTextureLod);
  7814. symbolTable.relateToOperator("shadow2DLod", EOpTextureLod);
  7815. symbolTable.relateToOperator("shadow1DProjLod", EOpTextureProjLod);
  7816. symbolTable.relateToOperator("shadow2DProjLod", EOpTextureProjLod);
  7817. }
  7818. if (profile != EEsProfile) {
  7819. symbolTable.relateToOperator("sparseTextureARB", EOpSparseTexture);
  7820. symbolTable.relateToOperator("sparseTextureLodARB", EOpSparseTextureLod);
  7821. symbolTable.relateToOperator("sparseTextureOffsetARB", EOpSparseTextureOffset);
  7822. symbolTable.relateToOperator("sparseTexelFetchARB", EOpSparseTextureFetch);
  7823. symbolTable.relateToOperator("sparseTexelFetchOffsetARB", EOpSparseTextureFetchOffset);
  7824. symbolTable.relateToOperator("sparseTextureLodOffsetARB", EOpSparseTextureLodOffset);
  7825. symbolTable.relateToOperator("sparseTextureGradARB", EOpSparseTextureGrad);
  7826. symbolTable.relateToOperator("sparseTextureGradOffsetARB", EOpSparseTextureGradOffset);
  7827. symbolTable.relateToOperator("sparseTextureGatherARB", EOpSparseTextureGather);
  7828. symbolTable.relateToOperator("sparseTextureGatherOffsetARB", EOpSparseTextureGatherOffset);
  7829. symbolTable.relateToOperator("sparseTextureGatherOffsetsARB", EOpSparseTextureGatherOffsets);
  7830. symbolTable.relateToOperator("sparseImageLoadARB", EOpSparseImageLoad);
  7831. symbolTable.relateToOperator("sparseTexelsResidentARB", EOpSparseTexelsResident);
  7832. symbolTable.relateToOperator("sparseTextureClampARB", EOpSparseTextureClamp);
  7833. symbolTable.relateToOperator("sparseTextureOffsetClampARB", EOpSparseTextureOffsetClamp);
  7834. symbolTable.relateToOperator("sparseTextureGradClampARB", EOpSparseTextureGradClamp);
  7835. symbolTable.relateToOperator("sparseTextureGradOffsetClampARB", EOpSparseTextureGradOffsetClamp);
  7836. symbolTable.relateToOperator("textureClampARB", EOpTextureClamp);
  7837. symbolTable.relateToOperator("textureOffsetClampARB", EOpTextureOffsetClamp);
  7838. symbolTable.relateToOperator("textureGradClampARB", EOpTextureGradClamp);
  7839. symbolTable.relateToOperator("textureGradOffsetClampARB", EOpTextureGradOffsetClamp);
  7840. symbolTable.relateToOperator("ballotARB", EOpBallot);
  7841. symbolTable.relateToOperator("readInvocationARB", EOpReadInvocation);
  7842. symbolTable.relateToOperator("readFirstInvocationARB", EOpReadFirstInvocation);
  7843. if (version >= 430) {
  7844. symbolTable.relateToOperator("anyInvocationARB", EOpAnyInvocation);
  7845. symbolTable.relateToOperator("allInvocationsARB", EOpAllInvocations);
  7846. symbolTable.relateToOperator("allInvocationsEqualARB", EOpAllInvocationsEqual);
  7847. }
  7848. if (version >= 460) {
  7849. symbolTable.relateToOperator("anyInvocation", EOpAnyInvocation);
  7850. symbolTable.relateToOperator("allInvocations", EOpAllInvocations);
  7851. symbolTable.relateToOperator("allInvocationsEqual", EOpAllInvocationsEqual);
  7852. }
  7853. symbolTable.relateToOperator("minInvocationsAMD", EOpMinInvocations);
  7854. symbolTable.relateToOperator("maxInvocationsAMD", EOpMaxInvocations);
  7855. symbolTable.relateToOperator("addInvocationsAMD", EOpAddInvocations);
  7856. symbolTable.relateToOperator("minInvocationsNonUniformAMD", EOpMinInvocationsNonUniform);
  7857. symbolTable.relateToOperator("maxInvocationsNonUniformAMD", EOpMaxInvocationsNonUniform);
  7858. symbolTable.relateToOperator("addInvocationsNonUniformAMD", EOpAddInvocationsNonUniform);
  7859. symbolTable.relateToOperator("minInvocationsInclusiveScanAMD", EOpMinInvocationsInclusiveScan);
  7860. symbolTable.relateToOperator("maxInvocationsInclusiveScanAMD", EOpMaxInvocationsInclusiveScan);
  7861. symbolTable.relateToOperator("addInvocationsInclusiveScanAMD", EOpAddInvocationsInclusiveScan);
  7862. symbolTable.relateToOperator("minInvocationsInclusiveScanNonUniformAMD", EOpMinInvocationsInclusiveScanNonUniform);
  7863. symbolTable.relateToOperator("maxInvocationsInclusiveScanNonUniformAMD", EOpMaxInvocationsInclusiveScanNonUniform);
  7864. symbolTable.relateToOperator("addInvocationsInclusiveScanNonUniformAMD", EOpAddInvocationsInclusiveScanNonUniform);
  7865. symbolTable.relateToOperator("minInvocationsExclusiveScanAMD", EOpMinInvocationsExclusiveScan);
  7866. symbolTable.relateToOperator("maxInvocationsExclusiveScanAMD", EOpMaxInvocationsExclusiveScan);
  7867. symbolTable.relateToOperator("addInvocationsExclusiveScanAMD", EOpAddInvocationsExclusiveScan);
  7868. symbolTable.relateToOperator("minInvocationsExclusiveScanNonUniformAMD", EOpMinInvocationsExclusiveScanNonUniform);
  7869. symbolTable.relateToOperator("maxInvocationsExclusiveScanNonUniformAMD", EOpMaxInvocationsExclusiveScanNonUniform);
  7870. symbolTable.relateToOperator("addInvocationsExclusiveScanNonUniformAMD", EOpAddInvocationsExclusiveScanNonUniform);
  7871. symbolTable.relateToOperator("swizzleInvocationsAMD", EOpSwizzleInvocations);
  7872. symbolTable.relateToOperator("swizzleInvocationsMaskedAMD", EOpSwizzleInvocationsMasked);
  7873. symbolTable.relateToOperator("writeInvocationAMD", EOpWriteInvocation);
  7874. symbolTable.relateToOperator("mbcntAMD", EOpMbcnt);
  7875. symbolTable.relateToOperator("min3", EOpMin3);
  7876. symbolTable.relateToOperator("max3", EOpMax3);
  7877. symbolTable.relateToOperator("mid3", EOpMid3);
  7878. symbolTable.relateToOperator("cubeFaceIndexAMD", EOpCubeFaceIndex);
  7879. symbolTable.relateToOperator("cubeFaceCoordAMD", EOpCubeFaceCoord);
  7880. symbolTable.relateToOperator("timeAMD", EOpTime);
  7881. symbolTable.relateToOperator("textureGatherLodAMD", EOpTextureGatherLod);
  7882. symbolTable.relateToOperator("textureGatherLodOffsetAMD", EOpTextureGatherLodOffset);
  7883. symbolTable.relateToOperator("textureGatherLodOffsetsAMD", EOpTextureGatherLodOffsets);
  7884. symbolTable.relateToOperator("sparseTextureGatherLodAMD", EOpSparseTextureGatherLod);
  7885. symbolTable.relateToOperator("sparseTextureGatherLodOffsetAMD", EOpSparseTextureGatherLodOffset);
  7886. symbolTable.relateToOperator("sparseTextureGatherLodOffsetsAMD", EOpSparseTextureGatherLodOffsets);
  7887. symbolTable.relateToOperator("imageLoadLodAMD", EOpImageLoadLod);
  7888. symbolTable.relateToOperator("imageStoreLodAMD", EOpImageStoreLod);
  7889. symbolTable.relateToOperator("sparseImageLoadLodAMD", EOpSparseImageLoadLod);
  7890. symbolTable.relateToOperator("fragmentMaskFetchAMD", EOpFragmentMaskFetch);
  7891. symbolTable.relateToOperator("fragmentFetchAMD", EOpFragmentFetch);
  7892. }
  7893. // GL_KHR_shader_subgroup
  7894. if ((profile == EEsProfile && version >= 310) ||
  7895. (profile != EEsProfile && version >= 140)) {
  7896. symbolTable.relateToOperator("subgroupBarrier", EOpSubgroupBarrier);
  7897. symbolTable.relateToOperator("subgroupMemoryBarrier", EOpSubgroupMemoryBarrier);
  7898. symbolTable.relateToOperator("subgroupMemoryBarrierBuffer", EOpSubgroupMemoryBarrierBuffer);
  7899. symbolTable.relateToOperator("subgroupMemoryBarrierImage", EOpSubgroupMemoryBarrierImage);
  7900. symbolTable.relateToOperator("subgroupElect", EOpSubgroupElect);
  7901. symbolTable.relateToOperator("subgroupAll", EOpSubgroupAll);
  7902. symbolTable.relateToOperator("subgroupAny", EOpSubgroupAny);
  7903. symbolTable.relateToOperator("subgroupAllEqual", EOpSubgroupAllEqual);
  7904. symbolTable.relateToOperator("subgroupBroadcast", EOpSubgroupBroadcast);
  7905. symbolTable.relateToOperator("subgroupBroadcastFirst", EOpSubgroupBroadcastFirst);
  7906. symbolTable.relateToOperator("subgroupBallot", EOpSubgroupBallot);
  7907. symbolTable.relateToOperator("subgroupInverseBallot", EOpSubgroupInverseBallot);
  7908. symbolTable.relateToOperator("subgroupBallotBitExtract", EOpSubgroupBallotBitExtract);
  7909. symbolTable.relateToOperator("subgroupBallotBitCount", EOpSubgroupBallotBitCount);
  7910. symbolTable.relateToOperator("subgroupBallotInclusiveBitCount", EOpSubgroupBallotInclusiveBitCount);
  7911. symbolTable.relateToOperator("subgroupBallotExclusiveBitCount", EOpSubgroupBallotExclusiveBitCount);
  7912. symbolTable.relateToOperator("subgroupBallotFindLSB", EOpSubgroupBallotFindLSB);
  7913. symbolTable.relateToOperator("subgroupBallotFindMSB", EOpSubgroupBallotFindMSB);
  7914. symbolTable.relateToOperator("subgroupShuffle", EOpSubgroupShuffle);
  7915. symbolTable.relateToOperator("subgroupShuffleXor", EOpSubgroupShuffleXor);
  7916. symbolTable.relateToOperator("subgroupShuffleUp", EOpSubgroupShuffleUp);
  7917. symbolTable.relateToOperator("subgroupShuffleDown", EOpSubgroupShuffleDown);
  7918. symbolTable.relateToOperator("subgroupAdd", EOpSubgroupAdd);
  7919. symbolTable.relateToOperator("subgroupMul", EOpSubgroupMul);
  7920. symbolTable.relateToOperator("subgroupMin", EOpSubgroupMin);
  7921. symbolTable.relateToOperator("subgroupMax", EOpSubgroupMax);
  7922. symbolTable.relateToOperator("subgroupAnd", EOpSubgroupAnd);
  7923. symbolTable.relateToOperator("subgroupOr", EOpSubgroupOr);
  7924. symbolTable.relateToOperator("subgroupXor", EOpSubgroupXor);
  7925. symbolTable.relateToOperator("subgroupInclusiveAdd", EOpSubgroupInclusiveAdd);
  7926. symbolTable.relateToOperator("subgroupInclusiveMul", EOpSubgroupInclusiveMul);
  7927. symbolTable.relateToOperator("subgroupInclusiveMin", EOpSubgroupInclusiveMin);
  7928. symbolTable.relateToOperator("subgroupInclusiveMax", EOpSubgroupInclusiveMax);
  7929. symbolTable.relateToOperator("subgroupInclusiveAnd", EOpSubgroupInclusiveAnd);
  7930. symbolTable.relateToOperator("subgroupInclusiveOr", EOpSubgroupInclusiveOr);
  7931. symbolTable.relateToOperator("subgroupInclusiveXor", EOpSubgroupInclusiveXor);
  7932. symbolTable.relateToOperator("subgroupExclusiveAdd", EOpSubgroupExclusiveAdd);
  7933. symbolTable.relateToOperator("subgroupExclusiveMul", EOpSubgroupExclusiveMul);
  7934. symbolTable.relateToOperator("subgroupExclusiveMin", EOpSubgroupExclusiveMin);
  7935. symbolTable.relateToOperator("subgroupExclusiveMax", EOpSubgroupExclusiveMax);
  7936. symbolTable.relateToOperator("subgroupExclusiveAnd", EOpSubgroupExclusiveAnd);
  7937. symbolTable.relateToOperator("subgroupExclusiveOr", EOpSubgroupExclusiveOr);
  7938. symbolTable.relateToOperator("subgroupExclusiveXor", EOpSubgroupExclusiveXor);
  7939. symbolTable.relateToOperator("subgroupClusteredAdd", EOpSubgroupClusteredAdd);
  7940. symbolTable.relateToOperator("subgroupClusteredMul", EOpSubgroupClusteredMul);
  7941. symbolTable.relateToOperator("subgroupClusteredMin", EOpSubgroupClusteredMin);
  7942. symbolTable.relateToOperator("subgroupClusteredMax", EOpSubgroupClusteredMax);
  7943. symbolTable.relateToOperator("subgroupClusteredAnd", EOpSubgroupClusteredAnd);
  7944. symbolTable.relateToOperator("subgroupClusteredOr", EOpSubgroupClusteredOr);
  7945. symbolTable.relateToOperator("subgroupClusteredXor", EOpSubgroupClusteredXor);
  7946. symbolTable.relateToOperator("subgroupQuadBroadcast", EOpSubgroupQuadBroadcast);
  7947. symbolTable.relateToOperator("subgroupQuadSwapHorizontal", EOpSubgroupQuadSwapHorizontal);
  7948. symbolTable.relateToOperator("subgroupQuadSwapVertical", EOpSubgroupQuadSwapVertical);
  7949. symbolTable.relateToOperator("subgroupQuadSwapDiagonal", EOpSubgroupQuadSwapDiagonal);
  7950. symbolTable.relateToOperator("subgroupPartitionNV", EOpSubgroupPartition);
  7951. symbolTable.relateToOperator("subgroupPartitionedAddNV", EOpSubgroupPartitionedAdd);
  7952. symbolTable.relateToOperator("subgroupPartitionedMulNV", EOpSubgroupPartitionedMul);
  7953. symbolTable.relateToOperator("subgroupPartitionedMinNV", EOpSubgroupPartitionedMin);
  7954. symbolTable.relateToOperator("subgroupPartitionedMaxNV", EOpSubgroupPartitionedMax);
  7955. symbolTable.relateToOperator("subgroupPartitionedAndNV", EOpSubgroupPartitionedAnd);
  7956. symbolTable.relateToOperator("subgroupPartitionedOrNV", EOpSubgroupPartitionedOr);
  7957. symbolTable.relateToOperator("subgroupPartitionedXorNV", EOpSubgroupPartitionedXor);
  7958. symbolTable.relateToOperator("subgroupPartitionedInclusiveAddNV", EOpSubgroupPartitionedInclusiveAdd);
  7959. symbolTable.relateToOperator("subgroupPartitionedInclusiveMulNV", EOpSubgroupPartitionedInclusiveMul);
  7960. symbolTable.relateToOperator("subgroupPartitionedInclusiveMinNV", EOpSubgroupPartitionedInclusiveMin);
  7961. symbolTable.relateToOperator("subgroupPartitionedInclusiveMaxNV", EOpSubgroupPartitionedInclusiveMax);
  7962. symbolTable.relateToOperator("subgroupPartitionedInclusiveAndNV", EOpSubgroupPartitionedInclusiveAnd);
  7963. symbolTable.relateToOperator("subgroupPartitionedInclusiveOrNV", EOpSubgroupPartitionedInclusiveOr);
  7964. symbolTable.relateToOperator("subgroupPartitionedInclusiveXorNV", EOpSubgroupPartitionedInclusiveXor);
  7965. symbolTable.relateToOperator("subgroupPartitionedExclusiveAddNV", EOpSubgroupPartitionedExclusiveAdd);
  7966. symbolTable.relateToOperator("subgroupPartitionedExclusiveMulNV", EOpSubgroupPartitionedExclusiveMul);
  7967. symbolTable.relateToOperator("subgroupPartitionedExclusiveMinNV", EOpSubgroupPartitionedExclusiveMin);
  7968. symbolTable.relateToOperator("subgroupPartitionedExclusiveMaxNV", EOpSubgroupPartitionedExclusiveMax);
  7969. symbolTable.relateToOperator("subgroupPartitionedExclusiveAndNV", EOpSubgroupPartitionedExclusiveAnd);
  7970. symbolTable.relateToOperator("subgroupPartitionedExclusiveOrNV", EOpSubgroupPartitionedExclusiveOr);
  7971. symbolTable.relateToOperator("subgroupPartitionedExclusiveXorNV", EOpSubgroupPartitionedExclusiveXor);
  7972. }
  7973. if (profile == EEsProfile) {
  7974. symbolTable.relateToOperator("shadow2DEXT", EOpTexture);
  7975. symbolTable.relateToOperator("shadow2DProjEXT", EOpTextureProj);
  7976. }
  7977. }
  7978. switch(language) {
  7979. case EShLangVertex:
  7980. break;
  7981. case EShLangTessControl:
  7982. case EShLangTessEvaluation:
  7983. break;
  7984. case EShLangGeometry:
  7985. symbolTable.relateToOperator("EmitStreamVertex", EOpEmitStreamVertex);
  7986. symbolTable.relateToOperator("EndStreamPrimitive", EOpEndStreamPrimitive);
  7987. symbolTable.relateToOperator("EmitVertex", EOpEmitVertex);
  7988. symbolTable.relateToOperator("EndPrimitive", EOpEndPrimitive);
  7989. break;
  7990. case EShLangFragment:
  7991. if (profile != EEsProfile && version >= 400) {
  7992. symbolTable.relateToOperator("dFdxFine", EOpDPdxFine);
  7993. symbolTable.relateToOperator("dFdyFine", EOpDPdyFine);
  7994. symbolTable.relateToOperator("fwidthFine", EOpFwidthFine);
  7995. symbolTable.relateToOperator("dFdxCoarse", EOpDPdxCoarse);
  7996. symbolTable.relateToOperator("dFdyCoarse", EOpDPdyCoarse);
  7997. symbolTable.relateToOperator("fwidthCoarse", EOpFwidthCoarse);
  7998. }
  7999. if (profile != EEsProfile && version >= 460) {
  8000. symbolTable.relateToOperator("rayQueryInitializeEXT", EOpRayQueryInitialize);
  8001. symbolTable.relateToOperator("rayQueryTerminateEXT", EOpRayQueryTerminate);
  8002. symbolTable.relateToOperator("rayQueryGenerateIntersectionEXT", EOpRayQueryGenerateIntersection);
  8003. symbolTable.relateToOperator("rayQueryConfirmIntersectionEXT", EOpRayQueryConfirmIntersection);
  8004. symbolTable.relateToOperator("rayQueryProceedEXT", EOpRayQueryProceed);
  8005. symbolTable.relateToOperator("rayQueryGetIntersectionTypeEXT", EOpRayQueryGetIntersectionType);
  8006. symbolTable.relateToOperator("rayQueryGetRayTMinEXT", EOpRayQueryGetRayTMin);
  8007. symbolTable.relateToOperator("rayQueryGetRayFlagsEXT", EOpRayQueryGetRayFlags);
  8008. symbolTable.relateToOperator("rayQueryGetIntersectionTEXT", EOpRayQueryGetIntersectionT);
  8009. symbolTable.relateToOperator("rayQueryGetIntersectionInstanceCustomIndexEXT", EOpRayQueryGetIntersectionInstanceCustomIndex);
  8010. symbolTable.relateToOperator("rayQueryGetIntersectionInstanceIdEXT", EOpRayQueryGetIntersectionInstanceId);
  8011. symbolTable.relateToOperator("rayQueryGetIntersectionInstanceShaderBindingTableRecordOffsetEXT", EOpRayQueryGetIntersectionInstanceShaderBindingTableRecordOffset);
  8012. symbolTable.relateToOperator("rayQueryGetIntersectionGeometryIndexEXT", EOpRayQueryGetIntersectionGeometryIndex);
  8013. symbolTable.relateToOperator("rayQueryGetIntersectionPrimitiveIndexEXT", EOpRayQueryGetIntersectionPrimitiveIndex);
  8014. symbolTable.relateToOperator("rayQueryGetIntersectionBarycentricsEXT", EOpRayQueryGetIntersectionBarycentrics);
  8015. symbolTable.relateToOperator("rayQueryGetIntersectionFrontFaceEXT", EOpRayQueryGetIntersectionFrontFace);
  8016. symbolTable.relateToOperator("rayQueryGetIntersectionCandidateAABBOpaqueEXT", EOpRayQueryGetIntersectionCandidateAABBOpaque);
  8017. symbolTable.relateToOperator("rayQueryGetIntersectionObjectRayDirectionEXT", EOpRayQueryGetIntersectionObjectRayDirection);
  8018. symbolTable.relateToOperator("rayQueryGetIntersectionObjectRayOriginEXT", EOpRayQueryGetIntersectionObjectRayOrigin);
  8019. symbolTable.relateToOperator("rayQueryGetWorldRayDirectionEXT", EOpRayQueryGetWorldRayDirection);
  8020. symbolTable.relateToOperator("rayQueryGetWorldRayOriginEXT", EOpRayQueryGetWorldRayOrigin);
  8021. symbolTable.relateToOperator("rayQueryGetIntersectionObjectToWorldEXT", EOpRayQueryGetIntersectionObjectToWorld);
  8022. symbolTable.relateToOperator("rayQueryGetIntersectionWorldToObjectEXT", EOpRayQueryGetIntersectionWorldToObject);
  8023. }
  8024. symbolTable.relateToOperator("interpolateAtCentroid", EOpInterpolateAtCentroid);
  8025. symbolTable.relateToOperator("interpolateAtSample", EOpInterpolateAtSample);
  8026. symbolTable.relateToOperator("interpolateAtOffset", EOpInterpolateAtOffset);
  8027. if (profile != EEsProfile)
  8028. symbolTable.relateToOperator("interpolateAtVertexAMD", EOpInterpolateAtVertex);
  8029. symbolTable.relateToOperator("beginInvocationInterlockARB", EOpBeginInvocationInterlock);
  8030. symbolTable.relateToOperator("endInvocationInterlockARB", EOpEndInvocationInterlock);
  8031. break;
  8032. case EShLangCompute:
  8033. symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared);
  8034. if ((profile != EEsProfile && version >= 450) ||
  8035. (profile == EEsProfile && version >= 320)) {
  8036. symbolTable.relateToOperator("dFdx", EOpDPdx);
  8037. symbolTable.relateToOperator("dFdy", EOpDPdy);
  8038. symbolTable.relateToOperator("fwidth", EOpFwidth);
  8039. symbolTable.relateToOperator("dFdxFine", EOpDPdxFine);
  8040. symbolTable.relateToOperator("dFdyFine", EOpDPdyFine);
  8041. symbolTable.relateToOperator("fwidthFine", EOpFwidthFine);
  8042. symbolTable.relateToOperator("dFdxCoarse", EOpDPdxCoarse);
  8043. symbolTable.relateToOperator("dFdyCoarse", EOpDPdyCoarse);
  8044. symbolTable.relateToOperator("fwidthCoarse",EOpFwidthCoarse);
  8045. }
  8046. symbolTable.relateToOperator("coopMatLoadNV", EOpCooperativeMatrixLoad);
  8047. symbolTable.relateToOperator("coopMatStoreNV", EOpCooperativeMatrixStore);
  8048. symbolTable.relateToOperator("coopMatMulAddNV", EOpCooperativeMatrixMulAdd);
  8049. break;
  8050. case EShLangRayGen:
  8051. case EShLangClosestHit:
  8052. case EShLangMiss:
  8053. if (profile != EEsProfile && version >= 460) {
  8054. symbolTable.relateToOperator("traceNV", EOpTraceNV);
  8055. symbolTable.relateToOperator("traceRayEXT", EOpTraceKHR);
  8056. symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
  8057. symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
  8058. }
  8059. break;
  8060. case EShLangIntersect:
  8061. if (profile != EEsProfile && version >= 460) {
  8062. symbolTable.relateToOperator("reportIntersectionNV", EOpReportIntersection);
  8063. symbolTable.relateToOperator("reportIntersectionEXT", EOpReportIntersection);
  8064. }
  8065. break;
  8066. case EShLangAnyHit:
  8067. if (profile != EEsProfile && version >= 460) {
  8068. symbolTable.relateToOperator("ignoreIntersectionNV", EOpIgnoreIntersectionNV);
  8069. symbolTable.relateToOperator("terminateRayNV", EOpTerminateRayNV);
  8070. }
  8071. break;
  8072. case EShLangCallable:
  8073. if (profile != EEsProfile && version >= 460) {
  8074. symbolTable.relateToOperator("executeCallableNV", EOpExecuteCallableNV);
  8075. symbolTable.relateToOperator("executeCallableEXT", EOpExecuteCallableKHR);
  8076. }
  8077. break;
  8078. case EShLangMeshNV:
  8079. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  8080. symbolTable.relateToOperator("writePackedPrimitiveIndices4x8NV", EOpWritePackedPrimitiveIndices4x8NV);
  8081. }
  8082. // fall through
  8083. case EShLangTaskNV:
  8084. if ((profile != EEsProfile && version >= 450) || (profile == EEsProfile && version >= 320)) {
  8085. symbolTable.relateToOperator("memoryBarrierShared", EOpMemoryBarrierShared);
  8086. symbolTable.relateToOperator("groupMemoryBarrier", EOpGroupMemoryBarrier);
  8087. symbolTable.relateToOperator("subgroupMemoryBarrierShared", EOpSubgroupMemoryBarrierShared);
  8088. }
  8089. break;
  8090. default:
  8091. assert(false && "Language not supported");
  8092. }
  8093. #endif // !GLSLANG_WEB
  8094. }
  8095. //
  8096. // Add context-dependent (resource-specific) built-ins not handled by the above. These
  8097. // would be ones that need to be programmatically added because they cannot
  8098. // be added by simple text strings. For these, also
  8099. // 1) Map built-in functions to operators, for those that will turn into an operation node
  8100. // instead of remaining a function call.
  8101. // 2) Tag extension-related symbols added to their base version with their extensions, so
  8102. // that if an early version has the extension turned off, there is an error reported on use.
  8103. //
  8104. void TBuiltIns::identifyBuiltIns(int version, EProfile profile, const SpvVersion& spvVersion, EShLanguage language, TSymbolTable& symbolTable, const TBuiltInResource &resources)
  8105. {
  8106. #ifndef GLSLANG_WEB
  8107. #if defined(GLSLANG_ANGLE)
  8108. profile = ECoreProfile;
  8109. version = 450;
  8110. #endif
  8111. if (profile != EEsProfile && version >= 430 && version < 440) {
  8112. symbolTable.setVariableExtensions("gl_MaxTransformFeedbackBuffers", 1, &E_GL_ARB_enhanced_layouts);
  8113. symbolTable.setVariableExtensions("gl_MaxTransformFeedbackInterleavedComponents", 1, &E_GL_ARB_enhanced_layouts);
  8114. }
  8115. if (profile != EEsProfile && version >= 130 && version < 420) {
  8116. symbolTable.setVariableExtensions("gl_MinProgramTexelOffset", 1, &E_GL_ARB_shading_language_420pack);
  8117. symbolTable.setVariableExtensions("gl_MaxProgramTexelOffset", 1, &E_GL_ARB_shading_language_420pack);
  8118. }
  8119. if (profile != EEsProfile && version >= 150 && version < 410)
  8120. symbolTable.setVariableExtensions("gl_MaxViewports", 1, &E_GL_ARB_viewport_array);
  8121. switch(language) {
  8122. case EShLangFragment:
  8123. // Set up gl_FragData based on current array size.
  8124. if (version == 100 || IncludeLegacy(version, profile, spvVersion) || (! ForwardCompatibility && profile != EEsProfile && version < 420)) {
  8125. TPrecisionQualifier pq = profile == EEsProfile ? EpqMedium : EpqNone;
  8126. TType fragData(EbtFloat, EvqFragColor, pq, 4);
  8127. TArraySizes* arraySizes = new TArraySizes;
  8128. arraySizes->addInnerSize(resources.maxDrawBuffers);
  8129. fragData.transferArraySizes(arraySizes);
  8130. symbolTable.insert(*new TVariable(NewPoolTString("gl_FragData"), fragData));
  8131. SpecialQualifier("gl_FragData", EvqFragColor, EbvFragData, symbolTable);
  8132. }
  8133. // GL_EXT_blend_func_extended
  8134. if (profile == EEsProfile && version >= 100) {
  8135. symbolTable.setVariableExtensions("gl_MaxDualSourceDrawBuffersEXT", 1, &E_GL_EXT_blend_func_extended);
  8136. symbolTable.setVariableExtensions("gl_SecondaryFragColorEXT", 1, &E_GL_EXT_blend_func_extended);
  8137. symbolTable.setVariableExtensions("gl_SecondaryFragDataEXT", 1, &E_GL_EXT_blend_func_extended);
  8138. SpecialQualifier("gl_SecondaryFragColorEXT", EvqVaryingOut, EbvSecondaryFragColorEXT, symbolTable);
  8139. SpecialQualifier("gl_SecondaryFragDataEXT", EvqVaryingOut, EbvSecondaryFragDataEXT, symbolTable);
  8140. }
  8141. break;
  8142. case EShLangTessControl:
  8143. case EShLangTessEvaluation:
  8144. // Because of the context-dependent array size (gl_MaxPatchVertices),
  8145. // these variables were added later than the others and need to be mapped now.
  8146. // standard members
  8147. BuiltInVariable("gl_in", "gl_Position", EbvPosition, symbolTable);
  8148. BuiltInVariable("gl_in", "gl_PointSize", EbvPointSize, symbolTable);
  8149. BuiltInVariable("gl_in", "gl_ClipDistance", EbvClipDistance, symbolTable);
  8150. BuiltInVariable("gl_in", "gl_CullDistance", EbvCullDistance, symbolTable);
  8151. // compatibility members
  8152. BuiltInVariable("gl_in", "gl_ClipVertex", EbvClipVertex, symbolTable);
  8153. BuiltInVariable("gl_in", "gl_FrontColor", EbvFrontColor, symbolTable);
  8154. BuiltInVariable("gl_in", "gl_BackColor", EbvBackColor, symbolTable);
  8155. BuiltInVariable("gl_in", "gl_FrontSecondaryColor", EbvFrontSecondaryColor, symbolTable);
  8156. BuiltInVariable("gl_in", "gl_BackSecondaryColor", EbvBackSecondaryColor, symbolTable);
  8157. BuiltInVariable("gl_in", "gl_TexCoord", EbvTexCoord, symbolTable);
  8158. BuiltInVariable("gl_in", "gl_FogFragCoord", EbvFogFragCoord, symbolTable);
  8159. symbolTable.setVariableExtensions("gl_in", "gl_SecondaryPositionNV", 1, &E_GL_NV_stereo_view_rendering);
  8160. symbolTable.setVariableExtensions("gl_in", "gl_PositionPerViewNV", 1, &E_GL_NVX_multiview_per_view_attributes);
  8161. BuiltInVariable("gl_in", "gl_SecondaryPositionNV", EbvSecondaryPositionNV, symbolTable);
  8162. BuiltInVariable("gl_in", "gl_PositionPerViewNV", EbvPositionPerViewNV, symbolTable);
  8163. // extension requirements
  8164. if (profile == EEsProfile) {
  8165. symbolTable.setVariableExtensions("gl_in", "gl_PointSize", Num_AEP_tessellation_point_size, AEP_tessellation_point_size);
  8166. }
  8167. break;
  8168. default:
  8169. break;
  8170. }
  8171. #endif
  8172. }
  8173. } // end namespace glslang