val_builtins_test.cpp 233 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478
  1. // Copyright (c) 2018 Google LLC.
  2. // Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights
  3. // reserved.
  4. //
  5. // Licensed under the Apache License, Version 2.0 (the "License");
  6. // you may not use this file except in compliance with the License.
  7. // You may obtain a copy of the License at
  8. //
  9. // http://www.apache.org/licenses/LICENSE-2.0
  10. //
  11. // Unless required by applicable law or agreed to in writing, software
  12. // distributed under the License is distributed on an "AS IS" BASIS,
  13. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. // See the License for the specific language governing permissions and
  15. // limitations under the License.
  16. // Tests validation rules of GLSL.450.std and OpenCL.std extended instructions.
  17. // Doesn't test OpenCL.std vector size 2, 3, 4, 8 or 16 rules (not supported
  18. // by standard SPIR-V).
  19. #include <cstring>
  20. #include <sstream>
  21. #include <string>
  22. #include <tuple>
  23. #include <utility>
  24. #include <vector>
  25. #include "gmock/gmock.h"
  26. #include "source/spirv_target_env.h"
  27. #include "test/unit_spirv.h"
  28. #include "test/val/val_code_generator.h"
  29. #include "test/val/val_fixtures.h"
  30. namespace spvtools {
  31. namespace val {
  32. namespace {
  33. struct TestResult {
  34. TestResult(spv_result_t in_validation_result = SPV_SUCCESS,
  35. const char* in_error_str = nullptr,
  36. const char* in_error_str2 = nullptr)
  37. : validation_result(in_validation_result),
  38. error_str(in_error_str),
  39. error_str2(in_error_str2) {}
  40. spv_result_t validation_result;
  41. const char* error_str;
  42. const char* error_str2;
  43. };
  44. using ::testing::Combine;
  45. using ::testing::HasSubstr;
  46. using ::testing::Not;
  47. using ::testing::Values;
  48. using ::testing::ValuesIn;
  49. using ValidateBuiltIns = spvtest::ValidateBase<bool>;
  50. using ValidateVulkanSubgroupBuiltIns =
  51. spvtest::ValidateBase<std::tuple<const char*, const char*, const char*,
  52. const char*, const char*, TestResult>>;
  53. using ValidateVulkanCombineBuiltInExecutionModelDataTypeResult =
  54. spvtest::ValidateBase<std::tuple<const char*, const char*, const char*,
  55. const char*, const char*, TestResult>>;
  56. using ValidateVulkanCombineBuiltInArrayedVariable =
  57. spvtest::ValidateBase<std::tuple<const char*, const char*, const char*,
  58. const char*, const char*, TestResult>>;
  59. using ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult =
  60. spvtest::ValidateBase<
  61. std::tuple<const char*, const char*, const char*, const char*,
  62. const char*, const char*, const char*, TestResult>>;
  63. using ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult =
  64. spvtest::ValidateBase<std::tuple<spv_target_env, const char*, const char*,
  65. const char*, const char*, const char*,
  66. const char*, const char*, TestResult>>;
  67. bool InitializerRequired(const char* const storage_class) {
  68. return (strncmp(storage_class, "Output", 6) == 0 ||
  69. strncmp(storage_class, "Private", 7) == 0 ||
  70. strncmp(storage_class, "Function", 8) == 0);
  71. }
  72. CodeGenerator GetInMainCodeGenerator(const char* const built_in,
  73. const char* const execution_model,
  74. const char* const storage_class,
  75. const char* const capabilities,
  76. const char* const extensions,
  77. const char* const data_type) {
  78. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  79. if (capabilities) {
  80. generator.capabilities_ += capabilities;
  81. }
  82. if (extensions) {
  83. generator.extensions_ += extensions;
  84. }
  85. generator.before_types_ = R"(OpDecorate %built_in_type Block
  86. OpMemberDecorate %built_in_type 0 BuiltIn )";
  87. generator.before_types_ += built_in;
  88. generator.before_types_ += "\n";
  89. std::ostringstream after_types;
  90. after_types << "%built_in_type = OpTypeStruct " << data_type << "\n";
  91. if (InitializerRequired(storage_class)) {
  92. after_types << "%built_in_null = OpConstantNull %built_in_type\n";
  93. }
  94. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  95. << " %built_in_type\n";
  96. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  97. if (InitializerRequired(storage_class)) {
  98. after_types << " %built_in_null";
  99. }
  100. after_types << "\n";
  101. after_types << "%data_ptr = OpTypePointer " << storage_class << " "
  102. << data_type << "\n";
  103. generator.after_types_ = after_types.str();
  104. EntryPoint entry_point;
  105. entry_point.name = "main";
  106. entry_point.execution_model = execution_model;
  107. if (strncmp(storage_class, "Input", 5) == 0 ||
  108. strncmp(storage_class, "Output", 6) == 0) {
  109. entry_point.interfaces = "%built_in_var";
  110. }
  111. std::ostringstream execution_modes;
  112. if (0 == std::strcmp(execution_model, "Fragment")) {
  113. execution_modes << "OpExecutionMode %" << entry_point.name
  114. << " OriginUpperLeft\n";
  115. if (0 == std::strcmp(built_in, "FragDepth")) {
  116. execution_modes << "OpExecutionMode %" << entry_point.name
  117. << " DepthReplacing\n";
  118. }
  119. }
  120. if (0 == std::strcmp(execution_model, "Geometry")) {
  121. execution_modes << "OpExecutionMode %" << entry_point.name
  122. << " InputPoints\n";
  123. execution_modes << "OpExecutionMode %" << entry_point.name
  124. << " OutputPoints\n";
  125. }
  126. if (0 == std::strcmp(execution_model, "GLCompute")) {
  127. execution_modes << "OpExecutionMode %" << entry_point.name
  128. << " LocalSize 1 1 1\n";
  129. }
  130. entry_point.execution_modes = execution_modes.str();
  131. entry_point.body = R"(
  132. %ptr = OpAccessChain %data_ptr %built_in_var %u32_0
  133. )";
  134. generator.entry_points_.push_back(std::move(entry_point));
  135. return generator;
  136. }
  137. TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InMain) {
  138. const char* const built_in = std::get<0>(GetParam());
  139. const char* const execution_model = std::get<1>(GetParam());
  140. const char* const storage_class = std::get<2>(GetParam());
  141. const char* const data_type = std::get<3>(GetParam());
  142. const char* const vuid = std::get<4>(GetParam());
  143. const TestResult& test_result = std::get<5>(GetParam());
  144. CodeGenerator generator = GetInMainCodeGenerator(
  145. built_in, execution_model, storage_class, NULL, NULL, data_type);
  146. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  147. ASSERT_EQ(test_result.validation_result,
  148. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  149. if (test_result.error_str) {
  150. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  151. }
  152. if (test_result.error_str2) {
  153. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  154. }
  155. if (vuid) {
  156. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  157. }
  158. }
  159. TEST_P(
  160. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  161. InMain) {
  162. const char* const built_in = std::get<0>(GetParam());
  163. const char* const execution_model = std::get<1>(GetParam());
  164. const char* const storage_class = std::get<2>(GetParam());
  165. const char* const data_type = std::get<3>(GetParam());
  166. const char* const capabilities = std::get<4>(GetParam());
  167. const char* const extensions = std::get<5>(GetParam());
  168. const char* const vuid = std::get<6>(GetParam());
  169. const TestResult& test_result = std::get<7>(GetParam());
  170. CodeGenerator generator =
  171. GetInMainCodeGenerator(built_in, execution_model, storage_class,
  172. capabilities, extensions, data_type);
  173. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  174. ASSERT_EQ(test_result.validation_result,
  175. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  176. if (test_result.error_str) {
  177. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  178. }
  179. if (test_result.error_str2) {
  180. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  181. }
  182. if (vuid) {
  183. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  184. }
  185. }
  186. TEST_P(
  187. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  188. InMain) {
  189. const spv_target_env env = std::get<0>(GetParam());
  190. const char* const built_in = std::get<1>(GetParam());
  191. const char* const execution_model = std::get<2>(GetParam());
  192. const char* const storage_class = std::get<3>(GetParam());
  193. const char* const data_type = std::get<4>(GetParam());
  194. const char* const capabilities = std::get<5>(GetParam());
  195. const char* const extensions = std::get<6>(GetParam());
  196. const char* const vuid = std::get<7>(GetParam());
  197. const TestResult& test_result = std::get<8>(GetParam());
  198. CodeGenerator generator =
  199. GetInMainCodeGenerator(built_in, execution_model, storage_class,
  200. capabilities, extensions, data_type);
  201. CompileSuccessfully(generator.Build(), env);
  202. ASSERT_EQ(test_result.validation_result, ValidateInstructions(env));
  203. if (test_result.error_str) {
  204. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  205. }
  206. if (test_result.error_str2) {
  207. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  208. }
  209. if (vuid) {
  210. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  211. }
  212. }
  213. CodeGenerator GetInFunctionCodeGenerator(const char* const built_in,
  214. const char* const execution_model,
  215. const char* const storage_class,
  216. const char* const capabilities,
  217. const char* const extensions,
  218. const char* const data_type) {
  219. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  220. if (capabilities) {
  221. generator.capabilities_ += capabilities;
  222. }
  223. if (extensions) {
  224. generator.extensions_ += extensions;
  225. }
  226. generator.before_types_ = R"(OpDecorate %built_in_type Block
  227. OpMemberDecorate %built_in_type 0 BuiltIn )";
  228. generator.before_types_ += built_in;
  229. generator.before_types_ += "\n";
  230. std::ostringstream after_types;
  231. after_types << "%built_in_type = OpTypeStruct " << data_type << "\n";
  232. if (InitializerRequired(storage_class)) {
  233. after_types << "%built_in_null = OpConstantNull %built_in_type\n";
  234. }
  235. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  236. << " %built_in_type\n";
  237. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  238. if (InitializerRequired(storage_class)) {
  239. after_types << " %built_in_null";
  240. }
  241. after_types << "\n";
  242. after_types << "%data_ptr = OpTypePointer " << storage_class << " "
  243. << data_type << "\n";
  244. generator.after_types_ = after_types.str();
  245. EntryPoint entry_point;
  246. entry_point.name = "main";
  247. entry_point.execution_model = execution_model;
  248. if (strncmp(storage_class, "Input", 5) == 0 ||
  249. strncmp(storage_class, "Output", 6) == 0) {
  250. entry_point.interfaces = "%built_in_var";
  251. }
  252. std::ostringstream execution_modes;
  253. if (0 == std::strcmp(execution_model, "Fragment")) {
  254. execution_modes << "OpExecutionMode %" << entry_point.name
  255. << " OriginUpperLeft\n";
  256. if (0 == std::strcmp(built_in, "FragDepth")) {
  257. execution_modes << "OpExecutionMode %" << entry_point.name
  258. << " DepthReplacing\n";
  259. }
  260. }
  261. if (0 == std::strcmp(execution_model, "Geometry")) {
  262. execution_modes << "OpExecutionMode %" << entry_point.name
  263. << " InputPoints\n";
  264. execution_modes << "OpExecutionMode %" << entry_point.name
  265. << " OutputPoints\n";
  266. }
  267. if (0 == std::strcmp(execution_model, "GLCompute")) {
  268. execution_modes << "OpExecutionMode %" << entry_point.name
  269. << " LocalSize 1 1 1\n";
  270. }
  271. entry_point.execution_modes = execution_modes.str();
  272. entry_point.body = R"(
  273. %val2 = OpFunctionCall %void %foo
  274. )";
  275. std::string function_body = R"(
  276. %foo = OpFunction %void None %func
  277. %foo_entry = OpLabel
  278. %ptr = OpAccessChain %data_ptr %built_in_var %u32_0
  279. OpReturn
  280. OpFunctionEnd
  281. )";
  282. generator.add_at_the_end_ = function_body;
  283. generator.entry_points_.push_back(std::move(entry_point));
  284. return generator;
  285. }
  286. TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InFunction) {
  287. const char* const built_in = std::get<0>(GetParam());
  288. const char* const execution_model = std::get<1>(GetParam());
  289. const char* const storage_class = std::get<2>(GetParam());
  290. const char* const data_type = std::get<3>(GetParam());
  291. const char* const vuid = std::get<4>(GetParam());
  292. const TestResult& test_result = std::get<5>(GetParam());
  293. CodeGenerator generator = GetInFunctionCodeGenerator(
  294. built_in, execution_model, storage_class, NULL, NULL, data_type);
  295. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  296. ASSERT_EQ(test_result.validation_result,
  297. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  298. if (test_result.error_str) {
  299. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  300. }
  301. if (test_result.error_str2) {
  302. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  303. }
  304. if (vuid) {
  305. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  306. }
  307. }
  308. TEST_P(
  309. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  310. InFunction) {
  311. const char* const built_in = std::get<0>(GetParam());
  312. const char* const execution_model = std::get<1>(GetParam());
  313. const char* const storage_class = std::get<2>(GetParam());
  314. const char* const data_type = std::get<3>(GetParam());
  315. const char* const capabilities = std::get<4>(GetParam());
  316. const char* const extensions = std::get<5>(GetParam());
  317. const char* const vuid = std::get<6>(GetParam());
  318. const TestResult& test_result = std::get<7>(GetParam());
  319. CodeGenerator generator =
  320. GetInFunctionCodeGenerator(built_in, execution_model, storage_class,
  321. capabilities, extensions, data_type);
  322. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  323. ASSERT_EQ(test_result.validation_result,
  324. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  325. if (test_result.error_str) {
  326. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  327. }
  328. if (test_result.error_str2) {
  329. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  330. }
  331. if (vuid) {
  332. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  333. }
  334. }
  335. CodeGenerator GetVariableCodeGenerator(const char* const built_in,
  336. const char* const execution_model,
  337. const char* const storage_class,
  338. const char* const capabilities,
  339. const char* const extensions,
  340. const char* const data_type) {
  341. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  342. if (capabilities) {
  343. generator.capabilities_ += capabilities;
  344. }
  345. if (extensions) {
  346. generator.extensions_ += extensions;
  347. }
  348. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  349. generator.before_types_ += built_in;
  350. generator.before_types_ += "\n";
  351. if ((0 == std::strcmp(storage_class, "Input")) &&
  352. (0 == std::strcmp(execution_model, "Fragment"))) {
  353. // ensure any needed input types that might require Flat
  354. generator.before_types_ += "OpDecorate %built_in_var Flat\n";
  355. }
  356. std::ostringstream after_types;
  357. if (InitializerRequired(storage_class)) {
  358. after_types << "%built_in_null = OpConstantNull " << data_type << "\n";
  359. }
  360. after_types << "%built_in_ptr = OpTypePointer " << storage_class << " "
  361. << data_type << "\n";
  362. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  363. if (InitializerRequired(storage_class)) {
  364. after_types << " %built_in_null";
  365. }
  366. after_types << "\n";
  367. generator.after_types_ = after_types.str();
  368. EntryPoint entry_point;
  369. entry_point.name = "main";
  370. entry_point.execution_model = execution_model;
  371. if (strncmp(storage_class, "Input", 5) == 0 ||
  372. strncmp(storage_class, "Output", 6) == 0) {
  373. entry_point.interfaces = "%built_in_var";
  374. }
  375. // Any kind of reference would do.
  376. entry_point.body = R"(
  377. %val = OpBitcast %u32 %built_in_var
  378. )";
  379. std::ostringstream execution_modes;
  380. if (0 == std::strcmp(execution_model, "Fragment")) {
  381. execution_modes << "OpExecutionMode %" << entry_point.name
  382. << " OriginUpperLeft\n";
  383. if (0 == std::strcmp(built_in, "FragDepth")) {
  384. execution_modes << "OpExecutionMode %" << entry_point.name
  385. << " DepthReplacing\n";
  386. }
  387. }
  388. if (0 == std::strcmp(execution_model, "Geometry")) {
  389. execution_modes << "OpExecutionMode %" << entry_point.name
  390. << " InputPoints\n";
  391. execution_modes << "OpExecutionMode %" << entry_point.name
  392. << " OutputPoints\n";
  393. }
  394. if (0 == std::strcmp(execution_model, "GLCompute")) {
  395. execution_modes << "OpExecutionMode %" << entry_point.name
  396. << " LocalSize 1 1 1\n";
  397. }
  398. entry_point.execution_modes = execution_modes.str();
  399. generator.entry_points_.push_back(std::move(entry_point));
  400. return generator;
  401. }
  402. TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, Variable) {
  403. const char* const built_in = std::get<0>(GetParam());
  404. const char* const execution_model = std::get<1>(GetParam());
  405. const char* const storage_class = std::get<2>(GetParam());
  406. const char* const data_type = std::get<3>(GetParam());
  407. const char* const vuid = std::get<4>(GetParam());
  408. const TestResult& test_result = std::get<5>(GetParam());
  409. CodeGenerator generator = GetVariableCodeGenerator(
  410. built_in, execution_model, storage_class, NULL, NULL, data_type);
  411. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  412. ASSERT_EQ(test_result.validation_result,
  413. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  414. if (test_result.error_str) {
  415. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  416. }
  417. if (test_result.error_str2) {
  418. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  419. }
  420. if (vuid) {
  421. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  422. }
  423. }
  424. TEST_P(
  425. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  426. Variable) {
  427. const char* const built_in = std::get<0>(GetParam());
  428. const char* const execution_model = std::get<1>(GetParam());
  429. const char* const storage_class = std::get<2>(GetParam());
  430. const char* const data_type = std::get<3>(GetParam());
  431. const char* const capabilities = std::get<4>(GetParam());
  432. const char* const extensions = std::get<5>(GetParam());
  433. const char* const vuid = std::get<6>(GetParam());
  434. const TestResult& test_result = std::get<7>(GetParam());
  435. CodeGenerator generator =
  436. GetVariableCodeGenerator(built_in, execution_model, storage_class,
  437. capabilities, extensions, data_type);
  438. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  439. ASSERT_EQ(test_result.validation_result,
  440. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  441. if (test_result.error_str) {
  442. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  443. }
  444. if (test_result.error_str2) {
  445. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  446. }
  447. if (vuid) {
  448. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  449. }
  450. }
  451. INSTANTIATE_TEST_SUITE_P(
  452. ClipAndCullDistanceOutputSuccess,
  453. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  454. Combine(Values("ClipDistance", "CullDistance"),
  455. Values("Vertex", "Geometry", "TessellationControl",
  456. "TessellationEvaluation"),
  457. Values("Output"), Values("%f32arr2", "%f32arr4"), Values(nullptr),
  458. Values(TestResult())));
  459. INSTANTIATE_TEST_SUITE_P(
  460. ClipAndCullDistanceInputSuccess,
  461. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  462. Combine(Values("ClipDistance", "CullDistance"),
  463. Values("Fragment", "Geometry", "TessellationControl",
  464. "TessellationEvaluation"),
  465. Values("Input"), Values("%f32arr2", "%f32arr4"), Values(nullptr),
  466. Values(TestResult())));
  467. INSTANTIATE_TEST_SUITE_P(
  468. ClipAndCullDistanceInvalidStorageClass,
  469. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  470. Combine(Values("ClipDistance", "CullDistance"),
  471. Values("Vertex", "Geometry", "TessellationControl",
  472. "TessellationEvaluation"),
  473. Values("Private"), Values("%f32arr2", "%f32arr4"),
  474. Values("VUID-ClipDistance-ClipDistance-04190 "
  475. "VUID-CullDistance-CullDistance-04199"),
  476. Values(TestResult(
  477. SPV_ERROR_INVALID_DATA,
  478. "to be only used for variables with Input or Output storage "
  479. "class."))));
  480. INSTANTIATE_TEST_SUITE_P(
  481. ClipAndCullDistanceFragmentOutput,
  482. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  483. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  484. Values("Output"), Values("%f32arr4"),
  485. Values("VUID-ClipDistance-ClipDistance-04189 "
  486. "VUID-CullDistance-CullDistance-04198"),
  487. Values(TestResult(
  488. SPV_ERROR_INVALID_DATA,
  489. "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance "
  490. "to be used for variables with Output storage class if "
  491. "execution model is Fragment.",
  492. "which is called with execution model Fragment."))));
  493. INSTANTIATE_TEST_SUITE_P(
  494. VertexIdVertexInput,
  495. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  496. Combine(
  497. Values("VertexId"), Values("Vertex"), Values("Input"), Values("%u32"),
  498. Values(nullptr),
  499. Values(TestResult(SPV_ERROR_INVALID_DATA,
  500. "Vulkan spec doesn't allow BuiltIn VertexId to be "
  501. "used."))));
  502. INSTANTIATE_TEST_SUITE_P(
  503. ClipAndCullDistanceVertexInput,
  504. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  505. Combine(Values("ClipDistance", "CullDistance"), Values("Vertex"),
  506. Values("Input"), Values("%f32arr4"),
  507. Values("VUID-ClipDistance-ClipDistance-04188 "
  508. "VUID-CullDistance-CullDistance-04197"),
  509. Values(TestResult(
  510. SPV_ERROR_INVALID_DATA,
  511. "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance "
  512. "to be used for variables with Input storage class if "
  513. "execution model is Vertex.",
  514. "which is called with execution model Vertex."))));
  515. INSTANTIATE_TEST_SUITE_P(
  516. ClipAndCullInvalidExecutionModel,
  517. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  518. Combine(Values("ClipDistance", "CullDistance"), Values("GLCompute"),
  519. Values("Input", "Output"), Values("%f32arr4"),
  520. Values("VUID-ClipDistance-ClipDistance-04187 "
  521. "VUID-CullDistance-CullDistance-04196"),
  522. Values(TestResult(
  523. SPV_ERROR_INVALID_DATA,
  524. "to be used only with Fragment, Vertex, TessellationControl, "
  525. "TessellationEvaluation or Geometry execution models"))));
  526. INSTANTIATE_TEST_SUITE_P(
  527. ClipAndCullDistanceNotArray,
  528. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  529. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  530. Values("Input"), Values("%f32vec2", "%f32vec4", "%f32"),
  531. Values("VUID-ClipDistance-ClipDistance-04191 "
  532. "VUID-CullDistance-CullDistance-04200"),
  533. Values(TestResult(SPV_ERROR_INVALID_DATA,
  534. "needs to be a 32-bit float array",
  535. "is not an array"))));
  536. INSTANTIATE_TEST_SUITE_P(
  537. ClipAndCullDistanceNotFloatArray,
  538. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  539. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  540. Values("Input"), Values("%u32arr2", "%u64arr4"),
  541. Values("VUID-ClipDistance-ClipDistance-04191 "
  542. "VUID-CullDistance-CullDistance-04200"),
  543. Values(TestResult(SPV_ERROR_INVALID_DATA,
  544. "needs to be a 32-bit float array",
  545. "components are not float scalar"))));
  546. INSTANTIATE_TEST_SUITE_P(
  547. ClipAndCullDistanceNotF32Array,
  548. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  549. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  550. Values("Input"), Values("%f64arr2", "%f64arr4"),
  551. Values("VUID-ClipDistance-ClipDistance-04191 "
  552. "VUID-CullDistance-CullDistance-04200"),
  553. Values(TestResult(SPV_ERROR_INVALID_DATA,
  554. "needs to be a 32-bit float array",
  555. "has components with bit width 64"))));
  556. INSTANTIATE_TEST_SUITE_P(
  557. FragCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  558. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  559. Values("%f32vec4"), Values(nullptr), Values(TestResult())));
  560. INSTANTIATE_TEST_SUITE_P(
  561. FragCoordNotFragment,
  562. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  563. Combine(
  564. Values("FragCoord"),
  565. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  566. "TessellationEvaluation"),
  567. Values("Input"), Values("%f32vec4"),
  568. Values("VUID-FragCoord-FragCoord-04210"),
  569. Values(TestResult(SPV_ERROR_INVALID_DATA,
  570. "to be used only with Fragment execution model"))));
  571. INSTANTIATE_TEST_SUITE_P(
  572. FragCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  573. Combine(Values("FragCoord"), Values("Fragment"), Values("Output"),
  574. Values("%f32vec4"), Values("VUID-FragCoord-FragCoord-04211"),
  575. Values(TestResult(
  576. SPV_ERROR_INVALID_DATA,
  577. "to be only used for variables with Input storage class",
  578. "uses storage class Output"))));
  579. INSTANTIATE_TEST_SUITE_P(
  580. FragCoordNotFloatVector,
  581. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  582. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  583. Values("%f32arr4", "%u32vec4"),
  584. Values("VUID-FragCoord-FragCoord-04212"),
  585. Values(TestResult(SPV_ERROR_INVALID_DATA,
  586. "needs to be a 4-component 32-bit float vector",
  587. "is not a float vector"))));
  588. INSTANTIATE_TEST_SUITE_P(
  589. FragCoordNotFloatVec4,
  590. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  591. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  592. Values("%f32vec3"), Values("VUID-FragCoord-FragCoord-04212"),
  593. Values(TestResult(SPV_ERROR_INVALID_DATA,
  594. "needs to be a 4-component 32-bit float vector",
  595. "has 3 components"))));
  596. INSTANTIATE_TEST_SUITE_P(
  597. FragCoordNotF32Vec4,
  598. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  599. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  600. Values("%f64vec4"), Values("VUID-FragCoord-FragCoord-04212"),
  601. Values(TestResult(SPV_ERROR_INVALID_DATA,
  602. "needs to be a 4-component 32-bit float vector",
  603. "has components with bit width 64"))));
  604. INSTANTIATE_TEST_SUITE_P(
  605. FragDepthSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  606. Combine(Values("FragDepth"), Values("Fragment"), Values("Output"),
  607. Values("%f32"), Values(nullptr), Values(TestResult())));
  608. INSTANTIATE_TEST_SUITE_P(
  609. FragDepthNotFragment,
  610. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  611. Combine(
  612. Values("FragDepth"),
  613. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  614. "TessellationEvaluation"),
  615. Values("Output"), Values("%f32"),
  616. Values("VUID-FragDepth-FragDepth-04213"),
  617. Values(TestResult(SPV_ERROR_INVALID_DATA,
  618. "to be used only with Fragment execution model"))));
  619. INSTANTIATE_TEST_SUITE_P(
  620. FragDepthNotOutput,
  621. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  622. Combine(Values("FragDepth"), Values("Fragment"), Values("Input"),
  623. Values("%f32"), Values("VUID-FragDepth-FragDepth-04214"),
  624. Values(TestResult(
  625. SPV_ERROR_INVALID_DATA,
  626. "to be only used for variables with Output storage class",
  627. "uses storage class Input"))));
  628. INSTANTIATE_TEST_SUITE_P(
  629. FragDepthNotFloatScalar,
  630. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  631. Combine(Values("FragDepth"), Values("Fragment"), Values("Output"),
  632. Values("%f32vec4", "%u32"),
  633. Values("VUID-FragDepth-FragDepth-04215"),
  634. Values(TestResult(SPV_ERROR_INVALID_DATA,
  635. "needs to be a 32-bit float scalar",
  636. "is not a float scalar"))));
  637. INSTANTIATE_TEST_SUITE_P(
  638. FragDepthNotF32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  639. Combine(Values("FragDepth"), Values("Fragment"), Values("Output"),
  640. Values("%f64"), Values("VUID-FragDepth-FragDepth-04215"),
  641. Values(TestResult(SPV_ERROR_INVALID_DATA,
  642. "needs to be a 32-bit float scalar",
  643. "has bit width 64"))));
  644. INSTANTIATE_TEST_SUITE_P(
  645. FrontFacingAndHelperInvocationSuccess,
  646. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  647. Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"),
  648. Values("Input"), Values("%bool"), Values(nullptr),
  649. Values(TestResult())));
  650. INSTANTIATE_TEST_SUITE_P(
  651. FrontFacingAndHelperInvocationNotFragment,
  652. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  653. Combine(
  654. Values("FrontFacing", "HelperInvocation"),
  655. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  656. "TessellationEvaluation"),
  657. Values("Input"), Values("%bool"),
  658. Values("VUID-FrontFacing-FrontFacing-04229 "
  659. "VUID-HelperInvocation-HelperInvocation-04239"),
  660. Values(TestResult(SPV_ERROR_INVALID_DATA,
  661. "to be used only with Fragment execution model"))));
  662. INSTANTIATE_TEST_SUITE_P(
  663. FrontFacingAndHelperInvocationNotInput,
  664. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  665. Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"),
  666. Values("Output"), Values("%bool"),
  667. Values("VUID-FrontFacing-FrontFacing-04230 "
  668. "VUID-HelperInvocation-HelperInvocation-04240"),
  669. Values(TestResult(
  670. SPV_ERROR_INVALID_DATA,
  671. "to be only used for variables with Input storage class",
  672. "uses storage class Output"))));
  673. INSTANTIATE_TEST_SUITE_P(
  674. FrontFacingAndHelperInvocationNotBool,
  675. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  676. Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"),
  677. Values("Input"), Values("%f32", "%u32"),
  678. Values("VUID-FrontFacing-FrontFacing-04231 "
  679. "VUID-HelperInvocation-HelperInvocation-04241"),
  680. Values(TestResult(SPV_ERROR_INVALID_DATA,
  681. "needs to be a bool scalar",
  682. "is not a bool scalar"))));
  683. INSTANTIATE_TEST_SUITE_P(
  684. ComputeShaderInputInt32Vec3Success,
  685. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  686. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  687. "WorkgroupId"),
  688. Values("GLCompute"), Values("Input"), Values("%u32vec3"),
  689. Values(nullptr), Values(TestResult())));
  690. INSTANTIATE_TEST_SUITE_P(
  691. ComputeShaderInputInt32Vec3NotGLCompute,
  692. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  693. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  694. "WorkgroupId"),
  695. Values("Vertex", "Fragment", "Geometry", "TessellationControl",
  696. "TessellationEvaluation"),
  697. Values("Input"), Values("%u32vec3"),
  698. Values("VUID-GlobalInvocationId-GlobalInvocationId-04236 "
  699. "VUID-LocalInvocationId-LocalInvocationId-04281 "
  700. "VUID-NumWorkgroups-NumWorkgroups-04296 "
  701. "VUID-WorkgroupId-WorkgroupId-04422"),
  702. Values(TestResult(SPV_ERROR_INVALID_DATA,
  703. "to be used only with GLCompute, MeshNV, "
  704. "TaskNV, MeshEXT or TaskEXT execution model"))));
  705. INSTANTIATE_TEST_SUITE_P(
  706. ComputeShaderInputInt32Vec3NotInput,
  707. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  708. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  709. "WorkgroupId"),
  710. Values("GLCompute"), Values("Output"), Values("%u32vec3"),
  711. Values("VUID-GlobalInvocationId-GlobalInvocationId-04237 "
  712. "VUID-LocalInvocationId-LocalInvocationId-04282 "
  713. "VUID-NumWorkgroups-NumWorkgroups-04297 "
  714. "VUID-WorkgroupId-WorkgroupId-04423"),
  715. Values(TestResult(
  716. SPV_ERROR_INVALID_DATA,
  717. "to be only used for variables with Input storage class",
  718. "uses storage class Output"))));
  719. INSTANTIATE_TEST_SUITE_P(
  720. ComputeShaderInputInt32Vec3NotIntVector,
  721. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  722. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  723. "WorkgroupId"),
  724. Values("GLCompute"), Values("Input"),
  725. Values("%u32arr3", "%f32vec3"),
  726. Values("VUID-GlobalInvocationId-GlobalInvocationId-04238 "
  727. "VUID-LocalInvocationId-LocalInvocationId-04283 "
  728. "VUID-NumWorkgroups-NumWorkgroups-04298 "
  729. "VUID-WorkgroupId-WorkgroupId-04424"),
  730. Values(TestResult(SPV_ERROR_INVALID_DATA,
  731. "needs to be a 3-component 32-bit int vector",
  732. "is not an int vector"))));
  733. INSTANTIATE_TEST_SUITE_P(
  734. ComputeShaderInputInt32Vec3NotIntVec3,
  735. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  736. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  737. "WorkgroupId"),
  738. Values("GLCompute"), Values("Input"), Values("%u32vec4"),
  739. Values("VUID-GlobalInvocationId-GlobalInvocationId-04238 "
  740. "VUID-LocalInvocationId-LocalInvocationId-04283 "
  741. "VUID-NumWorkgroups-NumWorkgroups-04298 "
  742. "VUID-WorkgroupId-WorkgroupId-04424"),
  743. Values(TestResult(SPV_ERROR_INVALID_DATA,
  744. "needs to be a 3-component 32-bit int vector",
  745. "has 4 components"))));
  746. INSTANTIATE_TEST_SUITE_P(
  747. ComputeShaderInputInt32Vec3NotInt32Vec,
  748. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  749. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  750. "WorkgroupId"),
  751. Values("GLCompute"), Values("Input"), Values("%u64vec3"),
  752. Values("VUID-GlobalInvocationId-GlobalInvocationId-04238 "
  753. "VUID-LocalInvocationId-LocalInvocationId-04283 "
  754. "VUID-NumWorkgroups-NumWorkgroups-04298 "
  755. "VUID-WorkgroupId-WorkgroupId-04424"),
  756. Values(TestResult(SPV_ERROR_INVALID_DATA,
  757. "needs to be a 3-component 32-bit int vector",
  758. "has components with bit width 64"))));
  759. INSTANTIATE_TEST_SUITE_P(
  760. InvocationIdSuccess,
  761. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  762. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  763. Values("Input"), Values("%u32"), Values(nullptr),
  764. Values(TestResult())));
  765. INSTANTIATE_TEST_SUITE_P(
  766. InvocationIdInvalidExecutionModel,
  767. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  768. Combine(Values("InvocationId"),
  769. Values("Vertex", "Fragment", "GLCompute", "TessellationEvaluation"),
  770. Values("Input"), Values("%u32"),
  771. Values("VUID-InvocationId-InvocationId-04257"),
  772. Values(TestResult(SPV_ERROR_INVALID_DATA,
  773. "to be used only with TessellationControl or "
  774. "Geometry execution models"))));
  775. INSTANTIATE_TEST_SUITE_P(
  776. InvocationIdNotInput,
  777. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  778. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  779. Values("Output"), Values("%u32"),
  780. Values("VUID-InvocationId-InvocationId-04258"),
  781. Values(TestResult(
  782. SPV_ERROR_INVALID_DATA,
  783. "to be only used for variables with Input storage class",
  784. "uses storage class Output"))));
  785. INSTANTIATE_TEST_SUITE_P(
  786. InvocationIdNotIntScalar,
  787. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  788. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  789. Values("Input"), Values("%f32", "%u32vec3"),
  790. Values("VUID-InvocationId-InvocationId-04259"),
  791. Values(TestResult(SPV_ERROR_INVALID_DATA,
  792. "needs to be a 32-bit int scalar",
  793. "is not an int scalar"))));
  794. INSTANTIATE_TEST_SUITE_P(
  795. InvocationIdNotInt32,
  796. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  797. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  798. Values("Input"), Values("%u64"),
  799. Values("VUID-InvocationId-InvocationId-04259"),
  800. Values(TestResult(SPV_ERROR_INVALID_DATA,
  801. "needs to be a 32-bit int scalar",
  802. "has bit width 64"))));
  803. INSTANTIATE_TEST_SUITE_P(
  804. InstanceIndexSuccess,
  805. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  806. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"),
  807. Values("%u32"), Values(nullptr), Values(TestResult())));
  808. INSTANTIATE_TEST_SUITE_P(
  809. InstanceIndexInvalidExecutionModel,
  810. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  811. Combine(Values("InstanceIndex"),
  812. Values("Geometry", "Fragment", "GLCompute", "TessellationControl",
  813. "TessellationEvaluation"),
  814. Values("Input"), Values("%u32"),
  815. Values("VUID-InstanceIndex-InstanceIndex-04263"),
  816. Values(TestResult(SPV_ERROR_INVALID_DATA,
  817. "to be used only with Vertex execution model"))));
  818. INSTANTIATE_TEST_SUITE_P(
  819. InstanceIndexNotInput,
  820. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  821. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Output"),
  822. Values("%u32"), Values("VUID-InstanceIndex-InstanceIndex-04264"),
  823. Values(TestResult(
  824. SPV_ERROR_INVALID_DATA,
  825. "to be only used for variables with Input storage class",
  826. "uses storage class Output"))));
  827. INSTANTIATE_TEST_SUITE_P(
  828. InstanceIndexNotIntScalar,
  829. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  830. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"),
  831. Values("%f32", "%u32vec3"),
  832. Values("VUID-InstanceIndex-InstanceIndex-04265"),
  833. Values(TestResult(SPV_ERROR_INVALID_DATA,
  834. "needs to be a 32-bit int scalar",
  835. "is not an int scalar"))));
  836. INSTANTIATE_TEST_SUITE_P(
  837. InstanceIndexNotInt32,
  838. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  839. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"),
  840. Values("%u64"), Values("VUID-InstanceIndex-InstanceIndex-04265"),
  841. Values(TestResult(SPV_ERROR_INVALID_DATA,
  842. "needs to be a 32-bit int scalar",
  843. "has bit width 64"))));
  844. INSTANTIATE_TEST_SUITE_P(
  845. LayerAndViewportIndexInputSuccess,
  846. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  847. Combine(Values("Layer", "ViewportIndex"), Values("Fragment"),
  848. Values("Input"), Values("%u32"), Values(nullptr),
  849. Values(TestResult())));
  850. INSTANTIATE_TEST_SUITE_P(
  851. LayerAndViewportIndexOutputSuccess,
  852. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  853. Combine(Values("Layer", "ViewportIndex"), Values("Geometry"),
  854. Values("Output"), Values("%u32"), Values(nullptr),
  855. Values(TestResult())));
  856. INSTANTIATE_TEST_SUITE_P(
  857. LayerAndViewportIndexInvalidExecutionModel,
  858. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  859. Combine(
  860. Values("Layer", "ViewportIndex"),
  861. Values("TessellationControl", "GLCompute"), Values("Input"),
  862. Values("%u32"),
  863. Values("VUID-Layer-Layer-04272 VUID-ViewportIndex-ViewportIndex-04404"),
  864. Values(
  865. TestResult(SPV_ERROR_INVALID_DATA,
  866. "to be used only with Vertex, TessellationEvaluation, "
  867. "Geometry, or Fragment execution models"))));
  868. INSTANTIATE_TEST_SUITE_P(
  869. ViewportIndexExecutionModelEnabledByCapability,
  870. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  871. Combine(Values("ViewportIndex"), Values("Vertex", "TessellationEvaluation"),
  872. Values("Output"), Values("%u32"),
  873. Values("VUID-ViewportIndex-ViewportIndex-04405"),
  874. Values(TestResult(
  875. SPV_ERROR_INVALID_DATA,
  876. "ShaderViewportIndexLayerEXT or ShaderViewportIndex"))));
  877. INSTANTIATE_TEST_SUITE_P(
  878. LayerExecutionModelEnabledByCapability,
  879. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  880. Combine(Values("Layer"), Values("Vertex", "TessellationEvaluation"),
  881. Values("Output"), Values("%u32"), Values("VUID-Layer-Layer-04273"),
  882. Values(TestResult(SPV_ERROR_INVALID_DATA,
  883. "ShaderViewportIndexLayerEXT or ShaderLayer"))));
  884. INSTANTIATE_TEST_SUITE_P(
  885. LayerAndViewportIndexFragmentNotInput,
  886. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  887. Combine(
  888. Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Output"),
  889. Values("%u32"),
  890. Values("VUID-Layer-Layer-04275 VUID-ViewportIndex-ViewportIndex-04407"),
  891. Values(TestResult(SPV_ERROR_INVALID_DATA,
  892. "Output storage class if execution model is Fragment",
  893. "which is called with execution model Fragment"))));
  894. INSTANTIATE_TEST_SUITE_P(
  895. LayerAndViewportIndexGeometryNotOutput,
  896. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  897. Combine(
  898. Values("Layer", "ViewportIndex"),
  899. Values("Vertex", "TessellationEvaluation", "Geometry"), Values("Input"),
  900. Values("%u32"),
  901. Values("VUID-Layer-Layer-04274 VUID-ViewportIndex-ViewportIndex-04406"),
  902. Values(TestResult(SPV_ERROR_INVALID_DATA,
  903. "Input storage class if execution model is Vertex, "
  904. "TessellationEvaluation, Geometry, MeshNV or MeshEXT",
  905. "which is called with execution model"))));
  906. INSTANTIATE_TEST_SUITE_P(
  907. LayerAndViewportIndexNotIntScalar,
  908. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  909. Combine(
  910. Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Input"),
  911. Values("%f32", "%u32vec3"),
  912. Values("VUID-Layer-Layer-04276 VUID-ViewportIndex-ViewportIndex-04408"),
  913. Values(TestResult(SPV_ERROR_INVALID_DATA,
  914. "needs to be a 32-bit int scalar",
  915. "is not an int scalar"))));
  916. INSTANTIATE_TEST_SUITE_P(
  917. LayerAndViewportIndexNotInt32,
  918. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  919. Combine(
  920. Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Input"),
  921. Values("%u64"),
  922. Values("VUID-Layer-Layer-04276 VUID-ViewportIndex-ViewportIndex-04408"),
  923. Values(TestResult(SPV_ERROR_INVALID_DATA,
  924. "needs to be a 32-bit int scalar",
  925. "has bit width 64"))));
  926. INSTANTIATE_TEST_SUITE_P(
  927. LayerCapability,
  928. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  929. Combine(Values(SPV_ENV_VULKAN_1_2), Values("Layer"), Values("Vertex"),
  930. Values("Output"), Values("%u32"),
  931. Values("OpCapability ShaderLayer\n"), Values(nullptr),
  932. Values(nullptr), Values(TestResult())));
  933. INSTANTIATE_TEST_SUITE_P(
  934. ViewportIndexCapability,
  935. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  936. Combine(Values(SPV_ENV_VULKAN_1_2), Values("ViewportIndex"),
  937. Values("Vertex"), Values("Output"), Values("%u32"),
  938. Values("OpCapability ShaderViewportIndex\n"), Values(nullptr),
  939. Values(nullptr), Values(TestResult())));
  940. INSTANTIATE_TEST_SUITE_P(
  941. PatchVerticesSuccess,
  942. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  943. Combine(Values("PatchVertices"),
  944. Values("TessellationEvaluation", "TessellationControl"),
  945. Values("Input"), Values("%u32"), Values(nullptr),
  946. Values(TestResult())));
  947. INSTANTIATE_TEST_SUITE_P(
  948. PatchVerticesInvalidExecutionModel,
  949. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  950. Combine(Values("PatchVertices"),
  951. Values("Vertex", "Fragment", "GLCompute", "Geometry"),
  952. Values("Input"), Values("%u32"),
  953. Values("VUID-PatchVertices-PatchVertices-04308"),
  954. Values(TestResult(SPV_ERROR_INVALID_DATA,
  955. "to be used only with TessellationControl or "
  956. "TessellationEvaluation execution models"))));
  957. INSTANTIATE_TEST_SUITE_P(
  958. PatchVerticesNotInput,
  959. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  960. Combine(Values("PatchVertices"),
  961. Values("TessellationEvaluation", "TessellationControl"),
  962. Values("Output"), Values("%u32"),
  963. Values("VUID-PatchVertices-PatchVertices-04309"),
  964. Values(TestResult(
  965. SPV_ERROR_INVALID_DATA,
  966. "to be only used for variables with Input storage class",
  967. "uses storage class Output"))));
  968. INSTANTIATE_TEST_SUITE_P(
  969. PatchVerticesNotIntScalar,
  970. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  971. Combine(Values("PatchVertices"),
  972. Values("TessellationEvaluation", "TessellationControl"),
  973. Values("Input"), Values("%f32", "%u32vec3"),
  974. Values("VUID-PatchVertices-PatchVertices-04310"),
  975. Values(TestResult(SPV_ERROR_INVALID_DATA,
  976. "needs to be a 32-bit int scalar",
  977. "is not an int scalar"))));
  978. INSTANTIATE_TEST_SUITE_P(
  979. PatchVerticesNotInt32,
  980. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  981. Combine(Values("PatchVertices"),
  982. Values("TessellationEvaluation", "TessellationControl"),
  983. Values("Input"), Values("%u64"),
  984. Values("VUID-PatchVertices-PatchVertices-04310"),
  985. Values(TestResult(SPV_ERROR_INVALID_DATA,
  986. "needs to be a 32-bit int scalar",
  987. "has bit width 64"))));
  988. INSTANTIATE_TEST_SUITE_P(
  989. PointCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  990. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  991. Values("%f32vec2"), Values(nullptr), Values(TestResult())));
  992. INSTANTIATE_TEST_SUITE_P(
  993. PointCoordNotFragment,
  994. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  995. Combine(
  996. Values("PointCoord"),
  997. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  998. "TessellationEvaluation"),
  999. Values("Input"), Values("%f32vec2"),
  1000. Values("VUID-PointCoord-PointCoord-04311"),
  1001. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1002. "to be used only with Fragment execution model"))));
  1003. INSTANTIATE_TEST_SUITE_P(
  1004. PointCoordNotInput,
  1005. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1006. Combine(Values("PointCoord"), Values("Fragment"), Values("Output"),
  1007. Values("%f32vec2"), Values("VUID-PointCoord-PointCoord-04312"),
  1008. Values(TestResult(
  1009. SPV_ERROR_INVALID_DATA,
  1010. "to be only used for variables with Input storage class",
  1011. "uses storage class Output"))));
  1012. INSTANTIATE_TEST_SUITE_P(
  1013. PointCoordNotFloatVector,
  1014. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1015. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  1016. Values("%f32arr2", "%u32vec2"),
  1017. Values("VUID-PointCoord-PointCoord-04313"),
  1018. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1019. "needs to be a 2-component 32-bit float vector",
  1020. "is not a float vector"))));
  1021. INSTANTIATE_TEST_SUITE_P(
  1022. PointCoordNotFloatVec3,
  1023. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1024. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  1025. Values("%f32vec3"), Values("VUID-PointCoord-PointCoord-04313"),
  1026. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1027. "needs to be a 2-component 32-bit float vector",
  1028. "has 3 components"))));
  1029. INSTANTIATE_TEST_SUITE_P(
  1030. PointCoordNotF32Vec4,
  1031. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1032. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  1033. Values("%f64vec2"), Values("VUID-PointCoord-PointCoord-04313"),
  1034. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1035. "needs to be a 2-component 32-bit float vector",
  1036. "has components with bit width 64"))));
  1037. INSTANTIATE_TEST_SUITE_P(
  1038. PointSizeOutputSuccess,
  1039. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1040. Combine(Values("PointSize"),
  1041. Values("Vertex", "Geometry", "TessellationControl",
  1042. "TessellationEvaluation"),
  1043. Values("Output"), Values("%f32"), Values(nullptr),
  1044. Values(TestResult())));
  1045. INSTANTIATE_TEST_SUITE_P(
  1046. PointSizeInputSuccess,
  1047. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1048. Combine(Values("PointSize"),
  1049. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  1050. Values("Input"), Values("%f32"), Values(nullptr),
  1051. Values(TestResult())));
  1052. INSTANTIATE_TEST_SUITE_P(
  1053. PointSizeVertexInput,
  1054. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1055. Combine(Values("PointSize"), Values("Vertex"), Values("Input"),
  1056. Values("%f32"), Values("VUID-PointSize-PointSize-04315"),
  1057. Values(TestResult(
  1058. SPV_ERROR_INVALID_DATA,
  1059. "Vulkan spec doesn't allow BuiltIn PointSize "
  1060. "to be used for variables with Input storage class if "
  1061. "execution model is Vertex.",
  1062. "which is called with execution model Vertex."))));
  1063. INSTANTIATE_TEST_SUITE_P(
  1064. PointSizeInvalidExecutionModel,
  1065. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1066. Combine(Values("PointSize"), Values("GLCompute", "Fragment"),
  1067. Values("Input", "Output"), Values("%f32"),
  1068. Values("VUID-PointSize-PointSize-04314"),
  1069. Values(TestResult(
  1070. SPV_ERROR_INVALID_DATA,
  1071. "to be used only with Vertex, TessellationControl, "
  1072. "TessellationEvaluation or Geometry execution models"))));
  1073. INSTANTIATE_TEST_SUITE_P(
  1074. PointSizeNotFloatScalar,
  1075. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1076. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  1077. Values("%f32vec4", "%u32"),
  1078. Values("VUID-PointSize-PointSize-04317"),
  1079. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1080. "needs to be a 32-bit float scalar",
  1081. "is not a float scalar"))));
  1082. INSTANTIATE_TEST_SUITE_P(
  1083. PointSizeNotF32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1084. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  1085. Values("%f64"), Values("VUID-PointSize-PointSize-04317"),
  1086. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1087. "needs to be a 32-bit float scalar",
  1088. "has bit width 64"))));
  1089. INSTANTIATE_TEST_SUITE_P(
  1090. PositionOutputSuccess,
  1091. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1092. Combine(Values("Position"),
  1093. Values("Vertex", "Geometry", "TessellationControl",
  1094. "TessellationEvaluation"),
  1095. Values("Output"), Values("%f32vec4"), Values(nullptr),
  1096. Values(TestResult())));
  1097. INSTANTIATE_TEST_SUITE_P(
  1098. PositionInputSuccess,
  1099. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1100. Combine(Values("Position"),
  1101. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  1102. Values("Input"), Values("%f32vec4"), Values(nullptr),
  1103. Values(TestResult())));
  1104. INSTANTIATE_TEST_SUITE_P(
  1105. PositionInvalidStorageClass,
  1106. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1107. Combine(Values("Position"),
  1108. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  1109. Values("Private"), Values("%f32vec4"),
  1110. Values("VUID-Position-Position-04320"),
  1111. Values(TestResult(
  1112. SPV_ERROR_INVALID_DATA,
  1113. "Vulkan spec allows BuiltIn Position to be only used for "
  1114. "variables with Input or Output storage class."))));
  1115. INSTANTIATE_TEST_SUITE_P(
  1116. PositionVertexInput,
  1117. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1118. Combine(Values("Position"), Values("Vertex"), Values("Input"),
  1119. Values("%f32vec4"), Values("VUID-Position-Position-04319"),
  1120. Values(TestResult(
  1121. SPV_ERROR_INVALID_DATA,
  1122. "Vulkan spec doesn't allow BuiltIn Position "
  1123. "to be used for variables with Input storage class if "
  1124. "execution model is Vertex.",
  1125. "which is called with execution model Vertex."))));
  1126. INSTANTIATE_TEST_SUITE_P(
  1127. PositionInvalidExecutionModel,
  1128. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1129. Combine(Values("Position"), Values("GLCompute", "Fragment"),
  1130. Values("Input", "Output"), Values("%f32vec4"),
  1131. Values("VUID-Position-Position-04318"),
  1132. Values(TestResult(
  1133. SPV_ERROR_INVALID_DATA,
  1134. "to be used only with Vertex, TessellationControl, "
  1135. "TessellationEvaluation or Geometry execution models"))));
  1136. INSTANTIATE_TEST_SUITE_P(
  1137. PositionNotFloatVector,
  1138. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1139. Combine(Values("Position"), Values("Geometry"), Values("Input"),
  1140. Values("%f32arr4", "%u32vec4"),
  1141. Values("VUID-Position-Position-04321"),
  1142. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1143. "needs to be a 4-component 32-bit float vector",
  1144. "is not a float vector"))));
  1145. INSTANTIATE_TEST_SUITE_P(
  1146. PositionNotFloatVec4,
  1147. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1148. Combine(Values("Position"), Values("Geometry"), Values("Input"),
  1149. Values("%f32vec3"), Values("VUID-Position-Position-04321"),
  1150. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1151. "needs to be a 4-component 32-bit float vector",
  1152. "has 3 components"))));
  1153. INSTANTIATE_TEST_SUITE_P(
  1154. PositionNotF32Vec4,
  1155. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1156. Combine(Values("Position"), Values("Geometry"), Values("Input"),
  1157. Values("%f64vec4"), Values("VUID-Position-Position-04321"),
  1158. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1159. "needs to be a 4-component 32-bit float vector",
  1160. "has components with bit width 64"))));
  1161. INSTANTIATE_TEST_SUITE_P(
  1162. PrimitiveIdInputSuccess,
  1163. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1164. Combine(Values("PrimitiveId"),
  1165. Values("Fragment", "TessellationControl", "TessellationEvaluation",
  1166. "Geometry"),
  1167. Values("Input"), Values("%u32"), Values(nullptr),
  1168. Values(TestResult())));
  1169. INSTANTIATE_TEST_SUITE_P(
  1170. PrimitiveIdOutputSuccess,
  1171. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1172. Combine(Values("PrimitiveId"), Values("Geometry"), Values("Output"),
  1173. Values("%u32"), Values(nullptr), Values(TestResult())));
  1174. INSTANTIATE_TEST_SUITE_P(
  1175. PrimitiveIdInvalidExecutionModel,
  1176. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1177. Combine(
  1178. Values("PrimitiveId"), Values("Vertex", "GLCompute"), Values("Input"),
  1179. Values("%u32"), Values("VUID-PrimitiveId-PrimitiveId-04330"),
  1180. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1181. "to be used only with Fragment, TessellationControl, "
  1182. "TessellationEvaluation, Geometry, MeshNV, MeshEXT, "
  1183. "IntersectionKHR, "
  1184. "AnyHitKHR, and ClosestHitKHR execution models"))));
  1185. INSTANTIATE_TEST_SUITE_P(
  1186. PrimitiveIdFragmentNotInput,
  1187. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1188. Combine(
  1189. Values("PrimitiveId"), Values("Fragment"), Values("Output"),
  1190. Values("%u32"), Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1191. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1192. "Output storage class if execution model is Fragment",
  1193. "which is called with execution model Fragment"))));
  1194. INSTANTIATE_TEST_SUITE_P(
  1195. PrimitiveIdTessellationNotInput,
  1196. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1197. Combine(Values("PrimitiveId"),
  1198. Values("TessellationControl", "TessellationEvaluation"),
  1199. Values("Output"), Values("%u32"),
  1200. Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1201. Values(TestResult(
  1202. SPV_ERROR_INVALID_DATA,
  1203. "Output storage class if execution model is Tessellation",
  1204. "which is called with execution model Tessellation"))));
  1205. INSTANTIATE_TEST_SUITE_P(
  1206. PrimitiveIdNotIntScalar,
  1207. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1208. Combine(Values("PrimitiveId"), Values("Fragment"), Values("Input"),
  1209. Values("%f32", "%u32vec3"),
  1210. Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1211. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1212. "needs to be a 32-bit int scalar",
  1213. "is not an int scalar"))));
  1214. INSTANTIATE_TEST_SUITE_P(
  1215. PrimitiveIdNotInt32,
  1216. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1217. Combine(Values("PrimitiveId"), Values("Fragment"), Values("Input"),
  1218. Values("%u64"), Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1219. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1220. "needs to be a 32-bit int scalar",
  1221. "has bit width 64"))));
  1222. INSTANTIATE_TEST_SUITE_P(
  1223. SampleIdSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1224. Combine(Values("SampleId"), Values("Fragment"), Values("Input"),
  1225. Values("%u32"), Values(nullptr), Values(TestResult())));
  1226. INSTANTIATE_TEST_SUITE_P(
  1227. SampleIdInvalidExecutionModel,
  1228. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1229. Combine(
  1230. Values("SampleId"),
  1231. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1232. "TessellationEvaluation"),
  1233. Values("Input"), Values("%u32"), Values("VUID-SampleId-SampleId-04354"),
  1234. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1235. "to be used only with Fragment execution model"))));
  1236. INSTANTIATE_TEST_SUITE_P(
  1237. SampleIdNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1238. Combine(
  1239. Values("SampleId"), Values("Fragment"), Values("Output"),
  1240. Values("%u32"), Values("VUID-SampleId-SampleId-04355"),
  1241. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1242. "Vulkan spec allows BuiltIn SampleId to be only used "
  1243. "for variables with Input storage class"))));
  1244. INSTANTIATE_TEST_SUITE_P(
  1245. SampleIdNotIntScalar,
  1246. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1247. Combine(Values("SampleId"), Values("Fragment"), Values("Input"),
  1248. Values("%f32", "%u32vec3"), Values("VUID-SampleId-SampleId-04356"),
  1249. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1250. "needs to be a 32-bit int scalar",
  1251. "is not an int scalar"))));
  1252. INSTANTIATE_TEST_SUITE_P(
  1253. SampleIdNotInt32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1254. Combine(Values("SampleId"), Values("Fragment"), Values("Input"),
  1255. Values("%u64"), Values("VUID-SampleId-SampleId-04356"),
  1256. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1257. "needs to be a 32-bit int scalar",
  1258. "has bit width 64"))));
  1259. INSTANTIATE_TEST_SUITE_P(
  1260. SampleMaskSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1261. Combine(Values("SampleMask"), Values("Fragment"), Values("Input", "Output"),
  1262. Values("%u32arr2", "%u32arr4"), Values(nullptr),
  1263. Values(TestResult())));
  1264. INSTANTIATE_TEST_SUITE_P(
  1265. SampleMaskInvalidExecutionModel,
  1266. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1267. Combine(
  1268. Values("SampleMask"),
  1269. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1270. "TessellationEvaluation"),
  1271. Values("Input"), Values("%u32arr2"),
  1272. Values("VUID-SampleMask-SampleMask-04357"),
  1273. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1274. "to be used only with Fragment execution model"))));
  1275. INSTANTIATE_TEST_SUITE_P(
  1276. SampleMaskNotArray,
  1277. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1278. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1279. Values("%f32", "%u32vec3"),
  1280. Values("VUID-SampleMask-SampleMask-04359"),
  1281. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1282. "needs to be a 32-bit int array",
  1283. "is not an array"))));
  1284. INSTANTIATE_TEST_SUITE_P(
  1285. SampleMaskNotIntArray,
  1286. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1287. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1288. Values("%f32arr2"), Values("VUID-SampleMask-SampleMask-04359"),
  1289. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1290. "needs to be a 32-bit int array",
  1291. "components are not int scalar"))));
  1292. INSTANTIATE_TEST_SUITE_P(
  1293. SampleMaskNotInt32Array,
  1294. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1295. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1296. Values("%u64arr2"), Values("VUID-SampleMask-SampleMask-04359"),
  1297. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1298. "needs to be a 32-bit int array",
  1299. "has components with bit width 64"))));
  1300. INSTANTIATE_TEST_SUITE_P(
  1301. SamplePositionSuccess,
  1302. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1303. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1304. Values("%f32vec2"), Values(nullptr), Values(TestResult())));
  1305. INSTANTIATE_TEST_SUITE_P(
  1306. SamplePositionNotFragment,
  1307. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1308. Combine(
  1309. Values("SamplePosition"),
  1310. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1311. "TessellationEvaluation"),
  1312. Values("Input"), Values("%f32vec2"),
  1313. Values("VUID-SamplePosition-SamplePosition-04360"),
  1314. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1315. "to be used only with Fragment execution model"))));
  1316. INSTANTIATE_TEST_SUITE_P(
  1317. SamplePositionNotInput,
  1318. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1319. Combine(Values("SamplePosition"), Values("Fragment"), Values("Output"),
  1320. Values("%f32vec2"),
  1321. Values("VUID-SamplePosition-SamplePosition-04361"),
  1322. Values(TestResult(
  1323. SPV_ERROR_INVALID_DATA,
  1324. "to be only used for variables with Input storage class",
  1325. "uses storage class Output"))));
  1326. INSTANTIATE_TEST_SUITE_P(
  1327. SamplePositionNotFloatVector,
  1328. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1329. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1330. Values("%f32arr2", "%u32vec4"),
  1331. Values("VUID-SamplePosition-SamplePosition-04362"),
  1332. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1333. "needs to be a 2-component 32-bit float vector",
  1334. "is not a float vector"))));
  1335. INSTANTIATE_TEST_SUITE_P(
  1336. SamplePositionNotFloatVec2,
  1337. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1338. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1339. Values("%f32vec3"),
  1340. Values("VUID-SamplePosition-SamplePosition-04362"),
  1341. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1342. "needs to be a 2-component 32-bit float vector",
  1343. "has 3 components"))));
  1344. INSTANTIATE_TEST_SUITE_P(
  1345. SamplePositionNotF32Vec2,
  1346. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1347. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1348. Values("%f64vec2"),
  1349. Values("VUID-SamplePosition-SamplePosition-04362"),
  1350. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1351. "needs to be a 2-component 32-bit float vector",
  1352. "has components with bit width 64"))));
  1353. INSTANTIATE_TEST_SUITE_P(
  1354. TessCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1355. Combine(Values("TessCoord"), Values("TessellationEvaluation"),
  1356. Values("Input"), Values("%f32vec3"), Values(nullptr),
  1357. Values(TestResult())));
  1358. INSTANTIATE_TEST_SUITE_P(
  1359. TessCoordNotFragment,
  1360. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1361. Combine(
  1362. Values("TessCoord"),
  1363. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1364. "Fragment"),
  1365. Values("Input"), Values("%f32vec3"),
  1366. Values("VUID-TessCoord-TessCoord-04387"),
  1367. Values(TestResult(
  1368. SPV_ERROR_INVALID_DATA,
  1369. "to be used only with TessellationEvaluation execution model"))));
  1370. INSTANTIATE_TEST_SUITE_P(
  1371. TessCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1372. Combine(Values("TessCoord"), Values("Fragment"), Values("Output"),
  1373. Values("%f32vec3"), Values("VUID-TessCoord-TessCoord-04388"),
  1374. Values(TestResult(
  1375. SPV_ERROR_INVALID_DATA,
  1376. "to be only used for variables with Input storage class",
  1377. "uses storage class Output"))));
  1378. INSTANTIATE_TEST_SUITE_P(
  1379. TessCoordNotFloatVector,
  1380. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1381. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1382. Values("%f32arr3", "%u32vec4"),
  1383. Values("VUID-TessCoord-TessCoord-04389"),
  1384. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1385. "needs to be a 3-component 32-bit float vector",
  1386. "is not a float vector"))));
  1387. INSTANTIATE_TEST_SUITE_P(
  1388. TessCoordNotFloatVec3,
  1389. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1390. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1391. Values("%f32vec2"), Values("VUID-TessCoord-TessCoord-04389"),
  1392. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1393. "needs to be a 3-component 32-bit float vector",
  1394. "has 2 components"))));
  1395. INSTANTIATE_TEST_SUITE_P(
  1396. TessCoordNotF32Vec3,
  1397. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1398. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1399. Values("%f64vec3"), Values("VUID-TessCoord-TessCoord-04389"),
  1400. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1401. "needs to be a 3-component 32-bit float vector",
  1402. "has components with bit width 64"))));
  1403. INSTANTIATE_TEST_SUITE_P(
  1404. TessLevelOuterTeseInputSuccess,
  1405. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1406. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1407. Values("Input"), Values("%f32arr4"), Values(nullptr),
  1408. Values(TestResult())));
  1409. INSTANTIATE_TEST_SUITE_P(
  1410. TessLevelOuterTescOutputSuccess,
  1411. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1412. Combine(Values("TessLevelOuter"), Values("TessellationControl"),
  1413. Values("Output"), Values("%f32arr4"), Values(nullptr),
  1414. Values(TestResult())));
  1415. INSTANTIATE_TEST_SUITE_P(
  1416. TessLevelOuterInvalidExecutionModel,
  1417. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1418. Combine(Values("TessLevelOuter"),
  1419. Values("Vertex", "GLCompute", "Geometry", "Fragment"),
  1420. Values("Input"), Values("%f32arr4"),
  1421. Values("VUID-TessLevelOuter-TessLevelOuter-04390"),
  1422. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1423. "to be used only with TessellationControl or "
  1424. "TessellationEvaluation execution models."))));
  1425. INSTANTIATE_TEST_SUITE_P(
  1426. TessLevelOuterOutputTese,
  1427. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1428. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1429. Values("Output"), Values("%f32arr4"),
  1430. Values("VUID-TessLevelOuter-TessLevelOuter-04392"),
  1431. Values(TestResult(
  1432. SPV_ERROR_INVALID_DATA,
  1433. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1434. "used for variables with Output storage class if execution "
  1435. "model is TessellationEvaluation."))));
  1436. INSTANTIATE_TEST_SUITE_P(
  1437. TessLevelOuterInputTesc,
  1438. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1439. Combine(Values("TessLevelOuter"), Values("TessellationControl"),
  1440. Values("Input"), Values("%f32arr4"),
  1441. Values("VUID-TessLevelOuter-TessLevelOuter-04391"),
  1442. Values(TestResult(
  1443. SPV_ERROR_INVALID_DATA,
  1444. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1445. "used for variables with Input storage class if execution "
  1446. "model is TessellationControl."))));
  1447. INSTANTIATE_TEST_SUITE_P(
  1448. TessLevelOuterNotArray,
  1449. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1450. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1451. Values("Input"), Values("%f32vec4", "%f32"),
  1452. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1453. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1454. "needs to be a 4-component 32-bit float array",
  1455. "is not an array"))));
  1456. INSTANTIATE_TEST_SUITE_P(
  1457. TessLevelOuterNotFloatArray,
  1458. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1459. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1460. Values("Input"), Values("%u32arr4"),
  1461. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1462. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1463. "needs to be a 4-component 32-bit float array",
  1464. "components are not float scalar"))));
  1465. INSTANTIATE_TEST_SUITE_P(
  1466. TessLevelOuterNotFloatArr4,
  1467. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1468. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1469. Values("Input"), Values("%f32arr3"),
  1470. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1471. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1472. "needs to be a 4-component 32-bit float array",
  1473. "has 3 components"))));
  1474. INSTANTIATE_TEST_SUITE_P(
  1475. TessLevelOuterNotF32Arr4,
  1476. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1477. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1478. Values("Input"), Values("%f64arr4"),
  1479. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1480. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1481. "needs to be a 4-component 32-bit float array",
  1482. "has components with bit width 64"))));
  1483. INSTANTIATE_TEST_SUITE_P(
  1484. TessLevelInnerTeseInputSuccess,
  1485. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1486. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1487. Values("Input"), Values("%f32arr2"), Values(nullptr),
  1488. Values(TestResult())));
  1489. INSTANTIATE_TEST_SUITE_P(
  1490. TessLevelInnerTescOutputSuccess,
  1491. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1492. Combine(Values("TessLevelInner"), Values("TessellationControl"),
  1493. Values("Output"), Values("%f32arr2"), Values(nullptr),
  1494. Values(TestResult())));
  1495. INSTANTIATE_TEST_SUITE_P(
  1496. TessLevelInnerInvalidExecutionModel,
  1497. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1498. Combine(Values("TessLevelInner"),
  1499. Values("Vertex", "GLCompute", "Geometry", "Fragment"),
  1500. Values("Input"), Values("%f32arr2"),
  1501. Values("VUID-TessLevelInner-TessLevelInner-04394"),
  1502. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1503. "to be used only with TessellationControl or "
  1504. "TessellationEvaluation execution models."))));
  1505. INSTANTIATE_TEST_SUITE_P(
  1506. TessLevelInnerOutputTese,
  1507. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1508. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1509. Values("Output"), Values("%f32arr2"),
  1510. Values("VUID-TessLevelInner-TessLevelInner-04396"),
  1511. Values(TestResult(
  1512. SPV_ERROR_INVALID_DATA,
  1513. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1514. "used for variables with Output storage class if execution "
  1515. "model is TessellationEvaluation."))));
  1516. INSTANTIATE_TEST_SUITE_P(
  1517. TessLevelInnerInputTesc,
  1518. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1519. Combine(Values("TessLevelInner"), Values("TessellationControl"),
  1520. Values("Input"), Values("%f32arr2"),
  1521. Values("VUID-TessLevelInner-TessLevelInner-04395"),
  1522. Values(TestResult(
  1523. SPV_ERROR_INVALID_DATA,
  1524. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1525. "used for variables with Input storage class if execution "
  1526. "model is TessellationControl."))));
  1527. INSTANTIATE_TEST_SUITE_P(
  1528. TessLevelInnerNotArray,
  1529. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1530. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1531. Values("Input"), Values("%f32vec2", "%f32"),
  1532. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1533. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1534. "needs to be a 2-component 32-bit float array",
  1535. "is not an array"))));
  1536. INSTANTIATE_TEST_SUITE_P(
  1537. TessLevelInnerNotFloatArray,
  1538. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1539. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1540. Values("Input"), Values("%u32arr2"),
  1541. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1542. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1543. "needs to be a 2-component 32-bit float array",
  1544. "components are not float scalar"))));
  1545. INSTANTIATE_TEST_SUITE_P(
  1546. TessLevelInnerNotFloatArr2,
  1547. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1548. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1549. Values("Input"), Values("%f32arr3"),
  1550. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1551. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1552. "needs to be a 2-component 32-bit float array",
  1553. "has 3 components"))));
  1554. INSTANTIATE_TEST_SUITE_P(
  1555. TessLevelInnerNotF32Arr2,
  1556. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1557. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1558. Values("Input"), Values("%f64arr2"),
  1559. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1560. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1561. "needs to be a 2-component 32-bit float array",
  1562. "has components with bit width 64"))));
  1563. INSTANTIATE_TEST_SUITE_P(
  1564. VertexIndexSuccess,
  1565. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1566. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1567. Values("%u32"), Values(nullptr), Values(TestResult())));
  1568. INSTANTIATE_TEST_SUITE_P(
  1569. VertexIndexInvalidExecutionModel,
  1570. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1571. Combine(Values("VertexIndex"),
  1572. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1573. "TessellationEvaluation"),
  1574. Values("Input"), Values("%u32"),
  1575. Values("VUID-VertexIndex-VertexIndex-04398"),
  1576. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1577. "to be used only with Vertex execution model"))));
  1578. INSTANTIATE_TEST_SUITE_P(
  1579. VertexIndexNotInput,
  1580. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1581. Combine(
  1582. Values("VertexIndex"), Values("Vertex"), Values("Output"),
  1583. Values("%u32"), Values("VUID-VertexIndex-VertexIndex-04399"),
  1584. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1585. "Vulkan spec allows BuiltIn VertexIndex to be only "
  1586. "used for variables with Input storage class"))));
  1587. INSTANTIATE_TEST_SUITE_P(
  1588. VertexIndexNotIntScalar,
  1589. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1590. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1591. Values("%f32", "%u32vec3"),
  1592. Values("VUID-VertexIndex-VertexIndex-04400"),
  1593. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1594. "needs to be a 32-bit int scalar",
  1595. "is not an int scalar"))));
  1596. INSTANTIATE_TEST_SUITE_P(
  1597. VertexIndexNotInt32,
  1598. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1599. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1600. Values("%u64"), Values("VUID-VertexIndex-VertexIndex-04400"),
  1601. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1602. "needs to be a 32-bit int scalar",
  1603. "has bit width 64"))));
  1604. INSTANTIATE_TEST_SUITE_P(
  1605. BaseInstanceOrVertexSuccess,
  1606. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1607. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1608. Values("Input"), Values("%u32"),
  1609. Values("OpCapability DrawParameters\n"),
  1610. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1611. Values(nullptr), Values(TestResult())));
  1612. INSTANTIATE_TEST_SUITE_P(
  1613. BaseInstanceOrVertexInvalidExecutionModel,
  1614. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1615. Combine(Values("BaseInstance", "BaseVertex"),
  1616. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1617. "TessellationEvaluation"),
  1618. Values("Input"), Values("%u32"),
  1619. Values("OpCapability DrawParameters\n"),
  1620. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1621. Values("VUID-BaseInstance-BaseInstance-04181 "
  1622. "VUID-BaseVertex-BaseVertex-04184"),
  1623. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1624. "to be used only with Vertex execution model"))));
  1625. INSTANTIATE_TEST_SUITE_P(
  1626. BaseInstanceOrVertexNotInput,
  1627. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1628. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1629. Values("Output"), Values("%u32"),
  1630. Values("OpCapability DrawParameters\n"),
  1631. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1632. Values("VUID-BaseInstance-BaseInstance-04182 "
  1633. "VUID-BaseVertex-BaseVertex-04185"),
  1634. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1635. "used for variables with Input storage class"))));
  1636. INSTANTIATE_TEST_SUITE_P(
  1637. BaseInstanceOrVertexNotIntScalar,
  1638. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1639. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1640. Values("Input"), Values("%f32", "%u32vec3"),
  1641. Values("OpCapability DrawParameters\n"),
  1642. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1643. Values("VUID-BaseInstance-BaseInstance-04183 "
  1644. "VUID-BaseVertex-BaseVertex-04186"),
  1645. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1646. "needs to be a 32-bit int scalar",
  1647. "is not an int scalar"))));
  1648. INSTANTIATE_TEST_SUITE_P(
  1649. DrawIndexSuccess,
  1650. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1651. Combine(Values("DrawIndex"), Values("Vertex"), Values("Input"),
  1652. Values("%u32"), Values("OpCapability DrawParameters\n"),
  1653. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1654. Values(nullptr), Values(TestResult())));
  1655. INSTANTIATE_TEST_SUITE_P(
  1656. DrawIndexMeshSuccess,
  1657. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1658. Combine(
  1659. Values("DrawIndex"), Values("MeshNV", "TaskNV"), Values("Input"),
  1660. Values("%u32"), Values("OpCapability MeshShadingNV\n"),
  1661. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\nOpExtension "
  1662. "\"SPV_NV_mesh_shader\"\n"),
  1663. Values(nullptr), Values(TestResult())));
  1664. INSTANTIATE_TEST_SUITE_P(
  1665. DrawIndexInvalidExecutionModel,
  1666. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1667. Combine(
  1668. Values("DrawIndex"),
  1669. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1670. "TessellationEvaluation"),
  1671. Values("Input"), Values("%u32"),
  1672. Values("OpCapability DrawParameters\n"),
  1673. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1674. Values("VUID-DrawIndex-DrawIndex-04207"),
  1675. Values(TestResult(
  1676. SPV_ERROR_INVALID_DATA,
  1677. "to be used only with Vertex, MeshNV, TaskNV , MeshEXT or TaskEXT "
  1678. "execution model"))));
  1679. INSTANTIATE_TEST_SUITE_P(
  1680. DrawIndexNotInput,
  1681. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1682. Combine(Values("DrawIndex"), Values("Vertex"), Values("Output"),
  1683. Values("%u32"), Values("OpCapability DrawParameters\n"),
  1684. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1685. Values("VUID-DrawIndex-DrawIndex-04208"),
  1686. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1687. "used for variables with Input storage class"))));
  1688. INSTANTIATE_TEST_SUITE_P(
  1689. DrawIndexNotIntScalar,
  1690. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1691. Combine(Values("DrawIndex"), Values("Vertex"), Values("Input"),
  1692. Values("%f32", "%u32vec3"), Values("OpCapability DrawParameters\n"),
  1693. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1694. Values("VUID-DrawIndex-DrawIndex-04209"),
  1695. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1696. "needs to be a 32-bit int scalar",
  1697. "is not an int scalar"))));
  1698. INSTANTIATE_TEST_SUITE_P(
  1699. ViewIndexSuccess,
  1700. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1701. Combine(Values("ViewIndex"),
  1702. Values("Fragment", "Vertex", "Geometry", "TessellationControl",
  1703. "TessellationEvaluation"),
  1704. Values("Input"), Values("%u32"), Values("OpCapability MultiView\n"),
  1705. Values("OpExtension \"SPV_KHR_multiview\"\n"), Values(nullptr),
  1706. Values(TestResult())));
  1707. INSTANTIATE_TEST_SUITE_P(
  1708. ViewIndexInvalidExecutionModel,
  1709. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1710. Combine(Values("ViewIndex"), Values("GLCompute"), Values("Input"),
  1711. Values("%u32"), Values("OpCapability MultiView\n"),
  1712. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1713. Values("VUID-ViewIndex-ViewIndex-04401"),
  1714. Values(TestResult(
  1715. SPV_ERROR_INVALID_DATA,
  1716. "to be not be used with GLCompute execution model"))));
  1717. INSTANTIATE_TEST_SUITE_P(
  1718. ViewIndexNotInput,
  1719. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1720. Combine(Values("ViewIndex"), Values("Vertex"), Values("Output"),
  1721. Values("%u32"), Values("OpCapability MultiView\n"),
  1722. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1723. Values("VUID-ViewIndex-ViewIndex-04402"),
  1724. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1725. "used for variables with Input storage class"))));
  1726. INSTANTIATE_TEST_SUITE_P(
  1727. ViewIndexNotIntScalar,
  1728. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1729. Combine(Values("ViewIndex"), Values("Vertex"), Values("Input"),
  1730. Values("%f32", "%u32vec3"), Values("OpCapability MultiView\n"),
  1731. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1732. Values("VUID-ViewIndex-ViewIndex-04403"),
  1733. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1734. "needs to be a 32-bit int scalar",
  1735. "is not an int scalar"))));
  1736. INSTANTIATE_TEST_SUITE_P(
  1737. DeviceIndexSuccess,
  1738. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1739. Combine(Values("DeviceIndex"),
  1740. Values("Fragment", "Vertex", "Geometry", "TessellationControl",
  1741. "TessellationEvaluation", "GLCompute"),
  1742. Values("Input"), Values("%u32"),
  1743. Values("OpCapability DeviceGroup\n"),
  1744. Values("OpExtension \"SPV_KHR_device_group\"\n"), Values(nullptr),
  1745. Values(TestResult())));
  1746. INSTANTIATE_TEST_SUITE_P(
  1747. DeviceIndexNotInput,
  1748. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1749. Combine(Values("DeviceIndex"), Values("Fragment", "Vertex", "GLCompute"),
  1750. Values("Output"), Values("%u32"),
  1751. Values("OpCapability DeviceGroup\n"),
  1752. Values("OpExtension \"SPV_KHR_device_group\"\n"),
  1753. Values("VUID-DeviceIndex-DeviceIndex-04205"),
  1754. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1755. "used for variables with Input storage class"))));
  1756. INSTANTIATE_TEST_SUITE_P(
  1757. DeviceIndexNotIntScalar,
  1758. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1759. Combine(Values("DeviceIndex"), Values("Fragment", "Vertex", "GLCompute"),
  1760. Values("Input"), Values("%f32", "%u32vec3"),
  1761. Values("OpCapability DeviceGroup\n"),
  1762. Values("OpExtension \"SPV_KHR_device_group\"\n"),
  1763. Values("VUID-DeviceIndex-DeviceIndex-04206"),
  1764. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1765. "needs to be a 32-bit int scalar",
  1766. "is not an int scalar"))));
  1767. // Test HitKind in NV RT shaders
  1768. INSTANTIATE_TEST_SUITE_P(
  1769. HitKindNVSuccess,
  1770. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1771. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindNV"),
  1772. Values("AnyHitNV", "ClosestHitNV"), Values("Input"), Values("%u32"),
  1773. Values("OpCapability RayTracingNV\n"),
  1774. Values("OpExtension \"SPV_NV_ray_tracing\"\n"), Values(nullptr),
  1775. Values(TestResult())));
  1776. // HitKind is valid in AH, CH shaders as input i32 scalar
  1777. INSTANTIATE_TEST_SUITE_P(
  1778. HitKindSuccess,
  1779. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1780. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1781. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1782. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1783. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1784. Values(TestResult())));
  1785. INSTANTIATE_TEST_SUITE_P(
  1786. HitKindNotExecutionMode,
  1787. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1788. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1789. Values("Vertex", "Fragment", "TessellationControl",
  1790. "TessellationEvaluation", "Geometry", "Fragment",
  1791. "GLCompute", "RayGenerationKHR", "IntersectionKHR",
  1792. "MissKHR", "CallableKHR"),
  1793. Values("Input"), Values("%u32"),
  1794. Values("OpCapability RayTracingKHR\n"),
  1795. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1796. Values("VUID-HitKindKHR-HitKindKHR-04242"),
  1797. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1798. "Vulkan spec does not allow BuiltIn",
  1799. "to be used with the execution model"))));
  1800. INSTANTIATE_TEST_SUITE_P(
  1801. HitKindNotInput,
  1802. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1803. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1804. Values("AnyHitKHR", "ClosestHitKHR"), Values("Output"),
  1805. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1806. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1807. Values("VUID-HitKindKHR-HitKindKHR-04243"),
  1808. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1809. "used for variables with Input storage class"))));
  1810. INSTANTIATE_TEST_SUITE_P(
  1811. HitKindNotIntScalar,
  1812. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1813. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1814. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1815. Values("%f32", "%u32vec3"), Values("OpCapability RayTracingKHR\n"),
  1816. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1817. Values("VUID-HitKindKHR-HitKindKHR-04244"),
  1818. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1819. "needs to be a 32-bit int scalar",
  1820. "is not an int scalar"))));
  1821. // Ensure HitT is not supported in KHR RT shaders
  1822. INSTANTIATE_TEST_SUITE_P(
  1823. HitTNVNotSupportedInKHR,
  1824. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1825. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1826. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1827. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1828. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1829. Values(TestResult(
  1830. SPV_ERROR_INVALID_CAPABILITY,
  1831. "of MemberDecorate requires one of these capabilities"))));
  1832. // HitT is valid in AH, CH shaders as input f32 scalar (NV RT only)
  1833. INSTANTIATE_TEST_SUITE_P(
  1834. HitTNVSuccess,
  1835. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1836. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1837. Values("AnyHitNV", "ClosestHitNV"), Values("Input"), Values("%f32"),
  1838. Values("OpCapability RayTracingNV\n"),
  1839. Values("OpExtension \"SPV_NV_ray_tracing\"\n"), Values(nullptr),
  1840. Values(TestResult())));
  1841. INSTANTIATE_TEST_SUITE_P(
  1842. HitTNVNotExecutionMode,
  1843. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1844. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1845. Values("Vertex", "Fragment", "TessellationControl",
  1846. "TessellationEvaluation", "Geometry", "Fragment",
  1847. "GLCompute", "RayGenerationNV", "IntersectionNV", "MissNV",
  1848. "CallableNV"),
  1849. Values("Input"), Values("%f32"),
  1850. Values("OpCapability RayTracingNV\n"),
  1851. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1852. Values("VUID-HitTNV-HitTNV-04245"),
  1853. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1854. "Vulkan spec does not allow BuiltIn",
  1855. "to be used with the execution model"))));
  1856. INSTANTIATE_TEST_SUITE_P(
  1857. HitTNVNotInput,
  1858. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1859. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1860. Values("AnyHitNV", "ClosestHitNV"), Values("Output"),
  1861. Values("%f32"), Values("OpCapability RayTracingNV\n"),
  1862. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1863. Values("VUID-HitTNV-HitTNV-04246"),
  1864. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1865. "used for variables with Input storage class"))));
  1866. INSTANTIATE_TEST_SUITE_P(
  1867. HitTNVNotIntScalar,
  1868. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1869. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1870. Values("AnyHitNV", "ClosestHitNV"), Values("Input"),
  1871. Values("%u32", "%f32vec3"), Values("OpCapability RayTracingNV\n"),
  1872. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1873. Values("VUID-HitTNV-HitTNV-04247"),
  1874. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1875. "needs to be a 32-bit float scalar",
  1876. "is not a float scalar"))));
  1877. // InstanceCustomIndexKHR, InstanceId, PrimitiveId, RayGeometryIndexKHR are
  1878. // valid in IS, AH, CH shaders as input i32 scalars
  1879. INSTANTIATE_TEST_SUITE_P(
  1880. RTBuiltIn3StageI32Success,
  1881. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1882. Combine(Values(SPV_ENV_VULKAN_1_2),
  1883. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1884. "InstanceId", "PrimitiveId"),
  1885. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1886. Values("Input"), Values("%u32"),
  1887. Values("OpCapability RayTracingKHR\n"),
  1888. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1889. Values(TestResult())));
  1890. INSTANTIATE_TEST_SUITE_P(
  1891. RTBuiltIn3StageI32NotExecutionMode,
  1892. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1893. Combine(Values(SPV_ENV_VULKAN_1_2),
  1894. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1895. "InstanceId"),
  1896. Values("Vertex", "Fragment", "TessellationControl",
  1897. "TessellationEvaluation", "Geometry", "Fragment",
  1898. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  1899. Values("Input"), Values("%u32"),
  1900. Values("OpCapability RayTracingKHR\n"),
  1901. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1902. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04251 "
  1903. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04345 "
  1904. "VUID-InstanceId-InstanceId-04254 "),
  1905. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1906. "Vulkan spec does not allow BuiltIn",
  1907. "to be used with the execution model"))));
  1908. INSTANTIATE_TEST_SUITE_P(
  1909. RTBuiltIn3StageI32NotInput,
  1910. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1911. Combine(Values(SPV_ENV_VULKAN_1_2),
  1912. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1913. "InstanceId"),
  1914. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1915. Values("Output"), Values("%u32"),
  1916. Values("OpCapability RayTracingKHR\n"),
  1917. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1918. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04252 "
  1919. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04346 "
  1920. "VUID-InstanceId-InstanceId-04255 "),
  1921. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1922. "used for variables with Input storage class"))));
  1923. INSTANTIATE_TEST_SUITE_P(
  1924. RTBuiltIn3StageI32NotIntScalar,
  1925. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1926. Combine(Values(SPV_ENV_VULKAN_1_2),
  1927. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1928. "InstanceId"),
  1929. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1930. Values("Input"), Values("%f32", "%u32vec3"),
  1931. Values("OpCapability RayTracingKHR\n"),
  1932. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1933. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04253 "
  1934. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04347 "
  1935. "VUID-InstanceId-InstanceId-04256 "),
  1936. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1937. "needs to be a 32-bit int scalar",
  1938. "is not an int scalar"))));
  1939. // PrimitiveId needs special negative testing because it has non-RT uses
  1940. INSTANTIATE_TEST_SUITE_P(
  1941. PrimitiveIdRTNotExecutionMode,
  1942. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1943. Combine(
  1944. Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1945. Values("RayGenerationKHR", "MissKHR", "CallableKHR"), Values("Input"),
  1946. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1947. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1948. Values("VUID-PrimitiveId-PrimitiveId-04330"),
  1949. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1950. "to be used only with Fragment, TessellationControl, "
  1951. "TessellationEvaluation, Geometry, MeshNV, MeshEXT, "
  1952. "IntersectionKHR, "
  1953. "AnyHitKHR, and ClosestHitKHR execution models"))));
  1954. INSTANTIATE_TEST_SUITE_P(
  1955. PrimitiveIdRTNotInput,
  1956. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1957. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1958. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1959. Values("Output"), Values("%u32"),
  1960. Values("OpCapability RayTracingKHR\n"),
  1961. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1962. Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1963. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1964. "Output storage class if execution model is "))));
  1965. INSTANTIATE_TEST_SUITE_P(
  1966. PrimitiveIdRTNotIntScalar,
  1967. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1968. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1969. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1970. Values("Input"), Values("%f32", "%u32vec3"),
  1971. Values("OpCapability RayTracingKHR\n"),
  1972. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1973. Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1974. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1975. "needs to be a 32-bit int scalar",
  1976. "is not an int scalar"))));
  1977. // ObjectRayDirectionKHR and ObjectRayOriginKHR valid
  1978. // in IS, AH, CH shaders as input 32-bit float vec3
  1979. INSTANTIATE_TEST_SUITE_P(
  1980. ObjectRayDirectionAndOriginSuccess,
  1981. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1982. Combine(Values(SPV_ENV_VULKAN_1_2),
  1983. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  1984. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1985. Values("Input"), Values("%f32vec3"),
  1986. Values("OpCapability RayTracingKHR\n"),
  1987. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1988. Values(TestResult())));
  1989. INSTANTIATE_TEST_SUITE_P(
  1990. ObjectRayDirectionAndOriginNotExecutionMode,
  1991. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1992. Combine(Values(SPV_ENV_VULKAN_1_2),
  1993. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  1994. Values("Vertex", "Fragment", "TessellationControl",
  1995. "TessellationEvaluation", "Geometry", "Fragment",
  1996. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  1997. Values("Input"), Values("%f32vec3"),
  1998. Values("OpCapability RayTracingKHR\n"),
  1999. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2000. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04299 "
  2001. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04302 "),
  2002. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2003. "Vulkan spec does not allow BuiltIn",
  2004. "to be used with the execution model"))));
  2005. INSTANTIATE_TEST_SUITE_P(
  2006. ObjectRayDirectionAndOriginNotInput,
  2007. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2008. Combine(Values(SPV_ENV_VULKAN_1_2),
  2009. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2010. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2011. Values("Output"), Values("%f32vec3"),
  2012. Values("OpCapability RayTracingKHR\n"),
  2013. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2014. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04300 "
  2015. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04303 "),
  2016. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2017. "used for variables with Input storage class"))));
  2018. INSTANTIATE_TEST_SUITE_P(
  2019. ObjectRayDirectionAndOriginNotFloatVec3,
  2020. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2021. Combine(
  2022. Values(SPV_ENV_VULKAN_1_2),
  2023. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2024. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2025. Values("Input"), Values("%u32vec3", "%f32", "%f32vec2", "%f32vec4"),
  2026. Values("OpCapability RayTracingKHR\n"),
  2027. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2028. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04301 "
  2029. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04304 "),
  2030. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2031. "needs to be a 3-component 32-bit float vector"))));
  2032. // ObjectToWorldKHR and WorldToObjectKHR valid
  2033. // in IS, AH, CH shaders as input mat4x3
  2034. INSTANTIATE_TEST_SUITE_P(
  2035. RTObjectMatrixSuccess,
  2036. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2037. Combine(Values(SPV_ENV_VULKAN_1_2),
  2038. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2039. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2040. Values("Input"), Values("%f32mat34"),
  2041. Values("OpCapability RayTracingKHR\n"),
  2042. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2043. Values(TestResult())));
  2044. INSTANTIATE_TEST_SUITE_P(
  2045. RTObjectMatrixNotExecutionMode,
  2046. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2047. Combine(Values(SPV_ENV_VULKAN_1_2),
  2048. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2049. Values("Vertex", "Fragment", "TessellationControl",
  2050. "TessellationEvaluation", "Geometry", "Fragment",
  2051. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  2052. Values("Input"), Values("%f32mat34"),
  2053. Values("OpCapability RayTracingKHR\n"),
  2054. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2055. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04305 "
  2056. "VUID-WorldToObjectKHR-WorldToObjectKHR-04434 "),
  2057. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2058. "Vulkan spec does not allow BuiltIn",
  2059. "to be used with the execution model"))));
  2060. INSTANTIATE_TEST_SUITE_P(
  2061. RTObjectMatrixNotInput,
  2062. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2063. Combine(Values(SPV_ENV_VULKAN_1_2),
  2064. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2065. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2066. Values("Output"), Values("%f32mat34"),
  2067. Values("OpCapability RayTracingKHR\n"),
  2068. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2069. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306 "
  2070. "VUID-WorldToObjectKHR-WorldToObjectKHR-04435 "),
  2071. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2072. "used for variables with Input storage class"))));
  2073. INSTANTIATE_TEST_SUITE_P(
  2074. RTObjectMatrixNotMat4x3,
  2075. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2076. Combine(Values(SPV_ENV_VULKAN_1_2),
  2077. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2078. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2079. Values("Input"), Values("%f32mat43", "%f32mat44", "%f32vec4"),
  2080. Values("OpCapability RayTracingKHR\n"),
  2081. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2082. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307 "
  2083. "VUID-WorldToObjectKHR-WorldToObjectKHR-04436 "),
  2084. Values(TestResult(
  2085. SPV_ERROR_INVALID_DATA,
  2086. "variable needs to be a matrix with "
  2087. "4 columns of 3-component vectors of 32-bit floats"))));
  2088. // IncomingRayFlagsKHR is valid
  2089. // in IS, AH, CH, MS shaders as an input i32 scalar
  2090. INSTANTIATE_TEST_SUITE_P(
  2091. IncomingRayFlagsSuccess,
  2092. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2093. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2094. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2095. Values("Input"), Values("%u32"),
  2096. Values("OpCapability RayTracingKHR\n"),
  2097. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2098. Values(TestResult())));
  2099. INSTANTIATE_TEST_SUITE_P(
  2100. IncomingRayFlagsNotExecutionMode,
  2101. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2102. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2103. Values("Vertex", "Fragment", "TessellationControl",
  2104. "TessellationEvaluation", "Geometry", "Fragment",
  2105. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2106. Values("Input"), Values("%u32"),
  2107. Values("OpCapability RayTracingKHR\n"),
  2108. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2109. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248 "
  2110. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2111. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2112. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2113. "Vulkan spec does not allow BuiltIn",
  2114. "to be used with the execution model"))));
  2115. INSTANTIATE_TEST_SUITE_P(
  2116. IncomingRayFlagsNotInput,
  2117. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2118. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2119. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2120. Values("Output"), Values("%u32"),
  2121. Values("OpCapability RayTracingKHR\n"),
  2122. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2123. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249 "
  2124. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2125. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2126. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2127. "used for variables with Input storage class"))));
  2128. INSTANTIATE_TEST_SUITE_P(
  2129. IncomingRayFlagsNotIntScalar,
  2130. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2131. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2132. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2133. Values("Input"), Values("%f32", "%u32vec3"),
  2134. Values("OpCapability RayTracingKHR\n"),
  2135. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2136. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250 "
  2137. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2138. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2139. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2140. "needs to be a 32-bit int scalar",
  2141. "is not an int scalar"))));
  2142. // CullMaskKHR is valid
  2143. // in IS, AH, CH, MS shaders as an input i32 scalar
  2144. INSTANTIATE_TEST_SUITE_P(
  2145. CullMaskSuccess,
  2146. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2147. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2148. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2149. Values("Input"), Values("%u32"),
  2150. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2151. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2152. "\"SPV_KHR_ray_cull_mask\"\n"),
  2153. Values(nullptr), Values(TestResult())));
  2154. INSTANTIATE_TEST_SUITE_P(
  2155. CullMaskNotExecutionMode,
  2156. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2157. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2158. Values("Vertex", "Fragment", "TessellationControl",
  2159. "TessellationEvaluation", "Geometry", "Fragment",
  2160. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2161. Values("Input"), Values("%u32"),
  2162. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2163. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2164. "\"SPV_KHR_ray_cull_mask\"\n"),
  2165. Values("VUID-CullMaskKHR-CullMaskKHR-06735 "
  2166. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2167. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2168. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2169. "Vulkan spec does not allow BuiltIn",
  2170. "to be used with the execution model"))));
  2171. INSTANTIATE_TEST_SUITE_P(
  2172. ICullMaskNotInput,
  2173. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2174. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2175. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2176. Values("Output"), Values("%u32"),
  2177. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2178. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2179. "\"SPV_KHR_ray_cull_mask\"\n"),
  2180. Values("VUID-CullMaskKHR-CullMaskKHR-06736 "
  2181. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2182. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2183. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2184. "used for variables with Input storage class"))));
  2185. INSTANTIATE_TEST_SUITE_P(
  2186. CullMaskNotIntScalar,
  2187. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2188. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2189. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2190. Values("Input"), Values("%f32", "%u32vec3"),
  2191. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2192. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2193. "\"SPV_KHR_ray_cull_mask\"\n"),
  2194. Values("VUID-CullMaskKHR-CullMaskKHR-06737 "
  2195. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2196. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2197. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2198. "needs to be a 32-bit int scalar",
  2199. "is not an int scalar"))));
  2200. // RayTmaxKHR, RayTminKHR are all valid
  2201. // in IS, AH, CH, MS shaders as input f32 scalars
  2202. INSTANTIATE_TEST_SUITE_P(
  2203. RayTSuccess,
  2204. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2205. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2206. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2207. Values("Input"), Values("%f32"),
  2208. Values("OpCapability RayTracingKHR\n"),
  2209. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2210. Values(TestResult())));
  2211. INSTANTIATE_TEST_SUITE_P(
  2212. RayTNotExecutionMode,
  2213. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2214. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2215. Values("Vertex", "Fragment", "TessellationControl",
  2216. "TessellationEvaluation", "Geometry", "Fragment",
  2217. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2218. Values("Input"), Values("%f32"),
  2219. Values("OpCapability RayTracingKHR\n"),
  2220. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2221. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248 "
  2222. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2223. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2224. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2225. "Vulkan spec does not allow BuiltIn",
  2226. "to be used with the execution model"))));
  2227. INSTANTIATE_TEST_SUITE_P(
  2228. RayTNotInput,
  2229. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2230. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2231. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2232. Values("Output"), Values("%f32"),
  2233. Values("OpCapability RayTracingKHR\n"),
  2234. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2235. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249 "
  2236. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2237. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2238. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2239. "used for variables with Input storage class"))));
  2240. INSTANTIATE_TEST_SUITE_P(
  2241. RayTNotFloatScalar,
  2242. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2243. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2244. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2245. Values("Input"), Values("%u32", "%f32vec3"),
  2246. Values("OpCapability RayTracingKHR\n"),
  2247. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2248. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250 "
  2249. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2250. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2251. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2252. "needs to be a 32-bit float scalar",
  2253. "is not a float scalar"))));
  2254. // WorldRayDirectionKHR and WorldRayOriginKHR are valid
  2255. // in IS, AH, CH, MS shaders as input 32-bit float vec3
  2256. INSTANTIATE_TEST_SUITE_P(
  2257. WorldRayDirectionAndOriginSuccess,
  2258. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2259. Combine(Values(SPV_ENV_VULKAN_1_2),
  2260. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2261. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2262. Values("Input"), Values("%f32vec3"),
  2263. Values("OpCapability RayTracingKHR\n"),
  2264. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2265. Values(TestResult())));
  2266. INSTANTIATE_TEST_SUITE_P(
  2267. WorldRayDirectionAndOriginNotExecutionMode,
  2268. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2269. Combine(Values(SPV_ENV_VULKAN_1_2),
  2270. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2271. Values("Vertex", "Fragment", "TessellationControl",
  2272. "TessellationEvaluation", "Geometry", "Fragment",
  2273. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2274. Values("Input"), Values("%f32vec3"),
  2275. Values("OpCapability RayTracingKHR\n"),
  2276. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2277. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04428 "
  2278. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04431 "),
  2279. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2280. "Vulkan spec does not allow BuiltIn",
  2281. "to be used with the execution model"))));
  2282. INSTANTIATE_TEST_SUITE_P(
  2283. WorldRayDirectionAndOriginNotInput,
  2284. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2285. Combine(Values(SPV_ENV_VULKAN_1_2),
  2286. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2287. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2288. Values("Output"), Values("%f32vec3"),
  2289. Values("OpCapability RayTracingKHR\n"),
  2290. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2291. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04429 "
  2292. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04432 "),
  2293. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2294. "used for variables with Input storage class"))));
  2295. INSTANTIATE_TEST_SUITE_P(
  2296. WorldRayDirectionAndOriginNotFloatVec3,
  2297. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2298. Combine(
  2299. Values(SPV_ENV_VULKAN_1_2),
  2300. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2301. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2302. Values("Input"), Values("%u32vec3", "%f32", "%f32vec2", "%f32vec4"),
  2303. Values("OpCapability RayTracingKHR\n"),
  2304. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2305. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04430 "
  2306. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04433 "),
  2307. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2308. "needs to be a 3-component 32-bit float vector"))));
  2309. // LaunchIdKHR and LaunchSizeKHR are valid
  2310. // in RG, IS, AH, CH, MS shaders as input 32-bit ivec3
  2311. INSTANTIATE_TEST_SUITE_P(
  2312. LaunchRTSuccess,
  2313. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2314. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2315. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2316. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2317. Values("Input"), Values("%u32vec3"),
  2318. Values("OpCapability RayTracingKHR\n"),
  2319. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2320. Values(TestResult())));
  2321. INSTANTIATE_TEST_SUITE_P(
  2322. LaunchRTNotExecutionMode,
  2323. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2324. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2325. Values("Vertex", "Fragment", "TessellationControl",
  2326. "TessellationEvaluation", "Geometry", "Fragment",
  2327. "GLCompute"),
  2328. Values("Input"), Values("%u32vec3"),
  2329. Values("OpCapability RayTracingKHR\n"),
  2330. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2331. Values("VUID-LaunchIdKHR-LaunchIdKHR-04266 "
  2332. "VUID-LaunchSizeKHR-LaunchSizeKHR-04269 "),
  2333. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2334. "Vulkan spec does not allow BuiltIn",
  2335. "to be used with the execution model"))));
  2336. INSTANTIATE_TEST_SUITE_P(
  2337. LaunchRTNotInput,
  2338. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2339. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2340. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2341. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2342. Values("Output"), Values("%u32vec3"),
  2343. Values("OpCapability RayTracingKHR\n"),
  2344. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2345. Values("VUID-LaunchIdKHR-LaunchIdKHR-04267 "
  2346. "VUID-LaunchSizeKHR-LaunchSizeKHR-04270 "),
  2347. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2348. "used for variables with Input storage class"))));
  2349. INSTANTIATE_TEST_SUITE_P(
  2350. LaunchRTNotIntVec3,
  2351. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2352. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2353. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2354. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2355. Values("Input"), Values("%f32vec3", "%u32", "%u32vec2", "%u32vec4"),
  2356. Values("OpCapability RayTracingKHR\n"),
  2357. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2358. Values("VUID-LaunchIdKHR-LaunchIdKHR-04268 "
  2359. "VUID-LaunchSizeKHR-LaunchSizeKHR-04271 "),
  2360. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2361. "needs to be a 3-component 32-bit int vector"))));
  2362. CodeGenerator GetArrayedVariableCodeGenerator(const char* const built_in,
  2363. const char* const execution_model,
  2364. const char* const storage_class,
  2365. const char* const data_type) {
  2366. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2367. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  2368. generator.before_types_ += built_in;
  2369. generator.before_types_ += "\n";
  2370. std::ostringstream after_types;
  2371. after_types << "%built_in_array = OpTypeArray " << data_type << " %u32_3\n";
  2372. if (InitializerRequired(storage_class)) {
  2373. after_types << "%built_in_array_null = OpConstantNull %built_in_array\n";
  2374. }
  2375. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  2376. << " %built_in_array\n";
  2377. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  2378. if (InitializerRequired(storage_class)) {
  2379. after_types << " %built_in_array_null";
  2380. }
  2381. after_types << "\n";
  2382. generator.after_types_ = after_types.str();
  2383. EntryPoint entry_point;
  2384. entry_point.name = "main";
  2385. entry_point.execution_model = execution_model;
  2386. entry_point.interfaces = "%built_in_var";
  2387. // Any kind of reference would do.
  2388. entry_point.body = R"(
  2389. %val = OpBitcast %u32 %built_in_var
  2390. )";
  2391. std::ostringstream execution_modes;
  2392. if (0 == std::strcmp(execution_model, "Fragment")) {
  2393. execution_modes << "OpExecutionMode %" << entry_point.name
  2394. << " OriginUpperLeft\n";
  2395. if (0 == std::strcmp(built_in, "FragDepth")) {
  2396. execution_modes << "OpExecutionMode %" << entry_point.name
  2397. << " DepthReplacing\n";
  2398. }
  2399. }
  2400. if (0 == std::strcmp(execution_model, "Geometry")) {
  2401. execution_modes << "OpExecutionMode %" << entry_point.name
  2402. << " InputPoints\n";
  2403. execution_modes << "OpExecutionMode %" << entry_point.name
  2404. << " OutputPoints\n";
  2405. }
  2406. if (0 == std::strcmp(execution_model, "GLCompute")) {
  2407. execution_modes << "OpExecutionMode %" << entry_point.name
  2408. << " LocalSize 1 1 1\n";
  2409. }
  2410. entry_point.execution_modes = execution_modes.str();
  2411. generator.entry_points_.push_back(std::move(entry_point));
  2412. return generator;
  2413. }
  2414. TEST_P(ValidateVulkanCombineBuiltInArrayedVariable, Variable) {
  2415. const char* const built_in = std::get<0>(GetParam());
  2416. const char* const execution_model = std::get<1>(GetParam());
  2417. const char* const storage_class = std::get<2>(GetParam());
  2418. const char* const data_type = std::get<3>(GetParam());
  2419. const char* const vuid = std::get<4>(GetParam());
  2420. const TestResult& test_result = std::get<5>(GetParam());
  2421. CodeGenerator generator = GetArrayedVariableCodeGenerator(
  2422. built_in, execution_model, storage_class, data_type);
  2423. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2424. ASSERT_EQ(test_result.validation_result,
  2425. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2426. if (test_result.error_str) {
  2427. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  2428. }
  2429. if (test_result.error_str2) {
  2430. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  2431. }
  2432. if (vuid) {
  2433. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  2434. }
  2435. }
  2436. INSTANTIATE_TEST_SUITE_P(
  2437. PointSizeArrayedF32TessControl, ValidateVulkanCombineBuiltInArrayedVariable,
  2438. Combine(Values("PointSize"), Values("TessellationControl"), Values("Input"),
  2439. Values("%f32"), Values(nullptr), Values(TestResult())));
  2440. INSTANTIATE_TEST_SUITE_P(
  2441. PointSizeArrayedF64TessControl, ValidateVulkanCombineBuiltInArrayedVariable,
  2442. Combine(Values("PointSize"), Values("TessellationControl"), Values("Input"),
  2443. Values("%f64"), Values("VUID-PointSize-PointSize-04317"),
  2444. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2445. "needs to be a 32-bit float scalar",
  2446. "has bit width 64"))));
  2447. INSTANTIATE_TEST_SUITE_P(
  2448. PointSizeArrayedF32Vertex, ValidateVulkanCombineBuiltInArrayedVariable,
  2449. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  2450. Values("%f32"), Values("VUID-PointSize-PointSize-04317"),
  2451. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2452. "needs to be a 32-bit float scalar",
  2453. "is not a float scalar"))));
  2454. INSTANTIATE_TEST_SUITE_P(PositionArrayedF32Vec4TessControl,
  2455. ValidateVulkanCombineBuiltInArrayedVariable,
  2456. Combine(Values("Position"),
  2457. Values("TessellationControl"), Values("Input"),
  2458. Values("%f32vec4"), Values(nullptr),
  2459. Values(TestResult())));
  2460. INSTANTIATE_TEST_SUITE_P(
  2461. PositionArrayedF32Vec3TessControl,
  2462. ValidateVulkanCombineBuiltInArrayedVariable,
  2463. Combine(Values("Position"), Values("TessellationControl"), Values("Input"),
  2464. Values("%f32vec3"), Values("VUID-Position-Position-04321"),
  2465. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2466. "needs to be a 4-component 32-bit float vector",
  2467. "has 3 components"))));
  2468. INSTANTIATE_TEST_SUITE_P(
  2469. PositionArrayedF32Vec4Vertex, ValidateVulkanCombineBuiltInArrayedVariable,
  2470. Combine(Values("Position"), Values("Vertex"), Values("Output"),
  2471. Values("%f32vec4"), Values("VUID-Position-Position-04321"),
  2472. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2473. "needs to be a 4-component 32-bit float vector",
  2474. "is not a float vector"))));
  2475. INSTANTIATE_TEST_SUITE_P(
  2476. ClipAndCullDistanceOutputSuccess,
  2477. ValidateVulkanCombineBuiltInArrayedVariable,
  2478. Combine(Values("ClipDistance", "CullDistance"),
  2479. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  2480. Values("Output"), Values("%f32arr2", "%f32arr4"), Values(nullptr),
  2481. Values(TestResult())));
  2482. INSTANTIATE_TEST_SUITE_P(
  2483. ClipAndCullDistanceVertexInput, ValidateVulkanCombineBuiltInArrayedVariable,
  2484. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  2485. Values("Input"), Values("%f32arr4"),
  2486. Values("VUID-ClipDistance-ClipDistance-04191 "
  2487. "VUID-CullDistance-CullDistance-04200"),
  2488. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2489. "needs to be a 32-bit float array",
  2490. "components are not float scalar"))));
  2491. INSTANTIATE_TEST_SUITE_P(
  2492. ClipAndCullDistanceNotArray, ValidateVulkanCombineBuiltInArrayedVariable,
  2493. Combine(Values("ClipDistance", "CullDistance"),
  2494. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  2495. Values("Input"), Values("%f32vec2", "%f32vec4"),
  2496. Values("VUID-ClipDistance-ClipDistance-04191 "
  2497. "VUID-CullDistance-CullDistance-04200"),
  2498. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2499. "needs to be a 32-bit float array",
  2500. "components are not float scalar"))));
  2501. INSTANTIATE_TEST_SUITE_P(
  2502. SMBuiltinsInputSuccess,
  2503. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2504. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2505. Values("Vertex", "Fragment", "TessellationControl",
  2506. "TessellationEvaluation", "Geometry", "GLCompute"),
  2507. Values("Input"), Values("%u32"),
  2508. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2509. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2510. Values(nullptr), Values(TestResult())));
  2511. INSTANTIATE_TEST_SUITE_P(
  2512. SMBuiltinsInputMeshSuccess,
  2513. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2514. Combine(
  2515. Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2516. Values("MeshNV", "TaskNV"), Values("Input"), Values("%u32"),
  2517. Values("OpCapability ShaderSMBuiltinsNV\nOpCapability MeshShadingNV\n"),
  2518. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\nOpExtension "
  2519. "\"SPV_NV_mesh_shader\"\n"),
  2520. Values(nullptr), Values(TestResult())));
  2521. INSTANTIATE_TEST_SUITE_P(
  2522. SMBuiltinsInputRaySuccess,
  2523. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2524. Combine(
  2525. Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2526. Values("RayGenerationNV", "IntersectionNV", "AnyHitNV", "ClosestHitNV",
  2527. "MissNV", "CallableNV"),
  2528. Values("Input"), Values("%u32"),
  2529. Values("OpCapability ShaderSMBuiltinsNV\nOpCapability RayTracingNV\n"),
  2530. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\nOpExtension "
  2531. "\"SPV_NV_ray_tracing\"\n"),
  2532. Values(nullptr), Values(TestResult())));
  2533. INSTANTIATE_TEST_SUITE_P(
  2534. SMBuiltinsNotInput,
  2535. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2536. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2537. Values("Vertex", "Fragment", "TessellationControl",
  2538. "TessellationEvaluation", "Geometry", "GLCompute"),
  2539. Values("Output"), Values("%u32"),
  2540. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2541. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2542. Values(nullptr),
  2543. Values(TestResult(
  2544. SPV_ERROR_INVALID_DATA,
  2545. "to be only used for variables with Input storage class",
  2546. "uses storage class Output"))));
  2547. INSTANTIATE_TEST_SUITE_P(
  2548. SMBuiltinsNotIntScalar,
  2549. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2550. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2551. Values("Vertex", "Fragment", "TessellationControl",
  2552. "TessellationEvaluation", "Geometry", "GLCompute"),
  2553. Values("Input"), Values("%f32", "%u32vec3"),
  2554. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2555. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2556. Values(nullptr),
  2557. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2558. "needs to be a 32-bit int scalar",
  2559. "is not an int scalar"))));
  2560. INSTANTIATE_TEST_SUITE_P(
  2561. SMBuiltinsNotInt32,
  2562. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2563. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2564. Values("Vertex", "Fragment", "TessellationControl",
  2565. "TessellationEvaluation", "Geometry", "GLCompute"),
  2566. Values("Input"), Values("%u64"),
  2567. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2568. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2569. Values(nullptr),
  2570. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2571. "needs to be a 32-bit int scalar",
  2572. "has bit width 64"))));
  2573. INSTANTIATE_TEST_SUITE_P(
  2574. ArmCoreBuiltinsInputSuccess,
  2575. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2576. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2577. "WarpMaxIDARM"),
  2578. Values("Vertex", "Fragment", "TessellationControl",
  2579. "TessellationEvaluation", "Geometry", "GLCompute"),
  2580. Values("Input"), Values("%u32"),
  2581. Values("OpCapability CoreBuiltinsARM\n"),
  2582. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2583. Values(TestResult())));
  2584. INSTANTIATE_TEST_SUITE_P(
  2585. ArmCoreBuiltinsNotInput,
  2586. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2587. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2588. "WarpMaxIDARM"),
  2589. Values("Vertex", "Fragment", "TessellationControl",
  2590. "TessellationEvaluation", "Geometry", "GLCompute"),
  2591. Values("Output"), Values("%u32"),
  2592. Values("OpCapability CoreBuiltinsARM\n"),
  2593. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2594. Values(TestResult(
  2595. SPV_ERROR_INVALID_DATA,
  2596. "to be only used for variables with Input storage class",
  2597. "uses storage class Output"))));
  2598. INSTANTIATE_TEST_SUITE_P(
  2599. ArmCoreBuiltinsNotIntScalar,
  2600. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2601. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2602. "WarpMaxIDARM"),
  2603. Values("Vertex", "Fragment", "TessellationControl",
  2604. "TessellationEvaluation", "Geometry", "GLCompute"),
  2605. Values("Input"), Values("%f32", "%u32vec3"),
  2606. Values("OpCapability CoreBuiltinsARM\n"),
  2607. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2608. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2609. "needs to be a 32-bit int scalar",
  2610. "is not an int scalar"))));
  2611. INSTANTIATE_TEST_SUITE_P(
  2612. ArmCoreBuiltinsNotInt32,
  2613. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2614. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2615. "WarpMaxIDARM"),
  2616. Values("Vertex", "Fragment", "TessellationControl",
  2617. "TessellationEvaluation", "Geometry", "GLCompute"),
  2618. Values("Input"), Values("%u64"),
  2619. Values("OpCapability CoreBuiltinsARM\n"),
  2620. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2621. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2622. "needs to be a 32-bit int scalar",
  2623. "has bit width 64"))));
  2624. CodeGenerator GetWorkgroupSizeSuccessGenerator() {
  2625. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2626. generator.before_types_ = R"(
  2627. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2628. )";
  2629. generator.after_types_ = R"(
  2630. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2631. )";
  2632. EntryPoint entry_point;
  2633. entry_point.name = "main";
  2634. entry_point.execution_model = "GLCompute";
  2635. entry_point.body = R"(
  2636. %copy = OpCopyObject %u32vec3 %workgroup_size
  2637. )";
  2638. generator.entry_points_.push_back(std::move(entry_point));
  2639. return generator;
  2640. }
  2641. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeSuccess) {
  2642. CodeGenerator generator = GetWorkgroupSizeSuccessGenerator();
  2643. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2644. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2645. }
  2646. CodeGenerator GetWorkgroupSizeFragmentGenerator() {
  2647. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2648. generator.before_types_ = R"(
  2649. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2650. )";
  2651. generator.after_types_ = R"(
  2652. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2653. )";
  2654. EntryPoint entry_point;
  2655. entry_point.name = "main";
  2656. entry_point.execution_model = "Fragment";
  2657. entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft";
  2658. entry_point.body = R"(
  2659. %copy = OpCopyObject %u32vec3 %workgroup_size
  2660. )";
  2661. generator.entry_points_.push_back(std::move(entry_point));
  2662. return generator;
  2663. }
  2664. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeFragment) {
  2665. CodeGenerator generator = GetWorkgroupSizeFragmentGenerator();
  2666. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2667. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2668. EXPECT_THAT(getDiagnosticString(),
  2669. HasSubstr("Vulkan spec allows BuiltIn WorkgroupSize to be used "
  2670. "only with GLCompute, MeshNV, TaskNV, MeshEXT or "
  2671. "TaskEXT execution model"));
  2672. EXPECT_THAT(getDiagnosticString(),
  2673. HasSubstr("is referencing ID <2> (OpConstantComposite) which is "
  2674. "decorated with BuiltIn WorkgroupSize in function <1> "
  2675. "called with execution model Fragment"));
  2676. EXPECT_THAT(getDiagnosticString(),
  2677. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04425 "
  2678. "VUID-WorkgroupSize-WorkgroupSize-04427"));
  2679. }
  2680. TEST_F(ValidateBuiltIns, WorkgroupSizeNotConstant) {
  2681. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2682. generator.before_types_ = R"(
  2683. OpDecorate %copy BuiltIn WorkgroupSize
  2684. )";
  2685. generator.after_types_ = R"(
  2686. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2687. )";
  2688. EntryPoint entry_point;
  2689. entry_point.name = "main";
  2690. entry_point.execution_model = "GLCompute";
  2691. entry_point.body = R"(
  2692. %copy = OpCopyObject %u32vec3 %workgroup_size
  2693. )";
  2694. generator.entry_points_.push_back(std::move(entry_point));
  2695. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2696. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2697. EXPECT_THAT(getDiagnosticString(),
  2698. HasSubstr("BuiltIns can only target variables, structure "
  2699. "members or constants"));
  2700. }
  2701. CodeGenerator GetWorkgroupSizeNotVectorGenerator() {
  2702. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2703. generator.before_types_ = R"(
  2704. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2705. )";
  2706. generator.after_types_ = R"(
  2707. %workgroup_size = OpConstant %u32 16
  2708. )";
  2709. EntryPoint entry_point;
  2710. entry_point.name = "main";
  2711. entry_point.execution_model = "GLCompute";
  2712. entry_point.body = R"(
  2713. %copy = OpCopyObject %u32 %workgroup_size
  2714. )";
  2715. generator.entry_points_.push_back(std::move(entry_point));
  2716. return generator;
  2717. }
  2718. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotVector) {
  2719. CodeGenerator generator = GetWorkgroupSizeNotVectorGenerator();
  2720. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2721. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2722. EXPECT_THAT(getDiagnosticString(),
  2723. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2724. "variable needs to be a 3-component 32-bit int vector. "
  2725. "ID <2> (OpConstant) is not an int vector."));
  2726. EXPECT_THAT(getDiagnosticString(),
  2727. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2728. }
  2729. CodeGenerator GetWorkgroupSizeNotIntVectorGenerator() {
  2730. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2731. generator.before_types_ = R"(
  2732. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2733. )";
  2734. generator.after_types_ = R"(
  2735. %workgroup_size = OpConstantComposite %f32vec3 %f32_1 %f32_1 %f32_1
  2736. )";
  2737. EntryPoint entry_point;
  2738. entry_point.name = "main";
  2739. entry_point.execution_model = "GLCompute";
  2740. entry_point.body = R"(
  2741. %copy = OpCopyObject %f32vec3 %workgroup_size
  2742. )";
  2743. generator.entry_points_.push_back(std::move(entry_point));
  2744. return generator;
  2745. }
  2746. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotIntVector) {
  2747. CodeGenerator generator = GetWorkgroupSizeNotIntVectorGenerator();
  2748. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2749. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2750. EXPECT_THAT(getDiagnosticString(),
  2751. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2752. "variable needs to be a 3-component 32-bit int vector. "
  2753. "ID <2> (OpConstantComposite) is not an int vector."));
  2754. EXPECT_THAT(getDiagnosticString(),
  2755. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2756. }
  2757. CodeGenerator GetWorkgroupSizeNotVec3Generator() {
  2758. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2759. generator.before_types_ = R"(
  2760. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2761. )";
  2762. generator.after_types_ = R"(
  2763. %workgroup_size = OpConstantComposite %u32vec2 %u32_1 %u32_1
  2764. )";
  2765. EntryPoint entry_point;
  2766. entry_point.name = "main";
  2767. entry_point.execution_model = "GLCompute";
  2768. entry_point.body = R"(
  2769. %copy = OpCopyObject %u32vec2 %workgroup_size
  2770. )";
  2771. generator.entry_points_.push_back(std::move(entry_point));
  2772. return generator;
  2773. }
  2774. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotVec3) {
  2775. CodeGenerator generator = GetWorkgroupSizeNotVec3Generator();
  2776. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2777. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2778. EXPECT_THAT(getDiagnosticString(),
  2779. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2780. "variable needs to be a 3-component 32-bit int vector. "
  2781. "ID <2> (OpConstantComposite) has 2 components."));
  2782. EXPECT_THAT(getDiagnosticString(),
  2783. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2784. }
  2785. TEST_F(ValidateBuiltIns, WorkgroupSizeNotInt32Vec) {
  2786. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2787. generator.before_types_ = R"(
  2788. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2789. )";
  2790. generator.after_types_ = R"(
  2791. %workgroup_size = OpConstantComposite %u64vec3 %u64_1 %u64_1 %u64_1
  2792. )";
  2793. EntryPoint entry_point;
  2794. entry_point.name = "main";
  2795. entry_point.execution_model = "GLCompute";
  2796. entry_point.body = R"(
  2797. %copy = OpCopyObject %u64vec3 %workgroup_size
  2798. )";
  2799. generator.entry_points_.push_back(std::move(entry_point));
  2800. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2801. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2802. EXPECT_THAT(
  2803. getDiagnosticString(),
  2804. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize variable "
  2805. "needs to be a 3-component 32-bit int vector. ID <2> "
  2806. "(OpConstantComposite) has components with bit width 64."));
  2807. EXPECT_THAT(getDiagnosticString(),
  2808. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2809. }
  2810. TEST_F(ValidateBuiltIns, WorkgroupSizePrivateVar) {
  2811. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2812. generator.before_types_ = R"(
  2813. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2814. )";
  2815. generator.after_types_ = R"(
  2816. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2817. %private_ptr_u32vec3 = OpTypePointer Private %u32vec3
  2818. %var = OpVariable %private_ptr_u32vec3 Private %workgroup_size
  2819. )";
  2820. EntryPoint entry_point;
  2821. entry_point.name = "main";
  2822. entry_point.execution_model = "GLCompute";
  2823. entry_point.body = R"(
  2824. )";
  2825. generator.entry_points_.push_back(std::move(entry_point));
  2826. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2827. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2828. }
  2829. TEST_F(ValidateBuiltIns, GeometryPositionInOutSuccess) {
  2830. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2831. generator.before_types_ = R"(
  2832. OpDecorate %input_type Block
  2833. OpMemberDecorate %input_type 0 BuiltIn Position
  2834. OpDecorate %output_type Block
  2835. OpMemberDecorate %output_type 0 BuiltIn Position
  2836. )";
  2837. generator.after_types_ = R"(
  2838. %input_type = OpTypeStruct %f32vec4
  2839. %arrayed_input_type = OpTypeArray %input_type %u32_3
  2840. %input_ptr = OpTypePointer Input %arrayed_input_type
  2841. %input = OpVariable %input_ptr Input
  2842. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2843. %output_type = OpTypeStruct %f32vec4
  2844. %output_ptr = OpTypePointer Output %output_type
  2845. %output = OpVariable %output_ptr Output
  2846. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2847. )";
  2848. EntryPoint entry_point;
  2849. entry_point.name = "main";
  2850. entry_point.execution_model = "Geometry";
  2851. entry_point.interfaces = "%input %output";
  2852. entry_point.body = R"(
  2853. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0 %u32_0
  2854. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2855. %pos = OpLoad %f32vec4 %input_pos
  2856. OpStore %output_pos %pos
  2857. )";
  2858. generator.entry_points_.push_back(std::move(entry_point));
  2859. generator.entry_points_[0].execution_modes =
  2860. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2861. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2862. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2863. }
  2864. TEST_F(ValidateBuiltIns, WorkgroupIdNotVec3) {
  2865. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2866. generator.before_types_ = R"(
  2867. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2868. OpDecorate %workgroup_id BuiltIn WorkgroupId
  2869. )";
  2870. generator.after_types_ = R"(
  2871. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2872. %input_ptr = OpTypePointer Input %u32vec2
  2873. %workgroup_id = OpVariable %input_ptr Input
  2874. )";
  2875. EntryPoint entry_point;
  2876. entry_point.name = "main";
  2877. entry_point.execution_model = "GLCompute";
  2878. entry_point.interfaces = "%workgroup_id";
  2879. entry_point.body = R"(
  2880. %copy_size = OpCopyObject %u32vec3 %workgroup_size
  2881. %load_id = OpLoad %u32vec2 %workgroup_id
  2882. )";
  2883. generator.entry_points_.push_back(std::move(entry_point));
  2884. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2885. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2886. EXPECT_THAT(getDiagnosticString(),
  2887. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupId "
  2888. "variable needs to be a 3-component 32-bit int vector. "
  2889. "ID <2> (OpVariable) has 2 components."));
  2890. }
  2891. TEST_F(ValidateBuiltIns, TwoBuiltInsFirstFails) {
  2892. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2893. generator.before_types_ = R"(
  2894. OpDecorate %input_type Block
  2895. OpDecorate %output_type Block
  2896. OpMemberDecorate %input_type 0 BuiltIn FragCoord
  2897. OpMemberDecorate %output_type 0 BuiltIn Position
  2898. )";
  2899. generator.after_types_ = R"(
  2900. %input_type = OpTypeStruct %f32vec4
  2901. %input_ptr = OpTypePointer Input %input_type
  2902. %input = OpVariable %input_ptr Input
  2903. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2904. %output_type = OpTypeStruct %f32vec4
  2905. %output_ptr = OpTypePointer Output %output_type
  2906. %output = OpVariable %output_ptr Output
  2907. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2908. )";
  2909. EntryPoint entry_point;
  2910. entry_point.name = "main";
  2911. entry_point.execution_model = "Geometry";
  2912. entry_point.interfaces = "%input %output";
  2913. entry_point.body = R"(
  2914. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0
  2915. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2916. %pos = OpLoad %f32vec4 %input_pos
  2917. OpStore %output_pos %pos
  2918. )";
  2919. generator.entry_points_.push_back(std::move(entry_point));
  2920. generator.entry_points_[0].execution_modes =
  2921. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2922. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2923. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2924. EXPECT_THAT(getDiagnosticString(),
  2925. HasSubstr("Vulkan spec allows BuiltIn FragCoord to be used only "
  2926. "with Fragment execution model"));
  2927. }
  2928. TEST_F(ValidateBuiltIns, TwoBuiltInsSecondFails) {
  2929. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2930. generator.before_types_ = R"(
  2931. OpDecorate %input_type Block
  2932. OpDecorate %output_type Block
  2933. OpMemberDecorate %input_type 0 BuiltIn Position
  2934. OpMemberDecorate %output_type 0 BuiltIn FragCoord
  2935. )";
  2936. generator.after_types_ = R"(
  2937. %input_type = OpTypeStruct %f32vec4
  2938. %input_ptr = OpTypePointer Input %input_type
  2939. %input = OpVariable %input_ptr Input
  2940. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2941. %output_type = OpTypeStruct %f32vec4
  2942. %output_ptr = OpTypePointer Output %output_type
  2943. %output = OpVariable %output_ptr Output
  2944. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2945. )";
  2946. EntryPoint entry_point;
  2947. entry_point.name = "main";
  2948. entry_point.execution_model = "Geometry";
  2949. entry_point.interfaces = "%input %output";
  2950. entry_point.body = R"(
  2951. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0
  2952. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2953. %pos = OpLoad %f32vec4 %input_pos
  2954. OpStore %output_pos %pos
  2955. )";
  2956. generator.entry_points_.push_back(std::move(entry_point));
  2957. generator.entry_points_[0].execution_modes =
  2958. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2959. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2960. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2961. EXPECT_THAT(getDiagnosticString(),
  2962. HasSubstr("Vulkan spec allows BuiltIn FragCoord to be only used "
  2963. "for variables with Input storage class"));
  2964. }
  2965. TEST_F(ValidateBuiltIns, VertexPositionVariableSuccess) {
  2966. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2967. generator.before_types_ = R"(
  2968. OpDecorate %position BuiltIn Position
  2969. )";
  2970. generator.after_types_ = R"(
  2971. %f32vec4_ptr_output = OpTypePointer Output %f32vec4
  2972. %position = OpVariable %f32vec4_ptr_output Output
  2973. )";
  2974. EntryPoint entry_point;
  2975. entry_point.name = "main";
  2976. entry_point.execution_model = "Vertex";
  2977. entry_point.interfaces = "%position";
  2978. entry_point.body = R"(
  2979. OpStore %position %f32vec4_0123
  2980. )";
  2981. generator.entry_points_.push_back(std::move(entry_point));
  2982. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2983. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2984. }
  2985. TEST_F(ValidateBuiltIns, FragmentPositionTwoEntryPoints) {
  2986. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2987. generator.before_types_ = R"(
  2988. OpDecorate %output_type Block
  2989. OpMemberDecorate %output_type 0 BuiltIn Position
  2990. )";
  2991. generator.after_types_ = R"(
  2992. %output_type = OpTypeStruct %f32vec4
  2993. %output_ptr = OpTypePointer Output %output_type
  2994. %output = OpVariable %output_ptr Output
  2995. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2996. )";
  2997. EntryPoint entry_point;
  2998. entry_point.name = "vmain";
  2999. entry_point.execution_model = "Vertex";
  3000. entry_point.interfaces = "%output";
  3001. entry_point.body = R"(
  3002. %val1 = OpFunctionCall %void %foo
  3003. )";
  3004. generator.entry_points_.push_back(std::move(entry_point));
  3005. entry_point.name = "fmain";
  3006. entry_point.execution_model = "Fragment";
  3007. entry_point.interfaces = "%output";
  3008. entry_point.execution_modes = "OpExecutionMode %fmain OriginUpperLeft";
  3009. entry_point.body = R"(
  3010. %val2 = OpFunctionCall %void %foo
  3011. )";
  3012. generator.entry_points_.push_back(std::move(entry_point));
  3013. generator.add_at_the_end_ = R"(
  3014. %foo = OpFunction %void None %func
  3015. %foo_entry = OpLabel
  3016. %position = OpAccessChain %output_f32vec4_ptr %output %u32_0
  3017. OpStore %position %f32vec4_0123
  3018. OpReturn
  3019. OpFunctionEnd
  3020. )";
  3021. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3022. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3023. EXPECT_THAT(getDiagnosticString(),
  3024. HasSubstr("Vulkan spec allows BuiltIn Position to be used only "
  3025. "with Vertex, TessellationControl, "
  3026. "TessellationEvaluation or Geometry execution models"));
  3027. EXPECT_THAT(getDiagnosticString(),
  3028. HasSubstr("called with execution model Fragment"));
  3029. }
  3030. CodeGenerator GetNoDepthReplacingGenerator() {
  3031. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3032. generator.before_types_ = R"(
  3033. OpDecorate %output_type Block
  3034. OpMemberDecorate %output_type 0 BuiltIn FragDepth
  3035. )";
  3036. generator.after_types_ = R"(
  3037. %output_type = OpTypeStruct %f32
  3038. %output_null = OpConstantNull %output_type
  3039. %output_ptr = OpTypePointer Output %output_type
  3040. %output = OpVariable %output_ptr Output %output_null
  3041. %output_f32_ptr = OpTypePointer Output %f32
  3042. )";
  3043. EntryPoint entry_point;
  3044. entry_point.name = "main";
  3045. entry_point.execution_model = "Fragment";
  3046. entry_point.interfaces = "%output";
  3047. entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft";
  3048. entry_point.body = R"(
  3049. %val2 = OpFunctionCall %void %foo
  3050. )";
  3051. generator.entry_points_.push_back(std::move(entry_point));
  3052. const std::string function_body = R"(
  3053. %foo = OpFunction %void None %func
  3054. %foo_entry = OpLabel
  3055. %frag_depth = OpAccessChain %output_f32_ptr %output %u32_0
  3056. OpStore %frag_depth %f32_1
  3057. OpReturn
  3058. OpFunctionEnd
  3059. )";
  3060. generator.add_at_the_end_ = function_body;
  3061. return generator;
  3062. }
  3063. TEST_F(ValidateBuiltIns, VulkanFragmentFragDepthNoDepthReplacing) {
  3064. CodeGenerator generator = GetNoDepthReplacingGenerator();
  3065. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3066. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3067. EXPECT_THAT(getDiagnosticString(),
  3068. HasSubstr("Vulkan spec requires DepthReplacing execution mode to "
  3069. "be declared when using BuiltIn FragDepth"));
  3070. EXPECT_THAT(getDiagnosticString(),
  3071. HasSubstr("VUID-FragDepth-FragDepth-04216"));
  3072. }
  3073. CodeGenerator GetOneMainHasDepthReplacingOtherHasntGenerator() {
  3074. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3075. generator.before_types_ = R"(
  3076. OpDecorate %output_type Block
  3077. OpMemberDecorate %output_type 0 BuiltIn FragDepth
  3078. )";
  3079. generator.after_types_ = R"(
  3080. %output_type = OpTypeStruct %f32
  3081. %output_null = OpConstantNull %output_type
  3082. %output_ptr = OpTypePointer Output %output_type
  3083. %output = OpVariable %output_ptr Output %output_null
  3084. %output_f32_ptr = OpTypePointer Output %f32
  3085. )";
  3086. EntryPoint entry_point;
  3087. entry_point.name = "main_d_r";
  3088. entry_point.execution_model = "Fragment";
  3089. entry_point.interfaces = "%output";
  3090. entry_point.execution_modes =
  3091. "OpExecutionMode %main_d_r OriginUpperLeft\n"
  3092. "OpExecutionMode %main_d_r DepthReplacing";
  3093. entry_point.body = R"(
  3094. %val2 = OpFunctionCall %void %foo
  3095. )";
  3096. generator.entry_points_.push_back(std::move(entry_point));
  3097. entry_point.name = "main_no_d_r";
  3098. entry_point.execution_model = "Fragment";
  3099. entry_point.interfaces = "%output";
  3100. entry_point.execution_modes = "OpExecutionMode %main_no_d_r OriginUpperLeft";
  3101. entry_point.body = R"(
  3102. %val3 = OpFunctionCall %void %foo
  3103. )";
  3104. generator.entry_points_.push_back(std::move(entry_point));
  3105. const std::string function_body = R"(
  3106. %foo = OpFunction %void None %func
  3107. %foo_entry = OpLabel
  3108. %frag_depth = OpAccessChain %output_f32_ptr %output %u32_0
  3109. OpStore %frag_depth %f32_1
  3110. OpReturn
  3111. OpFunctionEnd
  3112. )";
  3113. generator.add_at_the_end_ = function_body;
  3114. return generator;
  3115. }
  3116. TEST_F(ValidateBuiltIns,
  3117. VulkanFragmentFragDepthOneMainHasDepthReplacingOtherHasnt) {
  3118. CodeGenerator generator = GetOneMainHasDepthReplacingOtherHasntGenerator();
  3119. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3120. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3121. EXPECT_THAT(getDiagnosticString(),
  3122. HasSubstr("Vulkan spec requires DepthReplacing execution mode to "
  3123. "be declared when using BuiltIn FragDepth"));
  3124. EXPECT_THAT(getDiagnosticString(),
  3125. HasSubstr("VUID-FragDepth-FragDepth-04216"));
  3126. }
  3127. TEST_F(ValidateBuiltIns, AllowInstanceIdWithIntersectionShader) {
  3128. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3129. generator.capabilities_ += R"(
  3130. OpCapability RayTracingNV
  3131. )";
  3132. generator.extensions_ = R"(
  3133. OpExtension "SPV_NV_ray_tracing"
  3134. )";
  3135. generator.before_types_ = R"(
  3136. OpDecorate %input_type Block
  3137. OpMemberDecorate %input_type 0 BuiltIn InstanceId
  3138. )";
  3139. generator.after_types_ = R"(
  3140. %input_type = OpTypeStruct %u32
  3141. %input_ptr = OpTypePointer Input %input_type
  3142. %input = OpVariable %input_ptr Input
  3143. )";
  3144. EntryPoint entry_point;
  3145. entry_point.name = "main_d_r";
  3146. entry_point.execution_model = "IntersectionNV";
  3147. entry_point.interfaces = "%input";
  3148. entry_point.body = R"(
  3149. %val2 = OpFunctionCall %void %foo
  3150. )";
  3151. generator.entry_points_.push_back(std::move(entry_point));
  3152. generator.add_at_the_end_ = R"(
  3153. %foo = OpFunction %void None %func
  3154. %foo_entry = OpLabel
  3155. OpReturn
  3156. OpFunctionEnd
  3157. )";
  3158. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3159. EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3160. }
  3161. TEST_F(ValidateBuiltIns, ValidBuiltinsForMeshShader) {
  3162. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3163. generator.capabilities_ += R"(
  3164. OpCapability MeshShadingNV
  3165. )";
  3166. generator.extensions_ = R"(
  3167. OpExtension "SPV_NV_mesh_shader"
  3168. )";
  3169. generator.before_types_ = R"(
  3170. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  3171. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  3172. OpDecorate %gl_Layer BuiltIn Layer
  3173. OpDecorate %gl_Layer PerPrimitiveNV
  3174. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  3175. OpDecorate %gl_ViewportIndex PerPrimitiveNV
  3176. )";
  3177. generator.after_types_ = R"(
  3178. %u32_81 = OpConstant %u32 81
  3179. %_arr_int_uint_81 = OpTypeArray %i32 %u32_81
  3180. %_ptr_Output__arr_int_uint_81 = OpTypePointer Output %_arr_int_uint_81
  3181. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3182. %gl_Layer = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3183. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3184. )";
  3185. EntryPoint entry_point;
  3186. entry_point.name = "main_d_r";
  3187. entry_point.execution_model = "MeshNV";
  3188. entry_point.interfaces = "%gl_PrimitiveID %gl_Layer %gl_ViewportIndex";
  3189. generator.entry_points_.push_back(std::move(entry_point));
  3190. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3191. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3192. }
  3193. TEST_F(ValidateBuiltIns, InvalidBuiltinsForMeshShader) {
  3194. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3195. generator.capabilities_ += R"(
  3196. OpCapability MeshShadingNV
  3197. )";
  3198. generator.extensions_ = R"(
  3199. OpExtension "SPV_NV_mesh_shader"
  3200. )";
  3201. generator.before_types_ = R"(
  3202. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  3203. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  3204. OpDecorate %gl_Layer BuiltIn Layer
  3205. OpDecorate %gl_Layer PerPrimitiveNV
  3206. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  3207. OpDecorate %gl_ViewportIndex PerPrimitiveNV
  3208. )";
  3209. generator.after_types_ = R"(
  3210. %u32_81 = OpConstant %u32 81
  3211. %_arr_float_uint_81 = OpTypeArray %f32 %u32_81
  3212. %_ptr_Output__arr_float_uint_81 = OpTypePointer Output %_arr_float_uint_81
  3213. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3214. %gl_Layer = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3215. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3216. )";
  3217. EntryPoint entry_point;
  3218. entry_point.name = "main_d_r";
  3219. entry_point.execution_model = "MeshNV";
  3220. entry_point.interfaces = "%gl_PrimitiveID %gl_Layer %gl_ViewportIndex";
  3221. generator.entry_points_.push_back(std::move(entry_point));
  3222. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3223. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3224. EXPECT_THAT(getDiagnosticString(),
  3225. HasSubstr("needs to be a 32-bit int scalar"));
  3226. EXPECT_THAT(getDiagnosticString(), HasSubstr("is not an int scalar"));
  3227. }
  3228. TEST_P(ValidateVulkanSubgroupBuiltIns, InMain) {
  3229. const char* const built_in = std::get<0>(GetParam());
  3230. const char* const execution_model = std::get<1>(GetParam());
  3231. const char* const storage_class = std::get<2>(GetParam());
  3232. const char* const data_type = std::get<3>(GetParam());
  3233. const char* const vuid = std::get<4>(GetParam());
  3234. const TestResult& test_result = std::get<5>(GetParam());
  3235. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3236. generator.capabilities_ += R"(
  3237. OpCapability GroupNonUniformBallot
  3238. )";
  3239. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  3240. generator.before_types_ += built_in;
  3241. generator.before_types_ += "\n";
  3242. std::ostringstream after_types;
  3243. after_types << "%built_in_ptr = OpTypePointer " << storage_class << " "
  3244. << data_type << "\n";
  3245. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  3246. after_types << "\n";
  3247. generator.after_types_ = after_types.str();
  3248. EntryPoint entry_point;
  3249. entry_point.name = "main";
  3250. entry_point.execution_model = execution_model;
  3251. if (strncmp(storage_class, "Input", 5) == 0 ||
  3252. strncmp(storage_class, "Output", 6) == 0) {
  3253. entry_point.interfaces = "%built_in_var";
  3254. }
  3255. entry_point.body =
  3256. std::string("%ld = OpLoad ") + data_type + " %built_in_var\n";
  3257. std::ostringstream execution_modes;
  3258. if (0 == std::strcmp(execution_model, "Fragment")) {
  3259. execution_modes << "OpExecutionMode %" << entry_point.name
  3260. << " OriginUpperLeft\n";
  3261. if (0 == std::strcmp(built_in, "FragDepth")) {
  3262. execution_modes << "OpExecutionMode %" << entry_point.name
  3263. << " DepthReplacing\n";
  3264. }
  3265. }
  3266. if (0 == std::strcmp(execution_model, "Geometry")) {
  3267. execution_modes << "OpExecutionMode %" << entry_point.name
  3268. << " InputPoints\n";
  3269. execution_modes << "OpExecutionMode %" << entry_point.name
  3270. << " OutputPoints\n";
  3271. }
  3272. if (0 == std::strcmp(execution_model, "GLCompute")) {
  3273. execution_modes << "OpExecutionMode %" << entry_point.name
  3274. << " LocalSize 1 1 1\n";
  3275. }
  3276. entry_point.execution_modes = execution_modes.str();
  3277. generator.entry_points_.push_back(std::move(entry_point));
  3278. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3279. ASSERT_EQ(test_result.validation_result,
  3280. ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3281. if (test_result.error_str) {
  3282. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  3283. }
  3284. if (test_result.error_str2) {
  3285. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  3286. }
  3287. if (vuid) {
  3288. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  3289. }
  3290. }
  3291. INSTANTIATE_TEST_SUITE_P(
  3292. SubgroupMaskNotVec4, ValidateVulkanSubgroupBuiltIns,
  3293. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3294. "SubgroupLeMask", "SubgroupLtMask"),
  3295. Values("GLCompute"), Values("Input"), Values("%u32vec3"),
  3296. Values("VUID-SubgroupEqMask-SubgroupEqMask-04371 "
  3297. "VUID-SubgroupGeMask-SubgroupGeMask-04373 "
  3298. "VUID-SubgroupGtMask-SubgroupGtMask-04375 "
  3299. "VUID-SubgroupLeMask-SubgroupLeMask-04377 "
  3300. "VUID-SubgroupLtMask-SubgroupLtMask-04379"),
  3301. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3302. "needs to be a 4-component 32-bit int vector"))));
  3303. INSTANTIATE_TEST_SUITE_P(
  3304. SubgroupMaskNotU32, ValidateVulkanSubgroupBuiltIns,
  3305. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3306. "SubgroupLeMask", "SubgroupLtMask"),
  3307. Values("GLCompute"), Values("Input"), Values("%f32vec4"),
  3308. Values("VUID-SubgroupEqMask-SubgroupEqMask-04371 "
  3309. "VUID-SubgroupGeMask-SubgroupGeMask-04373 "
  3310. "VUID-SubgroupGtMask-SubgroupGtMask-04375 "
  3311. "VUID-SubgroupLeMask-SubgroupLeMask-04377 "
  3312. "VUID-SubgroupLtMask-SubgroupLtMask-04379"),
  3313. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3314. "needs to be a 4-component 32-bit int vector"))));
  3315. INSTANTIATE_TEST_SUITE_P(
  3316. SubgroupMaskNotInput, ValidateVulkanSubgroupBuiltIns,
  3317. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3318. "SubgroupLeMask", "SubgroupLtMask"),
  3319. Values("GLCompute"), Values("Output", "Workgroup", "Private"),
  3320. Values("%u32vec4"),
  3321. Values("VUID-SubgroupEqMask-SubgroupEqMask-04370 "
  3322. "VUID-SubgroupGeMask-SubgroupGeMask-04372 "
  3323. "VUID-SubgroupGtMask-SubgroupGtMask-04374 "
  3324. "VUID-SubgroupLeMask-SubgroupLeMask-04376 "
  3325. "VUID-SubgroupLtMask-SubgroupLtMask-04378"),
  3326. Values(TestResult(
  3327. SPV_ERROR_INVALID_DATA,
  3328. "to be only used for variables with Input storage class"))));
  3329. INSTANTIATE_TEST_SUITE_P(SubgroupMaskOk, ValidateVulkanSubgroupBuiltIns,
  3330. Combine(Values("SubgroupEqMask", "SubgroupGeMask",
  3331. "SubgroupGtMask", "SubgroupLeMask",
  3332. "SubgroupLtMask"),
  3333. Values("GLCompute"), Values("Input"),
  3334. Values("%u32vec4"), Values(nullptr),
  3335. Values(TestResult(SPV_SUCCESS, ""))));
  3336. TEST_F(ValidateBuiltIns, SubgroupMaskMemberDecorate) {
  3337. const std::string text = R"(
  3338. OpCapability Shader
  3339. OpCapability GroupNonUniformBallot
  3340. OpMemoryModel Logical GLSL450
  3341. OpEntryPoint GLCompute %foo "foo"
  3342. OpExecutionMode %foo LocalSize 1 1 1
  3343. OpDecorate %struct Block
  3344. OpMemberDecorate %struct 0 BuiltIn SubgroupEqMask
  3345. %void = OpTypeVoid
  3346. %int = OpTypeInt 32 0
  3347. %struct = OpTypeStruct %int
  3348. %void_fn = OpTypeFunction %void
  3349. %foo = OpFunction %void None %void_fn
  3350. %entry = OpLabel
  3351. OpReturn
  3352. OpFunctionEnd
  3353. )";
  3354. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3355. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3356. EXPECT_THAT(
  3357. getDiagnosticString(),
  3358. HasSubstr(
  3359. "BuiltIn SubgroupEqMask cannot be used as a member decoration"));
  3360. }
  3361. INSTANTIATE_TEST_SUITE_P(
  3362. SubgroupInvocationIdAndSizeNotU32, ValidateVulkanSubgroupBuiltIns,
  3363. Combine(
  3364. Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3365. Values("GLCompute"), Values("Input"), Values("%f32"),
  3366. Values("VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-04381 "
  3367. "VUID-SubgroupSize-SubgroupSize-04383"),
  3368. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3369. "needs to be a 32-bit int"))));
  3370. INSTANTIATE_TEST_SUITE_P(
  3371. SubgroupInvocationIdAndSizeNotInput, ValidateVulkanSubgroupBuiltIns,
  3372. Combine(
  3373. Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3374. Values("GLCompute"), Values("Output", "Workgroup", "Private"),
  3375. Values("%u32"),
  3376. Values("VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-04380 "
  3377. "VUID-SubgroupSize-SubgroupSize-04382"),
  3378. Values(TestResult(
  3379. SPV_ERROR_INVALID_DATA,
  3380. "to be only used for variables with Input storage class"))));
  3381. INSTANTIATE_TEST_SUITE_P(
  3382. SubgroupInvocationIdAndSizeOk, ValidateVulkanSubgroupBuiltIns,
  3383. Combine(Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3384. Values("GLCompute"), Values("Input"), Values("%u32"),
  3385. Values(nullptr), Values(TestResult(SPV_SUCCESS, ""))));
  3386. TEST_F(ValidateBuiltIns, SubgroupSizeMemberDecorate) {
  3387. const std::string text = R"(
  3388. OpCapability Shader
  3389. OpCapability GroupNonUniform
  3390. OpMemoryModel Logical GLSL450
  3391. OpEntryPoint GLCompute %foo "foo"
  3392. OpExecutionMode %foo LocalSize 1 1 1
  3393. OpDecorate %struct Block
  3394. OpMemberDecorate %struct 0 BuiltIn SubgroupSize
  3395. %void = OpTypeVoid
  3396. %int = OpTypeInt 32 0
  3397. %struct = OpTypeStruct %int
  3398. %void_fn = OpTypeFunction %void
  3399. %foo = OpFunction %void None %void_fn
  3400. %entry = OpLabel
  3401. OpReturn
  3402. OpFunctionEnd
  3403. )";
  3404. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3405. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3406. EXPECT_THAT(
  3407. getDiagnosticString(),
  3408. HasSubstr("BuiltIn SubgroupSize cannot be used as a member decoration"));
  3409. }
  3410. INSTANTIATE_TEST_SUITE_P(
  3411. SubgroupNumAndIdNotCompute, ValidateVulkanSubgroupBuiltIns,
  3412. Combine(Values("SubgroupId", "NumSubgroups"), Values("Vertex"),
  3413. Values("Input"), Values("%u32"),
  3414. Values("VUID-SubgroupId-SubgroupId-04367 "
  3415. "VUID-NumSubgroups-NumSubgroups-04293"),
  3416. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3417. "to be used only with GLCompute, MeshNV, "
  3418. "TaskNV, MeshEXT or TaskEXT execution model"))));
  3419. INSTANTIATE_TEST_SUITE_P(
  3420. SubgroupNumAndIdNotU32, ValidateVulkanSubgroupBuiltIns,
  3421. Combine(Values("SubgroupId", "NumSubgroups"), Values("GLCompute"),
  3422. Values("Input"), Values("%f32"),
  3423. Values("VUID-SubgroupId-SubgroupId-04369 "
  3424. "VUID-NumSubgroups-NumSubgroups-04295"),
  3425. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3426. "needs to be a 32-bit int"))));
  3427. INSTANTIATE_TEST_SUITE_P(
  3428. SubgroupNumAndIdNotInput, ValidateVulkanSubgroupBuiltIns,
  3429. Combine(Values("SubgroupId", "NumSubgroups"), Values("GLCompute"),
  3430. Values("Output", "Workgroup", "Private"), Values("%u32"),
  3431. Values("VUID-SubgroupId-SubgroupId-04368 "
  3432. "VUID-NumSubgroups-NumSubgroups-04294"),
  3433. Values(TestResult(
  3434. SPV_ERROR_INVALID_DATA,
  3435. "to be only used for variables with Input storage class"))));
  3436. INSTANTIATE_TEST_SUITE_P(SubgroupNumAndIdOk, ValidateVulkanSubgroupBuiltIns,
  3437. Combine(Values("SubgroupId", "NumSubgroups"),
  3438. Values("GLCompute"), Values("Input"),
  3439. Values("%u32"), Values(nullptr),
  3440. Values(TestResult(SPV_SUCCESS, ""))));
  3441. TEST_F(ValidateBuiltIns, SubgroupIdMemberDecorate) {
  3442. const std::string text = R"(
  3443. OpCapability Shader
  3444. OpCapability GroupNonUniform
  3445. OpMemoryModel Logical GLSL450
  3446. OpEntryPoint GLCompute %foo "foo"
  3447. OpExecutionMode %foo LocalSize 1 1 1
  3448. OpDecorate %struct Block
  3449. OpMemberDecorate %struct 0 BuiltIn SubgroupId
  3450. %void = OpTypeVoid
  3451. %int = OpTypeInt 32 0
  3452. %struct = OpTypeStruct %int
  3453. %void_fn = OpTypeFunction %void
  3454. %foo = OpFunction %void None %void_fn
  3455. %entry = OpLabel
  3456. OpReturn
  3457. OpFunctionEnd
  3458. )";
  3459. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3460. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3461. EXPECT_THAT(
  3462. getDiagnosticString(),
  3463. HasSubstr("BuiltIn SubgroupId cannot be used as a member decoration"));
  3464. }
  3465. TEST_F(ValidateBuiltIns, TargetIsType) {
  3466. const std::string text = R"(
  3467. OpCapability Shader
  3468. OpCapability Linkage
  3469. OpMemoryModel Logical GLSL450
  3470. OpDecorate %void BuiltIn Position
  3471. %void = OpTypeVoid
  3472. )";
  3473. CompileSuccessfully(text);
  3474. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  3475. EXPECT_THAT(getDiagnosticString(),
  3476. HasSubstr("BuiltIns can only target variables, structure members "
  3477. "or constants"));
  3478. }
  3479. TEST_F(ValidateBuiltIns, TargetIsVariable) {
  3480. const std::string text = R"(
  3481. OpCapability Shader
  3482. OpCapability Linkage
  3483. OpMemoryModel Logical GLSL450
  3484. OpDecorate %wg_var BuiltIn Position
  3485. %int = OpTypeInt 32 0
  3486. %int_wg_ptr = OpTypePointer Workgroup %int
  3487. %wg_var = OpVariable %int_wg_ptr Workgroup
  3488. )";
  3489. CompileSuccessfully(text);
  3490. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
  3491. }
  3492. INSTANTIATE_TEST_SUITE_P(
  3493. PrimitiveShadingRateOutputSuccess,
  3494. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3495. Combine(Values("PrimitiveShadingRateKHR"), Values("Vertex", "Geometry"),
  3496. Values("Output"), Values("%u32"),
  3497. Values("OpCapability FragmentShadingRateKHR\n"),
  3498. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3499. Values(nullptr), Values(TestResult())));
  3500. INSTANTIATE_TEST_SUITE_P(
  3501. PrimitiveShadingRateMeshOutputSuccess,
  3502. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3503. Combine(Values("PrimitiveShadingRateKHR"), Values("MeshNV"),
  3504. Values("Output"), Values("%u32"),
  3505. Values("OpCapability FragmentShadingRateKHR\nOpCapability "
  3506. "MeshShadingNV\n"),
  3507. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\nOpExtension "
  3508. "\"SPV_NV_mesh_shader\"\n"),
  3509. Values(nullptr), Values(TestResult())));
  3510. INSTANTIATE_TEST_SUITE_P(
  3511. PrimitiveShadingRateInvalidExecutionModel,
  3512. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3513. Combine(
  3514. Values("PrimitiveShadingRateKHR"), Values("Fragment"), Values("Output"),
  3515. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3516. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3517. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04484 "),
  3518. Values(TestResult(
  3519. SPV_ERROR_INVALID_DATA,
  3520. "Vulkan spec allows BuiltIn PrimitiveShadingRateKHR to be used "
  3521. "only with Vertex, Geometry, MeshNV or MeshEXT execution "
  3522. "models."))));
  3523. INSTANTIATE_TEST_SUITE_P(
  3524. PrimitiveShadingRateInvalidStorageClass,
  3525. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3526. Combine(
  3527. Values("PrimitiveShadingRateKHR"), Values("Vertex"), Values("Input"),
  3528. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3529. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3530. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04485 "),
  3531. Values(TestResult(
  3532. SPV_ERROR_INVALID_DATA,
  3533. "Vulkan spec allows BuiltIn PrimitiveShadingRateKHR to be only "
  3534. "used for variables with Output storage class."))));
  3535. INSTANTIATE_TEST_SUITE_P(
  3536. PrimitiveShadingRateInvalidType,
  3537. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3538. Combine(
  3539. Values("PrimitiveShadingRateKHR"), Values("Vertex"), Values("Output"),
  3540. Values("%f32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3541. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3542. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04486 "),
  3543. Values(TestResult(
  3544. SPV_ERROR_INVALID_DATA,
  3545. "According to the Vulkan spec BuiltIn PrimitiveShadingRateKHR "
  3546. "variable needs to be a 32-bit int scalar."))));
  3547. INSTANTIATE_TEST_SUITE_P(
  3548. ShadingRateInputSuccess,
  3549. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3550. Combine(Values("ShadingRateKHR"), Values("Fragment"), Values("Input"),
  3551. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3552. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3553. Values(nullptr), Values(TestResult())));
  3554. INSTANTIATE_TEST_SUITE_P(
  3555. ShadingRateInvalidExecutionModel,
  3556. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3557. Combine(Values("ShadingRateKHR"), Values("Vertex"), Values("Input"),
  3558. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3559. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3560. Values("VUID-ShadingRateKHR-ShadingRateKHR-04490 "),
  3561. Values(TestResult(
  3562. SPV_ERROR_INVALID_DATA,
  3563. "Vulkan spec allows BuiltIn ShadingRateKHR to be used "
  3564. "only with the Fragment execution model."))));
  3565. INSTANTIATE_TEST_SUITE_P(
  3566. ShadingRateInvalidStorageClass,
  3567. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3568. Combine(Values("ShadingRateKHR"), Values("Fragment"), Values("Output"),
  3569. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3570. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3571. Values("VUID-ShadingRateKHR-ShadingRateKHR-04491 "),
  3572. Values(TestResult(
  3573. SPV_ERROR_INVALID_DATA,
  3574. "Vulkan spec allows BuiltIn ShadingRateKHR to be only "
  3575. "used for variables with Input storage class."))));
  3576. INSTANTIATE_TEST_SUITE_P(
  3577. ShadingRateInvalidType,
  3578. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3579. Combine(
  3580. Values("ShadingRateKHR"), Values("Fragment"), Values("Input"),
  3581. Values("%f32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3582. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3583. Values("VUID-ShadingRateKHR-ShadingRateKHR-04492 "),
  3584. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3585. "According to the Vulkan spec BuiltIn ShadingRateKHR "
  3586. "variable needs to be a 32-bit int scalar."))));
  3587. INSTANTIATE_TEST_SUITE_P(
  3588. FragInvocationCountInputSuccess,
  3589. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3590. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3591. Values("Input"), Values("%u32"),
  3592. Values("OpCapability FragmentDensityEXT\n"),
  3593. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3594. Values(nullptr), Values(TestResult())));
  3595. INSTANTIATE_TEST_SUITE_P(
  3596. FragInvocationCountInvalidExecutionModel,
  3597. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3598. Combine(
  3599. Values("FragInvocationCountEXT"), Values("Vertex"), Values("Input"),
  3600. Values("%u32"), Values("OpCapability FragmentDensityEXT\n"),
  3601. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3602. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04217"),
  3603. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3604. "Vulkan spec allows BuiltIn FragInvocationCountEXT "
  3605. "to be used only with Fragment execution model."))));
  3606. INSTANTIATE_TEST_SUITE_P(
  3607. FragInvocationCountInvalidStorageClass,
  3608. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3609. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3610. Values("Output"), Values("%u32"),
  3611. Values("OpCapability FragmentDensityEXT\n"),
  3612. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3613. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04218"),
  3614. Values(TestResult(
  3615. SPV_ERROR_INVALID_DATA,
  3616. "Vulkan spec allows BuiltIn FragInvocationCountEXT to be only "
  3617. "used for variables with Input storage class."))));
  3618. INSTANTIATE_TEST_SUITE_P(
  3619. FragInvocationCountInvalidType,
  3620. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3621. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3622. Values("Input"), Values("%f32"),
  3623. Values("OpCapability FragmentDensityEXT\n"),
  3624. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3625. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04219"),
  3626. Values(TestResult(
  3627. SPV_ERROR_INVALID_DATA,
  3628. "According to the Vulkan spec BuiltIn FragInvocationCountEXT "
  3629. "variable needs to be a 32-bit int scalar."))));
  3630. INSTANTIATE_TEST_SUITE_P(
  3631. FragSizeInputSuccess,
  3632. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3633. Combine(Values("FragSizeEXT"), Values("Fragment"), Values("Input"),
  3634. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3635. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3636. Values(nullptr), Values(TestResult())));
  3637. INSTANTIATE_TEST_SUITE_P(
  3638. FragSizeInvalidExecutionModel,
  3639. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3640. Combine(Values("FragSizeEXT"), Values("Vertex"), Values("Input"),
  3641. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3642. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3643. Values("VUID-FragSizeEXT-FragSizeEXT-04220"),
  3644. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3645. "Vulkan spec allows BuiltIn FragSizeEXT to be "
  3646. "used only with Fragment execution model."))));
  3647. INSTANTIATE_TEST_SUITE_P(
  3648. FragSizeInvalidStorageClass,
  3649. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3650. Combine(
  3651. Values("FragSizeEXT"), Values("Fragment"), Values("Output"),
  3652. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3653. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3654. Values("VUID-FragSizeEXT-FragSizeEXT-04221"),
  3655. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3656. "Vulkan spec allows BuiltIn FragSizeEXT to be only "
  3657. "used for variables with Input storage class."))));
  3658. INSTANTIATE_TEST_SUITE_P(
  3659. FragSizeInvalidType,
  3660. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3661. Combine(Values("FragSizeEXT"), Values("Fragment"), Values("Input"),
  3662. Values("%u32vec3"), Values("OpCapability FragmentDensityEXT\n"),
  3663. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3664. Values("VUID-FragSizeEXT-FragSizeEXT-04222"),
  3665. Values(TestResult(
  3666. SPV_ERROR_INVALID_DATA,
  3667. "According to the Vulkan spec BuiltIn FragSizeEXT variable "
  3668. "needs to be a 2-component 32-bit int vector."))));
  3669. INSTANTIATE_TEST_SUITE_P(
  3670. FragStencilRefOutputSuccess,
  3671. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3672. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Output"),
  3673. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3674. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3675. Values(nullptr), Values(TestResult())));
  3676. INSTANTIATE_TEST_SUITE_P(
  3677. FragStencilRefInvalidExecutionModel,
  3678. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3679. Combine(Values("FragStencilRefEXT"), Values("Vertex"), Values("Output"),
  3680. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3681. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3682. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04223"),
  3683. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3684. "Vulkan spec allows BuiltIn FragStencilRefEXT to "
  3685. "be used only with Fragment execution model."))));
  3686. INSTANTIATE_TEST_SUITE_P(
  3687. FragStencilRefInvalidStorageClass,
  3688. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3689. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Input"),
  3690. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3691. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3692. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04224"),
  3693. Values(TestResult(
  3694. SPV_ERROR_INVALID_DATA,
  3695. "Vulkan spec allows BuiltIn FragStencilRefEXT to be only used "
  3696. "for variables with Output storage class."))));
  3697. INSTANTIATE_TEST_SUITE_P(
  3698. FragStencilRefInvalidType,
  3699. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3700. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Output"),
  3701. Values("%f32", "%f64", "%u32vec2"),
  3702. Values("OpCapability StencilExportEXT\n"),
  3703. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3704. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04225"),
  3705. Values(TestResult(
  3706. SPV_ERROR_INVALID_DATA,
  3707. "According to the Vulkan spec BuiltIn FragStencilRefEXT "
  3708. "variable needs to be a int scalar."))));
  3709. INSTANTIATE_TEST_SUITE_P(
  3710. FullyCoveredEXTInputSuccess,
  3711. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3712. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Input"),
  3713. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3714. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3715. Values(nullptr), Values(TestResult())));
  3716. INSTANTIATE_TEST_SUITE_P(
  3717. FullyCoveredEXTInvalidExecutionModel,
  3718. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3719. Combine(Values("FullyCoveredEXT"), Values("Vertex"), Values("Input"),
  3720. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3721. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3722. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04232"),
  3723. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3724. "Vulkan spec allows BuiltIn FullyCoveredEXT to "
  3725. "be used only with Fragment execution model."))));
  3726. INSTANTIATE_TEST_SUITE_P(
  3727. FullyCoveredEXTInvalidStorageClass,
  3728. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3729. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Output"),
  3730. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3731. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3732. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04233"),
  3733. Values(TestResult(
  3734. SPV_ERROR_INVALID_DATA,
  3735. "Vulkan spec allows BuiltIn FullyCoveredEXT to be only used "
  3736. "for variables with Input storage class."))));
  3737. INSTANTIATE_TEST_SUITE_P(
  3738. FullyCoveredEXTInvalidType,
  3739. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3740. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Input"),
  3741. Values("%f32"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3742. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3743. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04234"),
  3744. Values(TestResult(
  3745. SPV_ERROR_INVALID_DATA,
  3746. "According to the Vulkan spec BuiltIn FullyCoveredEXT variable "
  3747. "needs to be a bool scalar."))));
  3748. INSTANTIATE_TEST_SUITE_P(
  3749. BaryCoordNotFragment,
  3750. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3751. Combine(
  3752. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Vertex"),
  3753. Values("Input"), Values("%f32vec3"),
  3754. Values("OpCapability FragmentBarycentricKHR\n"),
  3755. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3756. Values("VUID-BaryCoordKHR-BaryCoordKHR-04154 "
  3757. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04160 "),
  3758. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows BuiltIn",
  3759. "to be used only with Fragment execution model"))));
  3760. INSTANTIATE_TEST_SUITE_P(
  3761. BaryCoordNotInput,
  3762. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3763. Combine(Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3764. Values("Output"), Values("%f32vec3"),
  3765. Values("OpCapability FragmentBarycentricKHR\n"),
  3766. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3767. Values("VUID-BaryCoordKHR-BaryCoordKHR-04155 "
  3768. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04161 "),
  3769. Values(TestResult(
  3770. SPV_ERROR_INVALID_DATA, "Vulkan spec allows BuiltIn",
  3771. "to be only used for variables with Input storage class"))));
  3772. INSTANTIATE_TEST_SUITE_P(
  3773. BaryCoordNotFloatVector,
  3774. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3775. Combine(
  3776. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3777. Values("Output"), Values("%f32arr3", "%u32vec4"),
  3778. Values("OpCapability FragmentBarycentricKHR\n"),
  3779. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3780. Values("VUID-BaryCoordKHR-BaryCoordKHR-04156 "
  3781. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162 "),
  3782. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3783. "needs to be a 3-component 32-bit float vector"))));
  3784. INSTANTIATE_TEST_SUITE_P(
  3785. BaryCoordNotFloatVec3,
  3786. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3787. Combine(
  3788. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3789. Values("Output"), Values("%f32vec2"),
  3790. Values("OpCapability FragmentBarycentricKHR\n"),
  3791. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3792. Values("VUID-BaryCoordKHR-BaryCoordKHR-04156 "
  3793. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162 "),
  3794. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3795. "needs to be a 3-component 32-bit float vector"))));
  3796. INSTANTIATE_TEST_SUITE_P(
  3797. BaryCoordNotF32Vec3,
  3798. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3799. Combine(
  3800. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3801. Values("Output"), Values("%f64vec3"),
  3802. Values("OpCapability FragmentBarycentricKHR\n"),
  3803. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3804. Values("VUID-BaryCoordKHR-BaryCoordKHR-04156 "
  3805. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162 "),
  3806. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3807. "needs to be a 3-component 32-bit float vector"))));
  3808. std::string GenerateMeshShadingCode(const std::string& built_in,
  3809. const std::string& execution_mode,
  3810. const std::string& body,
  3811. const std::string& declarations = "") {
  3812. std::ostringstream ss;
  3813. ss << R"(
  3814. OpCapability MeshShadingEXT
  3815. OpExtension "SPV_EXT_mesh_shader"
  3816. OpMemoryModel Logical GLSL450
  3817. OpEntryPoint MeshEXT %main "main" %var
  3818. OpExecutionMode %main LocalSize 1 1 1
  3819. OpExecutionMode %main OutputVertices 1
  3820. OpExecutionMode %main OutputPrimitivesEXT 16
  3821. )";
  3822. ss << "OpExecutionMode %main " << execution_mode << "\n";
  3823. ss << "OpDecorate %var BuiltIn " << built_in << "\n";
  3824. ss << R"(
  3825. %void = OpTypeVoid
  3826. %func = OpTypeFunction %void
  3827. %bool = OpTypeBool
  3828. %int = OpTypeInt 32 1
  3829. %uint = OpTypeInt 32 0
  3830. %v2uint = OpTypeVector %uint 2
  3831. %v3uint = OpTypeVector %uint 3
  3832. %int_0 = OpConstant %int 0
  3833. %uint_16 = OpConstant %uint 16
  3834. )";
  3835. ss << declarations;
  3836. ss << R"(
  3837. %main = OpFunction %void None %func
  3838. %main_entry = OpLabel
  3839. )";
  3840. ss << body;
  3841. ss << R"(
  3842. OpReturn
  3843. OpFunctionEnd)";
  3844. return ss.str();
  3845. }
  3846. TEST_F(ValidateBuiltIns, VulkanPrimitiveTriangleIndicesEXTSuccess) {
  3847. const std::string declarations = R"(
  3848. %array = OpTypeArray %v3uint %uint_16
  3849. %array_ptr = OpTypePointer Output %array
  3850. %var = OpVariable %array_ptr Output
  3851. %ptr = OpTypePointer Output %v3uint
  3852. )";
  3853. const std::string body = R"(
  3854. %access = OpAccessChain %ptr %var %int_0
  3855. )";
  3856. CompileSuccessfully(
  3857. GenerateMeshShadingCode("PrimitiveTriangleIndicesEXT",
  3858. "OutputTrianglesEXT", body, declarations)
  3859. .c_str(),
  3860. SPV_ENV_VULKAN_1_2);
  3861. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3862. }
  3863. TEST_F(ValidateBuiltIns,
  3864. VulkanPrimitiveTriangleIndicesEXTInvalidExecutionMode) {
  3865. const std::string declarations = R"(
  3866. %array = OpTypeArray %v3uint %uint_16
  3867. %array_ptr = OpTypePointer Output %array
  3868. %var = OpVariable %array_ptr Output
  3869. %ptr = OpTypePointer Output %v3uint
  3870. )";
  3871. const std::string body = R"(
  3872. %access = OpAccessChain %ptr %var %int_0
  3873. )";
  3874. CompileSuccessfully(
  3875. GenerateMeshShadingCode("PrimitiveTriangleIndicesEXT", "OutputPoints",
  3876. body, declarations)
  3877. .c_str(),
  3878. SPV_ENV_VULKAN_1_2);
  3879. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3880. EXPECT_THAT(getDiagnosticString(),
  3881. AnyVUID("VUID-PrimitiveTriangleIndicesEXT-"
  3882. "PrimitiveTriangleIndicesEXT-07054"));
  3883. }
  3884. TEST_F(ValidateBuiltIns, VulkanPrimitiveTriangleIndicesEXTStorageClass) {
  3885. const std::string declarations = R"(
  3886. %array = OpTypeArray %v3uint %uint_16
  3887. %array_ptr = OpTypePointer Input %array
  3888. %var = OpVariable %array_ptr Input
  3889. %ptr = OpTypePointer Input %v3uint
  3890. )";
  3891. const std::string body = R"(
  3892. %access = OpAccessChain %ptr %var %int_0
  3893. )";
  3894. CompileSuccessfully(
  3895. GenerateMeshShadingCode("PrimitiveTriangleIndicesEXT",
  3896. "OutputTrianglesEXT", body, declarations)
  3897. .c_str(),
  3898. SPV_ENV_VULKAN_1_2);
  3899. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3900. EXPECT_THAT(getDiagnosticString(),
  3901. AnyVUID("VUID-PrimitiveTriangleIndicesEXT-"
  3902. "PrimitiveTriangleIndicesEXT-07055"));
  3903. }
  3904. TEST_F(ValidateBuiltIns, VulkanPrimitiveTriangleIndicesEXTVectorSize) {
  3905. const std::string declarations = R"(
  3906. %array = OpTypeArray %v2uint %uint_16
  3907. %array_ptr = OpTypePointer Output %array
  3908. %var = OpVariable %array_ptr Output
  3909. %ptr = OpTypePointer Output %v2uint
  3910. )";
  3911. const std::string body = R"(
  3912. %access = OpAccessChain %ptr %var %int_0
  3913. )";
  3914. CompileSuccessfully(
  3915. GenerateMeshShadingCode("PrimitiveTriangleIndicesEXT",
  3916. "OutputTrianglesEXT", body, declarations)
  3917. .c_str(),
  3918. SPV_ENV_VULKAN_1_2);
  3919. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3920. EXPECT_THAT(getDiagnosticString(),
  3921. AnyVUID("VUID-PrimitiveTriangleIndicesEXT-"
  3922. "PrimitiveTriangleIndicesEXT-07056"));
  3923. }
  3924. TEST_F(ValidateBuiltIns, VulkanPrimitiveTriangleIndicesEXTNonArray) {
  3925. const std::string declarations = R"(
  3926. %ptr = OpTypePointer Output %v3uint
  3927. %var = OpVariable %ptr Output
  3928. )";
  3929. const std::string body = R"(
  3930. %load = OpLoad %v3uint %var
  3931. )";
  3932. CompileSuccessfully(
  3933. GenerateMeshShadingCode("PrimitiveTriangleIndicesEXT",
  3934. "OutputTrianglesEXT", body, declarations)
  3935. .c_str(),
  3936. SPV_ENV_VULKAN_1_2);
  3937. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3938. EXPECT_THAT(getDiagnosticString(),
  3939. AnyVUID("VUID-PrimitiveTriangleIndicesEXT-"
  3940. "PrimitiveTriangleIndicesEXT-07056"));
  3941. }
  3942. TEST_F(ValidateBuiltIns, VulkanPrimitiveLineIndicesEXTSuccess) {
  3943. const std::string declarations = R"(
  3944. %array = OpTypeArray %v2uint %uint_16
  3945. %array_ptr = OpTypePointer Output %array
  3946. %var = OpVariable %array_ptr Output
  3947. %ptr = OpTypePointer Output %v2uint
  3948. )";
  3949. const std::string body = R"(
  3950. %access = OpAccessChain %ptr %var %int_0
  3951. )";
  3952. CompileSuccessfully(
  3953. GenerateMeshShadingCode("PrimitiveLineIndicesEXT", "OutputLinesEXT", body,
  3954. declarations)
  3955. .c_str(),
  3956. SPV_ENV_VULKAN_1_2);
  3957. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3958. }
  3959. TEST_F(ValidateBuiltIns, VulkanPrimitiveLineIndicesEXTInvalidExecutionMode) {
  3960. const std::string declarations = R"(
  3961. %array = OpTypeArray %v2uint %uint_16
  3962. %array_ptr = OpTypePointer Output %array
  3963. %var = OpVariable %array_ptr Output
  3964. %ptr = OpTypePointer Output %v2uint
  3965. )";
  3966. const std::string body = R"(
  3967. %access = OpAccessChain %ptr %var %int_0
  3968. )";
  3969. CompileSuccessfully(
  3970. GenerateMeshShadingCode("PrimitiveLineIndicesEXT", "OutputPoints", body,
  3971. declarations)
  3972. .c_str(),
  3973. SPV_ENV_VULKAN_1_2);
  3974. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3975. EXPECT_THAT(
  3976. getDiagnosticString(),
  3977. AnyVUID("VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07048"));
  3978. }
  3979. TEST_F(ValidateBuiltIns, VulkanPrimitiveLineIndicesEXTStorageClass) {
  3980. const std::string declarations = R"(
  3981. %array = OpTypeArray %v2uint %uint_16
  3982. %array_ptr = OpTypePointer Input %array
  3983. %var = OpVariable %array_ptr Input
  3984. %ptr = OpTypePointer Input %v2uint
  3985. )";
  3986. const std::string body = R"(
  3987. %access = OpAccessChain %ptr %var %int_0
  3988. )";
  3989. CompileSuccessfully(
  3990. GenerateMeshShadingCode("PrimitiveLineIndicesEXT", "OutputLinesEXT", body,
  3991. declarations)
  3992. .c_str(),
  3993. SPV_ENV_VULKAN_1_2);
  3994. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  3995. EXPECT_THAT(
  3996. getDiagnosticString(),
  3997. AnyVUID("VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07049"));
  3998. }
  3999. TEST_F(ValidateBuiltIns, VulkanPrimitiveLineIndicesEXTType) {
  4000. const std::string declarations = R"(
  4001. %array = OpTypeArray %v3uint %uint_16
  4002. %array_ptr = OpTypePointer Input %array
  4003. %var = OpVariable %array_ptr Input
  4004. %ptr = OpTypePointer Input %v3uint
  4005. )";
  4006. const std::string body = R"(
  4007. %access = OpAccessChain %ptr %var %int_0
  4008. )";
  4009. CompileSuccessfully(
  4010. GenerateMeshShadingCode("PrimitiveLineIndicesEXT", "OutputLinesEXT", body,
  4011. declarations)
  4012. .c_str(),
  4013. SPV_ENV_VULKAN_1_2);
  4014. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4015. EXPECT_THAT(
  4016. getDiagnosticString(),
  4017. AnyVUID("VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07050"));
  4018. }
  4019. TEST_F(ValidateBuiltIns, VulkanPrimitivePointIndicesEXTSuccess) {
  4020. const std::string declarations = R"(
  4021. %array = OpTypeArray %uint %uint_16
  4022. %array_ptr = OpTypePointer Output %array
  4023. %var = OpVariable %array_ptr Output
  4024. %ptr = OpTypePointer Output %uint
  4025. )";
  4026. const std::string body = R"(
  4027. %access = OpAccessChain %ptr %var %int_0
  4028. )";
  4029. CompileSuccessfully(
  4030. GenerateMeshShadingCode("PrimitivePointIndicesEXT", "OutputPoints", body,
  4031. declarations)
  4032. .c_str(),
  4033. SPV_ENV_VULKAN_1_2);
  4034. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4035. }
  4036. TEST_F(ValidateBuiltIns, VulkanPrimitivePointIndicesEXTInvalidExecutionMode) {
  4037. const std::string declarations = R"(
  4038. %array = OpTypeArray %uint %uint_16
  4039. %array_ptr = OpTypePointer Output %array
  4040. %var = OpVariable %array_ptr Output
  4041. %ptr = OpTypePointer Output %uint
  4042. )";
  4043. const std::string body = R"(
  4044. %access = OpAccessChain %ptr %var %int_0
  4045. )";
  4046. CompileSuccessfully(
  4047. GenerateMeshShadingCode("PrimitivePointIndicesEXT", "OutputTrianglesNV",
  4048. body, declarations)
  4049. .c_str(),
  4050. SPV_ENV_VULKAN_1_2);
  4051. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4052. EXPECT_THAT(
  4053. getDiagnosticString(),
  4054. AnyVUID("VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07042"));
  4055. }
  4056. TEST_F(ValidateBuiltIns, VulkanPrimitivePointIndicesEXTStorageClass) {
  4057. const std::string declarations = R"(
  4058. %array = OpTypeArray %uint %uint_16
  4059. %array_ptr = OpTypePointer Input %array
  4060. %var = OpVariable %array_ptr Input
  4061. %ptr = OpTypePointer Input %uint
  4062. )";
  4063. const std::string body = R"(
  4064. %access = OpAccessChain %ptr %var %int_0
  4065. )";
  4066. CompileSuccessfully(
  4067. GenerateMeshShadingCode("PrimitivePointIndicesEXT", "OutputPoints", body,
  4068. declarations)
  4069. .c_str(),
  4070. SPV_ENV_VULKAN_1_2);
  4071. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4072. EXPECT_THAT(
  4073. getDiagnosticString(),
  4074. AnyVUID("VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07043"));
  4075. }
  4076. TEST_F(ValidateBuiltIns, VulkanPrimitivePointIndicesEXTType) {
  4077. const std::string declarations = R"(
  4078. %array = OpTypeArray %v3uint %uint_16
  4079. %array_ptr = OpTypePointer Output %array
  4080. %var = OpVariable %array_ptr Output
  4081. %ptr = OpTypePointer Output %v3uint
  4082. )";
  4083. const std::string body = R"(
  4084. %access = OpAccessChain %ptr %var %int_0
  4085. )";
  4086. CompileSuccessfully(
  4087. GenerateMeshShadingCode("PrimitivePointIndicesEXT", "OutputPoints", body,
  4088. declarations)
  4089. .c_str(),
  4090. SPV_ENV_VULKAN_1_2);
  4091. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4092. EXPECT_THAT(
  4093. getDiagnosticString(),
  4094. AnyVUID("VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07044"));
  4095. }
  4096. TEST_F(ValidateBuiltIns, VulkanBuiltinPrimtiveIDWithPerPrimitiveEXT) {
  4097. const std::string text = R"(
  4098. OpCapability MeshShadingEXT
  4099. OpCapability Shader
  4100. OpExtension "SPV_EXT_mesh_shader"
  4101. OpMemoryModel Logical GLSL450
  4102. OpEntryPoint MeshEXT %MainMesh "MainMesh" %gl_PrimitiveID
  4103. OpExecutionMode %MainMesh OutputPrimitivesNV 1
  4104. OpExecutionMode %MainMesh OutputVertices 3
  4105. OpExecutionMode %MainMesh OutputTrianglesNV
  4106. OpExecutionMode %MainMesh LocalSize 1 1 1
  4107. OpSource Slang 1
  4108. OpName %MainMesh "MainMesh"
  4109. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  4110. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  4111. %void = OpTypeVoid
  4112. %9 = OpTypeFunction %void
  4113. %uint = OpTypeInt 32 0
  4114. %uint_3 = OpConstant %uint 3
  4115. %uint_1 = OpConstant %uint 1
  4116. %float = OpTypeFloat 32
  4117. %v4float = OpTypeVector %float 4
  4118. %int = OpTypeInt 32 1
  4119. %int_1 = OpConstant %int 1
  4120. %int_3 = OpConstant %int 3
  4121. %_ptr_Output_v4float = OpTypePointer Output %v4float
  4122. %uint_0 = OpConstant %uint 0
  4123. %v3float = OpTypeVector %float 3
  4124. %_ptr_Output_v3float = OpTypePointer Output %v3float
  4125. %v3uint = OpTypeVector %uint 3
  4126. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4127. %_ptr_Output_int = OpTypePointer Output %int
  4128. %_arr_int_int_1 = OpTypeArray %int %int_1
  4129. %_ptr_Output__arr_int_int_1 = OpTypePointer Output %_arr_int_int_1
  4130. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_int_int_1 Output
  4131. %MainMesh = OpFunction %void None %9
  4132. %25 = OpLabel
  4133. OpSetMeshOutputsEXT %uint_3 %uint_1
  4134. OpReturn
  4135. OpFunctionEnd
  4136. )";
  4137. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4138. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4139. }
  4140. TEST_F(ValidateBuiltIns, BadVulkanBuiltinPrimtiveIDWithPerPrimitiveEXT) {
  4141. const std::string text = R"(
  4142. OpCapability MeshShadingEXT
  4143. OpCapability Shader
  4144. OpExtension "SPV_EXT_mesh_shader"
  4145. OpMemoryModel Logical GLSL450
  4146. OpEntryPoint MeshEXT %MainMesh "MainMesh" %gl_PrimitiveID
  4147. OpExecutionMode %MainMesh OutputPrimitivesNV 1
  4148. OpExecutionMode %MainMesh OutputVertices 3
  4149. OpExecutionMode %MainMesh OutputTrianglesNV
  4150. OpExecutionMode %MainMesh LocalSize 1 1 1
  4151. OpSource Slang 1
  4152. OpName %MainMesh "MainMesh"
  4153. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  4154. %void = OpTypeVoid
  4155. %9 = OpTypeFunction %void
  4156. %uint = OpTypeInt 32 0
  4157. %uint_3 = OpConstant %uint 3
  4158. %uint_1 = OpConstant %uint 1
  4159. %float = OpTypeFloat 32
  4160. %v4float = OpTypeVector %float 4
  4161. %int = OpTypeInt 32 1
  4162. %int_1 = OpConstant %int 1
  4163. %int_3 = OpConstant %int 3
  4164. %_ptr_Output_v4float = OpTypePointer Output %v4float
  4165. %uint_0 = OpConstant %uint 0
  4166. %v3float = OpTypeVector %float 3
  4167. %_ptr_Output_v3float = OpTypePointer Output %v3float
  4168. %v3uint = OpTypeVector %uint 3
  4169. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4170. %_ptr_Output_int = OpTypePointer Output %int
  4171. %_arr_int_int_1 = OpTypeArray %int %int_1
  4172. %_ptr_Output__arr_int_int_1 = OpTypePointer Output %_arr_int_int_1
  4173. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_int_int_1 Output
  4174. %MainMesh = OpFunction %void None %9
  4175. %25 = OpLabel
  4176. OpSetMeshOutputsEXT %uint_3 %uint_1
  4177. OpReturn
  4178. OpFunctionEnd
  4179. )";
  4180. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4181. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4182. EXPECT_THAT(getDiagnosticString(),
  4183. AnyVUID("VUID-PrimitiveId-PrimitiveId-07040"));
  4184. }
  4185. TEST_F(ValidateBuiltIns, BadVulkanBuiltinLayerWithPerPrimitiveEXT) {
  4186. const std::string text = R"(
  4187. OpCapability MeshShadingEXT
  4188. OpCapability Shader
  4189. OpExtension "SPV_EXT_mesh_shader"
  4190. OpMemoryModel Logical GLSL450
  4191. OpEntryPoint MeshEXT %MainMesh "MainMesh" %gl_Layer
  4192. OpExecutionMode %MainMesh OutputPrimitivesNV 1
  4193. OpExecutionMode %MainMesh OutputVertices 3
  4194. OpExecutionMode %MainMesh OutputTrianglesNV
  4195. OpExecutionMode %MainMesh LocalSize 1 1 1
  4196. OpSource Slang 1
  4197. OpName %MainMesh "MainMesh"
  4198. OpDecorate %gl_Layer BuiltIn Layer
  4199. %void = OpTypeVoid
  4200. %9 = OpTypeFunction %void
  4201. %uint = OpTypeInt 32 0
  4202. %uint_3 = OpConstant %uint 3
  4203. %uint_1 = OpConstant %uint 1
  4204. %float = OpTypeFloat 32
  4205. %int = OpTypeInt 32 1
  4206. %int_1 = OpConstant %int 1
  4207. %int_3 = OpConstant %int 3
  4208. %uint_0 = OpConstant %uint 0
  4209. %v3float = OpTypeVector %float 3
  4210. %_ptr_Output_v3float = OpTypePointer Output %v3float
  4211. %v3uint = OpTypeVector %uint 3
  4212. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4213. %_ptr_Output_int = OpTypePointer Output %int
  4214. %_arr_int_int_1 = OpTypeArray %int %int_1
  4215. %_ptr_Output__arr_int_int_1 = OpTypePointer Output %_arr_int_int_1
  4216. %gl_Layer = OpVariable %_ptr_Output__arr_int_int_1 Output
  4217. %MainMesh = OpFunction %void None %9
  4218. %25 = OpLabel
  4219. OpSetMeshOutputsEXT %uint_3 %uint_1
  4220. OpReturn
  4221. OpFunctionEnd
  4222. )";
  4223. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4224. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4225. EXPECT_THAT(getDiagnosticString(), AnyVUID("VUID-Layer-Layer-07039"));
  4226. }
  4227. TEST_F(ValidateBuiltIns, BadVulkanBuiltinViewportIndexWithPerPrimitiveEXT) {
  4228. const std::string text = R"(
  4229. OpCapability MeshShadingEXT
  4230. OpCapability Shader
  4231. OpExtension "SPV_EXT_mesh_shader"
  4232. OpMemoryModel Logical GLSL450
  4233. OpEntryPoint MeshEXT %MainMesh "MainMesh" %gl_ViewportIndex
  4234. OpExecutionMode %MainMesh OutputPrimitivesNV 1
  4235. OpExecutionMode %MainMesh OutputVertices 3
  4236. OpExecutionMode %MainMesh OutputTrianglesNV
  4237. OpExecutionMode %MainMesh LocalSize 1 1 1
  4238. OpSource Slang 1
  4239. OpName %MainMesh "MainMesh"
  4240. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  4241. %void = OpTypeVoid
  4242. %9 = OpTypeFunction %void
  4243. %uint = OpTypeInt 32 0
  4244. %uint_3 = OpConstant %uint 3
  4245. %uint_1 = OpConstant %uint 1
  4246. %float = OpTypeFloat 32
  4247. %int = OpTypeInt 32 1
  4248. %int_1 = OpConstant %int 1
  4249. %int_3 = OpConstant %int 3
  4250. %uint_0 = OpConstant %uint 0
  4251. %v3float = OpTypeVector %float 3
  4252. %_ptr_Output_v3float = OpTypePointer Output %v3float
  4253. %v3uint = OpTypeVector %uint 3
  4254. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4255. %_ptr_Output_int = OpTypePointer Output %int
  4256. %_arr_int_int_1 = OpTypeArray %int %int_1
  4257. %_ptr_Output__arr_int_int_1 = OpTypePointer Output %_arr_int_int_1
  4258. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_int_int_1 Output
  4259. %MainMesh = OpFunction %void None %9
  4260. %25 = OpLabel
  4261. OpSetMeshOutputsEXT %uint_3 %uint_1
  4262. OpReturn
  4263. OpFunctionEnd
  4264. )";
  4265. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4266. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4267. EXPECT_THAT(getDiagnosticString(),
  4268. AnyVUID("VUID-ViewportIndex-ViewportIndex-07060"));
  4269. }
  4270. TEST_F(ValidateBuiltIns, VulkanBuiltinPrimitivePointIndicesEXT) {
  4271. const std::string text = R"(
  4272. OpCapability MeshShadingEXT
  4273. OpExtension "SPV_EXT_mesh_shader"
  4274. %1 = OpExtInstImport "GLSL.std.450"
  4275. OpMemoryModel Logical GLSL450
  4276. OpEntryPoint MeshEXT %main "main" %gl_PrimitivePointIndicesEXT
  4277. OpExecutionMode %main LocalSize 32 1 1
  4278. OpExecutionMode %main OutputVertices 81
  4279. OpExecutionMode %main OutputPrimitivesEXT 32
  4280. OpExecutionMode %main OutputPoints
  4281. OpSource GLSL 460
  4282. OpSourceExtension "GL_EXT_mesh_shader"
  4283. OpName %main "main"
  4284. OpName %gl_PrimitivePointIndicesEXT "gl_PrimitivePointIndicesEXT"
  4285. OpDecorate %gl_PrimitivePointIndicesEXT BuiltIn PrimitivePointIndicesEXT
  4286. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4287. %void = OpTypeVoid
  4288. %3 = OpTypeFunction %void
  4289. %uint = OpTypeInt 32 0
  4290. %uint_32 = OpConstant %uint 32
  4291. %_arr_uint_uint_32 = OpTypeArray %uint %uint_32
  4292. %_ptr_Output__arr_uint_uint_32 = OpTypePointer Output %_arr_uint_uint_32
  4293. %gl_PrimitivePointIndicesEXT = OpVariable %_ptr_Output__arr_uint_uint_32 Output
  4294. %int = OpTypeInt 32 1
  4295. %int_0 = OpConstant %int 0
  4296. %uint_0 = OpConstant %uint 0
  4297. %_ptr_Output_uint = OpTypePointer Output %uint
  4298. %v3uint = OpTypeVector %uint 3
  4299. %uint_1 = OpConstant %uint 1
  4300. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4301. %main = OpFunction %void None %3
  4302. %5 = OpLabel
  4303. %15 = OpAccessChain %_ptr_Output_uint %gl_PrimitivePointIndicesEXT %int_0
  4304. OpStore %15 %uint_0
  4305. OpReturn
  4306. OpFunctionEnd
  4307. )";
  4308. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4309. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4310. }
  4311. TEST_F(ValidateBuiltIns, VulkanBuiltinPrimitiveLineIndicesEXT) {
  4312. const std::string text = R"(
  4313. OpCapability MeshShadingEXT
  4314. OpExtension "SPV_EXT_mesh_shader"
  4315. %1 = OpExtInstImport "GLSL.std.450"
  4316. OpMemoryModel Logical GLSL450
  4317. OpEntryPoint MeshEXT %main "main" %gl_PrimitiveLineIndicesEXT
  4318. OpExecutionMode %main LocalSize 32 1 1
  4319. OpExecutionMode %main OutputVertices 81
  4320. OpExecutionMode %main OutputPrimitivesEXT 32
  4321. OpExecutionMode %main OutputLinesEXT
  4322. OpSource GLSL 460
  4323. OpSourceExtension "GL_EXT_mesh_shader"
  4324. OpName %main "main"
  4325. OpName %gl_PrimitiveLineIndicesEXT "gl_PrimitiveLineIndicesEXT"
  4326. OpDecorate %gl_PrimitiveLineIndicesEXT BuiltIn PrimitiveLineIndicesEXT
  4327. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4328. %void = OpTypeVoid
  4329. %3 = OpTypeFunction %void
  4330. %uint = OpTypeInt 32 0
  4331. %v2uint = OpTypeVector %uint 2
  4332. %uint_32 = OpConstant %uint 32
  4333. %_arr_v2uint_uint_32 = OpTypeArray %v2uint %uint_32
  4334. %_ptr_Output__arr_v2uint_uint_32 = OpTypePointer Output %_arr_v2uint_uint_32
  4335. %gl_PrimitiveLineIndicesEXT = OpVariable %_ptr_Output__arr_v2uint_uint_32 Output
  4336. %int = OpTypeInt 32 1
  4337. %int_0 = OpConstant %int 0
  4338. %uint_0 = OpConstant %uint 0
  4339. %15 = OpConstantComposite %v2uint %uint_0 %uint_0
  4340. %_ptr_Output_v2uint = OpTypePointer Output %v2uint
  4341. %v3uint = OpTypeVector %uint 3
  4342. %uint_1 = OpConstant %uint 1
  4343. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4344. %main = OpFunction %void None %3
  4345. %5 = OpLabel
  4346. %17 = OpAccessChain %_ptr_Output_v2uint %gl_PrimitiveLineIndicesEXT %int_0
  4347. OpStore %17 %15
  4348. OpReturn
  4349. OpFunctionEnd
  4350. )";
  4351. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4352. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4353. }
  4354. TEST_F(ValidateBuiltIns, BadVulkanBuiltinPrimitiveLineIndicesEXT) {
  4355. const std::string text = R"(
  4356. OpCapability MeshShadingEXT
  4357. OpExtension "SPV_EXT_mesh_shader"
  4358. %1 = OpExtInstImport "GLSL.std.450"
  4359. OpMemoryModel Logical GLSL450
  4360. OpEntryPoint MeshEXT %main "main" %gl_PrimitiveLineIndicesEXT
  4361. OpExecutionMode %main LocalSize 32 1 1
  4362. OpExecutionMode %main OutputVertices 81
  4363. OpExecutionMode %main OutputPrimitivesEXT 32
  4364. OpExecutionMode %main OutputPoints
  4365. OpSource GLSL 460
  4366. OpSourceExtension "GL_EXT_mesh_shader"
  4367. OpName %main "main"
  4368. OpName %gl_PrimitiveLineIndicesEXT "gl_PrimitiveLineIndicesEXT"
  4369. OpDecorate %gl_PrimitiveLineIndicesEXT BuiltIn PrimitiveLineIndicesEXT
  4370. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4371. %void = OpTypeVoid
  4372. %3 = OpTypeFunction %void
  4373. %uint = OpTypeInt 32 0
  4374. %v2uint = OpTypeVector %uint 2
  4375. %uint_32 = OpConstant %uint 32
  4376. %_arr_v2uint_uint_32 = OpTypeArray %v2uint %uint_32
  4377. %_ptr_Output__arr_v2uint_uint_32 = OpTypePointer Output %_arr_v2uint_uint_32
  4378. %gl_PrimitiveLineIndicesEXT = OpVariable %_ptr_Output__arr_v2uint_uint_32 Output
  4379. %int = OpTypeInt 32 1
  4380. %int_0 = OpConstant %int 0
  4381. %uint_0 = OpConstant %uint 0
  4382. %15 = OpConstantComposite %v2uint %uint_0 %uint_0
  4383. %_ptr_Output_v2uint = OpTypePointer Output %v2uint
  4384. %v3uint = OpTypeVector %uint 3
  4385. %uint_1 = OpConstant %uint 1
  4386. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4387. %main = OpFunction %void None %3
  4388. %5 = OpLabel
  4389. %17 = OpAccessChain %_ptr_Output_v2uint %gl_PrimitiveLineIndicesEXT %int_0
  4390. OpStore %17 %15
  4391. OpReturn
  4392. OpFunctionEnd
  4393. )";
  4394. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4395. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4396. EXPECT_THAT(
  4397. getDiagnosticString(),
  4398. AnyVUID("VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07048"));
  4399. }
  4400. TEST_F(ValidateBuiltIns, BadVulkanBuiltinPrimitivePointIndicesEXT) {
  4401. const std::string text = R"(
  4402. OpCapability MeshShadingEXT
  4403. OpExtension "SPV_EXT_mesh_shader"
  4404. %1 = OpExtInstImport "GLSL.std.450"
  4405. OpMemoryModel Logical GLSL450
  4406. OpEntryPoint MeshEXT %main "main" %gl_PrimitivePointIndicesEXT
  4407. OpExecutionMode %main LocalSize 32 1 1
  4408. OpExecutionMode %main OutputVertices 81
  4409. OpExecutionMode %main OutputPrimitivesEXT 32
  4410. OpExecutionMode %main OutputTrianglesEXT
  4411. OpSource GLSL 460
  4412. OpSourceExtension "GL_EXT_mesh_shader"
  4413. OpName %main "main"
  4414. OpName %gl_PrimitivePointIndicesEXT "gl_PrimitivePointIndicesEXT"
  4415. OpDecorate %gl_PrimitivePointIndicesEXT BuiltIn PrimitivePointIndicesEXT
  4416. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4417. %void = OpTypeVoid
  4418. %3 = OpTypeFunction %void
  4419. %uint = OpTypeInt 32 0
  4420. %uint_32 = OpConstant %uint 32
  4421. %_arr_uint_uint_32 = OpTypeArray %uint %uint_32
  4422. %_ptr_Output__arr_uint_uint_32 = OpTypePointer Output %_arr_uint_uint_32
  4423. %gl_PrimitivePointIndicesEXT = OpVariable %_ptr_Output__arr_uint_uint_32 Output
  4424. %int = OpTypeInt 32 1
  4425. %int_0 = OpConstant %int 0
  4426. %uint_0 = OpConstant %uint 0
  4427. %_ptr_Output_uint = OpTypePointer Output %uint
  4428. %v3uint = OpTypeVector %uint 3
  4429. %uint_1 = OpConstant %uint 1
  4430. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4431. %main = OpFunction %void None %3
  4432. %5 = OpLabel
  4433. %15 = OpAccessChain %_ptr_Output_uint %gl_PrimitivePointIndicesEXT %int_0
  4434. OpStore %15 %uint_0
  4435. OpReturn
  4436. OpFunctionEnd
  4437. )";
  4438. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4439. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4440. EXPECT_THAT(
  4441. getDiagnosticString(),
  4442. AnyVUID("VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07042"));
  4443. }
  4444. TEST_F(ValidateBuiltIns, VulkanBuiltinPrimitiveTriangleIndicesEXT) {
  4445. const std::string text = R"(
  4446. OpCapability MeshShadingEXT
  4447. OpExtension "SPV_EXT_mesh_shader"
  4448. %1 = OpExtInstImport "GLSL.std.450"
  4449. OpMemoryModel Logical GLSL450
  4450. OpEntryPoint MeshEXT %main "main" %gl_PrimitiveTriangleIndicesEXT
  4451. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4452. OpExecutionMode %main OutputVertices 81
  4453. OpExecutionMode %main OutputPrimitivesEXT 32
  4454. OpExecutionMode %main OutputTrianglesEXT
  4455. OpSource GLSL 460
  4456. OpSourceExtension "GL_EXT_mesh_shader"
  4457. OpName %main "main"
  4458. OpName %gl_PrimitiveTriangleIndicesEXT "gl_PrimitiveTriangleIndicesEXT"
  4459. OpDecorate %gl_PrimitiveTriangleIndicesEXT BuiltIn PrimitiveTriangleIndicesEXT
  4460. %void = OpTypeVoid
  4461. %7 = OpTypeFunction %void
  4462. %uint = OpTypeInt 32 0
  4463. %uint_32 = OpConstant %uint 32
  4464. %uint_1 = OpConstant %uint 1
  4465. %v3uint = OpTypeVector %uint 3
  4466. %_arr_v3uint_uint_32 = OpTypeArray %v3uint %uint_32
  4467. %_ptr_Output__arr_v3uint_uint_32 = OpTypePointer Output %_arr_v3uint_uint_32
  4468. %gl_PrimitiveTriangleIndicesEXT = OpVariable %_ptr_Output__arr_v3uint_uint_32 Output
  4469. %int = OpTypeInt 32 1
  4470. %int_0 = OpConstant %int 0
  4471. %uint_0 = OpConstant %uint 0
  4472. %15 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0
  4473. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4474. %17 = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4475. %main = OpFunction %void None %7
  4476. %18 = OpLabel
  4477. %19 = OpAccessChain %_ptr_Output_v3uint %gl_PrimitiveTriangleIndicesEXT %int_0
  4478. OpStore %19 %15
  4479. OpReturn
  4480. OpFunctionEnd
  4481. )";
  4482. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4483. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4484. }
  4485. TEST_F(ValidateBuiltIns, BadVulkanBuiltinPrimitiveTriangleIndicesEXT) {
  4486. const std::string text = R"(
  4487. OpCapability MeshShadingEXT
  4488. OpExtension "SPV_EXT_mesh_shader"
  4489. %1 = OpExtInstImport "GLSL.std.450"
  4490. OpMemoryModel Logical GLSL450
  4491. OpEntryPoint MeshEXT %main "main" %gl_PrimitiveTriangleIndicesEXT
  4492. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4493. OpExecutionMode %main OutputVertices 81
  4494. OpExecutionMode %main OutputPrimitivesEXT 32
  4495. OpExecutionMode %main OutputPoints
  4496. OpSource GLSL 460
  4497. OpSourceExtension "GL_EXT_mesh_shader"
  4498. OpName %main "main"
  4499. OpName %gl_PrimitiveTriangleIndicesEXT "gl_PrimitiveTriangleIndicesEXT"
  4500. OpDecorate %gl_PrimitiveTriangleIndicesEXT BuiltIn PrimitiveTriangleIndicesEXT
  4501. %void = OpTypeVoid
  4502. %7 = OpTypeFunction %void
  4503. %uint = OpTypeInt 32 0
  4504. %uint_32 = OpConstant %uint 32
  4505. %uint_1 = OpConstant %uint 1
  4506. %v3uint = OpTypeVector %uint 3
  4507. %_arr_v3uint_uint_32 = OpTypeArray %v3uint %uint_32
  4508. %_ptr_Output__arr_v3uint_uint_32 = OpTypePointer Output %_arr_v3uint_uint_32
  4509. %gl_PrimitiveTriangleIndicesEXT = OpVariable %_ptr_Output__arr_v3uint_uint_32 Output
  4510. %int = OpTypeInt 32 1
  4511. %int_0 = OpConstant %int 0
  4512. %uint_0 = OpConstant %uint 0
  4513. %15 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0
  4514. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4515. %17 = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4516. %main = OpFunction %void None %7
  4517. %18 = OpLabel
  4518. %19 = OpAccessChain %_ptr_Output_v3uint %gl_PrimitiveTriangleIndicesEXT %int_0
  4519. OpStore %19 %15
  4520. OpReturn
  4521. OpFunctionEnd
  4522. )";
  4523. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4524. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4525. EXPECT_THAT(getDiagnosticString(),
  4526. AnyVUID("VUID-PrimitiveTriangleIndicesEXT-"
  4527. "PrimitiveTriangleIndicesEXT-07054"));
  4528. }
  4529. TEST_F(ValidateBuiltIns, BadVulkanPrimitivePointIndicesArraySizeMeshEXT) {
  4530. const std::string text = R"(
  4531. OpCapability MeshShadingEXT
  4532. OpExtension "SPV_EXT_mesh_shader"
  4533. %1 = OpExtInstImport "GLSL.std.450"
  4534. OpMemoryModel Logical GLSL450
  4535. OpEntryPoint MeshEXT %main "main" %gl_PrimitivePointIndicesEXT
  4536. OpExecutionMode %main LocalSize 32 1 1
  4537. OpExecutionMode %main OutputVertices 81
  4538. OpExecutionMode %main OutputPrimitivesEXT 16
  4539. OpExecutionMode %main OutputPoints
  4540. OpSource GLSL 460
  4541. OpSourceExtension "GL_EXT_mesh_shader"
  4542. OpName %main "main"
  4543. OpName %gl_PrimitivePointIndicesEXT "gl_PrimitivePointIndicesEXT"
  4544. OpDecorate %gl_PrimitivePointIndicesEXT BuiltIn PrimitivePointIndicesEXT
  4545. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4546. %void = OpTypeVoid
  4547. %3 = OpTypeFunction %void
  4548. %uint = OpTypeInt 32 0
  4549. %uint_32 = OpConstant %uint 32
  4550. %_arr_uint_uint_32 = OpTypeArray %uint %uint_32
  4551. %_ptr_Output__arr_uint_uint_32 = OpTypePointer Output %_arr_uint_uint_32
  4552. %gl_PrimitivePointIndicesEXT = OpVariable %_ptr_Output__arr_uint_uint_32 Output
  4553. %int = OpTypeInt 32 1
  4554. %int_0 = OpConstant %int 0
  4555. %uint_0 = OpConstant %uint 0
  4556. %_ptr_Output_uint = OpTypePointer Output %uint
  4557. %v3uint = OpTypeVector %uint 3
  4558. %uint_1 = OpConstant %uint 1
  4559. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4560. %main = OpFunction %void None %3
  4561. %5 = OpLabel
  4562. %15 = OpAccessChain %_ptr_Output_uint %gl_PrimitivePointIndicesEXT %int_0
  4563. OpStore %15 %uint_0
  4564. OpReturn
  4565. OpFunctionEnd
  4566. )";
  4567. CompileSuccessfully(text, SPV_ENV_VULKAN_1_2);
  4568. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_2));
  4569. EXPECT_THAT(
  4570. getDiagnosticString(),
  4571. AnyVUID("VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07046"));
  4572. }
  4573. TEST_F(ValidateBuiltIns, BadVulkanPrimitiveLineIndicesArraySizeMeshEXT) {
  4574. const std::string text = R"(
  4575. OpCapability MeshShadingEXT
  4576. OpExtension "SPV_EXT_mesh_shader"
  4577. %1 = OpExtInstImport "GLSL.std.450"
  4578. OpMemoryModel Logical GLSL450
  4579. OpEntryPoint MeshEXT %main "main" %gl_PrimitiveLineIndicesEXT
  4580. OpExecutionMode %main LocalSize 32 1 1
  4581. OpExecutionMode %main OutputVertices 81
  4582. OpExecutionMode %main OutputPrimitivesEXT 16
  4583. OpExecutionMode %main OutputLinesEXT
  4584. OpSource GLSL 460
  4585. OpSourceExtension "GL_EXT_mesh_shader"
  4586. OpName %main "main"
  4587. OpName %gl_PrimitiveLineIndicesEXT "gl_PrimitiveLineIndicesEXT"
  4588. OpDecorate %gl_PrimitiveLineIndicesEXT BuiltIn PrimitiveLineIndicesEXT
  4589. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4590. %void = OpTypeVoid
  4591. %3 = OpTypeFunction %void
  4592. %uint = OpTypeInt 32 0
  4593. %v2uint = OpTypeVector %uint 2
  4594. %uint_32 = OpConstant %uint 32
  4595. %_arr_v2uint_uint_32 = OpTypeArray %v2uint %uint_32
  4596. %_ptr_Output__arr_v2uint_uint_32 = OpTypePointer Output %_arr_v2uint_uint_32
  4597. %gl_PrimitiveLineIndicesEXT = OpVariable %_ptr_Output__arr_v2uint_uint_32 Output
  4598. %int = OpTypeInt 32 1
  4599. %int_0 = OpConstant %int 0
  4600. %uint_0 = OpConstant %uint 0
  4601. %15 = OpConstantComposite %v2uint %uint_0 %uint_0
  4602. %_ptr_Output_v2uint = OpTypePointer Output %v2uint
  4603. %v3uint = OpTypeVector %uint 3
  4604. %uint_1 = OpConstant %uint 1
  4605. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4606. %main = OpFunction %void None %3
  4607. %5 = OpLabel
  4608. %17 = OpAccessChain %_ptr_Output_v2uint %gl_PrimitiveLineIndicesEXT %int_0
  4609. OpStore %17 %15
  4610. OpReturn
  4611. OpFunctionEnd
  4612. )";
  4613. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4614. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4615. EXPECT_THAT(
  4616. getDiagnosticString(),
  4617. AnyVUID("VUID-PrimitiveLineIndicesEXT-PrimitiveLineIndicesEXT-07052"));
  4618. }
  4619. TEST_F(ValidateBuiltIns, BadVulkanPrimitiveTriangleIndicesArraySizeMeshEXT) {
  4620. const std::string text = R"(
  4621. OpCapability MeshShadingEXT
  4622. OpExtension "SPV_EXT_mesh_shader"
  4623. %1 = OpExtInstImport "GLSL.std.450"
  4624. OpMemoryModel Logical GLSL450
  4625. OpEntryPoint MeshEXT %main "main" %gl_PrimitiveTriangleIndicesEXT
  4626. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4627. OpExecutionMode %main OutputVertices 81
  4628. OpExecutionMode %main OutputPrimitivesEXT 16
  4629. OpExecutionMode %main OutputTrianglesEXT
  4630. OpSource GLSL 460
  4631. OpSourceExtension "GL_EXT_mesh_shader"
  4632. OpName %main "main"
  4633. OpName %gl_PrimitiveTriangleIndicesEXT "gl_PrimitiveTriangleIndicesEXT"
  4634. OpDecorate %gl_PrimitiveTriangleIndicesEXT BuiltIn PrimitiveTriangleIndicesEXT
  4635. %void = OpTypeVoid
  4636. %7 = OpTypeFunction %void
  4637. %uint = OpTypeInt 32 0
  4638. %uint_32 = OpConstant %uint 32
  4639. %uint_1 = OpConstant %uint 1
  4640. %v3uint = OpTypeVector %uint 3
  4641. %_arr_v3uint_uint_32 = OpTypeArray %v3uint %uint_32
  4642. %_ptr_Output__arr_v3uint_uint_32 = OpTypePointer Output %_arr_v3uint_uint_32
  4643. %gl_PrimitiveTriangleIndicesEXT = OpVariable %_ptr_Output__arr_v3uint_uint_32 Output
  4644. %int = OpTypeInt 32 1
  4645. %int_0 = OpConstant %int 0
  4646. %uint_0 = OpConstant %uint 0
  4647. %15 = OpConstantComposite %v3uint %uint_0 %uint_0 %uint_0
  4648. %_ptr_Output_v3uint = OpTypePointer Output %v3uint
  4649. %17 = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4650. %main = OpFunction %void None %7
  4651. %18 = OpLabel
  4652. %19 = OpAccessChain %_ptr_Output_v3uint %gl_PrimitiveTriangleIndicesEXT %int_0
  4653. OpStore %19 %15
  4654. OpReturn
  4655. OpFunctionEnd
  4656. )";
  4657. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4658. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4659. EXPECT_THAT(getDiagnosticString(),
  4660. AnyVUID("VUID-PrimitiveTriangleIndicesEXT-"
  4661. "PrimitiveTriangleIndicesEXT-07058"));
  4662. }
  4663. TEST_F(ValidateBuiltIns, BadExecModelVulkanPrimitivePointIndicesEXT) {
  4664. const std::string text = R"(
  4665. OpCapability MeshShadingNV
  4666. OpCapability MeshShadingEXT
  4667. OpExtension "SPV_NV_mesh_shader"
  4668. OpExtension "SPV_EXT_mesh_shader"
  4669. %1 = OpExtInstImport "GLSL.std.450"
  4670. OpMemoryModel Logical GLSL450
  4671. OpEntryPoint MeshNV %main "main" %gl_PrimitivePointIndicesEXT
  4672. OpExecutionMode %main LocalSize 32 1 1
  4673. OpExecutionMode %main OutputVertices 81
  4674. OpExecutionMode %main OutputPrimitivesEXT 32
  4675. OpExecutionMode %main OutputPoints
  4676. OpSource GLSL 460
  4677. OpSourceExtension "GL_EXT_mesh_shader"
  4678. OpName %main "main"
  4679. OpName %gl_PrimitivePointIndicesEXT "gl_PrimitivePointIndicesEXT"
  4680. OpDecorate %gl_PrimitivePointIndicesEXT BuiltIn PrimitivePointIndicesEXT
  4681. OpDecorate %gl_WorkGroupSize BuiltIn WorkgroupSize
  4682. %void = OpTypeVoid
  4683. %3 = OpTypeFunction %void
  4684. %uint = OpTypeInt 32 0
  4685. %uint_32 = OpConstant %uint 32
  4686. %_arr_uint_uint_32 = OpTypeArray %uint %uint_32
  4687. %_ptr_Output__arr_uint_uint_32 = OpTypePointer Output %_arr_uint_uint_32
  4688. %gl_PrimitivePointIndicesEXT = OpVariable %_ptr_Output__arr_uint_uint_32 Output
  4689. %int = OpTypeInt 32 1
  4690. %int_0 = OpConstant %int 0
  4691. %uint_0 = OpConstant %uint 0
  4692. %_ptr_Output_uint = OpTypePointer Output %uint
  4693. %v3uint = OpTypeVector %uint 3
  4694. %uint_1 = OpConstant %uint 1
  4695. %gl_WorkGroupSize = OpConstantComposite %v3uint %uint_32 %uint_1 %uint_1
  4696. %main = OpFunction %void None %3
  4697. %5 = OpLabel
  4698. %15 = OpAccessChain %_ptr_Output_uint %gl_PrimitivePointIndicesEXT %int_0
  4699. OpStore %15 %uint_0
  4700. OpReturn
  4701. OpFunctionEnd
  4702. )";
  4703. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4704. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4705. EXPECT_THAT(
  4706. getDiagnosticString(),
  4707. AnyVUID("VUID-PrimitivePointIndicesEXT-PrimitivePointIndicesEXT-07041"));
  4708. }
  4709. TEST_F(ValidateBuiltIns, VulkanBuiltinCullPrimitiveEXT) {
  4710. const std::string text = R"(
  4711. OpCapability MeshShadingEXT
  4712. OpExtension "SPV_EXT_mesh_shader"
  4713. %1 = OpExtInstImport "GLSL.std.450"
  4714. OpMemoryModel Logical GLSL450
  4715. OpEntryPoint MeshEXT %main "main" %gl_MeshPrimitivesEXT
  4716. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4717. OpExecutionMode %main OutputVertices 81
  4718. OpExecutionMode %main OutputPrimitivesEXT 32
  4719. OpExecutionMode %main OutputTrianglesEXT
  4720. OpSource GLSL 450
  4721. OpSourceExtension "GL_EXT_mesh_shader"
  4722. OpName %main "main"
  4723. OpName %gl_MeshPerPrimitiveEXT "gl_MeshPerPrimitiveEXT"
  4724. OpMemberName %gl_MeshPerPrimitiveEXT 0 "gl_CullPrimitiveEXT"
  4725. OpName %gl_MeshPrimitivesEXT "gl_MeshPrimitivesEXT"
  4726. OpDecorate %gl_MeshPerPrimitiveEXT Block
  4727. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 BuiltIn CullPrimitiveEXT
  4728. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 PerPrimitiveEXT
  4729. %void = OpTypeVoid
  4730. %3 = OpTypeFunction %void
  4731. %uint = OpTypeInt 32 0
  4732. %uint_32 = OpConstant %uint 32
  4733. %uint_1 = OpConstant %uint 1
  4734. %int = OpTypeInt 32 1
  4735. %bool = OpTypeBool
  4736. %gl_MeshPerPrimitiveEXT = OpTypeStruct %bool
  4737. %_arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypeArray %gl_MeshPerPrimitiveEXT %uint_32
  4738. %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypePointer Output %_arr_gl_MeshPerPrimitiveEXT_uint_32
  4739. %gl_MeshPrimitivesEXT = OpVariable %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 Output
  4740. %main = OpFunction %void None %3
  4741. %5 = OpLabel
  4742. OpReturn
  4743. OpFunctionEnd
  4744. )";
  4745. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4746. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4747. }
  4748. TEST_F(ValidateBuiltIns, BadVulkanBuiltinCullPrimitiveEXTType) {
  4749. const std::string text = R"(
  4750. OpCapability MeshShadingEXT
  4751. OpExtension "SPV_EXT_mesh_shader"
  4752. %1 = OpExtInstImport "GLSL.std.450"
  4753. OpMemoryModel Logical GLSL450
  4754. OpEntryPoint MeshEXT %main "main" %gl_MeshPrimitivesEXT
  4755. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4756. OpExecutionMode %main OutputVertices 81
  4757. OpExecutionMode %main OutputPrimitivesEXT 32
  4758. OpExecutionMode %main OutputTrianglesEXT
  4759. OpSource GLSL 450
  4760. OpSourceExtension "GL_EXT_mesh_shader"
  4761. OpName %main "main"
  4762. OpName %gl_MeshPerPrimitiveEXT "gl_MeshPerPrimitiveEXT"
  4763. OpMemberName %gl_MeshPerPrimitiveEXT 0 "gl_CullPrimitiveEXT"
  4764. OpName %gl_MeshPrimitivesEXT "gl_MeshPrimitivesEXT"
  4765. OpDecorate %gl_MeshPerPrimitiveEXT Block
  4766. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 BuiltIn CullPrimitiveEXT
  4767. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 PerPrimitiveEXT
  4768. %void = OpTypeVoid
  4769. %3 = OpTypeFunction %void
  4770. %uint = OpTypeInt 32 0
  4771. %uint_32 = OpConstant %uint 32
  4772. %uint_1 = OpConstant %uint 1
  4773. %int = OpTypeInt 32 1
  4774. %bool = OpTypeBool
  4775. %gl_MeshPerPrimitiveEXT = OpTypeStruct %int
  4776. %_arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypeArray %gl_MeshPerPrimitiveEXT %uint_32
  4777. %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypePointer Output %_arr_gl_MeshPerPrimitiveEXT_uint_32
  4778. %gl_MeshPrimitivesEXT = OpVariable %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 Output
  4779. %main = OpFunction %void None %3
  4780. %5 = OpLabel
  4781. OpReturn
  4782. OpFunctionEnd
  4783. )";
  4784. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4785. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4786. EXPECT_THAT(getDiagnosticString(),
  4787. AnyVUID("VUID-CullPrimitiveEXT-CullPrimitiveEXT-07036"));
  4788. }
  4789. TEST_F(ValidateBuiltIns, BadVulkanBuiltinCullPrimitiveEXTStorageClass) {
  4790. const std::string text = R"(
  4791. OpCapability MeshShadingEXT
  4792. OpExtension "SPV_EXT_mesh_shader"
  4793. %1 = OpExtInstImport "GLSL.std.450"
  4794. OpMemoryModel Logical GLSL450
  4795. OpEntryPoint MeshEXT %main "main" %gl_MeshPrimitivesEXT
  4796. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4797. OpExecutionMode %main OutputVertices 81
  4798. OpExecutionMode %main OutputPrimitivesEXT 32
  4799. OpExecutionMode %main OutputTrianglesEXT
  4800. OpSource GLSL 450
  4801. OpSourceExtension "GL_EXT_mesh_shader"
  4802. OpName %main "main"
  4803. OpName %gl_MeshPerPrimitiveEXT "gl_MeshPerPrimitiveEXT"
  4804. OpMemberName %gl_MeshPerPrimitiveEXT 0 "gl_CullPrimitiveEXT"
  4805. OpName %gl_MeshPrimitivesEXT "gl_MeshPrimitivesEXT"
  4806. OpDecorate %gl_MeshPerPrimitiveEXT Block
  4807. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 BuiltIn CullPrimitiveEXT
  4808. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 PerPrimitiveEXT
  4809. %void = OpTypeVoid
  4810. %3 = OpTypeFunction %void
  4811. %uint = OpTypeInt 32 0
  4812. %uint_32 = OpConstant %uint 32
  4813. %uint_1 = OpConstant %uint 1
  4814. %int = OpTypeInt 32 1
  4815. %bool = OpTypeBool
  4816. %gl_MeshPerPrimitiveEXT = OpTypeStruct %bool
  4817. %_arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypeArray %gl_MeshPerPrimitiveEXT %uint_32
  4818. %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypePointer Input %_arr_gl_MeshPerPrimitiveEXT_uint_32
  4819. %gl_MeshPrimitivesEXT = OpVariable %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 Input
  4820. %main = OpFunction %void None %3
  4821. %5 = OpLabel
  4822. OpReturn
  4823. OpFunctionEnd
  4824. )";
  4825. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4826. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4827. EXPECT_THAT(getDiagnosticString(),
  4828. AnyVUID("VUID-CullPrimitiveEXT-CullPrimitiveEXT-07035"));
  4829. }
  4830. TEST_F(ValidateBuiltIns, BadBuiltinCullPrimitiveEXTWithPerPrimitiveEXT) {
  4831. const std::string text = R"(
  4832. OpCapability MeshShadingEXT
  4833. OpExtension "SPV_EXT_mesh_shader"
  4834. %1 = OpExtInstImport "GLSL.std.450"
  4835. OpMemoryModel Logical GLSL450
  4836. OpEntryPoint MeshEXT %main "main" %gl_MeshPrimitivesEXT
  4837. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4838. OpExecutionMode %main OutputVertices 81
  4839. OpExecutionMode %main OutputPrimitivesEXT 32
  4840. OpExecutionMode %main OutputTrianglesEXT
  4841. OpSource GLSL 450
  4842. OpSourceExtension "GL_EXT_mesh_shader"
  4843. OpName %main "main"
  4844. OpName %gl_MeshPerPrimitiveEXT "gl_MeshPerPrimitiveEXT"
  4845. OpMemberName %gl_MeshPerPrimitiveEXT 0 "gl_CullPrimitiveEXT"
  4846. OpName %gl_MeshPrimitivesEXT "gl_MeshPrimitivesEXT"
  4847. OpDecorate %gl_MeshPerPrimitiveEXT Block
  4848. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 BuiltIn CullPrimitiveEXT
  4849. %void = OpTypeVoid
  4850. %3 = OpTypeFunction %void
  4851. %uint = OpTypeInt 32 0
  4852. %uint_32 = OpConstant %uint 32
  4853. %uint_1 = OpConstant %uint 1
  4854. %int = OpTypeInt 32 1
  4855. %bool = OpTypeBool
  4856. %gl_MeshPerPrimitiveEXT = OpTypeStruct %bool
  4857. %_arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypeArray %gl_MeshPerPrimitiveEXT %uint_32
  4858. %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypePointer Output %_arr_gl_MeshPerPrimitiveEXT_uint_32
  4859. %gl_MeshPrimitivesEXT = OpVariable %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 Output
  4860. %main = OpFunction %void None %3
  4861. %5 = OpLabel
  4862. OpReturn
  4863. OpFunctionEnd
  4864. )";
  4865. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4866. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4867. EXPECT_THAT(getDiagnosticString(),
  4868. AnyVUID("VUID-CullPrimitiveEXT-CullPrimitiveEXT-07038"));
  4869. }
  4870. TEST_F(ValidateBuiltIns, BadBuiltinPrimitiveShadingRateWithPerPrimitiveEXT) {
  4871. const std::string text = R"(
  4872. OpCapability FragmentShadingRateKHR
  4873. OpCapability MeshShadingEXT
  4874. OpExtension "SPV_EXT_mesh_shader"
  4875. OpExtension "SPV_KHR_fragment_shading_rate"
  4876. %1 = OpExtInstImport "GLSL.std.450"
  4877. OpMemoryModel Logical GLSL450
  4878. OpEntryPoint MeshEXT %main "main" %gl_MeshPrimitivesEXT
  4879. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4880. OpExecutionMode %main OutputVertices 81
  4881. OpExecutionMode %main OutputPrimitivesEXT 32
  4882. OpExecutionMode %main OutputTrianglesEXT
  4883. OpSource GLSL 450
  4884. OpSourceExtension "GL_EXT_mesh_shader"
  4885. OpName %main "main"
  4886. OpName %gl_MeshPerPrimitiveEXT "gl_MeshPerPrimitiveEXT"
  4887. OpMemberName %gl_MeshPerPrimitiveEXT 0 "gl_PrimitiveShadingRateKHR"
  4888. OpName %gl_MeshPrimitivesEXT "gl_MeshPrimitivesEXT"
  4889. OpDecorate %gl_MeshPerPrimitiveEXT Block
  4890. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 BuiltIn PrimitiveShadingRateKHR
  4891. %void = OpTypeVoid
  4892. %3 = OpTypeFunction %void
  4893. %uint = OpTypeInt 32 0
  4894. %uint_32 = OpConstant %uint 32
  4895. %uint_1 = OpConstant %uint 1
  4896. %int = OpTypeInt 32 1
  4897. %bool = OpTypeBool
  4898. %gl_MeshPerPrimitiveEXT = OpTypeStruct %int
  4899. %_arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypeArray %gl_MeshPerPrimitiveEXT %uint_32
  4900. %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypePointer Output %_arr_gl_MeshPerPrimitiveEXT_uint_32
  4901. %gl_MeshPrimitivesEXT = OpVariable %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 Output
  4902. %main = OpFunction %void None %3
  4903. %5 = OpLabel
  4904. OpReturn
  4905. OpFunctionEnd
  4906. )";
  4907. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4908. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4909. EXPECT_THAT(
  4910. getDiagnosticString(),
  4911. AnyVUID("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-07059"));
  4912. }
  4913. TEST_F(ValidateBuiltIns, BadExecModelVulkanCullPrimitiveEXT) {
  4914. const std::string text = R"(
  4915. OpCapability MeshShadingNV
  4916. OpCapability MeshShadingEXT
  4917. OpExtension "SPV_NV_mesh_shader"
  4918. OpExtension "SPV_EXT_mesh_shader"
  4919. %1 = OpExtInstImport "GLSL.std.450"
  4920. OpMemoryModel Logical GLSL450
  4921. OpEntryPoint MeshNV %main "main" %gl_MeshPrimitivesEXT
  4922. OpExecutionModeId %main LocalSizeId %uint_32 %uint_1 %uint_1
  4923. OpExecutionMode %main OutputVertices 81
  4924. OpExecutionMode %main OutputPrimitivesNV 32
  4925. OpExecutionMode %main OutputTrianglesNV
  4926. OpSource GLSL 450
  4927. OpSourceExtension "GL_EXT_mesh_shader"
  4928. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 PerPrimitiveEXT
  4929. OpMemberDecorate %gl_MeshPerPrimitiveEXT 0 BuiltIn CullPrimitiveEXT
  4930. OpDecorate %gl_MeshPerPrimitiveEXT Block
  4931. %void = OpTypeVoid
  4932. %3 = OpTypeFunction %void
  4933. %uint = OpTypeInt 32 0
  4934. %uint_32 = OpConstant %uint 32
  4935. %uint_1 = OpConstant %uint 1
  4936. %v3uint = OpTypeVector %uint 3
  4937. %bool = OpTypeBool
  4938. %int = OpTypeInt 32 1
  4939. %int_0 = OpConstant %int 0
  4940. %gl_MeshPerPrimitiveEXT = OpTypeStruct %bool
  4941. %_ptr_Output_bool = OpTypePointer Output %bool
  4942. %_arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypeArray %gl_MeshPerPrimitiveEXT %uint_32
  4943. %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 = OpTypePointer Output %_arr_gl_MeshPerPrimitiveEXT_uint_32
  4944. %gl_MeshPrimitivesEXT = OpVariable %_ptr_Output__arr_gl_MeshPerPrimitiveEXT_uint_32 Output
  4945. %main = OpFunction %void None %3
  4946. %5 = OpLabel
  4947. %18 = OpAccessChain %_ptr_Output_bool %gl_MeshPrimitivesEXT %int_0 %int_0
  4948. OpReturn
  4949. OpFunctionEnd
  4950. )";
  4951. CompileSuccessfully(text, SPV_ENV_VULKAN_1_3);
  4952. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_3));
  4953. EXPECT_THAT(getDiagnosticString(),
  4954. AnyVUID("VUID-CullPrimitiveEXT-CullPrimitiveEXT-07034"));
  4955. }
  4956. } // namespace
  4957. } // namespace val
  4958. } // namespace spvtools