val_builtins_test.cpp 189 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266
  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. SampleMaskWrongStorageClass,
  1277. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1278. Combine(Values("SampleMask"), Values("Fragment"), Values("Workgroup"),
  1279. Values("%u32arr2"), Values("VUID-SampleMask-SampleMask-04358"),
  1280. Values(TestResult(
  1281. SPV_ERROR_INVALID_DATA,
  1282. "Vulkan spec allows BuiltIn SampleMask to be only used for "
  1283. "variables with Input or Output storage class"))));
  1284. INSTANTIATE_TEST_SUITE_P(
  1285. SampleMaskNotArray,
  1286. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1287. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1288. Values("%f32", "%u32vec3"),
  1289. Values("VUID-SampleMask-SampleMask-04359"),
  1290. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1291. "needs to be a 32-bit int array",
  1292. "is not an array"))));
  1293. INSTANTIATE_TEST_SUITE_P(
  1294. SampleMaskNotIntArray,
  1295. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1296. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1297. Values("%f32arr2"), Values("VUID-SampleMask-SampleMask-04359"),
  1298. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1299. "needs to be a 32-bit int array",
  1300. "components are not int scalar"))));
  1301. INSTANTIATE_TEST_SUITE_P(
  1302. SampleMaskNotInt32Array,
  1303. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1304. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1305. Values("%u64arr2"), Values("VUID-SampleMask-SampleMask-04359"),
  1306. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1307. "needs to be a 32-bit int array",
  1308. "has components with bit width 64"))));
  1309. INSTANTIATE_TEST_SUITE_P(
  1310. SamplePositionSuccess,
  1311. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1312. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1313. Values("%f32vec2"), Values(nullptr), Values(TestResult())));
  1314. INSTANTIATE_TEST_SUITE_P(
  1315. SamplePositionNotFragment,
  1316. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1317. Combine(
  1318. Values("SamplePosition"),
  1319. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1320. "TessellationEvaluation"),
  1321. Values("Input"), Values("%f32vec2"),
  1322. Values("VUID-SamplePosition-SamplePosition-04360"),
  1323. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1324. "to be used only with Fragment execution model"))));
  1325. INSTANTIATE_TEST_SUITE_P(
  1326. SamplePositionNotInput,
  1327. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1328. Combine(Values("SamplePosition"), Values("Fragment"), Values("Output"),
  1329. Values("%f32vec2"),
  1330. Values("VUID-SamplePosition-SamplePosition-04361"),
  1331. Values(TestResult(
  1332. SPV_ERROR_INVALID_DATA,
  1333. "to be only used for variables with Input storage class",
  1334. "uses storage class Output"))));
  1335. INSTANTIATE_TEST_SUITE_P(
  1336. SamplePositionNotFloatVector,
  1337. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1338. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1339. Values("%f32arr2", "%u32vec4"),
  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. "is not a float vector"))));
  1344. INSTANTIATE_TEST_SUITE_P(
  1345. SamplePositionNotFloatVec2,
  1346. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1347. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1348. Values("%f32vec3"),
  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 3 components"))));
  1353. INSTANTIATE_TEST_SUITE_P(
  1354. SamplePositionNotF32Vec2,
  1355. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1356. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1357. Values("%f64vec2"),
  1358. Values("VUID-SamplePosition-SamplePosition-04362"),
  1359. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1360. "needs to be a 2-component 32-bit float vector",
  1361. "has components with bit width 64"))));
  1362. INSTANTIATE_TEST_SUITE_P(
  1363. TessCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1364. Combine(Values("TessCoord"), Values("TessellationEvaluation"),
  1365. Values("Input"), Values("%f32vec3"), Values(nullptr),
  1366. Values(TestResult())));
  1367. INSTANTIATE_TEST_SUITE_P(
  1368. TessCoordNotFragment,
  1369. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1370. Combine(
  1371. Values("TessCoord"),
  1372. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1373. "Fragment"),
  1374. Values("Input"), Values("%f32vec3"),
  1375. Values("VUID-TessCoord-TessCoord-04387"),
  1376. Values(TestResult(
  1377. SPV_ERROR_INVALID_DATA,
  1378. "to be used only with TessellationEvaluation execution model"))));
  1379. INSTANTIATE_TEST_SUITE_P(
  1380. TessCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1381. Combine(Values("TessCoord"), Values("Fragment"), Values("Output"),
  1382. Values("%f32vec3"), Values("VUID-TessCoord-TessCoord-04388"),
  1383. Values(TestResult(
  1384. SPV_ERROR_INVALID_DATA,
  1385. "to be only used for variables with Input storage class",
  1386. "uses storage class Output"))));
  1387. INSTANTIATE_TEST_SUITE_P(
  1388. TessCoordNotFloatVector,
  1389. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1390. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1391. Values("%f32arr3", "%u32vec4"),
  1392. Values("VUID-TessCoord-TessCoord-04389"),
  1393. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1394. "needs to be a 3-component 32-bit float vector",
  1395. "is not a float vector"))));
  1396. INSTANTIATE_TEST_SUITE_P(
  1397. TessCoordNotFloatVec3,
  1398. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1399. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1400. Values("%f32vec2"), Values("VUID-TessCoord-TessCoord-04389"),
  1401. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1402. "needs to be a 3-component 32-bit float vector",
  1403. "has 2 components"))));
  1404. INSTANTIATE_TEST_SUITE_P(
  1405. TessCoordNotF32Vec3,
  1406. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1407. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1408. Values("%f64vec3"), Values("VUID-TessCoord-TessCoord-04389"),
  1409. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1410. "needs to be a 3-component 32-bit float vector",
  1411. "has components with bit width 64"))));
  1412. INSTANTIATE_TEST_SUITE_P(
  1413. TessLevelOuterTeseInputSuccess,
  1414. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1415. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1416. Values("Input"), Values("%f32arr4"), Values(nullptr),
  1417. Values(TestResult())));
  1418. INSTANTIATE_TEST_SUITE_P(
  1419. TessLevelOuterTescOutputSuccess,
  1420. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1421. Combine(Values("TessLevelOuter"), Values("TessellationControl"),
  1422. Values("Output"), Values("%f32arr4"), Values(nullptr),
  1423. Values(TestResult())));
  1424. INSTANTIATE_TEST_SUITE_P(
  1425. TessLevelOuterInvalidExecutionModel,
  1426. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1427. Combine(Values("TessLevelOuter"),
  1428. Values("Vertex", "GLCompute", "Geometry", "Fragment"),
  1429. Values("Input"), Values("%f32arr4"),
  1430. Values("VUID-TessLevelOuter-TessLevelOuter-04390"),
  1431. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1432. "to be used only with TessellationControl or "
  1433. "TessellationEvaluation execution models."))));
  1434. INSTANTIATE_TEST_SUITE_P(
  1435. TessLevelOuterOutputTese,
  1436. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1437. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1438. Values("Output"), Values("%f32arr4"),
  1439. Values("VUID-TessLevelOuter-TessLevelOuter-04392"),
  1440. Values(TestResult(
  1441. SPV_ERROR_INVALID_DATA,
  1442. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1443. "used for variables with Output storage class if execution "
  1444. "model is TessellationEvaluation."))));
  1445. INSTANTIATE_TEST_SUITE_P(
  1446. TessLevelOuterInputTesc,
  1447. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1448. Combine(Values("TessLevelOuter"), Values("TessellationControl"),
  1449. Values("Input"), Values("%f32arr4"),
  1450. Values("VUID-TessLevelOuter-TessLevelOuter-04391"),
  1451. Values(TestResult(
  1452. SPV_ERROR_INVALID_DATA,
  1453. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1454. "used for variables with Input storage class if execution "
  1455. "model is TessellationControl."))));
  1456. INSTANTIATE_TEST_SUITE_P(
  1457. TessLevelOuterNotArray,
  1458. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1459. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1460. Values("Input"), Values("%f32vec4", "%f32"),
  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. "is not an array"))));
  1465. INSTANTIATE_TEST_SUITE_P(
  1466. TessLevelOuterNotFloatArray,
  1467. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1468. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1469. Values("Input"), Values("%u32arr4"),
  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. "components are not float scalar"))));
  1474. INSTANTIATE_TEST_SUITE_P(
  1475. TessLevelOuterNotFloatArr4,
  1476. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1477. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1478. Values("Input"), Values("%f32arr3"),
  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 3 components"))));
  1483. INSTANTIATE_TEST_SUITE_P(
  1484. TessLevelOuterNotF32Arr4,
  1485. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1486. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1487. Values("Input"), Values("%f64arr4"),
  1488. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1489. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1490. "needs to be a 4-component 32-bit float array",
  1491. "has components with bit width 64"))));
  1492. INSTANTIATE_TEST_SUITE_P(
  1493. TessLevelInnerTeseInputSuccess,
  1494. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1495. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1496. Values("Input"), Values("%f32arr2"), Values(nullptr),
  1497. Values(TestResult())));
  1498. INSTANTIATE_TEST_SUITE_P(
  1499. TessLevelInnerTescOutputSuccess,
  1500. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1501. Combine(Values("TessLevelInner"), Values("TessellationControl"),
  1502. Values("Output"), Values("%f32arr2"), Values(nullptr),
  1503. Values(TestResult())));
  1504. INSTANTIATE_TEST_SUITE_P(
  1505. TessLevelInnerInvalidExecutionModel,
  1506. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1507. Combine(Values("TessLevelInner"),
  1508. Values("Vertex", "GLCompute", "Geometry", "Fragment"),
  1509. Values("Input"), Values("%f32arr2"),
  1510. Values("VUID-TessLevelInner-TessLevelInner-04394"),
  1511. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1512. "to be used only with TessellationControl or "
  1513. "TessellationEvaluation execution models."))));
  1514. INSTANTIATE_TEST_SUITE_P(
  1515. TessLevelInnerOutputTese,
  1516. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1517. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1518. Values("Output"), Values("%f32arr2"),
  1519. Values("VUID-TessLevelInner-TessLevelInner-04396"),
  1520. Values(TestResult(
  1521. SPV_ERROR_INVALID_DATA,
  1522. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1523. "used for variables with Output storage class if execution "
  1524. "model is TessellationEvaluation."))));
  1525. INSTANTIATE_TEST_SUITE_P(
  1526. TessLevelInnerInputTesc,
  1527. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1528. Combine(Values("TessLevelInner"), Values("TessellationControl"),
  1529. Values("Input"), Values("%f32arr2"),
  1530. Values("VUID-TessLevelInner-TessLevelInner-04395"),
  1531. Values(TestResult(
  1532. SPV_ERROR_INVALID_DATA,
  1533. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1534. "used for variables with Input storage class if execution "
  1535. "model is TessellationControl."))));
  1536. INSTANTIATE_TEST_SUITE_P(
  1537. TessLevelInnerNotArray,
  1538. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1539. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1540. Values("Input"), Values("%f32vec2", "%f32"),
  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. "is not an array"))));
  1545. INSTANTIATE_TEST_SUITE_P(
  1546. TessLevelInnerNotFloatArray,
  1547. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1548. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1549. Values("Input"), Values("%u32arr2"),
  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. "components are not float scalar"))));
  1554. INSTANTIATE_TEST_SUITE_P(
  1555. TessLevelInnerNotFloatArr2,
  1556. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1557. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1558. Values("Input"), Values("%f32arr3"),
  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 3 components"))));
  1563. INSTANTIATE_TEST_SUITE_P(
  1564. TessLevelInnerNotF32Arr2,
  1565. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1566. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1567. Values("Input"), Values("%f64arr2"),
  1568. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1569. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1570. "needs to be a 2-component 32-bit float array",
  1571. "has components with bit width 64"))));
  1572. INSTANTIATE_TEST_SUITE_P(
  1573. VertexIndexSuccess,
  1574. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1575. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1576. Values("%u32"), Values(nullptr), Values(TestResult())));
  1577. INSTANTIATE_TEST_SUITE_P(
  1578. VertexIndexInvalidExecutionModel,
  1579. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1580. Combine(Values("VertexIndex"),
  1581. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1582. "TessellationEvaluation"),
  1583. Values("Input"), Values("%u32"),
  1584. Values("VUID-VertexIndex-VertexIndex-04398"),
  1585. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1586. "to be used only with Vertex execution model"))));
  1587. INSTANTIATE_TEST_SUITE_P(
  1588. VertexIndexNotInput,
  1589. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1590. Combine(
  1591. Values("VertexIndex"), Values("Vertex"), Values("Output"),
  1592. Values("%u32"), Values("VUID-VertexIndex-VertexIndex-04399"),
  1593. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1594. "Vulkan spec allows BuiltIn VertexIndex to be only "
  1595. "used for variables with Input storage class"))));
  1596. INSTANTIATE_TEST_SUITE_P(
  1597. VertexIndexNotIntScalar,
  1598. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1599. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1600. Values("%f32", "%u32vec3"),
  1601. Values("VUID-VertexIndex-VertexIndex-04400"),
  1602. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1603. "needs to be a 32-bit int scalar",
  1604. "is not an int scalar"))));
  1605. INSTANTIATE_TEST_SUITE_P(
  1606. VertexIndexNotInt32,
  1607. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1608. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1609. Values("%u64"), Values("VUID-VertexIndex-VertexIndex-04400"),
  1610. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1611. "needs to be a 32-bit int scalar",
  1612. "has bit width 64"))));
  1613. INSTANTIATE_TEST_SUITE_P(
  1614. BaseInstanceOrVertexSuccess,
  1615. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1616. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1617. Values("Input"), Values("%u32"),
  1618. Values("OpCapability DrawParameters\n"),
  1619. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1620. Values(nullptr), Values(TestResult())));
  1621. INSTANTIATE_TEST_SUITE_P(
  1622. BaseInstanceOrVertexInvalidExecutionModel,
  1623. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1624. Combine(Values("BaseInstance", "BaseVertex"),
  1625. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1626. "TessellationEvaluation"),
  1627. Values("Input"), Values("%u32"),
  1628. Values("OpCapability DrawParameters\n"),
  1629. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1630. Values("VUID-BaseInstance-BaseInstance-04181 "
  1631. "VUID-BaseVertex-BaseVertex-04184"),
  1632. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1633. "to be used only with Vertex execution model"))));
  1634. INSTANTIATE_TEST_SUITE_P(
  1635. BaseInstanceOrVertexNotInput,
  1636. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1637. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1638. Values("Output"), Values("%u32"),
  1639. Values("OpCapability DrawParameters\n"),
  1640. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1641. Values("VUID-BaseInstance-BaseInstance-04182 "
  1642. "VUID-BaseVertex-BaseVertex-04185"),
  1643. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1644. "used for variables with Input storage class"))));
  1645. INSTANTIATE_TEST_SUITE_P(
  1646. BaseInstanceOrVertexNotIntScalar,
  1647. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1648. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1649. Values("Input"), Values("%f32", "%u32vec3"),
  1650. Values("OpCapability DrawParameters\n"),
  1651. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1652. Values("VUID-BaseInstance-BaseInstance-04183 "
  1653. "VUID-BaseVertex-BaseVertex-04186"),
  1654. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1655. "needs to be a 32-bit int scalar",
  1656. "is not an int scalar"))));
  1657. INSTANTIATE_TEST_SUITE_P(
  1658. DrawIndexSuccess,
  1659. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1660. Combine(Values("DrawIndex"), Values("Vertex"), Values("Input"),
  1661. Values("%u32"), Values("OpCapability DrawParameters\n"),
  1662. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1663. Values(nullptr), Values(TestResult())));
  1664. INSTANTIATE_TEST_SUITE_P(
  1665. DrawIndexMeshSuccess,
  1666. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1667. Combine(
  1668. Values("DrawIndex"), Values("MeshNV", "TaskNV"), Values("Input"),
  1669. Values("%u32"), Values("OpCapability MeshShadingNV\n"),
  1670. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\nOpExtension "
  1671. "\"SPV_NV_mesh_shader\"\n"),
  1672. Values(nullptr), Values(TestResult())));
  1673. INSTANTIATE_TEST_SUITE_P(
  1674. DrawIndexInvalidExecutionModel,
  1675. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1676. Combine(
  1677. Values("DrawIndex"),
  1678. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1679. "TessellationEvaluation"),
  1680. Values("Input"), Values("%u32"),
  1681. Values("OpCapability DrawParameters\n"),
  1682. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1683. Values("VUID-DrawIndex-DrawIndex-04207"),
  1684. Values(TestResult(
  1685. SPV_ERROR_INVALID_DATA,
  1686. "to be used only with Vertex, MeshNV, TaskNV , MeshEXT or TaskEXT "
  1687. "execution model"))));
  1688. INSTANTIATE_TEST_SUITE_P(
  1689. DrawIndexNotInput,
  1690. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1691. Combine(Values("DrawIndex"), Values("Vertex"), Values("Output"),
  1692. Values("%u32"), Values("OpCapability DrawParameters\n"),
  1693. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1694. Values("VUID-DrawIndex-DrawIndex-04208"),
  1695. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1696. "used for variables with Input storage class"))));
  1697. INSTANTIATE_TEST_SUITE_P(
  1698. DrawIndexNotIntScalar,
  1699. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1700. Combine(Values("DrawIndex"), Values("Vertex"), Values("Input"),
  1701. Values("%f32", "%u32vec3"), Values("OpCapability DrawParameters\n"),
  1702. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1703. Values("VUID-DrawIndex-DrawIndex-04209"),
  1704. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1705. "needs to be a 32-bit int scalar",
  1706. "is not an int scalar"))));
  1707. INSTANTIATE_TEST_SUITE_P(
  1708. ViewIndexSuccess,
  1709. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1710. Combine(Values("ViewIndex"),
  1711. Values("Fragment", "Vertex", "Geometry", "TessellationControl",
  1712. "TessellationEvaluation"),
  1713. Values("Input"), Values("%u32"), Values("OpCapability MultiView\n"),
  1714. Values("OpExtension \"SPV_KHR_multiview\"\n"), Values(nullptr),
  1715. Values(TestResult())));
  1716. INSTANTIATE_TEST_SUITE_P(
  1717. ViewIndexInvalidExecutionModel,
  1718. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1719. Combine(Values("ViewIndex"), Values("GLCompute"), Values("Input"),
  1720. Values("%u32"), Values("OpCapability MultiView\n"),
  1721. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1722. Values("VUID-ViewIndex-ViewIndex-04401"),
  1723. Values(TestResult(
  1724. SPV_ERROR_INVALID_DATA,
  1725. "to be not be used with GLCompute execution model"))));
  1726. INSTANTIATE_TEST_SUITE_P(
  1727. ViewIndexNotInput,
  1728. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1729. Combine(Values("ViewIndex"), Values("Vertex"), Values("Output"),
  1730. Values("%u32"), Values("OpCapability MultiView\n"),
  1731. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1732. Values("VUID-ViewIndex-ViewIndex-04402"),
  1733. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1734. "used for variables with Input storage class"))));
  1735. INSTANTIATE_TEST_SUITE_P(
  1736. ViewIndexNotIntScalar,
  1737. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1738. Combine(Values("ViewIndex"), Values("Vertex"), Values("Input"),
  1739. Values("%f32", "%u32vec3"), Values("OpCapability MultiView\n"),
  1740. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1741. Values("VUID-ViewIndex-ViewIndex-04403"),
  1742. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1743. "needs to be a 32-bit int scalar",
  1744. "is not an int scalar"))));
  1745. INSTANTIATE_TEST_SUITE_P(
  1746. DeviceIndexSuccess,
  1747. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1748. Combine(Values("DeviceIndex"),
  1749. Values("Fragment", "Vertex", "Geometry", "TessellationControl",
  1750. "TessellationEvaluation", "GLCompute"),
  1751. Values("Input"), Values("%u32"),
  1752. Values("OpCapability DeviceGroup\n"),
  1753. Values("OpExtension \"SPV_KHR_device_group\"\n"), Values(nullptr),
  1754. Values(TestResult())));
  1755. INSTANTIATE_TEST_SUITE_P(
  1756. DeviceIndexNotInput,
  1757. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1758. Combine(Values("DeviceIndex"), Values("Fragment", "Vertex", "GLCompute"),
  1759. Values("Output"), Values("%u32"),
  1760. Values("OpCapability DeviceGroup\n"),
  1761. Values("OpExtension \"SPV_KHR_device_group\"\n"),
  1762. Values("VUID-DeviceIndex-DeviceIndex-04205"),
  1763. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1764. "used for variables with Input storage class"))));
  1765. INSTANTIATE_TEST_SUITE_P(
  1766. DeviceIndexNotIntScalar,
  1767. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1768. Combine(Values("DeviceIndex"), Values("Fragment", "Vertex", "GLCompute"),
  1769. Values("Input"), Values("%f32", "%u32vec3"),
  1770. Values("OpCapability DeviceGroup\n"),
  1771. Values("OpExtension \"SPV_KHR_device_group\"\n"),
  1772. Values("VUID-DeviceIndex-DeviceIndex-04206"),
  1773. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1774. "needs to be a 32-bit int scalar",
  1775. "is not an int scalar"))));
  1776. // Test HitKind in NV RT shaders
  1777. INSTANTIATE_TEST_SUITE_P(
  1778. HitKindNVSuccess,
  1779. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1780. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindNV"),
  1781. Values("AnyHitNV", "ClosestHitNV"), Values("Input"), Values("%u32"),
  1782. Values("OpCapability RayTracingNV\n"),
  1783. Values("OpExtension \"SPV_NV_ray_tracing\"\n"), Values(nullptr),
  1784. Values(TestResult())));
  1785. // HitKind is valid in AH, CH shaders as input i32 scalar
  1786. INSTANTIATE_TEST_SUITE_P(
  1787. HitKindSuccess,
  1788. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1789. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1790. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1791. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1792. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1793. Values(TestResult())));
  1794. INSTANTIATE_TEST_SUITE_P(
  1795. HitKindNotExecutionMode,
  1796. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1797. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1798. Values("Vertex", "Fragment", "TessellationControl",
  1799. "TessellationEvaluation", "Geometry", "Fragment",
  1800. "GLCompute", "RayGenerationKHR", "IntersectionKHR",
  1801. "MissKHR", "CallableKHR"),
  1802. Values("Input"), Values("%u32"),
  1803. Values("OpCapability RayTracingKHR\n"),
  1804. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1805. Values("VUID-HitKindKHR-HitKindKHR-04242"),
  1806. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1807. "Vulkan spec does not allow BuiltIn",
  1808. "to be used with the execution model"))));
  1809. INSTANTIATE_TEST_SUITE_P(
  1810. HitKindNotInput,
  1811. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1812. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1813. Values("AnyHitKHR", "ClosestHitKHR"), Values("Output"),
  1814. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1815. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1816. Values("VUID-HitKindKHR-HitKindKHR-04243"),
  1817. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1818. "used for variables with Input storage class"))));
  1819. INSTANTIATE_TEST_SUITE_P(
  1820. HitKindNotIntScalar,
  1821. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1822. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1823. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1824. Values("%f32", "%u32vec3"), Values("OpCapability RayTracingKHR\n"),
  1825. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1826. Values("VUID-HitKindKHR-HitKindKHR-04244"),
  1827. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1828. "needs to be a 32-bit int scalar",
  1829. "is not an int scalar"))));
  1830. // Ensure HitT is not supported in KHR RT shaders
  1831. INSTANTIATE_TEST_SUITE_P(
  1832. HitTNVNotSupportedInKHR,
  1833. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1834. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1835. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1836. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1837. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1838. Values(TestResult(
  1839. SPV_ERROR_INVALID_CAPABILITY,
  1840. "of MemberDecorate requires one of these capabilities"))));
  1841. // HitT is valid in AH, CH shaders as input f32 scalar (NV RT only)
  1842. INSTANTIATE_TEST_SUITE_P(
  1843. HitTNVSuccess,
  1844. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1845. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1846. Values("AnyHitNV", "ClosestHitNV"), Values("Input"), Values("%f32"),
  1847. Values("OpCapability RayTracingNV\n"),
  1848. Values("OpExtension \"SPV_NV_ray_tracing\"\n"), Values(nullptr),
  1849. Values(TestResult())));
  1850. INSTANTIATE_TEST_SUITE_P(
  1851. HitTNVNotExecutionMode,
  1852. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1853. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1854. Values("Vertex", "Fragment", "TessellationControl",
  1855. "TessellationEvaluation", "Geometry", "Fragment",
  1856. "GLCompute", "RayGenerationNV", "IntersectionNV", "MissNV",
  1857. "CallableNV"),
  1858. Values("Input"), Values("%f32"),
  1859. Values("OpCapability RayTracingNV\n"),
  1860. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1861. Values("VUID-HitTNV-HitTNV-04245"),
  1862. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1863. "Vulkan spec does not allow BuiltIn",
  1864. "to be used with the execution model"))));
  1865. INSTANTIATE_TEST_SUITE_P(
  1866. HitTNVNotInput,
  1867. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1868. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1869. Values("AnyHitNV", "ClosestHitNV"), Values("Output"),
  1870. Values("%f32"), Values("OpCapability RayTracingNV\n"),
  1871. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1872. Values("VUID-HitTNV-HitTNV-04246"),
  1873. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1874. "used for variables with Input storage class"))));
  1875. INSTANTIATE_TEST_SUITE_P(
  1876. HitTNVNotIntScalar,
  1877. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1878. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1879. Values("AnyHitNV", "ClosestHitNV"), Values("Input"),
  1880. Values("%u32", "%f32vec3"), Values("OpCapability RayTracingNV\n"),
  1881. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1882. Values("VUID-HitTNV-HitTNV-04247"),
  1883. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1884. "needs to be a 32-bit float scalar",
  1885. "is not a float scalar"))));
  1886. // InstanceCustomIndexKHR, InstanceId, PrimitiveId, RayGeometryIndexKHR are
  1887. // valid in IS, AH, CH shaders as input i32 scalars
  1888. INSTANTIATE_TEST_SUITE_P(
  1889. RTBuiltIn3StageI32Success,
  1890. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1891. Combine(Values(SPV_ENV_VULKAN_1_2),
  1892. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1893. "InstanceId", "PrimitiveId"),
  1894. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1895. Values("Input"), Values("%u32"),
  1896. Values("OpCapability RayTracingKHR\n"),
  1897. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1898. Values(TestResult())));
  1899. INSTANTIATE_TEST_SUITE_P(
  1900. RTBuiltIn3StageI32NotExecutionMode,
  1901. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1902. Combine(Values(SPV_ENV_VULKAN_1_2),
  1903. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1904. "InstanceId"),
  1905. Values("Vertex", "Fragment", "TessellationControl",
  1906. "TessellationEvaluation", "Geometry", "Fragment",
  1907. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  1908. Values("Input"), Values("%u32"),
  1909. Values("OpCapability RayTracingKHR\n"),
  1910. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1911. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04251 "
  1912. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04345 "
  1913. "VUID-InstanceId-InstanceId-04254 "),
  1914. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1915. "Vulkan spec does not allow BuiltIn",
  1916. "to be used with the execution model"))));
  1917. INSTANTIATE_TEST_SUITE_P(
  1918. RTBuiltIn3StageI32NotInput,
  1919. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1920. Combine(Values(SPV_ENV_VULKAN_1_2),
  1921. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1922. "InstanceId"),
  1923. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1924. Values("Output"), Values("%u32"),
  1925. Values("OpCapability RayTracingKHR\n"),
  1926. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1927. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04252 "
  1928. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04346 "
  1929. "VUID-InstanceId-InstanceId-04255 "),
  1930. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1931. "used for variables with Input storage class"))));
  1932. INSTANTIATE_TEST_SUITE_P(
  1933. RTBuiltIn3StageI32NotIntScalar,
  1934. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1935. Combine(Values(SPV_ENV_VULKAN_1_2),
  1936. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1937. "InstanceId"),
  1938. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1939. Values("Input"), Values("%f32", "%u32vec3"),
  1940. Values("OpCapability RayTracingKHR\n"),
  1941. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1942. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04253 "
  1943. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04347 "
  1944. "VUID-InstanceId-InstanceId-04256 "),
  1945. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1946. "needs to be a 32-bit int scalar",
  1947. "is not an int scalar"))));
  1948. // PrimitiveId needs special negative testing because it has non-RT uses
  1949. INSTANTIATE_TEST_SUITE_P(
  1950. PrimitiveIdRTNotExecutionMode,
  1951. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1952. Combine(
  1953. Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1954. Values("RayGenerationKHR", "MissKHR", "CallableKHR"), Values("Input"),
  1955. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1956. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1957. Values("VUID-PrimitiveId-PrimitiveId-04330"),
  1958. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1959. "to be used only with Fragment, TessellationControl, "
  1960. "TessellationEvaluation, Geometry, MeshNV, MeshEXT, "
  1961. "IntersectionKHR, "
  1962. "AnyHitKHR, and ClosestHitKHR execution models"))));
  1963. INSTANTIATE_TEST_SUITE_P(
  1964. PrimitiveIdRTNotInput,
  1965. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1966. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1967. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1968. Values("Output"), Values("%u32"),
  1969. Values("OpCapability RayTracingKHR\n"),
  1970. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1971. Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1972. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1973. "Output storage class if execution model is "))));
  1974. INSTANTIATE_TEST_SUITE_P(
  1975. PrimitiveIdRTNotIntScalar,
  1976. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1977. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1978. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1979. Values("Input"), Values("%f32", "%u32vec3"),
  1980. Values("OpCapability RayTracingKHR\n"),
  1981. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1982. Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1983. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1984. "needs to be a 32-bit int scalar",
  1985. "is not an int scalar"))));
  1986. // ObjectRayDirectionKHR and ObjectRayOriginKHR valid
  1987. // in IS, AH, CH shaders as input 32-bit float vec3
  1988. INSTANTIATE_TEST_SUITE_P(
  1989. ObjectRayDirectionAndOriginSuccess,
  1990. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1991. Combine(Values(SPV_ENV_VULKAN_1_2),
  1992. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  1993. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1994. Values("Input"), Values("%f32vec3"),
  1995. Values("OpCapability RayTracingKHR\n"),
  1996. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1997. Values(TestResult())));
  1998. INSTANTIATE_TEST_SUITE_P(
  1999. ObjectRayDirectionAndOriginNotExecutionMode,
  2000. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2001. Combine(Values(SPV_ENV_VULKAN_1_2),
  2002. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2003. Values("Vertex", "Fragment", "TessellationControl",
  2004. "TessellationEvaluation", "Geometry", "Fragment",
  2005. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  2006. Values("Input"), Values("%f32vec3"),
  2007. Values("OpCapability RayTracingKHR\n"),
  2008. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2009. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04299 "
  2010. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04302 "),
  2011. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2012. "Vulkan spec does not allow BuiltIn",
  2013. "to be used with the execution model"))));
  2014. INSTANTIATE_TEST_SUITE_P(
  2015. ObjectRayDirectionAndOriginNotInput,
  2016. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2017. Combine(Values(SPV_ENV_VULKAN_1_2),
  2018. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2019. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2020. Values("Output"), Values("%f32vec3"),
  2021. Values("OpCapability RayTracingKHR\n"),
  2022. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2023. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04300 "
  2024. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04303 "),
  2025. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2026. "used for variables with Input storage class"))));
  2027. INSTANTIATE_TEST_SUITE_P(
  2028. ObjectRayDirectionAndOriginNotFloatVec3,
  2029. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2030. Combine(
  2031. Values(SPV_ENV_VULKAN_1_2),
  2032. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2033. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2034. Values("Input"), Values("%u32vec3", "%f32", "%f32vec2", "%f32vec4"),
  2035. Values("OpCapability RayTracingKHR\n"),
  2036. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2037. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04301 "
  2038. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04304 "),
  2039. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2040. "needs to be a 3-component 32-bit float vector"))));
  2041. // ObjectToWorldKHR and WorldToObjectKHR valid
  2042. // in IS, AH, CH shaders as input mat4x3
  2043. INSTANTIATE_TEST_SUITE_P(
  2044. RTObjectMatrixSuccess,
  2045. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2046. Combine(Values(SPV_ENV_VULKAN_1_2),
  2047. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2048. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2049. Values("Input"), Values("%f32mat34"),
  2050. Values("OpCapability RayTracingKHR\n"),
  2051. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2052. Values(TestResult())));
  2053. INSTANTIATE_TEST_SUITE_P(
  2054. RTObjectMatrixNotExecutionMode,
  2055. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2056. Combine(Values(SPV_ENV_VULKAN_1_2),
  2057. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2058. Values("Vertex", "Fragment", "TessellationControl",
  2059. "TessellationEvaluation", "Geometry", "Fragment",
  2060. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  2061. Values("Input"), Values("%f32mat34"),
  2062. Values("OpCapability RayTracingKHR\n"),
  2063. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2064. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04305 "
  2065. "VUID-WorldToObjectKHR-WorldToObjectKHR-04434 "),
  2066. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2067. "Vulkan spec does not allow BuiltIn",
  2068. "to be used with the execution model"))));
  2069. INSTANTIATE_TEST_SUITE_P(
  2070. RTObjectMatrixNotInput,
  2071. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2072. Combine(Values(SPV_ENV_VULKAN_1_2),
  2073. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2074. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2075. Values("Output"), Values("%f32mat34"),
  2076. Values("OpCapability RayTracingKHR\n"),
  2077. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2078. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306 "
  2079. "VUID-WorldToObjectKHR-WorldToObjectKHR-04435 "),
  2080. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2081. "used for variables with Input storage class"))));
  2082. INSTANTIATE_TEST_SUITE_P(
  2083. RTObjectMatrixNotMat4x3,
  2084. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2085. Combine(Values(SPV_ENV_VULKAN_1_2),
  2086. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2087. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2088. Values("Input"), Values("%f32mat43", "%f32mat44", "%f32vec4"),
  2089. Values("OpCapability RayTracingKHR\n"),
  2090. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2091. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307 "
  2092. "VUID-WorldToObjectKHR-WorldToObjectKHR-04436 "),
  2093. Values(TestResult(
  2094. SPV_ERROR_INVALID_DATA,
  2095. "variable needs to be a matrix with "
  2096. "4 columns of 3-component vectors of 32-bit floats"))));
  2097. // IncomingRayFlagsKHR is valid
  2098. // in IS, AH, CH, MS shaders as an input i32 scalar
  2099. INSTANTIATE_TEST_SUITE_P(
  2100. IncomingRayFlagsSuccess,
  2101. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2102. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2103. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2104. Values("Input"), Values("%u32"),
  2105. Values("OpCapability RayTracingKHR\n"),
  2106. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2107. Values(TestResult())));
  2108. INSTANTIATE_TEST_SUITE_P(
  2109. IncomingRayFlagsNotExecutionMode,
  2110. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2111. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2112. Values("Vertex", "Fragment", "TessellationControl",
  2113. "TessellationEvaluation", "Geometry", "Fragment",
  2114. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2115. Values("Input"), Values("%u32"),
  2116. Values("OpCapability RayTracingKHR\n"),
  2117. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2118. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248 "
  2119. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2120. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2121. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2122. "Vulkan spec does not allow BuiltIn",
  2123. "to be used with the execution model"))));
  2124. INSTANTIATE_TEST_SUITE_P(
  2125. IncomingRayFlagsNotInput,
  2126. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2127. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2128. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2129. Values("Output"), Values("%u32"),
  2130. Values("OpCapability RayTracingKHR\n"),
  2131. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2132. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249 "
  2133. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2134. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2135. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2136. "used for variables with Input storage class"))));
  2137. INSTANTIATE_TEST_SUITE_P(
  2138. IncomingRayFlagsNotIntScalar,
  2139. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2140. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2141. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2142. Values("Input"), Values("%f32", "%u32vec3"),
  2143. Values("OpCapability RayTracingKHR\n"),
  2144. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2145. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250 "
  2146. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2147. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2148. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2149. "needs to be a 32-bit int scalar",
  2150. "is not an int scalar"))));
  2151. // CullMaskKHR is valid
  2152. // in IS, AH, CH, MS shaders as an input i32 scalar
  2153. INSTANTIATE_TEST_SUITE_P(
  2154. CullMaskSuccess,
  2155. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2156. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2157. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2158. Values("Input"), Values("%u32"),
  2159. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2160. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2161. "\"SPV_KHR_ray_cull_mask\"\n"),
  2162. Values(nullptr), Values(TestResult())));
  2163. INSTANTIATE_TEST_SUITE_P(
  2164. CullMaskNotExecutionMode,
  2165. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2166. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2167. Values("Vertex", "Fragment", "TessellationControl",
  2168. "TessellationEvaluation", "Geometry", "Fragment",
  2169. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2170. Values("Input"), Values("%u32"),
  2171. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2172. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2173. "\"SPV_KHR_ray_cull_mask\"\n"),
  2174. Values("VUID-CullMaskKHR-CullMaskKHR-06735 "
  2175. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2176. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2177. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2178. "Vulkan spec does not allow BuiltIn",
  2179. "to be used with the execution model"))));
  2180. INSTANTIATE_TEST_SUITE_P(
  2181. ICullMaskNotInput,
  2182. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2183. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2184. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2185. Values("Output"), Values("%u32"),
  2186. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2187. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2188. "\"SPV_KHR_ray_cull_mask\"\n"),
  2189. Values("VUID-CullMaskKHR-CullMaskKHR-06736 "
  2190. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2191. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2192. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2193. "used for variables with Input storage class"))));
  2194. INSTANTIATE_TEST_SUITE_P(
  2195. CullMaskNotIntScalar,
  2196. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2197. Combine(Values(SPV_ENV_VULKAN_1_2), Values("CullMaskKHR"),
  2198. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2199. Values("Input"), Values("%f32", "%u32vec3"),
  2200. Values("OpCapability RayTracingKHR\nOpCapability RayCullMaskKHR\n"),
  2201. Values("OpExtension \"SPV_KHR_ray_tracing\"\nOpExtension "
  2202. "\"SPV_KHR_ray_cull_mask\"\n"),
  2203. Values("VUID-CullMaskKHR-CullMaskKHR-06737 "
  2204. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2205. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2206. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2207. "needs to be a 32-bit int scalar",
  2208. "is not an int scalar"))));
  2209. // RayTmaxKHR, RayTminKHR are all valid
  2210. // in IS, AH, CH, MS shaders as input f32 scalars
  2211. INSTANTIATE_TEST_SUITE_P(
  2212. RayTSuccess,
  2213. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2214. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2215. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2216. Values("Input"), Values("%f32"),
  2217. Values("OpCapability RayTracingKHR\n"),
  2218. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2219. Values(TestResult())));
  2220. INSTANTIATE_TEST_SUITE_P(
  2221. RayTNotExecutionMode,
  2222. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2223. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2224. Values("Vertex", "Fragment", "TessellationControl",
  2225. "TessellationEvaluation", "Geometry", "Fragment",
  2226. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2227. Values("Input"), Values("%f32"),
  2228. Values("OpCapability RayTracingKHR\n"),
  2229. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2230. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248 "
  2231. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2232. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2233. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2234. "Vulkan spec does not allow BuiltIn",
  2235. "to be used with the execution model"))));
  2236. INSTANTIATE_TEST_SUITE_P(
  2237. RayTNotInput,
  2238. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2239. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2240. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2241. Values("Output"), Values("%f32"),
  2242. Values("OpCapability RayTracingKHR\n"),
  2243. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2244. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249 "
  2245. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2246. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2247. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2248. "used for variables with Input storage class"))));
  2249. INSTANTIATE_TEST_SUITE_P(
  2250. RayTNotFloatScalar,
  2251. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2252. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2253. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2254. Values("Input"), Values("%u32", "%f32vec3"),
  2255. Values("OpCapability RayTracingKHR\n"),
  2256. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2257. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250 "
  2258. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2259. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2260. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2261. "needs to be a 32-bit float scalar",
  2262. "is not a float scalar"))));
  2263. // WorldRayDirectionKHR and WorldRayOriginKHR are valid
  2264. // in IS, AH, CH, MS shaders as input 32-bit float vec3
  2265. INSTANTIATE_TEST_SUITE_P(
  2266. WorldRayDirectionAndOriginSuccess,
  2267. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2268. Combine(Values(SPV_ENV_VULKAN_1_2),
  2269. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2270. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2271. Values("Input"), Values("%f32vec3"),
  2272. Values("OpCapability RayTracingKHR\n"),
  2273. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2274. Values(TestResult())));
  2275. INSTANTIATE_TEST_SUITE_P(
  2276. WorldRayDirectionAndOriginNotExecutionMode,
  2277. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2278. Combine(Values(SPV_ENV_VULKAN_1_2),
  2279. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2280. Values("Vertex", "Fragment", "TessellationControl",
  2281. "TessellationEvaluation", "Geometry", "Fragment",
  2282. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2283. Values("Input"), Values("%f32vec3"),
  2284. Values("OpCapability RayTracingKHR\n"),
  2285. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2286. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04428 "
  2287. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04431 "),
  2288. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2289. "Vulkan spec does not allow BuiltIn",
  2290. "to be used with the execution model"))));
  2291. INSTANTIATE_TEST_SUITE_P(
  2292. WorldRayDirectionAndOriginNotInput,
  2293. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2294. Combine(Values(SPV_ENV_VULKAN_1_2),
  2295. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2296. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2297. Values("Output"), Values("%f32vec3"),
  2298. Values("OpCapability RayTracingKHR\n"),
  2299. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2300. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04429 "
  2301. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04432 "),
  2302. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2303. "used for variables with Input storage class"))));
  2304. INSTANTIATE_TEST_SUITE_P(
  2305. WorldRayDirectionAndOriginNotFloatVec3,
  2306. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2307. Combine(
  2308. Values(SPV_ENV_VULKAN_1_2),
  2309. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2310. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2311. Values("Input"), Values("%u32vec3", "%f32", "%f32vec2", "%f32vec4"),
  2312. Values("OpCapability RayTracingKHR\n"),
  2313. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2314. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04430 "
  2315. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04433 "),
  2316. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2317. "needs to be a 3-component 32-bit float vector"))));
  2318. // LaunchIdKHR and LaunchSizeKHR are valid
  2319. // in RG, IS, AH, CH, MS shaders as input 32-bit ivec3
  2320. INSTANTIATE_TEST_SUITE_P(
  2321. LaunchRTSuccess,
  2322. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2323. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2324. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2325. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2326. Values("Input"), Values("%u32vec3"),
  2327. Values("OpCapability RayTracingKHR\n"),
  2328. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2329. Values(TestResult())));
  2330. INSTANTIATE_TEST_SUITE_P(
  2331. LaunchRTNotExecutionMode,
  2332. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2333. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2334. Values("Vertex", "Fragment", "TessellationControl",
  2335. "TessellationEvaluation", "Geometry", "Fragment",
  2336. "GLCompute"),
  2337. Values("Input"), Values("%u32vec3"),
  2338. Values("OpCapability RayTracingKHR\n"),
  2339. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2340. Values("VUID-LaunchIdKHR-LaunchIdKHR-04266 "
  2341. "VUID-LaunchSizeKHR-LaunchSizeKHR-04269 "),
  2342. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2343. "Vulkan spec does not allow BuiltIn",
  2344. "to be used with the execution model"))));
  2345. INSTANTIATE_TEST_SUITE_P(
  2346. LaunchRTNotInput,
  2347. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2348. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2349. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2350. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2351. Values("Output"), Values("%u32vec3"),
  2352. Values("OpCapability RayTracingKHR\n"),
  2353. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2354. Values("VUID-LaunchIdKHR-LaunchIdKHR-04267 "
  2355. "VUID-LaunchSizeKHR-LaunchSizeKHR-04270 "),
  2356. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2357. "used for variables with Input storage class"))));
  2358. INSTANTIATE_TEST_SUITE_P(
  2359. LaunchRTNotIntVec3,
  2360. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2361. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2362. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2363. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2364. Values("Input"), Values("%f32vec3", "%u32", "%u32vec2", "%u32vec4"),
  2365. Values("OpCapability RayTracingKHR\n"),
  2366. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2367. Values("VUID-LaunchIdKHR-LaunchIdKHR-04268 "
  2368. "VUID-LaunchSizeKHR-LaunchSizeKHR-04271 "),
  2369. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2370. "needs to be a 3-component 32-bit int vector"))));
  2371. CodeGenerator GetArrayedVariableCodeGenerator(const char* const built_in,
  2372. const char* const execution_model,
  2373. const char* const storage_class,
  2374. const char* const data_type) {
  2375. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2376. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  2377. generator.before_types_ += built_in;
  2378. generator.before_types_ += "\n";
  2379. std::ostringstream after_types;
  2380. after_types << "%built_in_array = OpTypeArray " << data_type << " %u32_3\n";
  2381. if (InitializerRequired(storage_class)) {
  2382. after_types << "%built_in_array_null = OpConstantNull %built_in_array\n";
  2383. }
  2384. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  2385. << " %built_in_array\n";
  2386. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  2387. if (InitializerRequired(storage_class)) {
  2388. after_types << " %built_in_array_null";
  2389. }
  2390. after_types << "\n";
  2391. generator.after_types_ = after_types.str();
  2392. EntryPoint entry_point;
  2393. entry_point.name = "main";
  2394. entry_point.execution_model = execution_model;
  2395. entry_point.interfaces = "%built_in_var";
  2396. // Any kind of reference would do.
  2397. entry_point.body = R"(
  2398. %val = OpBitcast %u32 %built_in_var
  2399. )";
  2400. std::ostringstream execution_modes;
  2401. if (0 == std::strcmp(execution_model, "Fragment")) {
  2402. execution_modes << "OpExecutionMode %" << entry_point.name
  2403. << " OriginUpperLeft\n";
  2404. if (0 == std::strcmp(built_in, "FragDepth")) {
  2405. execution_modes << "OpExecutionMode %" << entry_point.name
  2406. << " DepthReplacing\n";
  2407. }
  2408. }
  2409. if (0 == std::strcmp(execution_model, "Geometry")) {
  2410. execution_modes << "OpExecutionMode %" << entry_point.name
  2411. << " InputPoints\n";
  2412. execution_modes << "OpExecutionMode %" << entry_point.name
  2413. << " OutputPoints\n";
  2414. }
  2415. if (0 == std::strcmp(execution_model, "GLCompute")) {
  2416. execution_modes << "OpExecutionMode %" << entry_point.name
  2417. << " LocalSize 1 1 1\n";
  2418. }
  2419. entry_point.execution_modes = execution_modes.str();
  2420. generator.entry_points_.push_back(std::move(entry_point));
  2421. return generator;
  2422. }
  2423. TEST_P(ValidateVulkanCombineBuiltInArrayedVariable, Variable) {
  2424. const char* const built_in = std::get<0>(GetParam());
  2425. const char* const execution_model = std::get<1>(GetParam());
  2426. const char* const storage_class = std::get<2>(GetParam());
  2427. const char* const data_type = std::get<3>(GetParam());
  2428. const char* const vuid = std::get<4>(GetParam());
  2429. const TestResult& test_result = std::get<5>(GetParam());
  2430. CodeGenerator generator = GetArrayedVariableCodeGenerator(
  2431. built_in, execution_model, storage_class, data_type);
  2432. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2433. ASSERT_EQ(test_result.validation_result,
  2434. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2435. if (test_result.error_str) {
  2436. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  2437. }
  2438. if (test_result.error_str2) {
  2439. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  2440. }
  2441. if (vuid) {
  2442. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  2443. }
  2444. }
  2445. INSTANTIATE_TEST_SUITE_P(
  2446. PointSizeArrayedF32TessControl, ValidateVulkanCombineBuiltInArrayedVariable,
  2447. Combine(Values("PointSize"), Values("TessellationControl"), Values("Input"),
  2448. Values("%f32"), Values(nullptr), Values(TestResult())));
  2449. INSTANTIATE_TEST_SUITE_P(
  2450. PointSizeArrayedF64TessControl, ValidateVulkanCombineBuiltInArrayedVariable,
  2451. Combine(Values("PointSize"), Values("TessellationControl"), Values("Input"),
  2452. Values("%f64"), Values("VUID-PointSize-PointSize-04317"),
  2453. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2454. "needs to be a 32-bit float scalar",
  2455. "has bit width 64"))));
  2456. INSTANTIATE_TEST_SUITE_P(
  2457. PointSizeArrayedF32Vertex, ValidateVulkanCombineBuiltInArrayedVariable,
  2458. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  2459. Values("%f32"), Values("VUID-PointSize-PointSize-04317"),
  2460. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2461. "needs to be a 32-bit float scalar",
  2462. "is not a float scalar"))));
  2463. INSTANTIATE_TEST_SUITE_P(PositionArrayedF32Vec4TessControl,
  2464. ValidateVulkanCombineBuiltInArrayedVariable,
  2465. Combine(Values("Position"),
  2466. Values("TessellationControl"), Values("Input"),
  2467. Values("%f32vec4"), Values(nullptr),
  2468. Values(TestResult())));
  2469. INSTANTIATE_TEST_SUITE_P(
  2470. PositionArrayedF32Vec3TessControl,
  2471. ValidateVulkanCombineBuiltInArrayedVariable,
  2472. Combine(Values("Position"), Values("TessellationControl"), Values("Input"),
  2473. Values("%f32vec3"), Values("VUID-Position-Position-04321"),
  2474. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2475. "needs to be a 4-component 32-bit float vector",
  2476. "has 3 components"))));
  2477. INSTANTIATE_TEST_SUITE_P(
  2478. PositionArrayedF32Vec4Vertex, ValidateVulkanCombineBuiltInArrayedVariable,
  2479. Combine(Values("Position"), Values("Vertex"), Values("Output"),
  2480. Values("%f32vec4"), Values("VUID-Position-Position-04321"),
  2481. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2482. "needs to be a 4-component 32-bit float vector",
  2483. "is not a float vector"))));
  2484. INSTANTIATE_TEST_SUITE_P(
  2485. ClipAndCullDistanceOutputSuccess,
  2486. ValidateVulkanCombineBuiltInArrayedVariable,
  2487. Combine(Values("ClipDistance", "CullDistance"),
  2488. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  2489. Values("Output"), Values("%f32arr2", "%f32arr4"), Values(nullptr),
  2490. Values(TestResult())));
  2491. INSTANTIATE_TEST_SUITE_P(
  2492. ClipAndCullDistanceVertexInput, ValidateVulkanCombineBuiltInArrayedVariable,
  2493. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  2494. Values("Input"), Values("%f32arr4"),
  2495. Values("VUID-ClipDistance-ClipDistance-04191 "
  2496. "VUID-CullDistance-CullDistance-04200"),
  2497. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2498. "needs to be a 32-bit float array",
  2499. "components are not float scalar"))));
  2500. INSTANTIATE_TEST_SUITE_P(
  2501. ClipAndCullDistanceNotArray, ValidateVulkanCombineBuiltInArrayedVariable,
  2502. Combine(Values("ClipDistance", "CullDistance"),
  2503. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  2504. Values("Input"), Values("%f32vec2", "%f32vec4"),
  2505. Values("VUID-ClipDistance-ClipDistance-04191 "
  2506. "VUID-CullDistance-CullDistance-04200"),
  2507. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2508. "needs to be a 32-bit float array",
  2509. "components are not float scalar"))));
  2510. INSTANTIATE_TEST_SUITE_P(
  2511. SMBuiltinsInputSuccess,
  2512. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2513. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2514. Values("Vertex", "Fragment", "TessellationControl",
  2515. "TessellationEvaluation", "Geometry", "GLCompute"),
  2516. Values("Input"), Values("%u32"),
  2517. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2518. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2519. Values(nullptr), Values(TestResult())));
  2520. INSTANTIATE_TEST_SUITE_P(
  2521. SMBuiltinsInputMeshSuccess,
  2522. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2523. Combine(
  2524. Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2525. Values("MeshNV", "TaskNV"), Values("Input"), Values("%u32"),
  2526. Values("OpCapability ShaderSMBuiltinsNV\nOpCapability MeshShadingNV\n"),
  2527. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\nOpExtension "
  2528. "\"SPV_NV_mesh_shader\"\n"),
  2529. Values(nullptr), Values(TestResult())));
  2530. INSTANTIATE_TEST_SUITE_P(
  2531. SMBuiltinsInputRaySuccess,
  2532. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2533. Combine(
  2534. Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2535. Values("RayGenerationNV", "IntersectionNV", "AnyHitNV", "ClosestHitNV",
  2536. "MissNV", "CallableNV"),
  2537. Values("Input"), Values("%u32"),
  2538. Values("OpCapability ShaderSMBuiltinsNV\nOpCapability RayTracingNV\n"),
  2539. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\nOpExtension "
  2540. "\"SPV_NV_ray_tracing\"\n"),
  2541. Values(nullptr), Values(TestResult())));
  2542. INSTANTIATE_TEST_SUITE_P(
  2543. SMBuiltinsNotInput,
  2544. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2545. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2546. Values("Vertex", "Fragment", "TessellationControl",
  2547. "TessellationEvaluation", "Geometry", "GLCompute"),
  2548. Values("Output"), Values("%u32"),
  2549. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2550. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2551. Values(nullptr),
  2552. Values(TestResult(
  2553. SPV_ERROR_INVALID_DATA,
  2554. "to be only used for variables with Input storage class",
  2555. "uses storage class Output"))));
  2556. INSTANTIATE_TEST_SUITE_P(
  2557. SMBuiltinsNotIntScalar,
  2558. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2559. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2560. Values("Vertex", "Fragment", "TessellationControl",
  2561. "TessellationEvaluation", "Geometry", "GLCompute"),
  2562. Values("Input"), Values("%f32", "%u32vec3"),
  2563. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2564. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2565. Values(nullptr),
  2566. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2567. "needs to be a 32-bit int scalar",
  2568. "is not an int scalar"))));
  2569. INSTANTIATE_TEST_SUITE_P(
  2570. SMBuiltinsNotInt32,
  2571. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2572. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2573. Values("Vertex", "Fragment", "TessellationControl",
  2574. "TessellationEvaluation", "Geometry", "GLCompute"),
  2575. Values("Input"), Values("%u64"),
  2576. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2577. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2578. Values(nullptr),
  2579. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2580. "needs to be a 32-bit int scalar",
  2581. "has bit width 64"))));
  2582. INSTANTIATE_TEST_SUITE_P(
  2583. ArmCoreBuiltinsInputSuccess,
  2584. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2585. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2586. "WarpMaxIDARM"),
  2587. Values("Vertex", "Fragment", "TessellationControl",
  2588. "TessellationEvaluation", "Geometry", "GLCompute"),
  2589. Values("Input"), Values("%u32"),
  2590. Values("OpCapability CoreBuiltinsARM\n"),
  2591. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2592. Values(TestResult())));
  2593. INSTANTIATE_TEST_SUITE_P(
  2594. ArmCoreBuiltinsNotInput,
  2595. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2596. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2597. "WarpMaxIDARM"),
  2598. Values("Vertex", "Fragment", "TessellationControl",
  2599. "TessellationEvaluation", "Geometry", "GLCompute"),
  2600. Values("Output"), Values("%u32"),
  2601. Values("OpCapability CoreBuiltinsARM\n"),
  2602. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2603. Values(TestResult(
  2604. SPV_ERROR_INVALID_DATA,
  2605. "to be only used for variables with Input storage class",
  2606. "uses storage class Output"))));
  2607. INSTANTIATE_TEST_SUITE_P(
  2608. ArmCoreBuiltinsNotIntScalar,
  2609. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2610. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2611. "WarpMaxIDARM"),
  2612. Values("Vertex", "Fragment", "TessellationControl",
  2613. "TessellationEvaluation", "Geometry", "GLCompute"),
  2614. Values("Input"), Values("%f32", "%u32vec3"),
  2615. Values("OpCapability CoreBuiltinsARM\n"),
  2616. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2617. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2618. "needs to be a 32-bit int scalar",
  2619. "is not an int scalar"))));
  2620. INSTANTIATE_TEST_SUITE_P(
  2621. ArmCoreBuiltinsNotInt32,
  2622. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2623. Combine(Values("CoreIDARM", "CoreCountARM", "CoreMaxIDARM", "WarpIDARM",
  2624. "WarpMaxIDARM"),
  2625. Values("Vertex", "Fragment", "TessellationControl",
  2626. "TessellationEvaluation", "Geometry", "GLCompute"),
  2627. Values("Input"), Values("%u64"),
  2628. Values("OpCapability CoreBuiltinsARM\n"),
  2629. Values("OpExtension \"SPV_ARM_core_builtins\"\n"), Values(nullptr),
  2630. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2631. "needs to be a 32-bit int scalar",
  2632. "has bit width 64"))));
  2633. CodeGenerator GetWorkgroupSizeSuccessGenerator() {
  2634. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2635. generator.before_types_ = R"(
  2636. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2637. )";
  2638. generator.after_types_ = R"(
  2639. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2640. )";
  2641. EntryPoint entry_point;
  2642. entry_point.name = "main";
  2643. entry_point.execution_model = "GLCompute";
  2644. entry_point.body = R"(
  2645. %copy = OpCopyObject %u32vec3 %workgroup_size
  2646. )";
  2647. generator.entry_points_.push_back(std::move(entry_point));
  2648. return generator;
  2649. }
  2650. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeSuccess) {
  2651. CodeGenerator generator = GetWorkgroupSizeSuccessGenerator();
  2652. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2653. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2654. }
  2655. CodeGenerator GetWorkgroupSizeFragmentGenerator() {
  2656. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2657. generator.before_types_ = R"(
  2658. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2659. )";
  2660. generator.after_types_ = R"(
  2661. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2662. )";
  2663. EntryPoint entry_point;
  2664. entry_point.name = "main";
  2665. entry_point.execution_model = "Fragment";
  2666. entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft";
  2667. entry_point.body = R"(
  2668. %copy = OpCopyObject %u32vec3 %workgroup_size
  2669. )";
  2670. generator.entry_points_.push_back(std::move(entry_point));
  2671. return generator;
  2672. }
  2673. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeFragment) {
  2674. CodeGenerator generator = GetWorkgroupSizeFragmentGenerator();
  2675. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2676. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2677. EXPECT_THAT(getDiagnosticString(),
  2678. HasSubstr("Vulkan spec allows BuiltIn WorkgroupSize to be used "
  2679. "only with GLCompute, MeshNV, TaskNV, MeshEXT or "
  2680. "TaskEXT execution model"));
  2681. EXPECT_THAT(getDiagnosticString(),
  2682. HasSubstr("is referencing ID <2> (OpConstantComposite) which is "
  2683. "decorated with BuiltIn WorkgroupSize in function <1> "
  2684. "called with execution model Fragment"));
  2685. EXPECT_THAT(getDiagnosticString(),
  2686. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04425 "
  2687. "VUID-WorkgroupSize-WorkgroupSize-04427"));
  2688. }
  2689. TEST_F(ValidateBuiltIns, WorkgroupSizeNotConstant) {
  2690. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2691. generator.before_types_ = R"(
  2692. OpDecorate %copy BuiltIn WorkgroupSize
  2693. )";
  2694. generator.after_types_ = R"(
  2695. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2696. )";
  2697. EntryPoint entry_point;
  2698. entry_point.name = "main";
  2699. entry_point.execution_model = "GLCompute";
  2700. entry_point.body = R"(
  2701. %copy = OpCopyObject %u32vec3 %workgroup_size
  2702. )";
  2703. generator.entry_points_.push_back(std::move(entry_point));
  2704. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2705. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2706. EXPECT_THAT(getDiagnosticString(),
  2707. HasSubstr("BuiltIns can only target variables, structure "
  2708. "members or constants"));
  2709. }
  2710. CodeGenerator GetWorkgroupSizeNotVectorGenerator() {
  2711. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2712. generator.before_types_ = R"(
  2713. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2714. )";
  2715. generator.after_types_ = R"(
  2716. %workgroup_size = OpConstant %u32 16
  2717. )";
  2718. EntryPoint entry_point;
  2719. entry_point.name = "main";
  2720. entry_point.execution_model = "GLCompute";
  2721. entry_point.body = R"(
  2722. %copy = OpCopyObject %u32 %workgroup_size
  2723. )";
  2724. generator.entry_points_.push_back(std::move(entry_point));
  2725. return generator;
  2726. }
  2727. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotVector) {
  2728. CodeGenerator generator = GetWorkgroupSizeNotVectorGenerator();
  2729. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2730. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2731. EXPECT_THAT(getDiagnosticString(),
  2732. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2733. "variable needs to be a 3-component 32-bit int vector. "
  2734. "ID <2> (OpConstant) is not an int vector."));
  2735. EXPECT_THAT(getDiagnosticString(),
  2736. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2737. }
  2738. CodeGenerator GetWorkgroupSizeNotIntVectorGenerator() {
  2739. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2740. generator.before_types_ = R"(
  2741. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2742. )";
  2743. generator.after_types_ = R"(
  2744. %workgroup_size = OpConstantComposite %f32vec3 %f32_1 %f32_1 %f32_1
  2745. )";
  2746. EntryPoint entry_point;
  2747. entry_point.name = "main";
  2748. entry_point.execution_model = "GLCompute";
  2749. entry_point.body = R"(
  2750. %copy = OpCopyObject %f32vec3 %workgroup_size
  2751. )";
  2752. generator.entry_points_.push_back(std::move(entry_point));
  2753. return generator;
  2754. }
  2755. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotIntVector) {
  2756. CodeGenerator generator = GetWorkgroupSizeNotIntVectorGenerator();
  2757. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2758. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2759. EXPECT_THAT(getDiagnosticString(),
  2760. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2761. "variable needs to be a 3-component 32-bit int vector. "
  2762. "ID <2> (OpConstantComposite) is not an int vector."));
  2763. EXPECT_THAT(getDiagnosticString(),
  2764. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2765. }
  2766. CodeGenerator GetWorkgroupSizeNotVec3Generator() {
  2767. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2768. generator.before_types_ = R"(
  2769. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2770. )";
  2771. generator.after_types_ = R"(
  2772. %workgroup_size = OpConstantComposite %u32vec2 %u32_1 %u32_1
  2773. )";
  2774. EntryPoint entry_point;
  2775. entry_point.name = "main";
  2776. entry_point.execution_model = "GLCompute";
  2777. entry_point.body = R"(
  2778. %copy = OpCopyObject %u32vec2 %workgroup_size
  2779. )";
  2780. generator.entry_points_.push_back(std::move(entry_point));
  2781. return generator;
  2782. }
  2783. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotVec3) {
  2784. CodeGenerator generator = GetWorkgroupSizeNotVec3Generator();
  2785. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2786. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2787. EXPECT_THAT(getDiagnosticString(),
  2788. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2789. "variable needs to be a 3-component 32-bit int vector. "
  2790. "ID <2> (OpConstantComposite) has 2 components."));
  2791. EXPECT_THAT(getDiagnosticString(),
  2792. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2793. }
  2794. TEST_F(ValidateBuiltIns, WorkgroupSizeNotInt32Vec) {
  2795. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2796. generator.before_types_ = R"(
  2797. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2798. )";
  2799. generator.after_types_ = R"(
  2800. %workgroup_size = OpConstantComposite %u64vec3 %u64_1 %u64_1 %u64_1
  2801. )";
  2802. EntryPoint entry_point;
  2803. entry_point.name = "main";
  2804. entry_point.execution_model = "GLCompute";
  2805. entry_point.body = R"(
  2806. %copy = OpCopyObject %u64vec3 %workgroup_size
  2807. )";
  2808. generator.entry_points_.push_back(std::move(entry_point));
  2809. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2810. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2811. EXPECT_THAT(
  2812. getDiagnosticString(),
  2813. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize variable "
  2814. "needs to be a 3-component 32-bit int vector. ID <2> "
  2815. "(OpConstantComposite) has components with bit width 64."));
  2816. EXPECT_THAT(getDiagnosticString(),
  2817. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2818. }
  2819. TEST_F(ValidateBuiltIns, WorkgroupSizePrivateVar) {
  2820. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2821. generator.before_types_ = R"(
  2822. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2823. )";
  2824. generator.after_types_ = R"(
  2825. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2826. %private_ptr_u32vec3 = OpTypePointer Private %u32vec3
  2827. %var = OpVariable %private_ptr_u32vec3 Private %workgroup_size
  2828. )";
  2829. EntryPoint entry_point;
  2830. entry_point.name = "main";
  2831. entry_point.execution_model = "GLCompute";
  2832. entry_point.body = R"(
  2833. )";
  2834. generator.entry_points_.push_back(std::move(entry_point));
  2835. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2836. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2837. }
  2838. TEST_F(ValidateBuiltIns, GeometryPositionInOutSuccess) {
  2839. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2840. generator.before_types_ = R"(
  2841. OpDecorate %input_type Block
  2842. OpMemberDecorate %input_type 0 BuiltIn Position
  2843. OpDecorate %output_type Block
  2844. OpMemberDecorate %output_type 0 BuiltIn Position
  2845. )";
  2846. generator.after_types_ = R"(
  2847. %input_type = OpTypeStruct %f32vec4
  2848. %arrayed_input_type = OpTypeArray %input_type %u32_3
  2849. %input_ptr = OpTypePointer Input %arrayed_input_type
  2850. %input = OpVariable %input_ptr Input
  2851. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2852. %output_type = OpTypeStruct %f32vec4
  2853. %output_ptr = OpTypePointer Output %output_type
  2854. %output = OpVariable %output_ptr Output
  2855. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2856. )";
  2857. EntryPoint entry_point;
  2858. entry_point.name = "main";
  2859. entry_point.execution_model = "Geometry";
  2860. entry_point.interfaces = "%input %output";
  2861. entry_point.body = R"(
  2862. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0 %u32_0
  2863. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2864. %pos = OpLoad %f32vec4 %input_pos
  2865. OpStore %output_pos %pos
  2866. )";
  2867. generator.entry_points_.push_back(std::move(entry_point));
  2868. generator.entry_points_[0].execution_modes =
  2869. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2870. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2871. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2872. }
  2873. TEST_F(ValidateBuiltIns, WorkgroupIdNotVec3) {
  2874. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2875. generator.before_types_ = R"(
  2876. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2877. OpDecorate %workgroup_id BuiltIn WorkgroupId
  2878. )";
  2879. generator.after_types_ = R"(
  2880. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2881. %input_ptr = OpTypePointer Input %u32vec2
  2882. %workgroup_id = OpVariable %input_ptr Input
  2883. )";
  2884. EntryPoint entry_point;
  2885. entry_point.name = "main";
  2886. entry_point.execution_model = "GLCompute";
  2887. entry_point.interfaces = "%workgroup_id";
  2888. entry_point.body = R"(
  2889. %copy_size = OpCopyObject %u32vec3 %workgroup_size
  2890. %load_id = OpLoad %u32vec2 %workgroup_id
  2891. )";
  2892. generator.entry_points_.push_back(std::move(entry_point));
  2893. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2894. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2895. EXPECT_THAT(getDiagnosticString(),
  2896. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupId "
  2897. "variable needs to be a 3-component 32-bit int vector. "
  2898. "ID <2> (OpVariable) has 2 components."));
  2899. }
  2900. TEST_F(ValidateBuiltIns, TwoBuiltInsFirstFails) {
  2901. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2902. generator.before_types_ = R"(
  2903. OpDecorate %input_type Block
  2904. OpDecorate %output_type Block
  2905. OpMemberDecorate %input_type 0 BuiltIn FragCoord
  2906. OpMemberDecorate %output_type 0 BuiltIn Position
  2907. )";
  2908. generator.after_types_ = R"(
  2909. %input_type = OpTypeStruct %f32vec4
  2910. %input_ptr = OpTypePointer Input %input_type
  2911. %input = OpVariable %input_ptr Input
  2912. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2913. %output_type = OpTypeStruct %f32vec4
  2914. %output_ptr = OpTypePointer Output %output_type
  2915. %output = OpVariable %output_ptr Output
  2916. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2917. )";
  2918. EntryPoint entry_point;
  2919. entry_point.name = "main";
  2920. entry_point.execution_model = "Geometry";
  2921. entry_point.interfaces = "%input %output";
  2922. entry_point.body = R"(
  2923. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0
  2924. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2925. %pos = OpLoad %f32vec4 %input_pos
  2926. OpStore %output_pos %pos
  2927. )";
  2928. generator.entry_points_.push_back(std::move(entry_point));
  2929. generator.entry_points_[0].execution_modes =
  2930. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2931. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2932. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2933. EXPECT_THAT(getDiagnosticString(),
  2934. HasSubstr("Vulkan spec allows BuiltIn FragCoord to be used only "
  2935. "with Fragment execution model"));
  2936. }
  2937. TEST_F(ValidateBuiltIns, TwoBuiltInsSecondFails) {
  2938. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2939. generator.before_types_ = R"(
  2940. OpDecorate %input_type Block
  2941. OpDecorate %output_type Block
  2942. OpMemberDecorate %input_type 0 BuiltIn Position
  2943. OpMemberDecorate %output_type 0 BuiltIn FragCoord
  2944. )";
  2945. generator.after_types_ = R"(
  2946. %input_type = OpTypeStruct %f32vec4
  2947. %input_ptr = OpTypePointer Input %input_type
  2948. %input = OpVariable %input_ptr Input
  2949. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2950. %output_type = OpTypeStruct %f32vec4
  2951. %output_ptr = OpTypePointer Output %output_type
  2952. %output = OpVariable %output_ptr Output
  2953. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2954. )";
  2955. EntryPoint entry_point;
  2956. entry_point.name = "main";
  2957. entry_point.execution_model = "Geometry";
  2958. entry_point.interfaces = "%input %output";
  2959. entry_point.body = R"(
  2960. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0
  2961. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2962. %pos = OpLoad %f32vec4 %input_pos
  2963. OpStore %output_pos %pos
  2964. )";
  2965. generator.entry_points_.push_back(std::move(entry_point));
  2966. generator.entry_points_[0].execution_modes =
  2967. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2968. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2969. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2970. EXPECT_THAT(getDiagnosticString(),
  2971. HasSubstr("Vulkan spec allows BuiltIn FragCoord to be only used "
  2972. "for variables with Input storage class"));
  2973. }
  2974. TEST_F(ValidateBuiltIns, VertexPositionVariableSuccess) {
  2975. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2976. generator.before_types_ = R"(
  2977. OpDecorate %position BuiltIn Position
  2978. )";
  2979. generator.after_types_ = R"(
  2980. %f32vec4_ptr_output = OpTypePointer Output %f32vec4
  2981. %position = OpVariable %f32vec4_ptr_output Output
  2982. )";
  2983. EntryPoint entry_point;
  2984. entry_point.name = "main";
  2985. entry_point.execution_model = "Vertex";
  2986. entry_point.interfaces = "%position";
  2987. entry_point.body = R"(
  2988. OpStore %position %f32vec4_0123
  2989. )";
  2990. generator.entry_points_.push_back(std::move(entry_point));
  2991. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2992. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2993. }
  2994. TEST_F(ValidateBuiltIns, FragmentPositionTwoEntryPoints) {
  2995. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2996. generator.before_types_ = R"(
  2997. OpDecorate %output_type Block
  2998. OpMemberDecorate %output_type 0 BuiltIn Position
  2999. )";
  3000. generator.after_types_ = R"(
  3001. %output_type = OpTypeStruct %f32vec4
  3002. %output_ptr = OpTypePointer Output %output_type
  3003. %output = OpVariable %output_ptr Output
  3004. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  3005. )";
  3006. EntryPoint entry_point;
  3007. entry_point.name = "vmain";
  3008. entry_point.execution_model = "Vertex";
  3009. entry_point.interfaces = "%output";
  3010. entry_point.body = R"(
  3011. %val1 = OpFunctionCall %void %foo
  3012. )";
  3013. generator.entry_points_.push_back(std::move(entry_point));
  3014. entry_point.name = "fmain";
  3015. entry_point.execution_model = "Fragment";
  3016. entry_point.interfaces = "%output";
  3017. entry_point.execution_modes = "OpExecutionMode %fmain OriginUpperLeft";
  3018. entry_point.body = R"(
  3019. %val2 = OpFunctionCall %void %foo
  3020. )";
  3021. generator.entry_points_.push_back(std::move(entry_point));
  3022. generator.add_at_the_end_ = R"(
  3023. %foo = OpFunction %void None %func
  3024. %foo_entry = OpLabel
  3025. %position = OpAccessChain %output_f32vec4_ptr %output %u32_0
  3026. OpStore %position %f32vec4_0123
  3027. OpReturn
  3028. OpFunctionEnd
  3029. )";
  3030. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3031. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3032. EXPECT_THAT(getDiagnosticString(),
  3033. HasSubstr("Vulkan spec allows BuiltIn Position to be used only "
  3034. "with Vertex, TessellationControl, "
  3035. "TessellationEvaluation or Geometry execution models"));
  3036. EXPECT_THAT(getDiagnosticString(),
  3037. HasSubstr("called with execution model Fragment"));
  3038. }
  3039. CodeGenerator GetNoDepthReplacingGenerator() {
  3040. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3041. generator.before_types_ = R"(
  3042. OpDecorate %output_type Block
  3043. OpMemberDecorate %output_type 0 BuiltIn FragDepth
  3044. )";
  3045. generator.after_types_ = R"(
  3046. %output_type = OpTypeStruct %f32
  3047. %output_null = OpConstantNull %output_type
  3048. %output_ptr = OpTypePointer Output %output_type
  3049. %output = OpVariable %output_ptr Output %output_null
  3050. %output_f32_ptr = OpTypePointer Output %f32
  3051. )";
  3052. EntryPoint entry_point;
  3053. entry_point.name = "main";
  3054. entry_point.execution_model = "Fragment";
  3055. entry_point.interfaces = "%output";
  3056. entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft";
  3057. entry_point.body = R"(
  3058. %val2 = OpFunctionCall %void %foo
  3059. )";
  3060. generator.entry_points_.push_back(std::move(entry_point));
  3061. const std::string function_body = R"(
  3062. %foo = OpFunction %void None %func
  3063. %foo_entry = OpLabel
  3064. %frag_depth = OpAccessChain %output_f32_ptr %output %u32_0
  3065. OpStore %frag_depth %f32_1
  3066. OpReturn
  3067. OpFunctionEnd
  3068. )";
  3069. generator.add_at_the_end_ = function_body;
  3070. return generator;
  3071. }
  3072. TEST_F(ValidateBuiltIns, VulkanFragmentFragDepthNoDepthReplacing) {
  3073. CodeGenerator generator = GetNoDepthReplacingGenerator();
  3074. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3075. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3076. EXPECT_THAT(getDiagnosticString(),
  3077. HasSubstr("Vulkan spec requires DepthReplacing execution mode to "
  3078. "be declared when using BuiltIn FragDepth"));
  3079. EXPECT_THAT(getDiagnosticString(),
  3080. HasSubstr("VUID-FragDepth-FragDepth-04216"));
  3081. }
  3082. CodeGenerator GetOneMainHasDepthReplacingOtherHasntGenerator() {
  3083. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3084. generator.before_types_ = R"(
  3085. OpDecorate %output_type Block
  3086. OpMemberDecorate %output_type 0 BuiltIn FragDepth
  3087. )";
  3088. generator.after_types_ = R"(
  3089. %output_type = OpTypeStruct %f32
  3090. %output_null = OpConstantNull %output_type
  3091. %output_ptr = OpTypePointer Output %output_type
  3092. %output = OpVariable %output_ptr Output %output_null
  3093. %output_f32_ptr = OpTypePointer Output %f32
  3094. )";
  3095. EntryPoint entry_point;
  3096. entry_point.name = "main_d_r";
  3097. entry_point.execution_model = "Fragment";
  3098. entry_point.interfaces = "%output";
  3099. entry_point.execution_modes =
  3100. "OpExecutionMode %main_d_r OriginUpperLeft\n"
  3101. "OpExecutionMode %main_d_r DepthReplacing";
  3102. entry_point.body = R"(
  3103. %val2 = OpFunctionCall %void %foo
  3104. )";
  3105. generator.entry_points_.push_back(std::move(entry_point));
  3106. entry_point.name = "main_no_d_r";
  3107. entry_point.execution_model = "Fragment";
  3108. entry_point.interfaces = "%output";
  3109. entry_point.execution_modes = "OpExecutionMode %main_no_d_r OriginUpperLeft";
  3110. entry_point.body = R"(
  3111. %val3 = OpFunctionCall %void %foo
  3112. )";
  3113. generator.entry_points_.push_back(std::move(entry_point));
  3114. const std::string function_body = R"(
  3115. %foo = OpFunction %void None %func
  3116. %foo_entry = OpLabel
  3117. %frag_depth = OpAccessChain %output_f32_ptr %output %u32_0
  3118. OpStore %frag_depth %f32_1
  3119. OpReturn
  3120. OpFunctionEnd
  3121. )";
  3122. generator.add_at_the_end_ = function_body;
  3123. return generator;
  3124. }
  3125. TEST_F(ValidateBuiltIns,
  3126. VulkanFragmentFragDepthOneMainHasDepthReplacingOtherHasnt) {
  3127. CodeGenerator generator = GetOneMainHasDepthReplacingOtherHasntGenerator();
  3128. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3129. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3130. EXPECT_THAT(getDiagnosticString(),
  3131. HasSubstr("Vulkan spec requires DepthReplacing execution mode to "
  3132. "be declared when using BuiltIn FragDepth"));
  3133. EXPECT_THAT(getDiagnosticString(),
  3134. HasSubstr("VUID-FragDepth-FragDepth-04216"));
  3135. }
  3136. TEST_F(ValidateBuiltIns, AllowInstanceIdWithIntersectionShader) {
  3137. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3138. generator.capabilities_ += R"(
  3139. OpCapability RayTracingNV
  3140. )";
  3141. generator.extensions_ = R"(
  3142. OpExtension "SPV_NV_ray_tracing"
  3143. )";
  3144. generator.before_types_ = R"(
  3145. OpDecorate %input_type Block
  3146. OpMemberDecorate %input_type 0 BuiltIn InstanceId
  3147. )";
  3148. generator.after_types_ = R"(
  3149. %input_type = OpTypeStruct %u32
  3150. %input_ptr = OpTypePointer Input %input_type
  3151. %input = OpVariable %input_ptr Input
  3152. )";
  3153. EntryPoint entry_point;
  3154. entry_point.name = "main_d_r";
  3155. entry_point.execution_model = "IntersectionNV";
  3156. entry_point.interfaces = "%input";
  3157. entry_point.body = R"(
  3158. %val2 = OpFunctionCall %void %foo
  3159. )";
  3160. generator.entry_points_.push_back(std::move(entry_point));
  3161. generator.add_at_the_end_ = R"(
  3162. %foo = OpFunction %void None %func
  3163. %foo_entry = OpLabel
  3164. OpReturn
  3165. OpFunctionEnd
  3166. )";
  3167. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3168. EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3169. }
  3170. TEST_F(ValidateBuiltIns, ValidBuiltinsForMeshShader) {
  3171. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3172. generator.capabilities_ += R"(
  3173. OpCapability MeshShadingNV
  3174. )";
  3175. generator.extensions_ = R"(
  3176. OpExtension "SPV_NV_mesh_shader"
  3177. )";
  3178. generator.before_types_ = R"(
  3179. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  3180. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  3181. OpDecorate %gl_Layer BuiltIn Layer
  3182. OpDecorate %gl_Layer PerPrimitiveNV
  3183. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  3184. OpDecorate %gl_ViewportIndex PerPrimitiveNV
  3185. )";
  3186. generator.after_types_ = R"(
  3187. %u32_81 = OpConstant %u32 81
  3188. %_arr_int_uint_81 = OpTypeArray %i32 %u32_81
  3189. %_ptr_Output__arr_int_uint_81 = OpTypePointer Output %_arr_int_uint_81
  3190. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3191. %gl_Layer = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3192. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3193. )";
  3194. EntryPoint entry_point;
  3195. entry_point.name = "main_d_r";
  3196. entry_point.execution_model = "MeshNV";
  3197. entry_point.interfaces = "%gl_PrimitiveID %gl_Layer %gl_ViewportIndex";
  3198. generator.entry_points_.push_back(std::move(entry_point));
  3199. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3200. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3201. }
  3202. TEST_F(ValidateBuiltIns, InvalidBuiltinsForMeshShader) {
  3203. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3204. generator.capabilities_ += R"(
  3205. OpCapability MeshShadingNV
  3206. )";
  3207. generator.extensions_ = R"(
  3208. OpExtension "SPV_NV_mesh_shader"
  3209. )";
  3210. generator.before_types_ = R"(
  3211. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  3212. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  3213. OpDecorate %gl_Layer BuiltIn Layer
  3214. OpDecorate %gl_Layer PerPrimitiveNV
  3215. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  3216. OpDecorate %gl_ViewportIndex PerPrimitiveNV
  3217. )";
  3218. generator.after_types_ = R"(
  3219. %u32_81 = OpConstant %u32 81
  3220. %_arr_float_uint_81 = OpTypeArray %f32 %u32_81
  3221. %_ptr_Output__arr_float_uint_81 = OpTypePointer Output %_arr_float_uint_81
  3222. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3223. %gl_Layer = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3224. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3225. )";
  3226. EntryPoint entry_point;
  3227. entry_point.name = "main_d_r";
  3228. entry_point.execution_model = "MeshNV";
  3229. entry_point.interfaces = "%gl_PrimitiveID %gl_Layer %gl_ViewportIndex";
  3230. generator.entry_points_.push_back(std::move(entry_point));
  3231. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3232. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3233. EXPECT_THAT(getDiagnosticString(),
  3234. HasSubstr("needs to be a 32-bit int scalar"));
  3235. EXPECT_THAT(getDiagnosticString(), HasSubstr("is not an int scalar"));
  3236. }
  3237. TEST_P(ValidateVulkanSubgroupBuiltIns, InMain) {
  3238. const char* const built_in = std::get<0>(GetParam());
  3239. const char* const execution_model = std::get<1>(GetParam());
  3240. const char* const storage_class = std::get<2>(GetParam());
  3241. const char* const data_type = std::get<3>(GetParam());
  3242. const char* const vuid = std::get<4>(GetParam());
  3243. const TestResult& test_result = std::get<5>(GetParam());
  3244. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3245. generator.capabilities_ += R"(
  3246. OpCapability GroupNonUniformBallot
  3247. )";
  3248. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  3249. generator.before_types_ += built_in;
  3250. generator.before_types_ += "\n";
  3251. std::ostringstream after_types;
  3252. after_types << "%built_in_ptr = OpTypePointer " << storage_class << " "
  3253. << data_type << "\n";
  3254. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  3255. after_types << "\n";
  3256. generator.after_types_ = after_types.str();
  3257. EntryPoint entry_point;
  3258. entry_point.name = "main";
  3259. entry_point.execution_model = execution_model;
  3260. if (strncmp(storage_class, "Input", 5) == 0 ||
  3261. strncmp(storage_class, "Output", 6) == 0) {
  3262. entry_point.interfaces = "%built_in_var";
  3263. }
  3264. entry_point.body =
  3265. std::string("%ld = OpLoad ") + data_type + " %built_in_var\n";
  3266. std::ostringstream execution_modes;
  3267. if (0 == std::strcmp(execution_model, "Fragment")) {
  3268. execution_modes << "OpExecutionMode %" << entry_point.name
  3269. << " OriginUpperLeft\n";
  3270. if (0 == std::strcmp(built_in, "FragDepth")) {
  3271. execution_modes << "OpExecutionMode %" << entry_point.name
  3272. << " DepthReplacing\n";
  3273. }
  3274. }
  3275. if (0 == std::strcmp(execution_model, "Geometry")) {
  3276. execution_modes << "OpExecutionMode %" << entry_point.name
  3277. << " InputPoints\n";
  3278. execution_modes << "OpExecutionMode %" << entry_point.name
  3279. << " OutputPoints\n";
  3280. }
  3281. if (0 == std::strcmp(execution_model, "GLCompute")) {
  3282. execution_modes << "OpExecutionMode %" << entry_point.name
  3283. << " LocalSize 1 1 1\n";
  3284. }
  3285. entry_point.execution_modes = execution_modes.str();
  3286. generator.entry_points_.push_back(std::move(entry_point));
  3287. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3288. ASSERT_EQ(test_result.validation_result,
  3289. ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3290. if (test_result.error_str) {
  3291. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  3292. }
  3293. if (test_result.error_str2) {
  3294. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  3295. }
  3296. if (vuid) {
  3297. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  3298. }
  3299. }
  3300. INSTANTIATE_TEST_SUITE_P(
  3301. SubgroupMaskNotVec4, ValidateVulkanSubgroupBuiltIns,
  3302. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3303. "SubgroupLeMask", "SubgroupLtMask"),
  3304. Values("GLCompute"), Values("Input"), Values("%u32vec3"),
  3305. Values("VUID-SubgroupEqMask-SubgroupEqMask-04371 "
  3306. "VUID-SubgroupGeMask-SubgroupGeMask-04373 "
  3307. "VUID-SubgroupGtMask-SubgroupGtMask-04375 "
  3308. "VUID-SubgroupLeMask-SubgroupLeMask-04377 "
  3309. "VUID-SubgroupLtMask-SubgroupLtMask-04379"),
  3310. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3311. "needs to be a 4-component 32-bit int vector"))));
  3312. INSTANTIATE_TEST_SUITE_P(
  3313. SubgroupMaskNotU32, ValidateVulkanSubgroupBuiltIns,
  3314. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3315. "SubgroupLeMask", "SubgroupLtMask"),
  3316. Values("GLCompute"), Values("Input"), Values("%f32vec4"),
  3317. Values("VUID-SubgroupEqMask-SubgroupEqMask-04371 "
  3318. "VUID-SubgroupGeMask-SubgroupGeMask-04373 "
  3319. "VUID-SubgroupGtMask-SubgroupGtMask-04375 "
  3320. "VUID-SubgroupLeMask-SubgroupLeMask-04377 "
  3321. "VUID-SubgroupLtMask-SubgroupLtMask-04379"),
  3322. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3323. "needs to be a 4-component 32-bit int vector"))));
  3324. INSTANTIATE_TEST_SUITE_P(
  3325. SubgroupMaskNotInput, ValidateVulkanSubgroupBuiltIns,
  3326. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3327. "SubgroupLeMask", "SubgroupLtMask"),
  3328. Values("GLCompute"), Values("Output", "Workgroup", "Private"),
  3329. Values("%u32vec4"),
  3330. Values("VUID-SubgroupEqMask-SubgroupEqMask-04370 "
  3331. "VUID-SubgroupGeMask-SubgroupGeMask-04372 "
  3332. "VUID-SubgroupGtMask-SubgroupGtMask-04374 "
  3333. "VUID-SubgroupLeMask-SubgroupLeMask-04376 "
  3334. "VUID-SubgroupLtMask-SubgroupLtMask-04378"),
  3335. Values(TestResult(
  3336. SPV_ERROR_INVALID_DATA,
  3337. "to be only used for variables with Input storage class"))));
  3338. INSTANTIATE_TEST_SUITE_P(SubgroupMaskOk, ValidateVulkanSubgroupBuiltIns,
  3339. Combine(Values("SubgroupEqMask", "SubgroupGeMask",
  3340. "SubgroupGtMask", "SubgroupLeMask",
  3341. "SubgroupLtMask"),
  3342. Values("GLCompute"), Values("Input"),
  3343. Values("%u32vec4"), Values(nullptr),
  3344. Values(TestResult(SPV_SUCCESS, ""))));
  3345. TEST_F(ValidateBuiltIns, SubgroupMaskMemberDecorate) {
  3346. const std::string text = R"(
  3347. OpCapability Shader
  3348. OpCapability GroupNonUniformBallot
  3349. OpMemoryModel Logical GLSL450
  3350. OpEntryPoint GLCompute %foo "foo"
  3351. OpExecutionMode %foo LocalSize 1 1 1
  3352. OpDecorate %struct Block
  3353. OpMemberDecorate %struct 0 BuiltIn SubgroupEqMask
  3354. %void = OpTypeVoid
  3355. %int = OpTypeInt 32 0
  3356. %struct = OpTypeStruct %int
  3357. %void_fn = OpTypeFunction %void
  3358. %foo = OpFunction %void None %void_fn
  3359. %entry = OpLabel
  3360. OpReturn
  3361. OpFunctionEnd
  3362. )";
  3363. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3364. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3365. EXPECT_THAT(
  3366. getDiagnosticString(),
  3367. HasSubstr(
  3368. "BuiltIn SubgroupEqMask cannot be used as a member decoration"));
  3369. }
  3370. INSTANTIATE_TEST_SUITE_P(
  3371. SubgroupInvocationIdAndSizeNotU32, ValidateVulkanSubgroupBuiltIns,
  3372. Combine(
  3373. Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3374. Values("GLCompute"), Values("Input"), Values("%f32"),
  3375. Values("VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-04381 "
  3376. "VUID-SubgroupSize-SubgroupSize-04383"),
  3377. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3378. "needs to be a 32-bit int"))));
  3379. INSTANTIATE_TEST_SUITE_P(
  3380. SubgroupInvocationIdAndSizeNotInput, ValidateVulkanSubgroupBuiltIns,
  3381. Combine(
  3382. Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3383. Values("GLCompute"), Values("Output", "Workgroup", "Private"),
  3384. Values("%u32"),
  3385. Values("VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-04380 "
  3386. "VUID-SubgroupSize-SubgroupSize-04382"),
  3387. Values(TestResult(
  3388. SPV_ERROR_INVALID_DATA,
  3389. "to be only used for variables with Input storage class"))));
  3390. INSTANTIATE_TEST_SUITE_P(
  3391. SubgroupInvocationIdAndSizeOk, ValidateVulkanSubgroupBuiltIns,
  3392. Combine(Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3393. Values("GLCompute"), Values("Input"), Values("%u32"),
  3394. Values(nullptr), Values(TestResult(SPV_SUCCESS, ""))));
  3395. TEST_F(ValidateBuiltIns, SubgroupSizeMemberDecorate) {
  3396. const std::string text = R"(
  3397. OpCapability Shader
  3398. OpCapability GroupNonUniform
  3399. OpMemoryModel Logical GLSL450
  3400. OpEntryPoint GLCompute %foo "foo"
  3401. OpExecutionMode %foo LocalSize 1 1 1
  3402. OpDecorate %struct Block
  3403. OpMemberDecorate %struct 0 BuiltIn SubgroupSize
  3404. %void = OpTypeVoid
  3405. %int = OpTypeInt 32 0
  3406. %struct = OpTypeStruct %int
  3407. %void_fn = OpTypeFunction %void
  3408. %foo = OpFunction %void None %void_fn
  3409. %entry = OpLabel
  3410. OpReturn
  3411. OpFunctionEnd
  3412. )";
  3413. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3414. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3415. EXPECT_THAT(
  3416. getDiagnosticString(),
  3417. HasSubstr("BuiltIn SubgroupSize cannot be used as a member decoration"));
  3418. }
  3419. INSTANTIATE_TEST_SUITE_P(
  3420. SubgroupNumAndIdNotCompute, ValidateVulkanSubgroupBuiltIns,
  3421. Combine(Values("SubgroupId", "NumSubgroups"), Values("Vertex"),
  3422. Values("Input"), Values("%u32"),
  3423. Values("VUID-SubgroupId-SubgroupId-04367 "
  3424. "VUID-NumSubgroups-NumSubgroups-04293"),
  3425. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3426. "to be used only with GLCompute, MeshNV, "
  3427. "TaskNV, MeshEXT or TaskEXT execution model"))));
  3428. INSTANTIATE_TEST_SUITE_P(
  3429. SubgroupNumAndIdNotU32, ValidateVulkanSubgroupBuiltIns,
  3430. Combine(Values("SubgroupId", "NumSubgroups"), Values("GLCompute"),
  3431. Values("Input"), Values("%f32"),
  3432. Values("VUID-SubgroupId-SubgroupId-04369 "
  3433. "VUID-NumSubgroups-NumSubgroups-04295"),
  3434. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3435. "needs to be a 32-bit int"))));
  3436. INSTANTIATE_TEST_SUITE_P(
  3437. SubgroupNumAndIdNotInput, ValidateVulkanSubgroupBuiltIns,
  3438. Combine(Values("SubgroupId", "NumSubgroups"), Values("GLCompute"),
  3439. Values("Output", "Workgroup", "Private"), Values("%u32"),
  3440. Values("VUID-SubgroupId-SubgroupId-04368 "
  3441. "VUID-NumSubgroups-NumSubgroups-04294"),
  3442. Values(TestResult(
  3443. SPV_ERROR_INVALID_DATA,
  3444. "to be only used for variables with Input storage class"))));
  3445. INSTANTIATE_TEST_SUITE_P(SubgroupNumAndIdOk, ValidateVulkanSubgroupBuiltIns,
  3446. Combine(Values("SubgroupId", "NumSubgroups"),
  3447. Values("GLCompute"), Values("Input"),
  3448. Values("%u32"), Values(nullptr),
  3449. Values(TestResult(SPV_SUCCESS, ""))));
  3450. TEST_F(ValidateBuiltIns, SubgroupIdMemberDecorate) {
  3451. const std::string text = R"(
  3452. OpCapability Shader
  3453. OpCapability GroupNonUniform
  3454. OpMemoryModel Logical GLSL450
  3455. OpEntryPoint GLCompute %foo "foo"
  3456. OpExecutionMode %foo LocalSize 1 1 1
  3457. OpDecorate %struct Block
  3458. OpMemberDecorate %struct 0 BuiltIn SubgroupId
  3459. %void = OpTypeVoid
  3460. %int = OpTypeInt 32 0
  3461. %struct = OpTypeStruct %int
  3462. %void_fn = OpTypeFunction %void
  3463. %foo = OpFunction %void None %void_fn
  3464. %entry = OpLabel
  3465. OpReturn
  3466. OpFunctionEnd
  3467. )";
  3468. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3469. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3470. EXPECT_THAT(
  3471. getDiagnosticString(),
  3472. HasSubstr("BuiltIn SubgroupId cannot be used as a member decoration"));
  3473. }
  3474. TEST_F(ValidateBuiltIns, TargetIsType) {
  3475. const std::string text = R"(
  3476. OpCapability Shader
  3477. OpCapability Linkage
  3478. OpMemoryModel Logical GLSL450
  3479. OpDecorate %void BuiltIn Position
  3480. %void = OpTypeVoid
  3481. )";
  3482. CompileSuccessfully(text);
  3483. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  3484. EXPECT_THAT(getDiagnosticString(),
  3485. HasSubstr("BuiltIns can only target variables, structure members "
  3486. "or constants"));
  3487. }
  3488. TEST_F(ValidateBuiltIns, TargetIsVariable) {
  3489. const std::string text = R"(
  3490. OpCapability Shader
  3491. OpCapability Linkage
  3492. OpMemoryModel Logical GLSL450
  3493. OpDecorate %wg_var BuiltIn Position
  3494. %int = OpTypeInt 32 0
  3495. %int_wg_ptr = OpTypePointer Workgroup %int
  3496. %wg_var = OpVariable %int_wg_ptr Workgroup
  3497. )";
  3498. CompileSuccessfully(text);
  3499. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
  3500. }
  3501. INSTANTIATE_TEST_SUITE_P(
  3502. PrimitiveShadingRateOutputSuccess,
  3503. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3504. Combine(Values("PrimitiveShadingRateKHR"), Values("Vertex", "Geometry"),
  3505. Values("Output"), Values("%u32"),
  3506. Values("OpCapability FragmentShadingRateKHR\n"),
  3507. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3508. Values(nullptr), Values(TestResult())));
  3509. INSTANTIATE_TEST_SUITE_P(
  3510. PrimitiveShadingRateMeshOutputSuccess,
  3511. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3512. Combine(Values("PrimitiveShadingRateKHR"), Values("MeshNV"),
  3513. Values("Output"), Values("%u32"),
  3514. Values("OpCapability FragmentShadingRateKHR\nOpCapability "
  3515. "MeshShadingNV\n"),
  3516. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\nOpExtension "
  3517. "\"SPV_NV_mesh_shader\"\n"),
  3518. Values(nullptr), Values(TestResult())));
  3519. INSTANTIATE_TEST_SUITE_P(
  3520. PrimitiveShadingRateInvalidExecutionModel,
  3521. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3522. Combine(
  3523. Values("PrimitiveShadingRateKHR"), Values("Fragment"), Values("Output"),
  3524. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3525. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3526. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04484 "),
  3527. Values(TestResult(
  3528. SPV_ERROR_INVALID_DATA,
  3529. "Vulkan spec allows BuiltIn PrimitiveShadingRateKHR to be used "
  3530. "only with Vertex, Geometry, or MeshNV execution models."))));
  3531. INSTANTIATE_TEST_SUITE_P(
  3532. PrimitiveShadingRateInvalidStorageClass,
  3533. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3534. Combine(
  3535. Values("PrimitiveShadingRateKHR"), Values("Vertex"), Values("Input"),
  3536. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3537. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3538. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04485 "),
  3539. Values(TestResult(
  3540. SPV_ERROR_INVALID_DATA,
  3541. "Vulkan spec allows BuiltIn PrimitiveShadingRateKHR to be only "
  3542. "used for variables with Output storage class."))));
  3543. INSTANTIATE_TEST_SUITE_P(
  3544. PrimitiveShadingRateInvalidType,
  3545. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3546. Combine(
  3547. Values("PrimitiveShadingRateKHR"), Values("Vertex"), Values("Output"),
  3548. Values("%f32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3549. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3550. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04486 "),
  3551. Values(TestResult(
  3552. SPV_ERROR_INVALID_DATA,
  3553. "According to the Vulkan spec BuiltIn PrimitiveShadingRateKHR "
  3554. "variable needs to be a 32-bit int scalar."))));
  3555. INSTANTIATE_TEST_SUITE_P(
  3556. ShadingRateInputSuccess,
  3557. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3558. Combine(Values("ShadingRateKHR"), Values("Fragment"), Values("Input"),
  3559. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3560. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3561. Values(nullptr), Values(TestResult())));
  3562. INSTANTIATE_TEST_SUITE_P(
  3563. ShadingRateInvalidExecutionModel,
  3564. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3565. Combine(Values("ShadingRateKHR"), Values("Vertex"), Values("Input"),
  3566. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3567. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3568. Values("VUID-ShadingRateKHR-ShadingRateKHR-04490 "),
  3569. Values(TestResult(
  3570. SPV_ERROR_INVALID_DATA,
  3571. "Vulkan spec allows BuiltIn ShadingRateKHR to be used "
  3572. "only with the Fragment execution model."))));
  3573. INSTANTIATE_TEST_SUITE_P(
  3574. ShadingRateInvalidStorageClass,
  3575. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3576. Combine(Values("ShadingRateKHR"), Values("Fragment"), Values("Output"),
  3577. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3578. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3579. Values("VUID-ShadingRateKHR-ShadingRateKHR-04491 "),
  3580. Values(TestResult(
  3581. SPV_ERROR_INVALID_DATA,
  3582. "Vulkan spec allows BuiltIn ShadingRateKHR to be only "
  3583. "used for variables with Input storage class."))));
  3584. INSTANTIATE_TEST_SUITE_P(
  3585. ShadingRateInvalidType,
  3586. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3587. Combine(
  3588. Values("ShadingRateKHR"), Values("Fragment"), Values("Input"),
  3589. Values("%f32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3590. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3591. Values("VUID-ShadingRateKHR-ShadingRateKHR-04492 "),
  3592. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3593. "According to the Vulkan spec BuiltIn ShadingRateKHR "
  3594. "variable needs to be a 32-bit int scalar."))));
  3595. INSTANTIATE_TEST_SUITE_P(
  3596. FragInvocationCountInputSuccess,
  3597. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3598. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3599. Values("Input"), Values("%u32"),
  3600. Values("OpCapability FragmentDensityEXT\n"),
  3601. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3602. Values(nullptr), Values(TestResult())));
  3603. INSTANTIATE_TEST_SUITE_P(
  3604. FragInvocationCountInvalidExecutionModel,
  3605. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3606. Combine(
  3607. Values("FragInvocationCountEXT"), Values("Vertex"), Values("Input"),
  3608. Values("%u32"), Values("OpCapability FragmentDensityEXT\n"),
  3609. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3610. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04217"),
  3611. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3612. "Vulkan spec allows BuiltIn FragInvocationCountEXT "
  3613. "to be used only with Fragment execution model."))));
  3614. INSTANTIATE_TEST_SUITE_P(
  3615. FragInvocationCountInvalidStorageClass,
  3616. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3617. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3618. Values("Output"), Values("%u32"),
  3619. Values("OpCapability FragmentDensityEXT\n"),
  3620. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3621. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04218"),
  3622. Values(TestResult(
  3623. SPV_ERROR_INVALID_DATA,
  3624. "Vulkan spec allows BuiltIn FragInvocationCountEXT to be only "
  3625. "used for variables with Input storage class."))));
  3626. INSTANTIATE_TEST_SUITE_P(
  3627. FragInvocationCountInvalidType,
  3628. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3629. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3630. Values("Input"), Values("%f32"),
  3631. Values("OpCapability FragmentDensityEXT\n"),
  3632. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3633. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04219"),
  3634. Values(TestResult(
  3635. SPV_ERROR_INVALID_DATA,
  3636. "According to the Vulkan spec BuiltIn FragInvocationCountEXT "
  3637. "variable needs to be a 32-bit int scalar."))));
  3638. INSTANTIATE_TEST_SUITE_P(
  3639. FragSizeInputSuccess,
  3640. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3641. Combine(Values("FragSizeEXT"), Values("Fragment"), Values("Input"),
  3642. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3643. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3644. Values(nullptr), Values(TestResult())));
  3645. INSTANTIATE_TEST_SUITE_P(
  3646. FragSizeInvalidExecutionModel,
  3647. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3648. Combine(Values("FragSizeEXT"), Values("Vertex"), Values("Input"),
  3649. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3650. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3651. Values("VUID-FragSizeEXT-FragSizeEXT-04220"),
  3652. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3653. "Vulkan spec allows BuiltIn FragSizeEXT to be "
  3654. "used only with Fragment execution model."))));
  3655. INSTANTIATE_TEST_SUITE_P(
  3656. FragSizeInvalidStorageClass,
  3657. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3658. Combine(
  3659. Values("FragSizeEXT"), Values("Fragment"), Values("Output"),
  3660. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3661. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3662. Values("VUID-FragSizeEXT-FragSizeEXT-04221"),
  3663. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3664. "Vulkan spec allows BuiltIn FragSizeEXT to be only "
  3665. "used for variables with Input storage class."))));
  3666. INSTANTIATE_TEST_SUITE_P(
  3667. FragSizeInvalidType,
  3668. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3669. Combine(Values("FragSizeEXT"), Values("Fragment"), Values("Input"),
  3670. Values("%u32vec3"), Values("OpCapability FragmentDensityEXT\n"),
  3671. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3672. Values("VUID-FragSizeEXT-FragSizeEXT-04222"),
  3673. Values(TestResult(
  3674. SPV_ERROR_INVALID_DATA,
  3675. "According to the Vulkan spec BuiltIn FragSizeEXT variable "
  3676. "needs to be a 2-component 32-bit int vector."))));
  3677. INSTANTIATE_TEST_SUITE_P(
  3678. FragStencilRefOutputSuccess,
  3679. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3680. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Output"),
  3681. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3682. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3683. Values(nullptr), Values(TestResult())));
  3684. INSTANTIATE_TEST_SUITE_P(
  3685. FragStencilRefInvalidExecutionModel,
  3686. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3687. Combine(Values("FragStencilRefEXT"), Values("Vertex"), Values("Output"),
  3688. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3689. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3690. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04223"),
  3691. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3692. "Vulkan spec allows BuiltIn FragStencilRefEXT to "
  3693. "be used only with Fragment execution model."))));
  3694. INSTANTIATE_TEST_SUITE_P(
  3695. FragStencilRefInvalidStorageClass,
  3696. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3697. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Input"),
  3698. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3699. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3700. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04224"),
  3701. Values(TestResult(
  3702. SPV_ERROR_INVALID_DATA,
  3703. "Vulkan spec allows BuiltIn FragStencilRefEXT to be only used "
  3704. "for variables with Output storage class."))));
  3705. INSTANTIATE_TEST_SUITE_P(
  3706. FragStencilRefInvalidType,
  3707. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3708. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Output"),
  3709. Values("%f32", "%f64", "%u32vec2"),
  3710. Values("OpCapability StencilExportEXT\n"),
  3711. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3712. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04225"),
  3713. Values(TestResult(
  3714. SPV_ERROR_INVALID_DATA,
  3715. "According to the Vulkan spec BuiltIn FragStencilRefEXT "
  3716. "variable needs to be a int scalar."))));
  3717. INSTANTIATE_TEST_SUITE_P(
  3718. FullyCoveredEXTInputSuccess,
  3719. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3720. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Input"),
  3721. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3722. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3723. Values(nullptr), Values(TestResult())));
  3724. INSTANTIATE_TEST_SUITE_P(
  3725. FullyCoveredEXTInvalidExecutionModel,
  3726. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3727. Combine(Values("FullyCoveredEXT"), Values("Vertex"), Values("Input"),
  3728. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3729. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3730. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04232"),
  3731. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3732. "Vulkan spec allows BuiltIn FullyCoveredEXT to "
  3733. "be used only with Fragment execution model."))));
  3734. INSTANTIATE_TEST_SUITE_P(
  3735. FullyCoveredEXTInvalidStorageClass,
  3736. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3737. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Output"),
  3738. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3739. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3740. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04233"),
  3741. Values(TestResult(
  3742. SPV_ERROR_INVALID_DATA,
  3743. "Vulkan spec allows BuiltIn FullyCoveredEXT to be only used "
  3744. "for variables with Input storage class."))));
  3745. INSTANTIATE_TEST_SUITE_P(
  3746. FullyCoveredEXTInvalidType,
  3747. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3748. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Input"),
  3749. Values("%f32"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3750. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3751. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04234"),
  3752. Values(TestResult(
  3753. SPV_ERROR_INVALID_DATA,
  3754. "According to the Vulkan spec BuiltIn FullyCoveredEXT variable "
  3755. "needs to be a bool scalar."))));
  3756. INSTANTIATE_TEST_SUITE_P(
  3757. BaryCoordNotFragment,
  3758. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3759. Combine(
  3760. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Vertex"),
  3761. Values("Input"), Values("%f32vec3"),
  3762. Values("OpCapability FragmentBarycentricKHR\n"),
  3763. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3764. Values("VUID-BaryCoordKHR-BaryCoordKHR-04154 "
  3765. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04160 "),
  3766. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows BuiltIn",
  3767. "to be used only with Fragment execution model"))));
  3768. INSTANTIATE_TEST_SUITE_P(
  3769. BaryCoordNotInput,
  3770. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3771. Combine(Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3772. Values("Output"), Values("%f32vec3"),
  3773. Values("OpCapability FragmentBarycentricKHR\n"),
  3774. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3775. Values("VUID-BaryCoordKHR-BaryCoordKHR-04155 "
  3776. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04161 "),
  3777. Values(TestResult(
  3778. SPV_ERROR_INVALID_DATA, "Vulkan spec allows BuiltIn",
  3779. "to be only used for variables with Input storage class"))));
  3780. INSTANTIATE_TEST_SUITE_P(
  3781. BaryCoordNotFloatVector,
  3782. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3783. Combine(
  3784. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3785. Values("Output"), Values("%f32arr3", "%u32vec4"),
  3786. Values("OpCapability FragmentBarycentricKHR\n"),
  3787. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3788. Values("VUID-BaryCoordKHR-BaryCoordKHR-04156 "
  3789. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162 "),
  3790. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3791. "needs to be a 3-component 32-bit float vector"))));
  3792. INSTANTIATE_TEST_SUITE_P(
  3793. BaryCoordNotFloatVec3,
  3794. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3795. Combine(
  3796. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3797. Values("Output"), Values("%f32vec2"),
  3798. Values("OpCapability FragmentBarycentricKHR\n"),
  3799. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3800. Values("VUID-BaryCoordKHR-BaryCoordKHR-04156 "
  3801. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162 "),
  3802. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3803. "needs to be a 3-component 32-bit float vector"))));
  3804. INSTANTIATE_TEST_SUITE_P(
  3805. BaryCoordNotF32Vec3,
  3806. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3807. Combine(
  3808. Values("BaryCoordKHR", "BaryCoordNoPerspKHR"), Values("Fragment"),
  3809. Values("Output"), Values("%f64vec3"),
  3810. Values("OpCapability FragmentBarycentricKHR\n"),
  3811. Values("OpExtension \"SPV_KHR_fragment_shader_barycentric\"\n"),
  3812. Values("VUID-BaryCoordKHR-BaryCoordKHR-04156 "
  3813. "VUID-BaryCoordNoPerspKHR-BaryCoordNoPerspKHR-04162 "),
  3814. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3815. "needs to be a 3-component 32-bit float vector"))));
  3816. } // namespace
  3817. } // namespace val
  3818. } // namespace spvtools