val_builtins_test.cpp 180 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124
  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 = spvtest::ValidateBase<
  57. std::tuple<const char*, const char*, const char*, const char*, TestResult>>;
  58. using ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult =
  59. spvtest::ValidateBase<
  60. std::tuple<const char*, const char*, const char*, const char*,
  61. const char*, const char*, const char*, TestResult>>;
  62. using ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult =
  63. spvtest::ValidateBase<std::tuple<spv_target_env, const char*, const char*,
  64. const char*, const char*, const char*,
  65. const char*, const char*, TestResult>>;
  66. bool InitializerRequired(const char* const storage_class) {
  67. return (strncmp(storage_class, "Output", 6) == 0 ||
  68. strncmp(storage_class, "Private", 7) == 0 ||
  69. strncmp(storage_class, "Function", 8) == 0);
  70. }
  71. CodeGenerator GetInMainCodeGenerator(const char* const built_in,
  72. const char* const execution_model,
  73. const char* const storage_class,
  74. const char* const capabilities,
  75. const char* const extensions,
  76. const char* const data_type) {
  77. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  78. if (capabilities) {
  79. generator.capabilities_ += capabilities;
  80. }
  81. if (extensions) {
  82. generator.extensions_ += extensions;
  83. }
  84. generator.before_types_ = "OpMemberDecorate %built_in_type 0 BuiltIn ";
  85. generator.before_types_ += built_in;
  86. generator.before_types_ += "\n";
  87. std::ostringstream after_types;
  88. after_types << "%built_in_type = OpTypeStruct " << data_type << "\n";
  89. if (InitializerRequired(storage_class)) {
  90. after_types << "%built_in_null = OpConstantNull %built_in_type\n";
  91. }
  92. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  93. << " %built_in_type\n";
  94. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  95. if (InitializerRequired(storage_class)) {
  96. after_types << " %built_in_null";
  97. }
  98. after_types << "\n";
  99. after_types << "%data_ptr = OpTypePointer " << storage_class << " "
  100. << data_type << "\n";
  101. generator.after_types_ = after_types.str();
  102. EntryPoint entry_point;
  103. entry_point.name = "main";
  104. entry_point.execution_model = execution_model;
  105. if (strncmp(storage_class, "Input", 5) == 0 ||
  106. strncmp(storage_class, "Output", 6) == 0) {
  107. entry_point.interfaces = "%built_in_var";
  108. }
  109. std::ostringstream execution_modes;
  110. if (0 == std::strcmp(execution_model, "Fragment")) {
  111. execution_modes << "OpExecutionMode %" << entry_point.name
  112. << " OriginUpperLeft\n";
  113. if (0 == std::strcmp(built_in, "FragDepth")) {
  114. execution_modes << "OpExecutionMode %" << entry_point.name
  115. << " DepthReplacing\n";
  116. }
  117. }
  118. if (0 == std::strcmp(execution_model, "Geometry")) {
  119. execution_modes << "OpExecutionMode %" << entry_point.name
  120. << " InputPoints\n";
  121. execution_modes << "OpExecutionMode %" << entry_point.name
  122. << " OutputPoints\n";
  123. }
  124. if (0 == std::strcmp(execution_model, "GLCompute")) {
  125. execution_modes << "OpExecutionMode %" << entry_point.name
  126. << " LocalSize 1 1 1\n";
  127. }
  128. entry_point.execution_modes = execution_modes.str();
  129. entry_point.body = R"(
  130. %ptr = OpAccessChain %data_ptr %built_in_var %u32_0
  131. )";
  132. generator.entry_points_.push_back(std::move(entry_point));
  133. return generator;
  134. }
  135. TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InMain) {
  136. const char* const built_in = std::get<0>(GetParam());
  137. const char* const execution_model = std::get<1>(GetParam());
  138. const char* const storage_class = std::get<2>(GetParam());
  139. const char* const data_type = std::get<3>(GetParam());
  140. const char* const vuid = std::get<4>(GetParam());
  141. const TestResult& test_result = std::get<5>(GetParam());
  142. CodeGenerator generator = GetInMainCodeGenerator(
  143. built_in, execution_model, storage_class, NULL, NULL, data_type);
  144. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  145. ASSERT_EQ(test_result.validation_result,
  146. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  147. if (test_result.error_str) {
  148. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  149. }
  150. if (test_result.error_str2) {
  151. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  152. }
  153. if (vuid) {
  154. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  155. }
  156. }
  157. TEST_P(
  158. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  159. InMain) {
  160. const char* const built_in = std::get<0>(GetParam());
  161. const char* const execution_model = std::get<1>(GetParam());
  162. const char* const storage_class = std::get<2>(GetParam());
  163. const char* const data_type = std::get<3>(GetParam());
  164. const char* const capabilities = std::get<4>(GetParam());
  165. const char* const extensions = std::get<5>(GetParam());
  166. const char* const vuid = std::get<6>(GetParam());
  167. const TestResult& test_result = std::get<7>(GetParam());
  168. CodeGenerator generator =
  169. GetInMainCodeGenerator(built_in, execution_model, storage_class,
  170. capabilities, extensions, data_type);
  171. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  172. ASSERT_EQ(test_result.validation_result,
  173. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  174. if (test_result.error_str) {
  175. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  176. }
  177. if (test_result.error_str2) {
  178. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  179. }
  180. if (vuid) {
  181. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  182. }
  183. }
  184. TEST_P(
  185. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  186. InMain) {
  187. const spv_target_env env = std::get<0>(GetParam());
  188. const char* const built_in = std::get<1>(GetParam());
  189. const char* const execution_model = std::get<2>(GetParam());
  190. const char* const storage_class = std::get<3>(GetParam());
  191. const char* const data_type = std::get<4>(GetParam());
  192. const char* const capabilities = std::get<5>(GetParam());
  193. const char* const extensions = std::get<6>(GetParam());
  194. const char* const vuid = std::get<7>(GetParam());
  195. const TestResult& test_result = std::get<8>(GetParam());
  196. CodeGenerator generator =
  197. GetInMainCodeGenerator(built_in, execution_model, storage_class,
  198. capabilities, extensions, data_type);
  199. CompileSuccessfully(generator.Build(), env);
  200. ASSERT_EQ(test_result.validation_result, ValidateInstructions(env));
  201. if (test_result.error_str) {
  202. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  203. }
  204. if (test_result.error_str2) {
  205. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  206. }
  207. if (vuid) {
  208. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  209. }
  210. }
  211. CodeGenerator GetInFunctionCodeGenerator(const char* const built_in,
  212. const char* const execution_model,
  213. const char* const storage_class,
  214. const char* const capabilities,
  215. const char* const extensions,
  216. const char* const data_type) {
  217. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  218. if (capabilities) {
  219. generator.capabilities_ += capabilities;
  220. }
  221. if (extensions) {
  222. generator.extensions_ += extensions;
  223. }
  224. generator.before_types_ = "OpMemberDecorate %built_in_type 0 BuiltIn ";
  225. generator.before_types_ += built_in;
  226. generator.before_types_ += "\n";
  227. std::ostringstream after_types;
  228. after_types << "%built_in_type = OpTypeStruct " << data_type << "\n";
  229. if (InitializerRequired(storage_class)) {
  230. after_types << "%built_in_null = OpConstantNull %built_in_type\n";
  231. }
  232. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  233. << " %built_in_type\n";
  234. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  235. if (InitializerRequired(storage_class)) {
  236. after_types << " %built_in_null";
  237. }
  238. after_types << "\n";
  239. after_types << "%data_ptr = OpTypePointer " << storage_class << " "
  240. << data_type << "\n";
  241. generator.after_types_ = after_types.str();
  242. EntryPoint entry_point;
  243. entry_point.name = "main";
  244. entry_point.execution_model = execution_model;
  245. if (strncmp(storage_class, "Input", 5) == 0 ||
  246. strncmp(storage_class, "Output", 6) == 0) {
  247. entry_point.interfaces = "%built_in_var";
  248. }
  249. std::ostringstream execution_modes;
  250. if (0 == std::strcmp(execution_model, "Fragment")) {
  251. execution_modes << "OpExecutionMode %" << entry_point.name
  252. << " OriginUpperLeft\n";
  253. if (0 == std::strcmp(built_in, "FragDepth")) {
  254. execution_modes << "OpExecutionMode %" << entry_point.name
  255. << " DepthReplacing\n";
  256. }
  257. }
  258. if (0 == std::strcmp(execution_model, "Geometry")) {
  259. execution_modes << "OpExecutionMode %" << entry_point.name
  260. << " InputPoints\n";
  261. execution_modes << "OpExecutionMode %" << entry_point.name
  262. << " OutputPoints\n";
  263. }
  264. if (0 == std::strcmp(execution_model, "GLCompute")) {
  265. execution_modes << "OpExecutionMode %" << entry_point.name
  266. << " LocalSize 1 1 1\n";
  267. }
  268. entry_point.execution_modes = execution_modes.str();
  269. entry_point.body = R"(
  270. %val2 = OpFunctionCall %void %foo
  271. )";
  272. std::string function_body = R"(
  273. %foo = OpFunction %void None %func
  274. %foo_entry = OpLabel
  275. %ptr = OpAccessChain %data_ptr %built_in_var %u32_0
  276. OpReturn
  277. OpFunctionEnd
  278. )";
  279. generator.add_at_the_end_ = function_body;
  280. generator.entry_points_.push_back(std::move(entry_point));
  281. return generator;
  282. }
  283. TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, InFunction) {
  284. const char* const built_in = std::get<0>(GetParam());
  285. const char* const execution_model = std::get<1>(GetParam());
  286. const char* const storage_class = std::get<2>(GetParam());
  287. const char* const data_type = std::get<3>(GetParam());
  288. const char* const vuid = std::get<4>(GetParam());
  289. const TestResult& test_result = std::get<5>(GetParam());
  290. CodeGenerator generator = GetInFunctionCodeGenerator(
  291. built_in, execution_model, storage_class, NULL, NULL, data_type);
  292. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  293. ASSERT_EQ(test_result.validation_result,
  294. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  295. if (test_result.error_str) {
  296. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  297. }
  298. if (test_result.error_str2) {
  299. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  300. }
  301. if (vuid) {
  302. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  303. }
  304. }
  305. TEST_P(
  306. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  307. InFunction) {
  308. const char* const built_in = std::get<0>(GetParam());
  309. const char* const execution_model = std::get<1>(GetParam());
  310. const char* const storage_class = std::get<2>(GetParam());
  311. const char* const data_type = std::get<3>(GetParam());
  312. const char* const capabilities = std::get<4>(GetParam());
  313. const char* const extensions = std::get<5>(GetParam());
  314. const char* const vuid = std::get<6>(GetParam());
  315. const TestResult& test_result = std::get<7>(GetParam());
  316. CodeGenerator generator =
  317. GetInFunctionCodeGenerator(built_in, execution_model, storage_class,
  318. capabilities, extensions, data_type);
  319. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  320. ASSERT_EQ(test_result.validation_result,
  321. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  322. if (test_result.error_str) {
  323. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  324. }
  325. if (test_result.error_str2) {
  326. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  327. }
  328. if (vuid) {
  329. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  330. }
  331. }
  332. CodeGenerator GetVariableCodeGenerator(const char* const built_in,
  333. const char* const execution_model,
  334. const char* const storage_class,
  335. const char* const capabilities,
  336. const char* const extensions,
  337. const char* const data_type) {
  338. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  339. if (capabilities) {
  340. generator.capabilities_ += capabilities;
  341. }
  342. if (extensions) {
  343. generator.extensions_ += extensions;
  344. }
  345. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  346. generator.before_types_ += built_in;
  347. generator.before_types_ += "\n";
  348. std::ostringstream after_types;
  349. if (InitializerRequired(storage_class)) {
  350. after_types << "%built_in_null = OpConstantNull " << data_type << "\n";
  351. }
  352. after_types << "%built_in_ptr = OpTypePointer " << storage_class << " "
  353. << data_type << "\n";
  354. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  355. if (InitializerRequired(storage_class)) {
  356. after_types << " %built_in_null";
  357. }
  358. after_types << "\n";
  359. generator.after_types_ = after_types.str();
  360. EntryPoint entry_point;
  361. entry_point.name = "main";
  362. entry_point.execution_model = execution_model;
  363. if (strncmp(storage_class, "Input", 5) == 0 ||
  364. strncmp(storage_class, "Output", 6) == 0) {
  365. entry_point.interfaces = "%built_in_var";
  366. }
  367. // Any kind of reference would do.
  368. entry_point.body = R"(
  369. %val = OpBitcast %u32 %built_in_var
  370. )";
  371. std::ostringstream execution_modes;
  372. if (0 == std::strcmp(execution_model, "Fragment")) {
  373. execution_modes << "OpExecutionMode %" << entry_point.name
  374. << " OriginUpperLeft\n";
  375. if (0 == std::strcmp(built_in, "FragDepth")) {
  376. execution_modes << "OpExecutionMode %" << entry_point.name
  377. << " DepthReplacing\n";
  378. }
  379. }
  380. if (0 == std::strcmp(execution_model, "Geometry")) {
  381. execution_modes << "OpExecutionMode %" << entry_point.name
  382. << " InputPoints\n";
  383. execution_modes << "OpExecutionMode %" << entry_point.name
  384. << " OutputPoints\n";
  385. }
  386. if (0 == std::strcmp(execution_model, "GLCompute")) {
  387. execution_modes << "OpExecutionMode %" << entry_point.name
  388. << " LocalSize 1 1 1\n";
  389. }
  390. entry_point.execution_modes = execution_modes.str();
  391. generator.entry_points_.push_back(std::move(entry_point));
  392. return generator;
  393. }
  394. TEST_P(ValidateVulkanCombineBuiltInExecutionModelDataTypeResult, Variable) {
  395. const char* const built_in = std::get<0>(GetParam());
  396. const char* const execution_model = std::get<1>(GetParam());
  397. const char* const storage_class = std::get<2>(GetParam());
  398. const char* const data_type = std::get<3>(GetParam());
  399. const char* const vuid = std::get<4>(GetParam());
  400. const TestResult& test_result = std::get<5>(GetParam());
  401. CodeGenerator generator = GetVariableCodeGenerator(
  402. built_in, execution_model, storage_class, NULL, NULL, data_type);
  403. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  404. ASSERT_EQ(test_result.validation_result,
  405. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  406. if (test_result.error_str) {
  407. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  408. }
  409. if (test_result.error_str2) {
  410. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  411. }
  412. if (vuid) {
  413. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  414. }
  415. }
  416. TEST_P(
  417. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  418. Variable) {
  419. const char* const built_in = std::get<0>(GetParam());
  420. const char* const execution_model = std::get<1>(GetParam());
  421. const char* const storage_class = std::get<2>(GetParam());
  422. const char* const data_type = std::get<3>(GetParam());
  423. const char* const capabilities = std::get<4>(GetParam());
  424. const char* const extensions = std::get<5>(GetParam());
  425. const char* const vuid = std::get<6>(GetParam());
  426. const TestResult& test_result = std::get<7>(GetParam());
  427. CodeGenerator generator =
  428. GetVariableCodeGenerator(built_in, execution_model, storage_class,
  429. capabilities, extensions, data_type);
  430. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  431. ASSERT_EQ(test_result.validation_result,
  432. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  433. if (test_result.error_str) {
  434. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  435. }
  436. if (test_result.error_str2) {
  437. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  438. }
  439. if (vuid) {
  440. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  441. }
  442. }
  443. INSTANTIATE_TEST_SUITE_P(
  444. ClipAndCullDistanceOutputSuccess,
  445. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  446. Combine(Values("ClipDistance", "CullDistance"),
  447. Values("Vertex", "Geometry", "TessellationControl",
  448. "TessellationEvaluation"),
  449. Values("Output"), Values("%f32arr2", "%f32arr4"), Values(nullptr),
  450. Values(TestResult())));
  451. INSTANTIATE_TEST_SUITE_P(
  452. ClipAndCullDistanceInputSuccess,
  453. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  454. Combine(Values("ClipDistance", "CullDistance"),
  455. Values("Fragment", "Geometry", "TessellationControl",
  456. "TessellationEvaluation"),
  457. Values("Input"), Values("%f32arr2", "%f32arr4"), Values(nullptr),
  458. Values(TestResult())));
  459. INSTANTIATE_TEST_SUITE_P(
  460. ClipAndCullDistanceInvalidStorageClass,
  461. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  462. Combine(Values("ClipDistance", "CullDistance"),
  463. Values("Vertex", "Geometry", "TessellationControl",
  464. "TessellationEvaluation"),
  465. Values("Private"), Values("%f32arr2", "%f32arr4"),
  466. Values("VUID-ClipDistance-ClipDistance-04190 "
  467. "VUID-CullDistance-CullDistance-04199"),
  468. Values(TestResult(
  469. SPV_ERROR_INVALID_DATA,
  470. "to be only used for variables with Input or Output storage "
  471. "class."))));
  472. INSTANTIATE_TEST_SUITE_P(
  473. ClipAndCullDistanceFragmentOutput,
  474. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  475. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  476. Values("Output"), Values("%f32arr4"),
  477. Values("VUID-ClipDistance-ClipDistance-04189 "
  478. "VUID-CullDistance-CullDistance-04198"),
  479. Values(TestResult(
  480. SPV_ERROR_INVALID_DATA,
  481. "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance "
  482. "to be used for variables with Output storage class if "
  483. "execution model is Fragment.",
  484. "which is called with execution model Fragment."))));
  485. INSTANTIATE_TEST_SUITE_P(
  486. VertexIdVertexInput,
  487. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  488. Combine(
  489. Values("VertexId"), Values("Vertex"), Values("Input"), Values("%u32"),
  490. Values(nullptr),
  491. Values(TestResult(SPV_ERROR_INVALID_DATA,
  492. "Vulkan spec doesn't allow BuiltIn VertexId to be "
  493. "used."))));
  494. INSTANTIATE_TEST_SUITE_P(
  495. ClipAndCullDistanceVertexInput,
  496. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  497. Combine(Values("ClipDistance", "CullDistance"), Values("Vertex"),
  498. Values("Input"), Values("%f32arr4"),
  499. Values("VUID-ClipDistance-ClipDistance-04188 "
  500. "VUID-CullDistance-CullDistance-04197"),
  501. Values(TestResult(
  502. SPV_ERROR_INVALID_DATA,
  503. "Vulkan spec doesn't allow BuiltIn ClipDistance/CullDistance "
  504. "to be used for variables with Input storage class if "
  505. "execution model is Vertex.",
  506. "which is called with execution model Vertex."))));
  507. INSTANTIATE_TEST_SUITE_P(
  508. ClipAndCullInvalidExecutionModel,
  509. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  510. Combine(Values("ClipDistance", "CullDistance"), Values("GLCompute"),
  511. Values("Input", "Output"), Values("%f32arr4"),
  512. Values("VUID-ClipDistance-ClipDistance-04187 "
  513. "VUID-CullDistance-CullDistance-04196"),
  514. Values(TestResult(
  515. SPV_ERROR_INVALID_DATA,
  516. "to be used only with Fragment, Vertex, TessellationControl, "
  517. "TessellationEvaluation or Geometry execution models"))));
  518. INSTANTIATE_TEST_SUITE_P(
  519. ClipAndCullDistanceNotArray,
  520. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  521. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  522. Values("Input"), Values("%f32vec2", "%f32vec4", "%f32"),
  523. Values("VUID-ClipDistance-ClipDistance-04191 "
  524. "VUID-CullDistance-CullDistance-04200"),
  525. Values(TestResult(SPV_ERROR_INVALID_DATA,
  526. "needs to be a 32-bit float array",
  527. "is not an array"))));
  528. INSTANTIATE_TEST_SUITE_P(
  529. ClipAndCullDistanceNotFloatArray,
  530. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  531. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  532. Values("Input"), Values("%u32arr2", "%u64arr4"),
  533. Values("VUID-ClipDistance-ClipDistance-04191 "
  534. "VUID-CullDistance-CullDistance-04200"),
  535. Values(TestResult(SPV_ERROR_INVALID_DATA,
  536. "needs to be a 32-bit float array",
  537. "components are not float scalar"))));
  538. INSTANTIATE_TEST_SUITE_P(
  539. ClipAndCullDistanceNotF32Array,
  540. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  541. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  542. Values("Input"), Values("%f64arr2", "%f64arr4"),
  543. Values("VUID-ClipDistance-ClipDistance-04191 "
  544. "VUID-CullDistance-CullDistance-04200"),
  545. Values(TestResult(SPV_ERROR_INVALID_DATA,
  546. "needs to be a 32-bit float array",
  547. "has components with bit width 64"))));
  548. INSTANTIATE_TEST_SUITE_P(
  549. FragCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  550. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  551. Values("%f32vec4"), Values(nullptr), Values(TestResult())));
  552. INSTANTIATE_TEST_SUITE_P(
  553. FragCoordNotFragment,
  554. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  555. Combine(
  556. Values("FragCoord"),
  557. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  558. "TessellationEvaluation"),
  559. Values("Input"), Values("%f32vec4"),
  560. Values("VUID-FragCoord-FragCoord-04210"),
  561. Values(TestResult(SPV_ERROR_INVALID_DATA,
  562. "to be used only with Fragment execution model"))));
  563. INSTANTIATE_TEST_SUITE_P(
  564. FragCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  565. Combine(Values("FragCoord"), Values("Fragment"), Values("Output"),
  566. Values("%f32vec4"), Values("VUID-FragCoord-FragCoord-04211"),
  567. Values(TestResult(
  568. SPV_ERROR_INVALID_DATA,
  569. "to be only used for variables with Input storage class",
  570. "uses storage class Output"))));
  571. INSTANTIATE_TEST_SUITE_P(
  572. FragCoordNotFloatVector,
  573. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  574. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  575. Values("%f32arr4", "%u32vec4"),
  576. Values("VUID-FragCoord-FragCoord-04212"),
  577. Values(TestResult(SPV_ERROR_INVALID_DATA,
  578. "needs to be a 4-component 32-bit float vector",
  579. "is not a float vector"))));
  580. INSTANTIATE_TEST_SUITE_P(
  581. FragCoordNotFloatVec4,
  582. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  583. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  584. Values("%f32vec3"), Values("VUID-FragCoord-FragCoord-04212"),
  585. Values(TestResult(SPV_ERROR_INVALID_DATA,
  586. "needs to be a 4-component 32-bit float vector",
  587. "has 3 components"))));
  588. INSTANTIATE_TEST_SUITE_P(
  589. FragCoordNotF32Vec4,
  590. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  591. Combine(Values("FragCoord"), Values("Fragment"), Values("Input"),
  592. Values("%f64vec4"), 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 components with bit width 64"))));
  596. INSTANTIATE_TEST_SUITE_P(
  597. FragDepthSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  598. Combine(Values("FragDepth"), Values("Fragment"), Values("Output"),
  599. Values("%f32"), Values(nullptr), Values(TestResult())));
  600. INSTANTIATE_TEST_SUITE_P(
  601. FragDepthNotFragment,
  602. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  603. Combine(
  604. Values("FragDepth"),
  605. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  606. "TessellationEvaluation"),
  607. Values("Output"), Values("%f32"),
  608. Values("VUID-FragDepth-FragDepth-04213"),
  609. Values(TestResult(SPV_ERROR_INVALID_DATA,
  610. "to be used only with Fragment execution model"))));
  611. INSTANTIATE_TEST_SUITE_P(
  612. FragDepthNotOutput,
  613. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  614. Combine(Values("FragDepth"), Values("Fragment"), Values("Input"),
  615. Values("%f32"), Values("VUID-FragDepth-FragDepth-04214"),
  616. Values(TestResult(
  617. SPV_ERROR_INVALID_DATA,
  618. "to be only used for variables with Output storage class",
  619. "uses storage class Input"))));
  620. INSTANTIATE_TEST_SUITE_P(
  621. FragDepthNotFloatScalar,
  622. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  623. Combine(Values("FragDepth"), Values("Fragment"), Values("Output"),
  624. Values("%f32vec4", "%u32"),
  625. Values("VUID-FragDepth-FragDepth-04215"),
  626. Values(TestResult(SPV_ERROR_INVALID_DATA,
  627. "needs to be a 32-bit float scalar",
  628. "is not a float scalar"))));
  629. INSTANTIATE_TEST_SUITE_P(
  630. FragDepthNotF32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  631. Combine(Values("FragDepth"), Values("Fragment"), Values("Output"),
  632. Values("%f64"), Values("VUID-FragDepth-FragDepth-04215"),
  633. Values(TestResult(SPV_ERROR_INVALID_DATA,
  634. "needs to be a 32-bit float scalar",
  635. "has bit width 64"))));
  636. INSTANTIATE_TEST_SUITE_P(
  637. FrontFacingAndHelperInvocationSuccess,
  638. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  639. Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"),
  640. Values("Input"), Values("%bool"), Values(nullptr),
  641. Values(TestResult())));
  642. INSTANTIATE_TEST_SUITE_P(
  643. FrontFacingAndHelperInvocationNotFragment,
  644. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  645. Combine(
  646. Values("FrontFacing", "HelperInvocation"),
  647. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  648. "TessellationEvaluation"),
  649. Values("Input"), Values("%bool"),
  650. Values("VUID-FrontFacing-FrontFacing-04229 "
  651. "VUID-HelperInvocation-HelperInvocation-04239"),
  652. Values(TestResult(SPV_ERROR_INVALID_DATA,
  653. "to be used only with Fragment execution model"))));
  654. INSTANTIATE_TEST_SUITE_P(
  655. FrontFacingAndHelperInvocationNotInput,
  656. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  657. Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"),
  658. Values("Output"), Values("%bool"),
  659. Values("VUID-FrontFacing-FrontFacing-04230 "
  660. "VUID-HelperInvocation-HelperInvocation-04240"),
  661. Values(TestResult(
  662. SPV_ERROR_INVALID_DATA,
  663. "to be only used for variables with Input storage class",
  664. "uses storage class Output"))));
  665. INSTANTIATE_TEST_SUITE_P(
  666. FrontFacingAndHelperInvocationNotBool,
  667. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  668. Combine(Values("FrontFacing", "HelperInvocation"), Values("Fragment"),
  669. Values("Input"), Values("%f32", "%u32"),
  670. Values("VUID-FrontFacing-FrontFacing-04231 "
  671. "VUID-HelperInvocation-HelperInvocation-04241"),
  672. Values(TestResult(SPV_ERROR_INVALID_DATA,
  673. "needs to be a bool scalar",
  674. "is not a bool scalar"))));
  675. INSTANTIATE_TEST_SUITE_P(
  676. ComputeShaderInputInt32Vec3Success,
  677. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  678. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  679. "WorkgroupId"),
  680. Values("GLCompute"), Values("Input"), Values("%u32vec3"),
  681. Values(nullptr), Values(TestResult())));
  682. INSTANTIATE_TEST_SUITE_P(
  683. ComputeShaderInputInt32Vec3NotGLCompute,
  684. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  685. Combine(
  686. Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  687. "WorkgroupId"),
  688. Values("Vertex", "Fragment", "Geometry", "TessellationControl",
  689. "TessellationEvaluation"),
  690. Values("Input"), Values("%u32vec3"),
  691. Values("VUID-GlobalInvocationId-GlobalInvocationId-04236 "
  692. "VUID-LocalInvocationId-LocalInvocationId-04281 "
  693. "VUID-NumWorkgroups-NumWorkgroups-04296 "
  694. "VUID-WorkgroupId-WorkgroupId-04422"),
  695. Values(TestResult(SPV_ERROR_INVALID_DATA,
  696. "to be used only with GLCompute execution model"))));
  697. INSTANTIATE_TEST_SUITE_P(
  698. ComputeShaderInputInt32Vec3NotInput,
  699. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  700. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  701. "WorkgroupId"),
  702. Values("GLCompute"), Values("Output"), Values("%u32vec3"),
  703. Values("VUID-GlobalInvocationId-GlobalInvocationId-04237 "
  704. "VUID-LocalInvocationId-LocalInvocationId-04282 "
  705. "VUID-NumWorkgroups-NumWorkgroups-04297 "
  706. "VUID-WorkgroupId-WorkgroupId-04423"),
  707. Values(TestResult(
  708. SPV_ERROR_INVALID_DATA,
  709. "to be only used for variables with Input storage class",
  710. "uses storage class Output"))));
  711. INSTANTIATE_TEST_SUITE_P(
  712. ComputeShaderInputInt32Vec3NotIntVector,
  713. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  714. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  715. "WorkgroupId"),
  716. Values("GLCompute"), Values("Input"),
  717. Values("%u32arr3", "%f32vec3"),
  718. Values("VUID-GlobalInvocationId-GlobalInvocationId-04238 "
  719. "VUID-LocalInvocationId-LocalInvocationId-04283 "
  720. "VUID-NumWorkgroups-NumWorkgroups-04298 "
  721. "VUID-WorkgroupId-WorkgroupId-04424"),
  722. Values(TestResult(SPV_ERROR_INVALID_DATA,
  723. "needs to be a 3-component 32-bit int vector",
  724. "is not an int vector"))));
  725. INSTANTIATE_TEST_SUITE_P(
  726. ComputeShaderInputInt32Vec3NotIntVec3,
  727. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  728. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  729. "WorkgroupId"),
  730. Values("GLCompute"), Values("Input"), Values("%u32vec4"),
  731. Values("VUID-GlobalInvocationId-GlobalInvocationId-04238 "
  732. "VUID-LocalInvocationId-LocalInvocationId-04283 "
  733. "VUID-NumWorkgroups-NumWorkgroups-04298 "
  734. "VUID-WorkgroupId-WorkgroupId-04424"),
  735. Values(TestResult(SPV_ERROR_INVALID_DATA,
  736. "needs to be a 3-component 32-bit int vector",
  737. "has 4 components"))));
  738. INSTANTIATE_TEST_SUITE_P(
  739. ComputeShaderInputInt32Vec3NotInt32Vec,
  740. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  741. Combine(Values("GlobalInvocationId", "LocalInvocationId", "NumWorkgroups",
  742. "WorkgroupId"),
  743. Values("GLCompute"), Values("Input"), Values("%u64vec3"),
  744. Values("VUID-GlobalInvocationId-GlobalInvocationId-04238 "
  745. "VUID-LocalInvocationId-LocalInvocationId-04283 "
  746. "VUID-NumWorkgroups-NumWorkgroups-04298 "
  747. "VUID-WorkgroupId-WorkgroupId-04424"),
  748. Values(TestResult(SPV_ERROR_INVALID_DATA,
  749. "needs to be a 3-component 32-bit int vector",
  750. "has components with bit width 64"))));
  751. INSTANTIATE_TEST_SUITE_P(
  752. InvocationIdSuccess,
  753. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  754. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  755. Values("Input"), Values("%u32"), Values(nullptr),
  756. Values(TestResult())));
  757. INSTANTIATE_TEST_SUITE_P(
  758. InvocationIdInvalidExecutionModel,
  759. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  760. Combine(Values("InvocationId"),
  761. Values("Vertex", "Fragment", "GLCompute", "TessellationEvaluation"),
  762. Values("Input"), Values("%u32"),
  763. Values("VUID-InvocationId-InvocationId-04257"),
  764. Values(TestResult(SPV_ERROR_INVALID_DATA,
  765. "to be used only with TessellationControl or "
  766. "Geometry execution models"))));
  767. INSTANTIATE_TEST_SUITE_P(
  768. InvocationIdNotInput,
  769. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  770. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  771. Values("Output"), Values("%u32"),
  772. Values("VUID-InvocationId-InvocationId-04258"),
  773. Values(TestResult(
  774. SPV_ERROR_INVALID_DATA,
  775. "to be only used for variables with Input storage class",
  776. "uses storage class Output"))));
  777. INSTANTIATE_TEST_SUITE_P(
  778. InvocationIdNotIntScalar,
  779. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  780. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  781. Values("Input"), Values("%f32", "%u32vec3"),
  782. Values("VUID-InvocationId-InvocationId-04259"),
  783. Values(TestResult(SPV_ERROR_INVALID_DATA,
  784. "needs to be a 32-bit int scalar",
  785. "is not an int scalar"))));
  786. INSTANTIATE_TEST_SUITE_P(
  787. InvocationIdNotInt32,
  788. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  789. Combine(Values("InvocationId"), Values("Geometry", "TessellationControl"),
  790. Values("Input"), Values("%u64"),
  791. Values("VUID-InvocationId-InvocationId-04259"),
  792. Values(TestResult(SPV_ERROR_INVALID_DATA,
  793. "needs to be a 32-bit int scalar",
  794. "has bit width 64"))));
  795. INSTANTIATE_TEST_SUITE_P(
  796. InstanceIndexSuccess,
  797. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  798. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"),
  799. Values("%u32"), Values(nullptr), Values(TestResult())));
  800. INSTANTIATE_TEST_SUITE_P(
  801. InstanceIndexInvalidExecutionModel,
  802. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  803. Combine(Values("InstanceIndex"),
  804. Values("Geometry", "Fragment", "GLCompute", "TessellationControl",
  805. "TessellationEvaluation"),
  806. Values("Input"), Values("%u32"),
  807. Values("VUID-InstanceIndex-InstanceIndex-04263"),
  808. Values(TestResult(SPV_ERROR_INVALID_DATA,
  809. "to be used only with Vertex execution model"))));
  810. INSTANTIATE_TEST_SUITE_P(
  811. InstanceIndexNotInput,
  812. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  813. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Output"),
  814. Values("%u32"), Values("VUID-InstanceIndex-InstanceIndex-04264"),
  815. Values(TestResult(
  816. SPV_ERROR_INVALID_DATA,
  817. "to be only used for variables with Input storage class",
  818. "uses storage class Output"))));
  819. INSTANTIATE_TEST_SUITE_P(
  820. InstanceIndexNotIntScalar,
  821. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  822. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"),
  823. Values("%f32", "%u32vec3"),
  824. Values("VUID-InstanceIndex-InstanceIndex-04265"),
  825. Values(TestResult(SPV_ERROR_INVALID_DATA,
  826. "needs to be a 32-bit int scalar",
  827. "is not an int scalar"))));
  828. INSTANTIATE_TEST_SUITE_P(
  829. InstanceIndexNotInt32,
  830. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  831. Combine(Values("InstanceIndex"), Values("Vertex"), Values("Input"),
  832. Values("%u64"), Values("VUID-InstanceIndex-InstanceIndex-04265"),
  833. Values(TestResult(SPV_ERROR_INVALID_DATA,
  834. "needs to be a 32-bit int scalar",
  835. "has bit width 64"))));
  836. INSTANTIATE_TEST_SUITE_P(
  837. LayerAndViewportIndexInputSuccess,
  838. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  839. Combine(Values("Layer", "ViewportIndex"), Values("Fragment"),
  840. Values("Input"), Values("%u32"), Values(nullptr),
  841. Values(TestResult())));
  842. INSTANTIATE_TEST_SUITE_P(
  843. LayerAndViewportIndexOutputSuccess,
  844. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  845. Combine(Values("Layer", "ViewportIndex"), Values("Geometry"),
  846. Values("Output"), Values("%u32"), Values(nullptr),
  847. Values(TestResult())));
  848. INSTANTIATE_TEST_SUITE_P(
  849. LayerAndViewportIndexInvalidExecutionModel,
  850. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  851. Combine(
  852. Values("Layer", "ViewportIndex"),
  853. Values("TessellationControl", "GLCompute"), Values("Input"),
  854. Values("%u32"),
  855. Values("VUID-Layer-Layer-04272 VUID-ViewportIndex-ViewportIndex-04404"),
  856. Values(
  857. TestResult(SPV_ERROR_INVALID_DATA,
  858. "to be used only with Vertex, TessellationEvaluation, "
  859. "Geometry, or Fragment execution models"))));
  860. INSTANTIATE_TEST_SUITE_P(
  861. ViewportIndexExecutionModelEnabledByCapability,
  862. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  863. Combine(Values("ViewportIndex"), Values("Vertex", "TessellationEvaluation"),
  864. Values("Output"), Values("%u32"),
  865. Values("VUID-ViewportIndex-ViewportIndex-04405"),
  866. Values(TestResult(
  867. SPV_ERROR_INVALID_DATA,
  868. "ShaderViewportIndexLayerEXT or ShaderViewportIndex"))));
  869. INSTANTIATE_TEST_SUITE_P(
  870. LayerExecutionModelEnabledByCapability,
  871. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  872. Combine(Values("Layer"), Values("Vertex", "TessellationEvaluation"),
  873. Values("Output"), Values("%u32"), Values("VUID-Layer-Layer-04273"),
  874. Values(TestResult(SPV_ERROR_INVALID_DATA,
  875. "ShaderViewportIndexLayerEXT or ShaderLayer"))));
  876. INSTANTIATE_TEST_SUITE_P(
  877. LayerAndViewportIndexFragmentNotInput,
  878. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  879. Combine(
  880. Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Output"),
  881. Values("%u32"),
  882. Values("VUID-Layer-Layer-04275 VUID-ViewportIndex-ViewportIndex-04407"),
  883. Values(TestResult(SPV_ERROR_INVALID_DATA,
  884. "Output storage class if execution model is Fragment",
  885. "which is called with execution model Fragment"))));
  886. INSTANTIATE_TEST_SUITE_P(
  887. LayerAndViewportIndexGeometryNotOutput,
  888. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  889. Combine(
  890. Values("Layer", "ViewportIndex"),
  891. Values("Vertex", "TessellationEvaluation", "Geometry"), Values("Input"),
  892. Values("%u32"),
  893. Values("VUID-Layer-Layer-04274 VUID-ViewportIndex-ViewportIndex-04406"),
  894. Values(TestResult(SPV_ERROR_INVALID_DATA,
  895. "Input storage class if execution model is Vertex, "
  896. "TessellationEvaluation, Geometry, or MeshNV",
  897. "which is called with execution model"))));
  898. INSTANTIATE_TEST_SUITE_P(
  899. LayerAndViewportIndexNotIntScalar,
  900. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  901. Combine(
  902. Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Input"),
  903. Values("%f32", "%u32vec3"),
  904. Values("VUID-Layer-Layer-04276 VUID-ViewportIndex-ViewportIndex-04408"),
  905. Values(TestResult(SPV_ERROR_INVALID_DATA,
  906. "needs to be a 32-bit int scalar",
  907. "is not an int scalar"))));
  908. INSTANTIATE_TEST_SUITE_P(
  909. LayerAndViewportIndexNotInt32,
  910. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  911. Combine(
  912. Values("Layer", "ViewportIndex"), Values("Fragment"), Values("Input"),
  913. Values("%u64"),
  914. Values("VUID-Layer-Layer-04276 VUID-ViewportIndex-ViewportIndex-04408"),
  915. Values(TestResult(SPV_ERROR_INVALID_DATA,
  916. "needs to be a 32-bit int scalar",
  917. "has bit width 64"))));
  918. INSTANTIATE_TEST_SUITE_P(
  919. LayerCapability,
  920. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  921. Combine(Values(SPV_ENV_VULKAN_1_2), Values("Layer"), Values("Vertex"),
  922. Values("Output"), Values("%u32"),
  923. Values("OpCapability ShaderLayer\n"), Values(nullptr),
  924. Values(nullptr), Values(TestResult())));
  925. INSTANTIATE_TEST_SUITE_P(
  926. ViewportIndexCapability,
  927. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  928. Combine(Values(SPV_ENV_VULKAN_1_2), Values("ViewportIndex"),
  929. Values("Vertex"), Values("Output"), Values("%u32"),
  930. Values("OpCapability ShaderViewportIndex\n"), Values(nullptr),
  931. Values(nullptr), Values(TestResult())));
  932. INSTANTIATE_TEST_SUITE_P(
  933. PatchVerticesSuccess,
  934. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  935. Combine(Values("PatchVertices"),
  936. Values("TessellationEvaluation", "TessellationControl"),
  937. Values("Input"), Values("%u32"), Values(nullptr),
  938. Values(TestResult())));
  939. INSTANTIATE_TEST_SUITE_P(
  940. PatchVerticesInvalidExecutionModel,
  941. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  942. Combine(Values("PatchVertices"),
  943. Values("Vertex", "Fragment", "GLCompute", "Geometry"),
  944. Values("Input"), Values("%u32"),
  945. Values("VUID-PatchVertices-PatchVertices-04308"),
  946. Values(TestResult(SPV_ERROR_INVALID_DATA,
  947. "to be used only with TessellationControl or "
  948. "TessellationEvaluation execution models"))));
  949. INSTANTIATE_TEST_SUITE_P(
  950. PatchVerticesNotInput,
  951. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  952. Combine(Values("PatchVertices"),
  953. Values("TessellationEvaluation", "TessellationControl"),
  954. Values("Output"), Values("%u32"),
  955. Values("VUID-PatchVertices-PatchVertices-04309"),
  956. Values(TestResult(
  957. SPV_ERROR_INVALID_DATA,
  958. "to be only used for variables with Input storage class",
  959. "uses storage class Output"))));
  960. INSTANTIATE_TEST_SUITE_P(
  961. PatchVerticesNotIntScalar,
  962. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  963. Combine(Values("PatchVertices"),
  964. Values("TessellationEvaluation", "TessellationControl"),
  965. Values("Input"), Values("%f32", "%u32vec3"),
  966. Values("VUID-PatchVertices-PatchVertices-04310"),
  967. Values(TestResult(SPV_ERROR_INVALID_DATA,
  968. "needs to be a 32-bit int scalar",
  969. "is not an int scalar"))));
  970. INSTANTIATE_TEST_SUITE_P(
  971. PatchVerticesNotInt32,
  972. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  973. Combine(Values("PatchVertices"),
  974. Values("TessellationEvaluation", "TessellationControl"),
  975. Values("Input"), Values("%u64"),
  976. Values("VUID-PatchVertices-PatchVertices-04310"),
  977. Values(TestResult(SPV_ERROR_INVALID_DATA,
  978. "needs to be a 32-bit int scalar",
  979. "has bit width 64"))));
  980. INSTANTIATE_TEST_SUITE_P(
  981. PointCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  982. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  983. Values("%f32vec2"), Values(nullptr), Values(TestResult())));
  984. INSTANTIATE_TEST_SUITE_P(
  985. PointCoordNotFragment,
  986. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  987. Combine(
  988. Values("PointCoord"),
  989. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  990. "TessellationEvaluation"),
  991. Values("Input"), Values("%f32vec2"),
  992. Values("VUID-PointCoord-PointCoord-04311"),
  993. Values(TestResult(SPV_ERROR_INVALID_DATA,
  994. "to be used only with Fragment execution model"))));
  995. INSTANTIATE_TEST_SUITE_P(
  996. PointCoordNotInput,
  997. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  998. Combine(Values("PointCoord"), Values("Fragment"), Values("Output"),
  999. Values("%f32vec2"), Values("VUID-PointCoord-PointCoord-04312"),
  1000. Values(TestResult(
  1001. SPV_ERROR_INVALID_DATA,
  1002. "to be only used for variables with Input storage class",
  1003. "uses storage class Output"))));
  1004. INSTANTIATE_TEST_SUITE_P(
  1005. PointCoordNotFloatVector,
  1006. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1007. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  1008. Values("%f32arr2", "%u32vec2"),
  1009. Values("VUID-PointCoord-PointCoord-04313"),
  1010. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1011. "needs to be a 2-component 32-bit float vector",
  1012. "is not a float vector"))));
  1013. INSTANTIATE_TEST_SUITE_P(
  1014. PointCoordNotFloatVec3,
  1015. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1016. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  1017. Values("%f32vec3"), Values("VUID-PointCoord-PointCoord-04313"),
  1018. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1019. "needs to be a 2-component 32-bit float vector",
  1020. "has 3 components"))));
  1021. INSTANTIATE_TEST_SUITE_P(
  1022. PointCoordNotF32Vec4,
  1023. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1024. Combine(Values("PointCoord"), Values("Fragment"), Values("Input"),
  1025. Values("%f64vec2"), 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 components with bit width 64"))));
  1029. INSTANTIATE_TEST_SUITE_P(
  1030. PointSizeOutputSuccess,
  1031. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1032. Combine(Values("PointSize"),
  1033. Values("Vertex", "Geometry", "TessellationControl",
  1034. "TessellationEvaluation"),
  1035. Values("Output"), Values("%f32"), Values(nullptr),
  1036. Values(TestResult())));
  1037. INSTANTIATE_TEST_SUITE_P(
  1038. PointSizeInputSuccess,
  1039. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1040. Combine(Values("PointSize"),
  1041. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  1042. Values("Input"), Values("%f32"), Values(nullptr),
  1043. Values(TestResult())));
  1044. INSTANTIATE_TEST_SUITE_P(
  1045. PointSizeVertexInput,
  1046. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1047. Combine(Values("PointSize"), Values("Vertex"), Values("Input"),
  1048. Values("%f32"), Values("VUID-PointSize-PointSize-04315"),
  1049. Values(TestResult(
  1050. SPV_ERROR_INVALID_DATA,
  1051. "Vulkan spec doesn't allow BuiltIn PointSize "
  1052. "to be used for variables with Input storage class if "
  1053. "execution model is Vertex.",
  1054. "which is called with execution model Vertex."))));
  1055. INSTANTIATE_TEST_SUITE_P(
  1056. PointSizeInvalidExecutionModel,
  1057. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1058. Combine(Values("PointSize"), Values("GLCompute", "Fragment"),
  1059. Values("Input", "Output"), Values("%f32"),
  1060. Values("VUID-PointSize-PointSize-04314"),
  1061. Values(TestResult(
  1062. SPV_ERROR_INVALID_DATA,
  1063. "to be used only with Vertex, TessellationControl, "
  1064. "TessellationEvaluation or Geometry execution models"))));
  1065. INSTANTIATE_TEST_SUITE_P(
  1066. PointSizeNotFloatScalar,
  1067. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1068. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  1069. Values("%f32vec4", "%u32"),
  1070. Values("VUID-PointSize-PointSize-04317"),
  1071. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1072. "needs to be a 32-bit float scalar",
  1073. "is not a float scalar"))));
  1074. INSTANTIATE_TEST_SUITE_P(
  1075. PointSizeNotF32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1076. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  1077. Values("%f64"), Values("VUID-PointSize-PointSize-04317"),
  1078. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1079. "needs to be a 32-bit float scalar",
  1080. "has bit width 64"))));
  1081. INSTANTIATE_TEST_SUITE_P(
  1082. PositionOutputSuccess,
  1083. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1084. Combine(Values("Position"),
  1085. Values("Vertex", "Geometry", "TessellationControl",
  1086. "TessellationEvaluation"),
  1087. Values("Output"), Values("%f32vec4"), Values(nullptr),
  1088. Values(TestResult())));
  1089. INSTANTIATE_TEST_SUITE_P(
  1090. PositionInputSuccess,
  1091. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1092. Combine(Values("Position"),
  1093. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  1094. Values("Input"), Values("%f32vec4"), Values(nullptr),
  1095. Values(TestResult())));
  1096. INSTANTIATE_TEST_SUITE_P(
  1097. PositionInvalidStorageClass,
  1098. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1099. Combine(Values("Position"),
  1100. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  1101. Values("Private"), Values("%f32vec4"),
  1102. Values("VUID-Position-Position-04320"),
  1103. Values(TestResult(
  1104. SPV_ERROR_INVALID_DATA,
  1105. "Vulkan spec allows BuiltIn Position to be only used for "
  1106. "variables with Input or Output storage class."))));
  1107. INSTANTIATE_TEST_SUITE_P(
  1108. PositionVertexInput,
  1109. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1110. Combine(Values("Position"), Values("Vertex"), Values("Input"),
  1111. Values("%f32vec4"), Values("VUID-Position-Position-04319"),
  1112. Values(TestResult(
  1113. SPV_ERROR_INVALID_DATA,
  1114. "Vulkan spec doesn't allow BuiltIn Position "
  1115. "to be used for variables with Input storage class if "
  1116. "execution model is Vertex.",
  1117. "which is called with execution model Vertex."))));
  1118. INSTANTIATE_TEST_SUITE_P(
  1119. PositionInvalidExecutionModel,
  1120. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1121. Combine(Values("Position"), Values("GLCompute", "Fragment"),
  1122. Values("Input", "Output"), Values("%f32vec4"),
  1123. Values("VUID-Position-Position-04318"),
  1124. Values(TestResult(
  1125. SPV_ERROR_INVALID_DATA,
  1126. "to be used only with Vertex, TessellationControl, "
  1127. "TessellationEvaluation or Geometry execution models"))));
  1128. INSTANTIATE_TEST_SUITE_P(
  1129. PositionNotFloatVector,
  1130. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1131. Combine(Values("Position"), Values("Geometry"), Values("Input"),
  1132. Values("%f32arr4", "%u32vec4"),
  1133. Values("VUID-Position-Position-04321"),
  1134. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1135. "needs to be a 4-component 32-bit float vector",
  1136. "is not a float vector"))));
  1137. INSTANTIATE_TEST_SUITE_P(
  1138. PositionNotFloatVec4,
  1139. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1140. Combine(Values("Position"), Values("Geometry"), Values("Input"),
  1141. Values("%f32vec3"), Values("VUID-Position-Position-04321"),
  1142. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1143. "needs to be a 4-component 32-bit float vector",
  1144. "has 3 components"))));
  1145. INSTANTIATE_TEST_SUITE_P(
  1146. PositionNotF32Vec4,
  1147. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1148. Combine(Values("Position"), Values("Geometry"), Values("Input"),
  1149. Values("%f64vec4"), 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 components with bit width 64"))));
  1153. INSTANTIATE_TEST_SUITE_P(
  1154. PrimitiveIdInputSuccess,
  1155. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1156. Combine(Values("PrimitiveId"),
  1157. Values("Fragment", "TessellationControl", "TessellationEvaluation",
  1158. "Geometry"),
  1159. Values("Input"), Values("%u32"), Values(nullptr),
  1160. Values(TestResult())));
  1161. INSTANTIATE_TEST_SUITE_P(
  1162. PrimitiveIdOutputSuccess,
  1163. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1164. Combine(Values("PrimitiveId"), Values("Geometry"), Values("Output"),
  1165. Values("%u32"), Values(nullptr), Values(TestResult())));
  1166. INSTANTIATE_TEST_SUITE_P(
  1167. PrimitiveIdInvalidExecutionModel,
  1168. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1169. Combine(Values("PrimitiveId"), Values("Vertex", "GLCompute"),
  1170. Values("Input"), Values("%u32"),
  1171. Values("VUID-PrimitiveId-PrimitiveId-04330"),
  1172. Values(TestResult(
  1173. SPV_ERROR_INVALID_DATA,
  1174. "to be used only with Fragment, TessellationControl, "
  1175. "TessellationEvaluation, Geometry, MeshNV, IntersectionKHR, "
  1176. "AnyHitKHR, and ClosestHitKHR execution models"))));
  1177. INSTANTIATE_TEST_SUITE_P(
  1178. PrimitiveIdFragmentNotInput,
  1179. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1180. Combine(
  1181. Values("PrimitiveId"), Values("Fragment"), Values("Output"),
  1182. Values("%u32"), Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1183. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1184. "Output storage class if execution model is Fragment",
  1185. "which is called with execution model Fragment"))));
  1186. INSTANTIATE_TEST_SUITE_P(
  1187. PrimitiveIdTessellationNotInput,
  1188. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1189. Combine(Values("PrimitiveId"),
  1190. Values("TessellationControl", "TessellationEvaluation"),
  1191. Values("Output"), Values("%u32"),
  1192. Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1193. Values(TestResult(
  1194. SPV_ERROR_INVALID_DATA,
  1195. "Output storage class if execution model is Tessellation",
  1196. "which is called with execution model Tessellation"))));
  1197. INSTANTIATE_TEST_SUITE_P(
  1198. PrimitiveIdNotIntScalar,
  1199. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1200. Combine(Values("PrimitiveId"), Values("Fragment"), Values("Input"),
  1201. Values("%f32", "%u32vec3"),
  1202. Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1203. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1204. "needs to be a 32-bit int scalar",
  1205. "is not an int scalar"))));
  1206. INSTANTIATE_TEST_SUITE_P(
  1207. PrimitiveIdNotInt32,
  1208. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1209. Combine(Values("PrimitiveId"), Values("Fragment"), Values("Input"),
  1210. Values("%u64"), Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1211. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1212. "needs to be a 32-bit int scalar",
  1213. "has bit width 64"))));
  1214. INSTANTIATE_TEST_SUITE_P(
  1215. SampleIdSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1216. Combine(Values("SampleId"), Values("Fragment"), Values("Input"),
  1217. Values("%u32"), Values(nullptr), Values(TestResult())));
  1218. INSTANTIATE_TEST_SUITE_P(
  1219. SampleIdInvalidExecutionModel,
  1220. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1221. Combine(
  1222. Values("SampleId"),
  1223. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1224. "TessellationEvaluation"),
  1225. Values("Input"), Values("%u32"), Values("VUID-SampleId-SampleId-04354"),
  1226. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1227. "to be used only with Fragment execution model"))));
  1228. INSTANTIATE_TEST_SUITE_P(
  1229. SampleIdNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1230. Combine(
  1231. Values("SampleId"), Values("Fragment"), Values("Output"),
  1232. Values("%u32"), Values("VUID-SampleId-SampleId-04355"),
  1233. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1234. "Vulkan spec allows BuiltIn SampleId to be only used "
  1235. "for variables with Input storage class"))));
  1236. INSTANTIATE_TEST_SUITE_P(
  1237. SampleIdNotIntScalar,
  1238. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1239. Combine(Values("SampleId"), Values("Fragment"), Values("Input"),
  1240. Values("%f32", "%u32vec3"), Values("VUID-SampleId-SampleId-04356"),
  1241. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1242. "needs to be a 32-bit int scalar",
  1243. "is not an int scalar"))));
  1244. INSTANTIATE_TEST_SUITE_P(
  1245. SampleIdNotInt32, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1246. Combine(Values("SampleId"), Values("Fragment"), Values("Input"),
  1247. Values("%u64"), Values("VUID-SampleId-SampleId-04356"),
  1248. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1249. "needs to be a 32-bit int scalar",
  1250. "has bit width 64"))));
  1251. INSTANTIATE_TEST_SUITE_P(
  1252. SampleMaskSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1253. Combine(Values("SampleMask"), Values("Fragment"), Values("Input", "Output"),
  1254. Values("%u32arr2", "%u32arr4"), Values(nullptr),
  1255. Values(TestResult())));
  1256. INSTANTIATE_TEST_SUITE_P(
  1257. SampleMaskInvalidExecutionModel,
  1258. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1259. Combine(
  1260. Values("SampleMask"),
  1261. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1262. "TessellationEvaluation"),
  1263. Values("Input"), Values("%u32arr2"),
  1264. Values("VUID-SampleMask-SampleMask-04357"),
  1265. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1266. "to be used only with Fragment execution model"))));
  1267. INSTANTIATE_TEST_SUITE_P(
  1268. SampleMaskWrongStorageClass,
  1269. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1270. Combine(Values("SampleMask"), Values("Fragment"), Values("Workgroup"),
  1271. Values("%u32arr2"), Values("VUID-SampleMask-SampleMask-04358"),
  1272. Values(TestResult(
  1273. SPV_ERROR_INVALID_DATA,
  1274. "Vulkan spec allows BuiltIn SampleMask to be only used for "
  1275. "variables with Input or Output storage class"))));
  1276. INSTANTIATE_TEST_SUITE_P(
  1277. SampleMaskNotArray,
  1278. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1279. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1280. Values("%f32", "%u32vec3"),
  1281. Values("VUID-SampleMask-SampleMask-04359"),
  1282. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1283. "needs to be a 32-bit int array",
  1284. "is not an array"))));
  1285. INSTANTIATE_TEST_SUITE_P(
  1286. SampleMaskNotIntArray,
  1287. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1288. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1289. Values("%f32arr2"), Values("VUID-SampleMask-SampleMask-04359"),
  1290. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1291. "needs to be a 32-bit int array",
  1292. "components are not int scalar"))));
  1293. INSTANTIATE_TEST_SUITE_P(
  1294. SampleMaskNotInt32Array,
  1295. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1296. Combine(Values("SampleMask"), Values("Fragment"), Values("Input"),
  1297. Values("%u64arr2"), Values("VUID-SampleMask-SampleMask-04359"),
  1298. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1299. "needs to be a 32-bit int array",
  1300. "has components with bit width 64"))));
  1301. INSTANTIATE_TEST_SUITE_P(
  1302. SamplePositionSuccess,
  1303. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1304. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1305. Values("%f32vec2"), Values(nullptr), Values(TestResult())));
  1306. INSTANTIATE_TEST_SUITE_P(
  1307. SamplePositionNotFragment,
  1308. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1309. Combine(
  1310. Values("SamplePosition"),
  1311. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1312. "TessellationEvaluation"),
  1313. Values("Input"), Values("%f32vec2"),
  1314. Values("VUID-SamplePosition-SamplePosition-04360"),
  1315. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1316. "to be used only with Fragment execution model"))));
  1317. INSTANTIATE_TEST_SUITE_P(
  1318. SamplePositionNotInput,
  1319. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1320. Combine(Values("SamplePosition"), Values("Fragment"), Values("Output"),
  1321. Values("%f32vec2"),
  1322. Values("VUID-SamplePosition-SamplePosition-04361"),
  1323. Values(TestResult(
  1324. SPV_ERROR_INVALID_DATA,
  1325. "to be only used for variables with Input storage class",
  1326. "uses storage class Output"))));
  1327. INSTANTIATE_TEST_SUITE_P(
  1328. SamplePositionNotFloatVector,
  1329. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1330. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1331. Values("%f32arr2", "%u32vec4"),
  1332. Values("VUID-SamplePosition-SamplePosition-04362"),
  1333. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1334. "needs to be a 2-component 32-bit float vector",
  1335. "is not a float vector"))));
  1336. INSTANTIATE_TEST_SUITE_P(
  1337. SamplePositionNotFloatVec2,
  1338. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1339. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1340. Values("%f32vec3"),
  1341. Values("VUID-SamplePosition-SamplePosition-04362"),
  1342. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1343. "needs to be a 2-component 32-bit float vector",
  1344. "has 3 components"))));
  1345. INSTANTIATE_TEST_SUITE_P(
  1346. SamplePositionNotF32Vec2,
  1347. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1348. Combine(Values("SamplePosition"), Values("Fragment"), Values("Input"),
  1349. Values("%f64vec2"),
  1350. Values("VUID-SamplePosition-SamplePosition-04362"),
  1351. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1352. "needs to be a 2-component 32-bit float vector",
  1353. "has components with bit width 64"))));
  1354. INSTANTIATE_TEST_SUITE_P(
  1355. TessCoordSuccess, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1356. Combine(Values("TessCoord"), Values("TessellationEvaluation"),
  1357. Values("Input"), Values("%f32vec3"), Values(nullptr),
  1358. Values(TestResult())));
  1359. INSTANTIATE_TEST_SUITE_P(
  1360. TessCoordNotFragment,
  1361. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1362. Combine(
  1363. Values("TessCoord"),
  1364. Values("Vertex", "GLCompute", "Geometry", "TessellationControl",
  1365. "Fragment"),
  1366. Values("Input"), Values("%f32vec3"),
  1367. Values("VUID-TessCoord-TessCoord-04387"),
  1368. Values(TestResult(
  1369. SPV_ERROR_INVALID_DATA,
  1370. "to be used only with TessellationEvaluation execution model"))));
  1371. INSTANTIATE_TEST_SUITE_P(
  1372. TessCoordNotInput, ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1373. Combine(Values("TessCoord"), Values("Fragment"), Values("Output"),
  1374. Values("%f32vec3"), Values("VUID-TessCoord-TessCoord-04388"),
  1375. Values(TestResult(
  1376. SPV_ERROR_INVALID_DATA,
  1377. "to be only used for variables with Input storage class",
  1378. "uses storage class Output"))));
  1379. INSTANTIATE_TEST_SUITE_P(
  1380. TessCoordNotFloatVector,
  1381. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1382. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1383. Values("%f32arr3", "%u32vec4"),
  1384. Values("VUID-TessCoord-TessCoord-04389"),
  1385. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1386. "needs to be a 3-component 32-bit float vector",
  1387. "is not a float vector"))));
  1388. INSTANTIATE_TEST_SUITE_P(
  1389. TessCoordNotFloatVec3,
  1390. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1391. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1392. Values("%f32vec2"), Values("VUID-TessCoord-TessCoord-04389"),
  1393. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1394. "needs to be a 3-component 32-bit float vector",
  1395. "has 2 components"))));
  1396. INSTANTIATE_TEST_SUITE_P(
  1397. TessCoordNotF32Vec3,
  1398. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1399. Combine(Values("TessCoord"), Values("Fragment"), Values("Input"),
  1400. Values("%f64vec3"), 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 components with bit width 64"))));
  1404. INSTANTIATE_TEST_SUITE_P(
  1405. TessLevelOuterTeseInputSuccess,
  1406. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1407. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1408. Values("Input"), Values("%f32arr4"), Values(nullptr),
  1409. Values(TestResult())));
  1410. INSTANTIATE_TEST_SUITE_P(
  1411. TessLevelOuterTescOutputSuccess,
  1412. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1413. Combine(Values("TessLevelOuter"), Values("TessellationControl"),
  1414. Values("Output"), Values("%f32arr4"), Values(nullptr),
  1415. Values(TestResult())));
  1416. INSTANTIATE_TEST_SUITE_P(
  1417. TessLevelOuterInvalidExecutionModel,
  1418. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1419. Combine(Values("TessLevelOuter"),
  1420. Values("Vertex", "GLCompute", "Geometry", "Fragment"),
  1421. Values("Input"), Values("%f32arr4"),
  1422. Values("VUID-TessLevelOuter-TessLevelOuter-04390"),
  1423. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1424. "to be used only with TessellationControl or "
  1425. "TessellationEvaluation execution models."))));
  1426. INSTANTIATE_TEST_SUITE_P(
  1427. TessLevelOuterOutputTese,
  1428. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1429. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1430. Values("Output"), Values("%f32arr4"),
  1431. Values("VUID-TessLevelOuter-TessLevelOuter-04392"),
  1432. Values(TestResult(
  1433. SPV_ERROR_INVALID_DATA,
  1434. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1435. "used for variables with Output storage class if execution "
  1436. "model is TessellationEvaluation."))));
  1437. INSTANTIATE_TEST_SUITE_P(
  1438. TessLevelOuterInputTesc,
  1439. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1440. Combine(Values("TessLevelOuter"), Values("TessellationControl"),
  1441. Values("Input"), Values("%f32arr4"),
  1442. Values("VUID-TessLevelOuter-TessLevelOuter-04391"),
  1443. Values(TestResult(
  1444. SPV_ERROR_INVALID_DATA,
  1445. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1446. "used for variables with Input storage class if execution "
  1447. "model is TessellationControl."))));
  1448. INSTANTIATE_TEST_SUITE_P(
  1449. TessLevelOuterNotArray,
  1450. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1451. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1452. Values("Input"), Values("%f32vec4", "%f32"),
  1453. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1454. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1455. "needs to be a 4-component 32-bit float array",
  1456. "is not an array"))));
  1457. INSTANTIATE_TEST_SUITE_P(
  1458. TessLevelOuterNotFloatArray,
  1459. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1460. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1461. Values("Input"), Values("%u32arr4"),
  1462. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1463. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1464. "needs to be a 4-component 32-bit float array",
  1465. "components are not float scalar"))));
  1466. INSTANTIATE_TEST_SUITE_P(
  1467. TessLevelOuterNotFloatArr4,
  1468. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1469. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1470. Values("Input"), Values("%f32arr3"),
  1471. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1472. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1473. "needs to be a 4-component 32-bit float array",
  1474. "has 3 components"))));
  1475. INSTANTIATE_TEST_SUITE_P(
  1476. TessLevelOuterNotF32Arr4,
  1477. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1478. Combine(Values("TessLevelOuter"), Values("TessellationEvaluation"),
  1479. Values("Input"), Values("%f64arr4"),
  1480. Values("VUID-TessLevelOuter-TessLevelOuter-04393"),
  1481. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1482. "needs to be a 4-component 32-bit float array",
  1483. "has components with bit width 64"))));
  1484. INSTANTIATE_TEST_SUITE_P(
  1485. TessLevelInnerTeseInputSuccess,
  1486. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1487. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1488. Values("Input"), Values("%f32arr2"), Values(nullptr),
  1489. Values(TestResult())));
  1490. INSTANTIATE_TEST_SUITE_P(
  1491. TessLevelInnerTescOutputSuccess,
  1492. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1493. Combine(Values("TessLevelInner"), Values("TessellationControl"),
  1494. Values("Output"), Values("%f32arr2"), Values(nullptr),
  1495. Values(TestResult())));
  1496. INSTANTIATE_TEST_SUITE_P(
  1497. TessLevelInnerInvalidExecutionModel,
  1498. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1499. Combine(Values("TessLevelInner"),
  1500. Values("Vertex", "GLCompute", "Geometry", "Fragment"),
  1501. Values("Input"), Values("%f32arr2"),
  1502. Values("VUID-TessLevelInner-TessLevelInner-04394"),
  1503. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1504. "to be used only with TessellationControl or "
  1505. "TessellationEvaluation execution models."))));
  1506. INSTANTIATE_TEST_SUITE_P(
  1507. TessLevelInnerOutputTese,
  1508. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1509. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1510. Values("Output"), Values("%f32arr2"),
  1511. Values("VUID-TessLevelInner-TessLevelInner-04396"),
  1512. Values(TestResult(
  1513. SPV_ERROR_INVALID_DATA,
  1514. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1515. "used for variables with Output storage class if execution "
  1516. "model is TessellationEvaluation."))));
  1517. INSTANTIATE_TEST_SUITE_P(
  1518. TessLevelInnerInputTesc,
  1519. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1520. Combine(Values("TessLevelInner"), Values("TessellationControl"),
  1521. Values("Input"), Values("%f32arr2"),
  1522. Values("VUID-TessLevelInner-TessLevelInner-04395"),
  1523. Values(TestResult(
  1524. SPV_ERROR_INVALID_DATA,
  1525. "Vulkan spec doesn't allow TessLevelOuter/TessLevelInner to be "
  1526. "used for variables with Input storage class if execution "
  1527. "model is TessellationControl."))));
  1528. INSTANTIATE_TEST_SUITE_P(
  1529. TessLevelInnerNotArray,
  1530. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1531. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1532. Values("Input"), Values("%f32vec2", "%f32"),
  1533. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1534. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1535. "needs to be a 2-component 32-bit float array",
  1536. "is not an array"))));
  1537. INSTANTIATE_TEST_SUITE_P(
  1538. TessLevelInnerNotFloatArray,
  1539. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1540. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1541. Values("Input"), Values("%u32arr2"),
  1542. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1543. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1544. "needs to be a 2-component 32-bit float array",
  1545. "components are not float scalar"))));
  1546. INSTANTIATE_TEST_SUITE_P(
  1547. TessLevelInnerNotFloatArr2,
  1548. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1549. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1550. Values("Input"), Values("%f32arr3"),
  1551. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1552. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1553. "needs to be a 2-component 32-bit float array",
  1554. "has 3 components"))));
  1555. INSTANTIATE_TEST_SUITE_P(
  1556. TessLevelInnerNotF32Arr2,
  1557. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1558. Combine(Values("TessLevelInner"), Values("TessellationEvaluation"),
  1559. Values("Input"), Values("%f64arr2"),
  1560. Values("VUID-TessLevelInner-TessLevelInner-04397"),
  1561. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1562. "needs to be a 2-component 32-bit float array",
  1563. "has components with bit width 64"))));
  1564. INSTANTIATE_TEST_SUITE_P(
  1565. VertexIndexSuccess,
  1566. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1567. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1568. Values("%u32"), Values(nullptr), Values(TestResult())));
  1569. INSTANTIATE_TEST_SUITE_P(
  1570. VertexIndexInvalidExecutionModel,
  1571. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1572. Combine(Values("VertexIndex"),
  1573. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1574. "TessellationEvaluation"),
  1575. Values("Input"), Values("%u32"),
  1576. Values("VUID-VertexIndex-VertexIndex-04398"),
  1577. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1578. "to be used only with Vertex execution model"))));
  1579. INSTANTIATE_TEST_SUITE_P(
  1580. VertexIndexNotInput,
  1581. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1582. Combine(
  1583. Values("VertexIndex"), Values("Vertex"), Values("Output"),
  1584. Values("%u32"), Values("VUID-VertexIndex-VertexIndex-04399"),
  1585. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1586. "Vulkan spec allows BuiltIn VertexIndex to be only "
  1587. "used for variables with Input storage class"))));
  1588. INSTANTIATE_TEST_SUITE_P(
  1589. VertexIndexNotIntScalar,
  1590. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1591. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1592. Values("%f32", "%u32vec3"),
  1593. Values("VUID-VertexIndex-VertexIndex-04400"),
  1594. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1595. "needs to be a 32-bit int scalar",
  1596. "is not an int scalar"))));
  1597. INSTANTIATE_TEST_SUITE_P(
  1598. VertexIndexNotInt32,
  1599. ValidateVulkanCombineBuiltInExecutionModelDataTypeResult,
  1600. Combine(Values("VertexIndex"), Values("Vertex"), Values("Input"),
  1601. Values("%u64"), Values("VUID-VertexIndex-VertexIndex-04400"),
  1602. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1603. "needs to be a 32-bit int scalar",
  1604. "has bit width 64"))));
  1605. INSTANTIATE_TEST_SUITE_P(
  1606. BaseInstanceOrVertexSuccess,
  1607. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1608. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1609. Values("Input"), Values("%u32"),
  1610. Values("OpCapability DrawParameters\n"),
  1611. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1612. Values(nullptr), Values(TestResult())));
  1613. INSTANTIATE_TEST_SUITE_P(
  1614. BaseInstanceOrVertexInvalidExecutionModel,
  1615. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1616. Combine(Values("BaseInstance", "BaseVertex"),
  1617. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1618. "TessellationEvaluation"),
  1619. Values("Input"), Values("%u32"),
  1620. Values("OpCapability DrawParameters\n"),
  1621. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1622. Values("VUID-BaseInstance-BaseInstance-04181 "
  1623. "VUID-BaseVertex-BaseVertex-04184"),
  1624. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1625. "to be used only with Vertex execution model"))));
  1626. INSTANTIATE_TEST_SUITE_P(
  1627. BaseInstanceOrVertexNotInput,
  1628. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1629. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1630. Values("Output"), Values("%u32"),
  1631. Values("OpCapability DrawParameters\n"),
  1632. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1633. Values("VUID-BaseInstance-BaseInstance-04182 "
  1634. "VUID-BaseVertex-BaseVertex-04185"),
  1635. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1636. "used for variables with Input storage class"))));
  1637. INSTANTIATE_TEST_SUITE_P(
  1638. BaseInstanceOrVertexNotIntScalar,
  1639. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1640. Combine(Values("BaseInstance", "BaseVertex"), Values("Vertex"),
  1641. Values("Input"), Values("%f32", "%u32vec3"),
  1642. Values("OpCapability DrawParameters\n"),
  1643. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1644. Values("VUID-BaseInstance-BaseInstance-04183 "
  1645. "VUID-BaseVertex-BaseVertex-04186"),
  1646. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1647. "needs to be a 32-bit int scalar",
  1648. "is not an int scalar"))));
  1649. INSTANTIATE_TEST_SUITE_P(
  1650. DrawIndexSuccess,
  1651. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1652. Combine(Values("DrawIndex"), Values("Vertex"), Values("Input"),
  1653. Values("%u32"), Values("OpCapability DrawParameters\n"),
  1654. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1655. Values(nullptr), Values(TestResult())));
  1656. INSTANTIATE_TEST_SUITE_P(
  1657. DrawIndexMeshSuccess,
  1658. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1659. Combine(
  1660. Values("DrawIndex"), Values("MeshNV", "TaskNV"), Values("Input"),
  1661. Values("%u32"), Values("OpCapability MeshShadingNV\n"),
  1662. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\nOpExtension "
  1663. "\"SPV_NV_mesh_shader\"\n"),
  1664. Values(nullptr), Values(TestResult())));
  1665. INSTANTIATE_TEST_SUITE_P(
  1666. DrawIndexInvalidExecutionModel,
  1667. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1668. Combine(Values("DrawIndex"),
  1669. Values("Fragment", "GLCompute", "Geometry", "TessellationControl",
  1670. "TessellationEvaluation"),
  1671. Values("Input"), Values("%u32"),
  1672. Values("OpCapability DrawParameters\n"),
  1673. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1674. Values("VUID-DrawIndex-DrawIndex-04207"),
  1675. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1676. "to be used only with Vertex, MeshNV, or TaskNV "
  1677. "execution model"))));
  1678. INSTANTIATE_TEST_SUITE_P(
  1679. DrawIndexNotInput,
  1680. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1681. Combine(Values("DrawIndex"), Values("Vertex"), Values("Output"),
  1682. Values("%u32"), Values("OpCapability DrawParameters\n"),
  1683. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1684. Values("VUID-DrawIndex-DrawIndex-04208"),
  1685. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1686. "used for variables with Input storage class"))));
  1687. INSTANTIATE_TEST_SUITE_P(
  1688. DrawIndexNotIntScalar,
  1689. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1690. Combine(Values("DrawIndex"), Values("Vertex"), Values("Input"),
  1691. Values("%f32", "%u32vec3"), Values("OpCapability DrawParameters\n"),
  1692. Values("OpExtension \"SPV_KHR_shader_draw_parameters\"\n"),
  1693. Values("VUID-DrawIndex-DrawIndex-04209"),
  1694. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1695. "needs to be a 32-bit int scalar",
  1696. "is not an int scalar"))));
  1697. INSTANTIATE_TEST_SUITE_P(
  1698. ViewIndexSuccess,
  1699. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1700. Combine(Values("ViewIndex"),
  1701. Values("Fragment", "Vertex", "Geometry", "TessellationControl",
  1702. "TessellationEvaluation"),
  1703. Values("Input"), Values("%u32"), Values("OpCapability MultiView\n"),
  1704. Values("OpExtension \"SPV_KHR_multiview\"\n"), Values(nullptr),
  1705. Values(TestResult())));
  1706. INSTANTIATE_TEST_SUITE_P(
  1707. ViewIndexInvalidExecutionModel,
  1708. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1709. Combine(Values("ViewIndex"), Values("GLCompute"), Values("Input"),
  1710. Values("%u32"), Values("OpCapability MultiView\n"),
  1711. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1712. Values("VUID-ViewIndex-ViewIndex-04401"),
  1713. Values(TestResult(
  1714. SPV_ERROR_INVALID_DATA,
  1715. "to be not be used with GLCompute execution model"))));
  1716. INSTANTIATE_TEST_SUITE_P(
  1717. ViewIndexNotInput,
  1718. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1719. Combine(Values("ViewIndex"), Values("Vertex"), Values("Output"),
  1720. Values("%u32"), Values("OpCapability MultiView\n"),
  1721. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1722. Values("VUID-ViewIndex-ViewIndex-04402"),
  1723. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1724. "used for variables with Input storage class"))));
  1725. INSTANTIATE_TEST_SUITE_P(
  1726. ViewIndexNotIntScalar,
  1727. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1728. Combine(Values("ViewIndex"), Values("Vertex"), Values("Input"),
  1729. Values("%f32", "%u32vec3"), Values("OpCapability MultiView\n"),
  1730. Values("OpExtension \"SPV_KHR_multiview\"\n"),
  1731. Values("VUID-ViewIndex-ViewIndex-04403"),
  1732. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1733. "needs to be a 32-bit int scalar",
  1734. "is not an int scalar"))));
  1735. INSTANTIATE_TEST_SUITE_P(
  1736. DeviceIndexSuccess,
  1737. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1738. Combine(Values("DeviceIndex"),
  1739. Values("Fragment", "Vertex", "Geometry", "TessellationControl",
  1740. "TessellationEvaluation", "GLCompute"),
  1741. Values("Input"), Values("%u32"),
  1742. Values("OpCapability DeviceGroup\n"),
  1743. Values("OpExtension \"SPV_KHR_device_group\"\n"), Values(nullptr),
  1744. Values(TestResult())));
  1745. INSTANTIATE_TEST_SUITE_P(
  1746. DeviceIndexNotInput,
  1747. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1748. Combine(Values("DeviceIndex"), Values("Fragment", "Vertex", "GLCompute"),
  1749. Values("Output"), Values("%u32"),
  1750. Values("OpCapability DeviceGroup\n"),
  1751. Values("OpExtension \"SPV_KHR_device_group\"\n"),
  1752. Values("VUID-DeviceIndex-DeviceIndex-04205"),
  1753. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1754. "used for variables with Input storage class"))));
  1755. INSTANTIATE_TEST_SUITE_P(
  1756. DeviceIndexNotIntScalar,
  1757. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1758. Combine(Values("DeviceIndex"), Values("Fragment", "Vertex", "GLCompute"),
  1759. Values("Input"), Values("%f32", "%u32vec3"),
  1760. Values("OpCapability DeviceGroup\n"),
  1761. Values("OpExtension \"SPV_KHR_device_group\"\n"),
  1762. Values("VUID-DeviceIndex-DeviceIndex-04206"),
  1763. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1764. "needs to be a 32-bit int scalar",
  1765. "is not an int scalar"))));
  1766. // Test HitKind in NV RT shaders
  1767. INSTANTIATE_TEST_SUITE_P(
  1768. HitKindNVSuccess,
  1769. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1770. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindNV"),
  1771. Values("AnyHitNV", "ClosestHitNV"), Values("Input"), Values("%u32"),
  1772. Values("OpCapability RayTracingNV\n"),
  1773. Values("OpExtension \"SPV_NV_ray_tracing\"\n"), Values(nullptr),
  1774. Values(TestResult())));
  1775. // HitKind is valid in AH, CH shaders as input i32 scalar
  1776. INSTANTIATE_TEST_SUITE_P(
  1777. HitKindSuccess,
  1778. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1779. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1780. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1781. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1782. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1783. Values(TestResult())));
  1784. INSTANTIATE_TEST_SUITE_P(
  1785. HitKindNotExecutionMode,
  1786. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1787. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1788. Values("Vertex", "Fragment", "TessellationControl",
  1789. "TessellationEvaluation", "Geometry", "Fragment",
  1790. "GLCompute", "RayGenerationKHR", "IntersectionKHR",
  1791. "MissKHR", "CallableKHR"),
  1792. Values("Input"), Values("%u32"),
  1793. Values("OpCapability RayTracingKHR\n"),
  1794. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1795. Values("VUID-HitKindKHR-HitKindKHR-04242"),
  1796. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1797. "Vulkan spec does not allow BuiltIn",
  1798. "to be used with the execution model"))));
  1799. INSTANTIATE_TEST_SUITE_P(
  1800. HitKindNotInput,
  1801. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1802. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1803. Values("AnyHitKHR", "ClosestHitKHR"), Values("Output"),
  1804. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1805. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1806. Values("VUID-HitKindKHR-HitKindKHR-04243"),
  1807. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1808. "used for variables with Input storage class"))));
  1809. INSTANTIATE_TEST_SUITE_P(
  1810. HitKindNotIntScalar,
  1811. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1812. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitKindKHR"),
  1813. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1814. Values("%f32", "%u32vec3"), Values("OpCapability RayTracingKHR\n"),
  1815. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1816. Values("VUID-HitKindKHR-HitKindKHR-04244"),
  1817. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1818. "needs to be a 32-bit int scalar",
  1819. "is not an int scalar"))));
  1820. // Ensure HitT is not supported in KHR RT shaders
  1821. INSTANTIATE_TEST_SUITE_P(
  1822. HitTNVNotSupportedInKHR,
  1823. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1824. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1825. Values("AnyHitKHR", "ClosestHitKHR"), Values("Input"),
  1826. Values("%u32"), Values("OpCapability RayTracingKHR\n"),
  1827. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1828. Values(TestResult(
  1829. SPV_ERROR_INVALID_CAPABILITY,
  1830. "of MemberDecorate requires one of these capabilities"))));
  1831. // HitT is valid in AH, CH shaders as input f32 scalar (NV RT only)
  1832. INSTANTIATE_TEST_SUITE_P(
  1833. HitTNVSuccess,
  1834. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1835. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1836. Values("AnyHitNV", "ClosestHitNV"), Values("Input"), Values("%f32"),
  1837. Values("OpCapability RayTracingNV\n"),
  1838. Values("OpExtension \"SPV_NV_ray_tracing\"\n"), Values(nullptr),
  1839. Values(TestResult())));
  1840. INSTANTIATE_TEST_SUITE_P(
  1841. HitTNVNotExecutionMode,
  1842. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1843. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1844. Values("Vertex", "Fragment", "TessellationControl",
  1845. "TessellationEvaluation", "Geometry", "Fragment",
  1846. "GLCompute", "RayGenerationNV", "IntersectionNV", "MissNV",
  1847. "CallableNV"),
  1848. Values("Input"), Values("%f32"),
  1849. Values("OpCapability RayTracingNV\n"),
  1850. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1851. Values("VUID-HitTNV-HitTNV-04245"),
  1852. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1853. "Vulkan spec does not allow BuiltIn",
  1854. "to be used with the execution model"))));
  1855. INSTANTIATE_TEST_SUITE_P(
  1856. HitTNVNotInput,
  1857. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1858. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1859. Values("AnyHitNV", "ClosestHitNV"), Values("Output"),
  1860. Values("%f32"), Values("OpCapability RayTracingNV\n"),
  1861. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1862. Values("VUID-HitTNV-HitTNV-04246"),
  1863. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1864. "used for variables with Input storage class"))));
  1865. INSTANTIATE_TEST_SUITE_P(
  1866. HitTNVNotIntScalar,
  1867. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1868. Combine(Values(SPV_ENV_VULKAN_1_2), Values("HitTNV"),
  1869. Values("AnyHitNV", "ClosestHitNV"), Values("Input"),
  1870. Values("%u32", "%f32vec3"), Values("OpCapability RayTracingNV\n"),
  1871. Values("OpExtension \"SPV_NV_ray_tracing\"\n"),
  1872. Values("VUID-HitTNV-HitTNV-04247"),
  1873. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1874. "needs to be a 32-bit float scalar",
  1875. "is not a float scalar"))));
  1876. // InstanceCustomIndexKHR, InstanceId, PrimitiveId, RayGeometryIndexKHR are
  1877. // valid in IS, AH, CH shaders as input i32 scalars
  1878. INSTANTIATE_TEST_SUITE_P(
  1879. RTBuiltIn3StageI32Success,
  1880. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1881. Combine(Values(SPV_ENV_VULKAN_1_2),
  1882. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1883. "InstanceId", "PrimitiveId"),
  1884. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1885. Values("Input"), Values("%u32"),
  1886. Values("OpCapability RayTracingKHR\n"),
  1887. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1888. Values(TestResult())));
  1889. INSTANTIATE_TEST_SUITE_P(
  1890. RTBuiltIn3StageI32NotExecutionMode,
  1891. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1892. Combine(Values(SPV_ENV_VULKAN_1_2),
  1893. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1894. "InstanceId"),
  1895. Values("Vertex", "Fragment", "TessellationControl",
  1896. "TessellationEvaluation", "Geometry", "Fragment",
  1897. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  1898. Values("Input"), Values("%u32"),
  1899. Values("OpCapability RayTracingKHR\n"),
  1900. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1901. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04251 "
  1902. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04345 "
  1903. "VUID-InstanceId-InstanceId-04254 "),
  1904. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1905. "Vulkan spec does not allow BuiltIn",
  1906. "to be used with the execution model"))));
  1907. INSTANTIATE_TEST_SUITE_P(
  1908. RTBuiltIn3StageI32NotInput,
  1909. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1910. Combine(Values(SPV_ENV_VULKAN_1_2),
  1911. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1912. "InstanceId"),
  1913. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1914. Values("Output"), Values("%u32"),
  1915. Values("OpCapability RayTracingKHR\n"),
  1916. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1917. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04252 "
  1918. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04346 "
  1919. "VUID-InstanceId-InstanceId-04255 "),
  1920. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  1921. "used for variables with Input storage class"))));
  1922. INSTANTIATE_TEST_SUITE_P(
  1923. RTBuiltIn3StageI32NotIntScalar,
  1924. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1925. Combine(Values(SPV_ENV_VULKAN_1_2),
  1926. Values("InstanceCustomIndexKHR", "RayGeometryIndexKHR",
  1927. "InstanceId"),
  1928. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1929. Values("Input"), Values("%f32", "%u32vec3"),
  1930. Values("OpCapability RayTracingKHR\n"),
  1931. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1932. Values("VUID-InstanceCustomIndexKHR-InstanceCustomIndexKHR-04253 "
  1933. "VUID-RayGeometryIndexKHR-RayGeometryIndexKHR-04347 "
  1934. "VUID-InstanceId-InstanceId-04256 "),
  1935. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1936. "needs to be a 32-bit int scalar",
  1937. "is not an int scalar"))));
  1938. // PrimitiveId needs special negative testing because it has non-RT uses
  1939. INSTANTIATE_TEST_SUITE_P(
  1940. PrimitiveIdRTNotExecutionMode,
  1941. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1942. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1943. Values("RayGenerationKHR", "MissKHR", "CallableKHR"),
  1944. Values("Input"), Values("%u32"),
  1945. Values("OpCapability RayTracingKHR\n"),
  1946. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1947. Values("VUID-PrimitiveId-PrimitiveId-04330"),
  1948. Values(TestResult(
  1949. SPV_ERROR_INVALID_DATA,
  1950. "to be used only with Fragment, TessellationControl, "
  1951. "TessellationEvaluation, Geometry, MeshNV, IntersectionKHR, "
  1952. "AnyHitKHR, and ClosestHitKHR execution models"))));
  1953. INSTANTIATE_TEST_SUITE_P(
  1954. PrimitiveIdRTNotInput,
  1955. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1956. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1957. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1958. Values("Output"), Values("%u32"),
  1959. Values("OpCapability RayTracingKHR\n"),
  1960. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1961. Values("VUID-PrimitiveId-PrimitiveId-04334"),
  1962. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1963. "Output storage class if execution model is "))));
  1964. INSTANTIATE_TEST_SUITE_P(
  1965. PrimitiveIdRTNotIntScalar,
  1966. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1967. Combine(Values(SPV_ENV_VULKAN_1_2), Values("PrimitiveId"),
  1968. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1969. Values("Input"), Values("%f32", "%u32vec3"),
  1970. Values("OpCapability RayTracingKHR\n"),
  1971. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1972. Values("VUID-PrimitiveId-PrimitiveId-04337"),
  1973. Values(TestResult(SPV_ERROR_INVALID_DATA,
  1974. "needs to be a 32-bit int scalar",
  1975. "is not an int scalar"))));
  1976. // ObjectRayDirectionKHR and ObjectRayOriginKHR valid
  1977. // in IS, AH, CH shaders as input 32-bit float vec3
  1978. INSTANTIATE_TEST_SUITE_P(
  1979. ObjectRayDirectionAndOriginSuccess,
  1980. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1981. Combine(Values(SPV_ENV_VULKAN_1_2),
  1982. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  1983. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  1984. Values("Input"), Values("%f32vec3"),
  1985. Values("OpCapability RayTracingKHR\n"),
  1986. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  1987. Values(TestResult())));
  1988. INSTANTIATE_TEST_SUITE_P(
  1989. ObjectRayDirectionAndOriginNotExecutionMode,
  1990. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  1991. Combine(Values(SPV_ENV_VULKAN_1_2),
  1992. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  1993. Values("Vertex", "Fragment", "TessellationControl",
  1994. "TessellationEvaluation", "Geometry", "Fragment",
  1995. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  1996. Values("Input"), Values("%f32vec3"),
  1997. Values("OpCapability RayTracingKHR\n"),
  1998. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  1999. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04299 "
  2000. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04302 "),
  2001. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2002. "Vulkan spec does not allow BuiltIn",
  2003. "to be used with the execution model"))));
  2004. INSTANTIATE_TEST_SUITE_P(
  2005. ObjectRayDirectionAndOriginNotInput,
  2006. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2007. Combine(Values(SPV_ENV_VULKAN_1_2),
  2008. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2009. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2010. Values("Output"), Values("%f32vec3"),
  2011. Values("OpCapability RayTracingKHR\n"),
  2012. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2013. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04300 "
  2014. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04303 "),
  2015. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2016. "used for variables with Input storage class"))));
  2017. INSTANTIATE_TEST_SUITE_P(
  2018. ObjectRayDirectionAndOriginNotFloatVec3,
  2019. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2020. Combine(
  2021. Values(SPV_ENV_VULKAN_1_2),
  2022. Values("ObjectRayDirectionKHR", "ObjectRayOriginKHR"),
  2023. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2024. Values("Input"), Values("%u32vec3", "%f32", "%f32vec2", "%f32vec4"),
  2025. Values("OpCapability RayTracingKHR\n"),
  2026. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2027. Values("VUID-ObjectRayDirectionKHR-ObjectRayDirectionKHR-04301 "
  2028. "VUID-ObjectRayOriginKHR-ObjectRayOriginKHR-04304 "),
  2029. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2030. "needs to be a 3-component 32-bit float vector"))));
  2031. // ObjectToWorldKHR and WorldToObjectKHR valid
  2032. // in IS, AH, CH shaders as input mat4x3
  2033. INSTANTIATE_TEST_SUITE_P(
  2034. RTObjectMatrixSuccess,
  2035. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2036. Combine(Values(SPV_ENV_VULKAN_1_2),
  2037. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2038. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2039. Values("Input"), Values("%f32mat34"),
  2040. Values("OpCapability RayTracingKHR\n"),
  2041. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2042. Values(TestResult())));
  2043. INSTANTIATE_TEST_SUITE_P(
  2044. RTObjectMatrixNotExecutionMode,
  2045. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2046. Combine(Values(SPV_ENV_VULKAN_1_2),
  2047. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2048. Values("Vertex", "Fragment", "TessellationControl",
  2049. "TessellationEvaluation", "Geometry", "Fragment",
  2050. "GLCompute", "RayGenerationKHR", "MissKHR", "CallableKHR"),
  2051. Values("Input"), Values("%f32mat34"),
  2052. Values("OpCapability RayTracingKHR\n"),
  2053. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2054. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04305 "
  2055. "VUID-WorldToObjectKHR-WorldToObjectKHR-04434 "),
  2056. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2057. "Vulkan spec does not allow BuiltIn",
  2058. "to be used with the execution model"))));
  2059. INSTANTIATE_TEST_SUITE_P(
  2060. RTObjectMatrixNotInput,
  2061. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2062. Combine(Values(SPV_ENV_VULKAN_1_2),
  2063. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2064. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2065. Values("Output"), Values("%f32mat34"),
  2066. Values("OpCapability RayTracingKHR\n"),
  2067. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2068. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04306 "
  2069. "VUID-WorldToObjectKHR-WorldToObjectKHR-04435 "),
  2070. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2071. "used for variables with Input storage class"))));
  2072. INSTANTIATE_TEST_SUITE_P(
  2073. RTObjectMatrixNotMat4x3,
  2074. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2075. Combine(Values(SPV_ENV_VULKAN_1_2),
  2076. Values("ObjectToWorldKHR", "WorldToObjectKHR"),
  2077. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR"),
  2078. Values("Input"), Values("%f32mat43", "%f32mat44", "%f32vec4"),
  2079. Values("OpCapability RayTracingKHR\n"),
  2080. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2081. Values("VUID-ObjectToWorldKHR-ObjectToWorldKHR-04307 "
  2082. "VUID-WorldToObjectKHR-WorldToObjectKHR-04436 "),
  2083. Values(TestResult(
  2084. SPV_ERROR_INVALID_DATA,
  2085. "variable needs to be a matrix with "
  2086. "4 columns of 3-component vectors of 32-bit floats"))));
  2087. // IncomingRayFlagsKHR is valid
  2088. // in IS, AH, CH, MS shaders as an input i32 scalar
  2089. INSTANTIATE_TEST_SUITE_P(
  2090. IncomingRayFlagsSuccess,
  2091. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2092. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2093. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2094. Values("Input"), Values("%u32"),
  2095. Values("OpCapability RayTracingKHR\n"),
  2096. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2097. Values(TestResult())));
  2098. INSTANTIATE_TEST_SUITE_P(
  2099. IncomingRayFlagsNotExecutionMode,
  2100. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2101. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2102. Values("Vertex", "Fragment", "TessellationControl",
  2103. "TessellationEvaluation", "Geometry", "Fragment",
  2104. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2105. Values("Input"), Values("%u32"),
  2106. Values("OpCapability RayTracingKHR\n"),
  2107. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2108. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248 "
  2109. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2110. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2111. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2112. "Vulkan spec does not allow BuiltIn",
  2113. "to be used with the execution model"))));
  2114. INSTANTIATE_TEST_SUITE_P(
  2115. IncomingRayFlagsNotInput,
  2116. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2117. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2118. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2119. Values("Output"), Values("%u32"),
  2120. Values("OpCapability RayTracingKHR\n"),
  2121. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2122. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249 "
  2123. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2124. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2125. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2126. "used for variables with Input storage class"))));
  2127. INSTANTIATE_TEST_SUITE_P(
  2128. IncomingRayFlagsNotIntScalar,
  2129. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2130. Combine(Values(SPV_ENV_VULKAN_1_2), Values("IncomingRayFlagsKHR"),
  2131. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2132. Values("Input"), Values("%f32", "%u32vec3"),
  2133. Values("OpCapability RayTracingKHR\n"),
  2134. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2135. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250 "
  2136. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2137. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2138. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2139. "needs to be a 32-bit int scalar",
  2140. "is not an int scalar"))));
  2141. // RayTmaxKHR, RayTminKHR are all valid
  2142. // in IS, AH, CH, MS shaders as input f32 scalars
  2143. INSTANTIATE_TEST_SUITE_P(
  2144. RayTSuccess,
  2145. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2146. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2147. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2148. Values("Input"), Values("%f32"),
  2149. Values("OpCapability RayTracingKHR\n"),
  2150. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2151. Values(TestResult())));
  2152. INSTANTIATE_TEST_SUITE_P(
  2153. RayTNotExecutionMode,
  2154. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2155. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2156. Values("Vertex", "Fragment", "TessellationControl",
  2157. "TessellationEvaluation", "Geometry", "Fragment",
  2158. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2159. Values("Input"), Values("%f32"),
  2160. Values("OpCapability RayTracingKHR\n"),
  2161. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2162. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04248 "
  2163. "VUID-RayTmaxKHR-RayTmaxKHR-04348 "
  2164. "VUID-RayTminKHR-RayTminKHR-04351 "),
  2165. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2166. "Vulkan spec does not allow BuiltIn",
  2167. "to be used with the execution model"))));
  2168. INSTANTIATE_TEST_SUITE_P(
  2169. RayTNotInput,
  2170. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2171. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2172. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2173. Values("Output"), Values("%f32"),
  2174. Values("OpCapability RayTracingKHR\n"),
  2175. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2176. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04249 "
  2177. "VUID-RayTmaxKHR-RayTmaxKHR-04349 "
  2178. "VUID-RayTminKHR-RayTminKHR-04352 "),
  2179. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2180. "used for variables with Input storage class"))));
  2181. INSTANTIATE_TEST_SUITE_P(
  2182. RayTNotFloatScalar,
  2183. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2184. Combine(Values(SPV_ENV_VULKAN_1_2), Values("RayTmaxKHR", "RayTminKHR"),
  2185. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2186. Values("Input"), Values("%u32", "%f32vec3"),
  2187. Values("OpCapability RayTracingKHR\n"),
  2188. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2189. Values("VUID-IncomingRayFlagsKHR-IncomingRayFlagsKHR-04250 "
  2190. "VUID-RayTmaxKHR-RayTmaxKHR-04350 "
  2191. "VUID-RayTminKHR-RayTminKHR-04353 "),
  2192. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2193. "needs to be a 32-bit float scalar",
  2194. "is not a float scalar"))));
  2195. // WorldRayDirectionKHR and WorldRayOriginKHR are valid
  2196. // in IS, AH, CH, MS shaders as input 32-bit float vec3
  2197. INSTANTIATE_TEST_SUITE_P(
  2198. WorldRayDirectionAndOriginSuccess,
  2199. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2200. Combine(Values(SPV_ENV_VULKAN_1_2),
  2201. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2202. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2203. Values("Input"), Values("%f32vec3"),
  2204. Values("OpCapability RayTracingKHR\n"),
  2205. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2206. Values(TestResult())));
  2207. INSTANTIATE_TEST_SUITE_P(
  2208. WorldRayDirectionAndOriginNotExecutionMode,
  2209. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2210. Combine(Values(SPV_ENV_VULKAN_1_2),
  2211. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2212. Values("Vertex", "Fragment", "TessellationControl",
  2213. "TessellationEvaluation", "Geometry", "Fragment",
  2214. "GLCompute", "RayGenerationKHR", "CallableKHR"),
  2215. Values("Input"), Values("%f32vec3"),
  2216. Values("OpCapability RayTracingKHR\n"),
  2217. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2218. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04428 "
  2219. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04431 "),
  2220. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2221. "Vulkan spec does not allow BuiltIn",
  2222. "to be used with the execution model"))));
  2223. INSTANTIATE_TEST_SUITE_P(
  2224. WorldRayDirectionAndOriginNotInput,
  2225. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2226. Combine(Values(SPV_ENV_VULKAN_1_2),
  2227. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2228. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2229. Values("Output"), Values("%f32vec3"),
  2230. Values("OpCapability RayTracingKHR\n"),
  2231. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2232. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04429 "
  2233. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04432 "),
  2234. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2235. "used for variables with Input storage class"))));
  2236. INSTANTIATE_TEST_SUITE_P(
  2237. WorldRayDirectionAndOriginNotFloatVec3,
  2238. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2239. Combine(
  2240. Values(SPV_ENV_VULKAN_1_2),
  2241. Values("WorldRayDirectionKHR", "WorldRayOriginKHR"),
  2242. Values("AnyHitKHR", "ClosestHitKHR", "IntersectionKHR", "MissKHR"),
  2243. Values("Input"), Values("%u32vec3", "%f32", "%f32vec2", "%f32vec4"),
  2244. Values("OpCapability RayTracingKHR\n"),
  2245. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2246. Values("VUID-WorldRayDirectionKHR-WorldRayDirectionKHR-04430 "
  2247. "VUID-WorldRayOriginKHR-WorldRayOriginKHR-04433 "),
  2248. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2249. "needs to be a 3-component 32-bit float vector"))));
  2250. // LaunchIdKHR and LaunchSizeKHR are valid
  2251. // in RG, IS, AH, CH, MS shaders as input 32-bit ivec3
  2252. INSTANTIATE_TEST_SUITE_P(
  2253. LaunchRTSuccess,
  2254. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2255. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2256. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2257. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2258. Values("Input"), Values("%u32vec3"),
  2259. Values("OpCapability RayTracingKHR\n"),
  2260. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"), Values(nullptr),
  2261. Values(TestResult())));
  2262. INSTANTIATE_TEST_SUITE_P(
  2263. LaunchRTNotExecutionMode,
  2264. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2265. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2266. Values("Vertex", "Fragment", "TessellationControl",
  2267. "TessellationEvaluation", "Geometry", "Fragment",
  2268. "GLCompute"),
  2269. Values("Input"), Values("%u32vec3"),
  2270. Values("OpCapability RayTracingKHR\n"),
  2271. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2272. Values("VUID-LaunchIdKHR-LaunchIdKHR-04266 "
  2273. "VUID-LaunchSizeKHR-LaunchSizeKHR-04269 "),
  2274. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2275. "Vulkan spec does not allow BuiltIn",
  2276. "to be used with the execution model"))));
  2277. INSTANTIATE_TEST_SUITE_P(
  2278. LaunchRTNotInput,
  2279. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2280. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2281. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2282. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2283. Values("Output"), Values("%u32vec3"),
  2284. Values("OpCapability RayTracingKHR\n"),
  2285. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2286. Values("VUID-LaunchIdKHR-LaunchIdKHR-04267 "
  2287. "VUID-LaunchSizeKHR-LaunchSizeKHR-04270 "),
  2288. Values(TestResult(SPV_ERROR_INVALID_DATA, "Vulkan spec allows",
  2289. "used for variables with Input storage class"))));
  2290. INSTANTIATE_TEST_SUITE_P(
  2291. LaunchRTNotIntVec3,
  2292. ValidateGenericCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2293. Combine(Values(SPV_ENV_VULKAN_1_2), Values("LaunchIdKHR", "LaunchSizeKHR"),
  2294. Values("RayGenerationKHR", "AnyHitKHR", "ClosestHitKHR",
  2295. "IntersectionKHR", "MissKHR", "CallableKHR"),
  2296. Values("Input"), Values("%f32vec3", "%u32", "%u32vec2", "%u32vec4"),
  2297. Values("OpCapability RayTracingKHR\n"),
  2298. Values("OpExtension \"SPV_KHR_ray_tracing\"\n"),
  2299. Values("VUID-LaunchIdKHR-LaunchIdKHR-04268 "
  2300. "VUID-LaunchSizeKHR-LaunchSizeKHR-04271 "),
  2301. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2302. "needs to be a 3-component 32-bit int vector"))));
  2303. CodeGenerator GetArrayedVariableCodeGenerator(const char* const built_in,
  2304. const char* const execution_model,
  2305. const char* const storage_class,
  2306. const char* const data_type) {
  2307. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2308. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  2309. generator.before_types_ += built_in;
  2310. generator.before_types_ += "\n";
  2311. std::ostringstream after_types;
  2312. after_types << "%built_in_array = OpTypeArray " << data_type << " %u32_3\n";
  2313. if (InitializerRequired(storage_class)) {
  2314. after_types << "%built_in_array_null = OpConstantNull %built_in_array\n";
  2315. }
  2316. after_types << "%built_in_ptr = OpTypePointer " << storage_class
  2317. << " %built_in_array\n";
  2318. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  2319. if (InitializerRequired(storage_class)) {
  2320. after_types << " %built_in_array_null";
  2321. }
  2322. after_types << "\n";
  2323. generator.after_types_ = after_types.str();
  2324. EntryPoint entry_point;
  2325. entry_point.name = "main";
  2326. entry_point.execution_model = execution_model;
  2327. entry_point.interfaces = "%built_in_var";
  2328. // Any kind of reference would do.
  2329. entry_point.body = R"(
  2330. %val = OpBitcast %u32 %built_in_var
  2331. )";
  2332. std::ostringstream execution_modes;
  2333. if (0 == std::strcmp(execution_model, "Fragment")) {
  2334. execution_modes << "OpExecutionMode %" << entry_point.name
  2335. << " OriginUpperLeft\n";
  2336. if (0 == std::strcmp(built_in, "FragDepth")) {
  2337. execution_modes << "OpExecutionMode %" << entry_point.name
  2338. << " DepthReplacing\n";
  2339. }
  2340. }
  2341. if (0 == std::strcmp(execution_model, "Geometry")) {
  2342. execution_modes << "OpExecutionMode %" << entry_point.name
  2343. << " InputPoints\n";
  2344. execution_modes << "OpExecutionMode %" << entry_point.name
  2345. << " OutputPoints\n";
  2346. }
  2347. if (0 == std::strcmp(execution_model, "GLCompute")) {
  2348. execution_modes << "OpExecutionMode %" << entry_point.name
  2349. << " LocalSize 1 1 1\n";
  2350. }
  2351. entry_point.execution_modes = execution_modes.str();
  2352. generator.entry_points_.push_back(std::move(entry_point));
  2353. return generator;
  2354. }
  2355. TEST_P(ValidateVulkanCombineBuiltInArrayedVariable, Variable) {
  2356. const char* const built_in = std::get<0>(GetParam());
  2357. const char* const execution_model = std::get<1>(GetParam());
  2358. const char* const storage_class = std::get<2>(GetParam());
  2359. const char* const data_type = std::get<3>(GetParam());
  2360. const TestResult& test_result = std::get<4>(GetParam());
  2361. CodeGenerator generator = GetArrayedVariableCodeGenerator(
  2362. built_in, execution_model, storage_class, data_type);
  2363. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2364. ASSERT_EQ(test_result.validation_result,
  2365. ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2366. if (test_result.error_str) {
  2367. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  2368. }
  2369. if (test_result.error_str2) {
  2370. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  2371. }
  2372. }
  2373. INSTANTIATE_TEST_SUITE_P(PointSizeArrayedF32TessControl,
  2374. ValidateVulkanCombineBuiltInArrayedVariable,
  2375. Combine(Values("PointSize"),
  2376. Values("TessellationControl"), Values("Input"),
  2377. Values("%f32"), Values(TestResult())));
  2378. INSTANTIATE_TEST_SUITE_P(
  2379. PointSizeArrayedF64TessControl, ValidateVulkanCombineBuiltInArrayedVariable,
  2380. Combine(Values("PointSize"), Values("TessellationControl"), Values("Input"),
  2381. Values("%f64"),
  2382. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2383. "needs to be a 32-bit float scalar",
  2384. "has bit width 64"))));
  2385. INSTANTIATE_TEST_SUITE_P(
  2386. PointSizeArrayedF32Vertex, ValidateVulkanCombineBuiltInArrayedVariable,
  2387. Combine(Values("PointSize"), Values("Vertex"), Values("Output"),
  2388. Values("%f32"),
  2389. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2390. "needs to be a 32-bit float scalar",
  2391. "is not a float scalar"))));
  2392. INSTANTIATE_TEST_SUITE_P(PositionArrayedF32Vec4TessControl,
  2393. ValidateVulkanCombineBuiltInArrayedVariable,
  2394. Combine(Values("Position"),
  2395. Values("TessellationControl"), Values("Input"),
  2396. Values("%f32vec4"), Values(TestResult())));
  2397. INSTANTIATE_TEST_SUITE_P(
  2398. PositionArrayedF32Vec3TessControl,
  2399. ValidateVulkanCombineBuiltInArrayedVariable,
  2400. Combine(Values("Position"), Values("TessellationControl"), Values("Input"),
  2401. Values("%f32vec3"),
  2402. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2403. "needs to be a 4-component 32-bit float vector",
  2404. "has 3 components"))));
  2405. INSTANTIATE_TEST_SUITE_P(
  2406. PositionArrayedF32Vec4Vertex, ValidateVulkanCombineBuiltInArrayedVariable,
  2407. Combine(Values("Position"), Values("Vertex"), Values("Output"),
  2408. Values("%f32vec4"),
  2409. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2410. "needs to be a 4-component 32-bit float vector",
  2411. "is not a float vector"))));
  2412. INSTANTIATE_TEST_SUITE_P(
  2413. ClipAndCullDistanceOutputSuccess,
  2414. ValidateVulkanCombineBuiltInArrayedVariable,
  2415. Combine(Values("ClipDistance", "CullDistance"),
  2416. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  2417. Values("Output"), Values("%f32arr2", "%f32arr4"),
  2418. Values(TestResult())));
  2419. INSTANTIATE_TEST_SUITE_P(
  2420. ClipAndCullDistanceVertexInput, ValidateVulkanCombineBuiltInArrayedVariable,
  2421. Combine(Values("ClipDistance", "CullDistance"), Values("Fragment"),
  2422. Values("Input"), Values("%f32arr4"),
  2423. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2424. "needs to be a 32-bit float array",
  2425. "components are not float scalar"))));
  2426. INSTANTIATE_TEST_SUITE_P(
  2427. ClipAndCullDistanceNotArray, ValidateVulkanCombineBuiltInArrayedVariable,
  2428. Combine(Values("ClipDistance", "CullDistance"),
  2429. Values("Geometry", "TessellationControl", "TessellationEvaluation"),
  2430. Values("Input"), Values("%f32vec2", "%f32vec4"),
  2431. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2432. "needs to be a 32-bit float array",
  2433. "components are not float scalar"))));
  2434. INSTANTIATE_TEST_SUITE_P(
  2435. SMBuiltinsInputSuccess,
  2436. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2437. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2438. Values("Vertex", "Fragment", "TessellationControl",
  2439. "TessellationEvaluation", "Geometry", "GLCompute"),
  2440. Values("Input"), Values("%u32"),
  2441. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2442. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2443. Values(nullptr), Values(TestResult())));
  2444. INSTANTIATE_TEST_SUITE_P(
  2445. SMBuiltinsInputMeshSuccess,
  2446. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2447. Combine(
  2448. Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2449. Values("MeshNV", "TaskNV"), Values("Input"), Values("%u32"),
  2450. Values("OpCapability ShaderSMBuiltinsNV\nOpCapability MeshShadingNV\n"),
  2451. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\nOpExtension "
  2452. "\"SPV_NV_mesh_shader\"\n"),
  2453. Values(nullptr), Values(TestResult())));
  2454. INSTANTIATE_TEST_SUITE_P(
  2455. SMBuiltinsInputRaySuccess,
  2456. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2457. Combine(
  2458. Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2459. Values("RayGenerationNV", "IntersectionNV", "AnyHitNV", "ClosestHitNV",
  2460. "MissNV", "CallableNV"),
  2461. Values("Input"), Values("%u32"),
  2462. Values("OpCapability ShaderSMBuiltinsNV\nOpCapability RayTracingNV\n"),
  2463. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\nOpExtension "
  2464. "\"SPV_NV_ray_tracing\"\n"),
  2465. Values(nullptr), Values(TestResult())));
  2466. INSTANTIATE_TEST_SUITE_P(
  2467. SMBuiltinsNotInput,
  2468. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2469. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2470. Values("Vertex", "Fragment", "TessellationControl",
  2471. "TessellationEvaluation", "Geometry", "GLCompute"),
  2472. Values("Output"), Values("%u32"),
  2473. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2474. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2475. Values(nullptr),
  2476. Values(TestResult(
  2477. SPV_ERROR_INVALID_DATA,
  2478. "to be only used for variables with Input storage class",
  2479. "uses storage class Output"))));
  2480. INSTANTIATE_TEST_SUITE_P(
  2481. SMBuiltinsNotIntScalar,
  2482. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2483. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2484. Values("Vertex", "Fragment", "TessellationControl",
  2485. "TessellationEvaluation", "Geometry", "GLCompute"),
  2486. Values("Input"), Values("%f32", "%u32vec3"),
  2487. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2488. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2489. Values(nullptr),
  2490. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2491. "needs to be a 32-bit int scalar",
  2492. "is not an int scalar"))));
  2493. INSTANTIATE_TEST_SUITE_P(
  2494. SMBuiltinsNotInt32,
  2495. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  2496. Combine(Values("SMCountNV", "SMIDNV", "WarpsPerSMNV", "WarpIDNV"),
  2497. Values("Vertex", "Fragment", "TessellationControl",
  2498. "TessellationEvaluation", "Geometry", "GLCompute"),
  2499. Values("Input"), Values("%u64"),
  2500. Values("OpCapability ShaderSMBuiltinsNV\n"),
  2501. Values("OpExtension \"SPV_NV_shader_sm_builtins\"\n"),
  2502. Values(nullptr),
  2503. Values(TestResult(SPV_ERROR_INVALID_DATA,
  2504. "needs to be a 32-bit int scalar",
  2505. "has bit width 64"))));
  2506. CodeGenerator GetWorkgroupSizeSuccessGenerator() {
  2507. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2508. generator.before_types_ = R"(
  2509. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2510. )";
  2511. generator.after_types_ = R"(
  2512. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2513. )";
  2514. EntryPoint entry_point;
  2515. entry_point.name = "main";
  2516. entry_point.execution_model = "GLCompute";
  2517. entry_point.body = R"(
  2518. %copy = OpCopyObject %u32vec3 %workgroup_size
  2519. )";
  2520. generator.entry_points_.push_back(std::move(entry_point));
  2521. return generator;
  2522. }
  2523. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeSuccess) {
  2524. CodeGenerator generator = GetWorkgroupSizeSuccessGenerator();
  2525. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2526. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2527. }
  2528. CodeGenerator GetWorkgroupSizeFragmentGenerator() {
  2529. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2530. generator.before_types_ = R"(
  2531. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2532. )";
  2533. generator.after_types_ = R"(
  2534. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2535. )";
  2536. EntryPoint entry_point;
  2537. entry_point.name = "main";
  2538. entry_point.execution_model = "Fragment";
  2539. entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft";
  2540. entry_point.body = R"(
  2541. %copy = OpCopyObject %u32vec3 %workgroup_size
  2542. )";
  2543. generator.entry_points_.push_back(std::move(entry_point));
  2544. return generator;
  2545. }
  2546. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeFragment) {
  2547. CodeGenerator generator = GetWorkgroupSizeFragmentGenerator();
  2548. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2549. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2550. EXPECT_THAT(getDiagnosticString(),
  2551. HasSubstr("Vulkan spec allows BuiltIn WorkgroupSize to be used "
  2552. "only with GLCompute execution model"));
  2553. EXPECT_THAT(getDiagnosticString(),
  2554. HasSubstr("is referencing ID <2> (OpConstantComposite) which is "
  2555. "decorated with BuiltIn WorkgroupSize in function <1> "
  2556. "called with execution model Fragment"));
  2557. EXPECT_THAT(getDiagnosticString(),
  2558. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04425 "
  2559. "VUID-WorkgroupSize-WorkgroupSize-04427"));
  2560. }
  2561. TEST_F(ValidateBuiltIns, WorkgroupSizeNotConstant) {
  2562. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2563. generator.before_types_ = R"(
  2564. OpDecorate %copy BuiltIn WorkgroupSize
  2565. )";
  2566. generator.after_types_ = R"(
  2567. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2568. )";
  2569. EntryPoint entry_point;
  2570. entry_point.name = "main";
  2571. entry_point.execution_model = "GLCompute";
  2572. entry_point.body = R"(
  2573. %copy = OpCopyObject %u32vec3 %workgroup_size
  2574. )";
  2575. generator.entry_points_.push_back(std::move(entry_point));
  2576. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2577. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2578. EXPECT_THAT(
  2579. getDiagnosticString(),
  2580. HasSubstr("BuiltIns can only target variables, structs or constants"));
  2581. }
  2582. CodeGenerator GetWorkgroupSizeNotVectorGenerator() {
  2583. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2584. generator.before_types_ = R"(
  2585. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2586. )";
  2587. generator.after_types_ = R"(
  2588. %workgroup_size = OpConstant %u32 16
  2589. )";
  2590. EntryPoint entry_point;
  2591. entry_point.name = "main";
  2592. entry_point.execution_model = "GLCompute";
  2593. entry_point.body = R"(
  2594. %copy = OpCopyObject %u32 %workgroup_size
  2595. )";
  2596. generator.entry_points_.push_back(std::move(entry_point));
  2597. return generator;
  2598. }
  2599. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotVector) {
  2600. CodeGenerator generator = GetWorkgroupSizeNotVectorGenerator();
  2601. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2602. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2603. EXPECT_THAT(getDiagnosticString(),
  2604. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2605. "variable needs to be a 3-component 32-bit int vector. "
  2606. "ID <2> (OpConstant) is not an int vector."));
  2607. EXPECT_THAT(getDiagnosticString(),
  2608. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2609. }
  2610. CodeGenerator GetWorkgroupSizeNotIntVectorGenerator() {
  2611. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2612. generator.before_types_ = R"(
  2613. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2614. )";
  2615. generator.after_types_ = R"(
  2616. %workgroup_size = OpConstantComposite %f32vec3 %f32_1 %f32_1 %f32_1
  2617. )";
  2618. EntryPoint entry_point;
  2619. entry_point.name = "main";
  2620. entry_point.execution_model = "GLCompute";
  2621. entry_point.body = R"(
  2622. %copy = OpCopyObject %f32vec3 %workgroup_size
  2623. )";
  2624. generator.entry_points_.push_back(std::move(entry_point));
  2625. return generator;
  2626. }
  2627. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotIntVector) {
  2628. CodeGenerator generator = GetWorkgroupSizeNotIntVectorGenerator();
  2629. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2630. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2631. EXPECT_THAT(getDiagnosticString(),
  2632. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2633. "variable needs to be a 3-component 32-bit int vector. "
  2634. "ID <2> (OpConstantComposite) is not an int vector."));
  2635. EXPECT_THAT(getDiagnosticString(),
  2636. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2637. }
  2638. CodeGenerator GetWorkgroupSizeNotVec3Generator() {
  2639. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2640. generator.before_types_ = R"(
  2641. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2642. )";
  2643. generator.after_types_ = R"(
  2644. %workgroup_size = OpConstantComposite %u32vec2 %u32_1 %u32_1
  2645. )";
  2646. EntryPoint entry_point;
  2647. entry_point.name = "main";
  2648. entry_point.execution_model = "GLCompute";
  2649. entry_point.body = R"(
  2650. %copy = OpCopyObject %u32vec2 %workgroup_size
  2651. )";
  2652. generator.entry_points_.push_back(std::move(entry_point));
  2653. return generator;
  2654. }
  2655. TEST_F(ValidateBuiltIns, VulkanWorkgroupSizeNotVec3) {
  2656. CodeGenerator generator = GetWorkgroupSizeNotVec3Generator();
  2657. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2658. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2659. EXPECT_THAT(getDiagnosticString(),
  2660. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize "
  2661. "variable needs to be a 3-component 32-bit int vector. "
  2662. "ID <2> (OpConstantComposite) has 2 components."));
  2663. EXPECT_THAT(getDiagnosticString(),
  2664. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2665. }
  2666. TEST_F(ValidateBuiltIns, WorkgroupSizeNotInt32Vec) {
  2667. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2668. generator.before_types_ = R"(
  2669. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2670. )";
  2671. generator.after_types_ = R"(
  2672. %workgroup_size = OpConstantComposite %u64vec3 %u64_1 %u64_1 %u64_1
  2673. )";
  2674. EntryPoint entry_point;
  2675. entry_point.name = "main";
  2676. entry_point.execution_model = "GLCompute";
  2677. entry_point.body = R"(
  2678. %copy = OpCopyObject %u64vec3 %workgroup_size
  2679. )";
  2680. generator.entry_points_.push_back(std::move(entry_point));
  2681. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2682. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2683. EXPECT_THAT(
  2684. getDiagnosticString(),
  2685. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupSize variable "
  2686. "needs to be a 3-component 32-bit int vector. ID <2> "
  2687. "(OpConstantComposite) has components with bit width 64."));
  2688. EXPECT_THAT(getDiagnosticString(),
  2689. AnyVUID("VUID-WorkgroupSize-WorkgroupSize-04427"));
  2690. }
  2691. TEST_F(ValidateBuiltIns, WorkgroupSizePrivateVar) {
  2692. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2693. generator.before_types_ = R"(
  2694. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2695. )";
  2696. generator.after_types_ = R"(
  2697. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2698. %private_ptr_u32vec3 = OpTypePointer Private %u32vec3
  2699. %var = OpVariable %private_ptr_u32vec3 Private %workgroup_size
  2700. )";
  2701. EntryPoint entry_point;
  2702. entry_point.name = "main";
  2703. entry_point.execution_model = "GLCompute";
  2704. entry_point.body = R"(
  2705. )";
  2706. generator.entry_points_.push_back(std::move(entry_point));
  2707. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2708. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2709. }
  2710. TEST_F(ValidateBuiltIns, GeometryPositionInOutSuccess) {
  2711. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2712. generator.before_types_ = R"(
  2713. OpDecorate %input_type Block
  2714. OpMemberDecorate %input_type 0 BuiltIn Position
  2715. OpDecorate %output_type Block
  2716. OpMemberDecorate %output_type 0 BuiltIn Position
  2717. )";
  2718. generator.after_types_ = R"(
  2719. %input_type = OpTypeStruct %f32vec4
  2720. %arrayed_input_type = OpTypeArray %input_type %u32_3
  2721. %input_ptr = OpTypePointer Input %arrayed_input_type
  2722. %input = OpVariable %input_ptr Input
  2723. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2724. %output_type = OpTypeStruct %f32vec4
  2725. %output_ptr = OpTypePointer Output %output_type
  2726. %output = OpVariable %output_ptr Output
  2727. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2728. )";
  2729. EntryPoint entry_point;
  2730. entry_point.name = "main";
  2731. entry_point.execution_model = "Geometry";
  2732. entry_point.interfaces = "%input %output";
  2733. entry_point.body = R"(
  2734. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0 %u32_0
  2735. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2736. %pos = OpLoad %f32vec4 %input_pos
  2737. OpStore %output_pos %pos
  2738. )";
  2739. generator.entry_points_.push_back(std::move(entry_point));
  2740. generator.entry_points_[0].execution_modes =
  2741. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2742. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2743. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2744. }
  2745. TEST_F(ValidateBuiltIns, WorkgroupIdNotVec3) {
  2746. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2747. generator.before_types_ = R"(
  2748. OpDecorate %workgroup_size BuiltIn WorkgroupSize
  2749. OpDecorate %workgroup_id BuiltIn WorkgroupId
  2750. )";
  2751. generator.after_types_ = R"(
  2752. %workgroup_size = OpConstantComposite %u32vec3 %u32_1 %u32_1 %u32_1
  2753. %input_ptr = OpTypePointer Input %u32vec2
  2754. %workgroup_id = OpVariable %input_ptr Input
  2755. )";
  2756. EntryPoint entry_point;
  2757. entry_point.name = "main";
  2758. entry_point.execution_model = "GLCompute";
  2759. entry_point.interfaces = "%workgroup_id";
  2760. entry_point.body = R"(
  2761. %copy_size = OpCopyObject %u32vec3 %workgroup_size
  2762. %load_id = OpLoad %u32vec2 %workgroup_id
  2763. )";
  2764. generator.entry_points_.push_back(std::move(entry_point));
  2765. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2766. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2767. EXPECT_THAT(getDiagnosticString(),
  2768. HasSubstr("According to the Vulkan spec BuiltIn WorkgroupId "
  2769. "variable needs to be a 3-component 32-bit int vector. "
  2770. "ID <2> (OpVariable) has 2 components."));
  2771. }
  2772. TEST_F(ValidateBuiltIns, TwoBuiltInsFirstFails) {
  2773. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2774. generator.before_types_ = R"(
  2775. OpMemberDecorate %input_type 0 BuiltIn FragCoord
  2776. OpMemberDecorate %output_type 0 BuiltIn Position
  2777. )";
  2778. generator.after_types_ = R"(
  2779. %input_type = OpTypeStruct %f32vec4
  2780. %input_ptr = OpTypePointer Input %input_type
  2781. %input = OpVariable %input_ptr Input
  2782. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2783. %output_type = OpTypeStruct %f32vec4
  2784. %output_ptr = OpTypePointer Output %output_type
  2785. %output = OpVariable %output_ptr Output
  2786. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2787. )";
  2788. EntryPoint entry_point;
  2789. entry_point.name = "main";
  2790. entry_point.execution_model = "Geometry";
  2791. entry_point.interfaces = "%input %output";
  2792. entry_point.body = R"(
  2793. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0
  2794. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2795. %pos = OpLoad %f32vec4 %input_pos
  2796. OpStore %output_pos %pos
  2797. )";
  2798. generator.entry_points_.push_back(std::move(entry_point));
  2799. generator.entry_points_[0].execution_modes =
  2800. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2801. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2802. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2803. EXPECT_THAT(getDiagnosticString(),
  2804. HasSubstr("Vulkan spec allows BuiltIn FragCoord to be used only "
  2805. "with Fragment execution model"));
  2806. }
  2807. TEST_F(ValidateBuiltIns, TwoBuiltInsSecondFails) {
  2808. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2809. generator.before_types_ = R"(
  2810. OpMemberDecorate %input_type 0 BuiltIn Position
  2811. OpMemberDecorate %output_type 0 BuiltIn FragCoord
  2812. )";
  2813. generator.after_types_ = R"(
  2814. %input_type = OpTypeStruct %f32vec4
  2815. %input_ptr = OpTypePointer Input %input_type
  2816. %input = OpVariable %input_ptr Input
  2817. %input_f32vec4_ptr = OpTypePointer Input %f32vec4
  2818. %output_type = OpTypeStruct %f32vec4
  2819. %output_ptr = OpTypePointer Output %output_type
  2820. %output = OpVariable %output_ptr Output
  2821. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2822. )";
  2823. EntryPoint entry_point;
  2824. entry_point.name = "main";
  2825. entry_point.execution_model = "Geometry";
  2826. entry_point.interfaces = "%input %output";
  2827. entry_point.body = R"(
  2828. %input_pos = OpAccessChain %input_f32vec4_ptr %input %u32_0
  2829. %output_pos = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2830. %pos = OpLoad %f32vec4 %input_pos
  2831. OpStore %output_pos %pos
  2832. )";
  2833. generator.entry_points_.push_back(std::move(entry_point));
  2834. generator.entry_points_[0].execution_modes =
  2835. "OpExecutionMode %main InputPoints\nOpExecutionMode %main OutputPoints\n";
  2836. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2837. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2838. EXPECT_THAT(getDiagnosticString(),
  2839. HasSubstr("Vulkan spec allows BuiltIn FragCoord to be only used "
  2840. "for variables with Input storage class"));
  2841. }
  2842. TEST_F(ValidateBuiltIns, VertexPositionVariableSuccess) {
  2843. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2844. generator.before_types_ = R"(
  2845. OpDecorate %position BuiltIn Position
  2846. )";
  2847. generator.after_types_ = R"(
  2848. %f32vec4_ptr_output = OpTypePointer Output %f32vec4
  2849. %position = OpVariable %f32vec4_ptr_output Output
  2850. )";
  2851. EntryPoint entry_point;
  2852. entry_point.name = "main";
  2853. entry_point.execution_model = "Vertex";
  2854. entry_point.interfaces = "%position";
  2855. entry_point.body = R"(
  2856. OpStore %position %f32vec4_0123
  2857. )";
  2858. generator.entry_points_.push_back(std::move(entry_point));
  2859. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2860. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2861. }
  2862. TEST_F(ValidateBuiltIns, FragmentPositionTwoEntryPoints) {
  2863. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2864. generator.before_types_ = R"(
  2865. OpMemberDecorate %output_type 0 BuiltIn Position
  2866. )";
  2867. generator.after_types_ = R"(
  2868. %output_type = OpTypeStruct %f32vec4
  2869. %output_ptr = OpTypePointer Output %output_type
  2870. %output = OpVariable %output_ptr Output
  2871. %output_f32vec4_ptr = OpTypePointer Output %f32vec4
  2872. )";
  2873. EntryPoint entry_point;
  2874. entry_point.name = "vmain";
  2875. entry_point.execution_model = "Vertex";
  2876. entry_point.interfaces = "%output";
  2877. entry_point.body = R"(
  2878. %val1 = OpFunctionCall %void %foo
  2879. )";
  2880. generator.entry_points_.push_back(std::move(entry_point));
  2881. entry_point.name = "fmain";
  2882. entry_point.execution_model = "Fragment";
  2883. entry_point.interfaces = "%output";
  2884. entry_point.execution_modes = "OpExecutionMode %fmain OriginUpperLeft";
  2885. entry_point.body = R"(
  2886. %val2 = OpFunctionCall %void %foo
  2887. )";
  2888. generator.entry_points_.push_back(std::move(entry_point));
  2889. generator.add_at_the_end_ = R"(
  2890. %foo = OpFunction %void None %func
  2891. %foo_entry = OpLabel
  2892. %position = OpAccessChain %output_f32vec4_ptr %output %u32_0
  2893. OpStore %position %f32vec4_0123
  2894. OpReturn
  2895. OpFunctionEnd
  2896. )";
  2897. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2898. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2899. EXPECT_THAT(getDiagnosticString(),
  2900. HasSubstr("Vulkan spec allows BuiltIn Position to be used only "
  2901. "with Vertex, TessellationControl, "
  2902. "TessellationEvaluation or Geometry execution models"));
  2903. EXPECT_THAT(getDiagnosticString(),
  2904. HasSubstr("called with execution model Fragment"));
  2905. }
  2906. CodeGenerator GetNoDepthReplacingGenerator() {
  2907. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2908. generator.before_types_ = R"(
  2909. OpMemberDecorate %output_type 0 BuiltIn FragDepth
  2910. )";
  2911. generator.after_types_ = R"(
  2912. %output_type = OpTypeStruct %f32
  2913. %output_null = OpConstantNull %output_type
  2914. %output_ptr = OpTypePointer Output %output_type
  2915. %output = OpVariable %output_ptr Output %output_null
  2916. %output_f32_ptr = OpTypePointer Output %f32
  2917. )";
  2918. EntryPoint entry_point;
  2919. entry_point.name = "main";
  2920. entry_point.execution_model = "Fragment";
  2921. entry_point.interfaces = "%output";
  2922. entry_point.execution_modes = "OpExecutionMode %main OriginUpperLeft";
  2923. entry_point.body = R"(
  2924. %val2 = OpFunctionCall %void %foo
  2925. )";
  2926. generator.entry_points_.push_back(std::move(entry_point));
  2927. const std::string function_body = R"(
  2928. %foo = OpFunction %void None %func
  2929. %foo_entry = OpLabel
  2930. %frag_depth = OpAccessChain %output_f32_ptr %output %u32_0
  2931. OpStore %frag_depth %f32_1
  2932. OpReturn
  2933. OpFunctionEnd
  2934. )";
  2935. generator.add_at_the_end_ = function_body;
  2936. return generator;
  2937. }
  2938. TEST_F(ValidateBuiltIns, VulkanFragmentFragDepthNoDepthReplacing) {
  2939. CodeGenerator generator = GetNoDepthReplacingGenerator();
  2940. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2941. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2942. EXPECT_THAT(getDiagnosticString(),
  2943. HasSubstr("Vulkan spec requires DepthReplacing execution mode to "
  2944. "be declared when using BuiltIn FragDepth"));
  2945. EXPECT_THAT(getDiagnosticString(),
  2946. HasSubstr("VUID-FragDepth-FragDepth-04216"));
  2947. }
  2948. CodeGenerator GetOneMainHasDepthReplacingOtherHasntGenerator() {
  2949. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  2950. generator.before_types_ = R"(
  2951. OpMemberDecorate %output_type 0 BuiltIn FragDepth
  2952. )";
  2953. generator.after_types_ = R"(
  2954. %output_type = OpTypeStruct %f32
  2955. %output_null = OpConstantNull %output_type
  2956. %output_ptr = OpTypePointer Output %output_type
  2957. %output = OpVariable %output_ptr Output %output_null
  2958. %output_f32_ptr = OpTypePointer Output %f32
  2959. )";
  2960. EntryPoint entry_point;
  2961. entry_point.name = "main_d_r";
  2962. entry_point.execution_model = "Fragment";
  2963. entry_point.interfaces = "%output";
  2964. entry_point.execution_modes =
  2965. "OpExecutionMode %main_d_r OriginUpperLeft\n"
  2966. "OpExecutionMode %main_d_r DepthReplacing";
  2967. entry_point.body = R"(
  2968. %val2 = OpFunctionCall %void %foo
  2969. )";
  2970. generator.entry_points_.push_back(std::move(entry_point));
  2971. entry_point.name = "main_no_d_r";
  2972. entry_point.execution_model = "Fragment";
  2973. entry_point.interfaces = "%output";
  2974. entry_point.execution_modes = "OpExecutionMode %main_no_d_r OriginUpperLeft";
  2975. entry_point.body = R"(
  2976. %val3 = OpFunctionCall %void %foo
  2977. )";
  2978. generator.entry_points_.push_back(std::move(entry_point));
  2979. const std::string function_body = R"(
  2980. %foo = OpFunction %void None %func
  2981. %foo_entry = OpLabel
  2982. %frag_depth = OpAccessChain %output_f32_ptr %output %u32_0
  2983. OpStore %frag_depth %f32_1
  2984. OpReturn
  2985. OpFunctionEnd
  2986. )";
  2987. generator.add_at_the_end_ = function_body;
  2988. return generator;
  2989. }
  2990. TEST_F(ValidateBuiltIns,
  2991. VulkanFragmentFragDepthOneMainHasDepthReplacingOtherHasnt) {
  2992. CodeGenerator generator = GetOneMainHasDepthReplacingOtherHasntGenerator();
  2993. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  2994. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  2995. EXPECT_THAT(getDiagnosticString(),
  2996. HasSubstr("Vulkan spec requires DepthReplacing execution mode to "
  2997. "be declared when using BuiltIn FragDepth"));
  2998. EXPECT_THAT(getDiagnosticString(),
  2999. HasSubstr("VUID-FragDepth-FragDepth-04216"));
  3000. }
  3001. TEST_F(ValidateBuiltIns, AllowInstanceIdWithIntersectionShader) {
  3002. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3003. generator.capabilities_ += R"(
  3004. OpCapability RayTracingNV
  3005. )";
  3006. generator.extensions_ = R"(
  3007. OpExtension "SPV_NV_ray_tracing"
  3008. )";
  3009. generator.before_types_ = R"(
  3010. OpMemberDecorate %input_type 0 BuiltIn InstanceId
  3011. )";
  3012. generator.after_types_ = R"(
  3013. %input_type = OpTypeStruct %u32
  3014. %input_ptr = OpTypePointer Input %input_type
  3015. %input = OpVariable %input_ptr Input
  3016. )";
  3017. EntryPoint entry_point;
  3018. entry_point.name = "main_d_r";
  3019. entry_point.execution_model = "IntersectionNV";
  3020. entry_point.interfaces = "%input";
  3021. entry_point.body = R"(
  3022. %val2 = OpFunctionCall %void %foo
  3023. )";
  3024. generator.entry_points_.push_back(std::move(entry_point));
  3025. generator.add_at_the_end_ = R"(
  3026. %foo = OpFunction %void None %func
  3027. %foo_entry = OpLabel
  3028. OpReturn
  3029. OpFunctionEnd
  3030. )";
  3031. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_0);
  3032. EXPECT_THAT(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_0));
  3033. }
  3034. TEST_F(ValidateBuiltIns, ValidBuiltinsForMeshShader) {
  3035. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3036. generator.capabilities_ += R"(
  3037. OpCapability MeshShadingNV
  3038. )";
  3039. generator.extensions_ = R"(
  3040. OpExtension "SPV_NV_mesh_shader"
  3041. )";
  3042. generator.before_types_ = R"(
  3043. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  3044. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  3045. OpDecorate %gl_Layer BuiltIn Layer
  3046. OpDecorate %gl_Layer PerPrimitiveNV
  3047. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  3048. OpDecorate %gl_ViewportIndex PerPrimitiveNV
  3049. )";
  3050. generator.after_types_ = R"(
  3051. %u32_81 = OpConstant %u32 81
  3052. %_arr_int_uint_81 = OpTypeArray %i32 %u32_81
  3053. %_ptr_Output__arr_int_uint_81 = OpTypePointer Output %_arr_int_uint_81
  3054. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3055. %gl_Layer = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3056. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_int_uint_81 Output
  3057. )";
  3058. EntryPoint entry_point;
  3059. entry_point.name = "main_d_r";
  3060. entry_point.execution_model = "MeshNV";
  3061. entry_point.interfaces = "%gl_PrimitiveID %gl_Layer %gl_ViewportIndex";
  3062. generator.entry_points_.push_back(std::move(entry_point));
  3063. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3064. ASSERT_EQ(SPV_SUCCESS, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3065. }
  3066. TEST_F(ValidateBuiltIns, InvalidBuiltinsForMeshShader) {
  3067. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3068. generator.capabilities_ += R"(
  3069. OpCapability MeshShadingNV
  3070. )";
  3071. generator.extensions_ = R"(
  3072. OpExtension "SPV_NV_mesh_shader"
  3073. )";
  3074. generator.before_types_ = R"(
  3075. OpDecorate %gl_PrimitiveID BuiltIn PrimitiveId
  3076. OpDecorate %gl_PrimitiveID PerPrimitiveNV
  3077. OpDecorate %gl_Layer BuiltIn Layer
  3078. OpDecorate %gl_Layer PerPrimitiveNV
  3079. OpDecorate %gl_ViewportIndex BuiltIn ViewportIndex
  3080. OpDecorate %gl_ViewportIndex PerPrimitiveNV
  3081. )";
  3082. generator.after_types_ = R"(
  3083. %u32_81 = OpConstant %u32 81
  3084. %_arr_float_uint_81 = OpTypeArray %f32 %u32_81
  3085. %_ptr_Output__arr_float_uint_81 = OpTypePointer Output %_arr_float_uint_81
  3086. %gl_PrimitiveID = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3087. %gl_Layer = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3088. %gl_ViewportIndex = OpVariable %_ptr_Output__arr_float_uint_81 Output
  3089. )";
  3090. EntryPoint entry_point;
  3091. entry_point.name = "main_d_r";
  3092. entry_point.execution_model = "MeshNV";
  3093. entry_point.interfaces = "%gl_PrimitiveID %gl_Layer %gl_ViewportIndex";
  3094. generator.entry_points_.push_back(std::move(entry_point));
  3095. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3096. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3097. EXPECT_THAT(getDiagnosticString(),
  3098. HasSubstr("needs to be a 32-bit int scalar"));
  3099. EXPECT_THAT(getDiagnosticString(), HasSubstr("is not an int scalar"));
  3100. }
  3101. TEST_F(ValidateBuiltIns, GetUnderlyingTypeNoAssert) {
  3102. std::string spirv = R"(
  3103. OpCapability Shader
  3104. OpMemoryModel Logical GLSL450
  3105. OpEntryPoint Fragment %4 "PSMa" %12 %17
  3106. OpExecutionMode %4 OriginUpperLeft
  3107. OpDecorate %gl_PointCoord BuiltIn PointCoord
  3108. OpDecorate %12 Location 0
  3109. OpDecorate %17 Location 0
  3110. %void = OpTypeVoid
  3111. %3 = OpTypeFunction %void
  3112. %float = OpTypeFloat 32
  3113. %v4float = OpTypeVector %float 4
  3114. %gl_PointCoord = OpTypeStruct %v4float
  3115. %_ptr_Input_v4float = OpTypePointer Input %v4float
  3116. %_ptr_Output_v4float = OpTypePointer Output %v4float
  3117. %12 = OpVariable %_ptr_Input_v4float Input
  3118. %17 = OpVariable %_ptr_Output_v4float Output
  3119. %4 = OpFunction %void None %3
  3120. %15 = OpLabel
  3121. OpReturn
  3122. OpFunctionEnd)";
  3123. CompileSuccessfully(spirv, SPV_ENV_VULKAN_1_1);
  3124. ASSERT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3125. EXPECT_THAT(getDiagnosticString(),
  3126. HasSubstr("did not find an member index to get underlying data "
  3127. "type"));
  3128. }
  3129. TEST_P(ValidateVulkanSubgroupBuiltIns, InMain) {
  3130. const char* const built_in = std::get<0>(GetParam());
  3131. const char* const execution_model = std::get<1>(GetParam());
  3132. const char* const storage_class = std::get<2>(GetParam());
  3133. const char* const data_type = std::get<3>(GetParam());
  3134. const char* const vuid = std::get<4>(GetParam());
  3135. const TestResult& test_result = std::get<5>(GetParam());
  3136. CodeGenerator generator = CodeGenerator::GetDefaultShaderCodeGenerator();
  3137. generator.capabilities_ += R"(
  3138. OpCapability GroupNonUniformBallot
  3139. )";
  3140. generator.before_types_ = "OpDecorate %built_in_var BuiltIn ";
  3141. generator.before_types_ += built_in;
  3142. generator.before_types_ += "\n";
  3143. std::ostringstream after_types;
  3144. after_types << "%built_in_ptr = OpTypePointer " << storage_class << " "
  3145. << data_type << "\n";
  3146. after_types << "%built_in_var = OpVariable %built_in_ptr " << storage_class;
  3147. after_types << "\n";
  3148. generator.after_types_ = after_types.str();
  3149. EntryPoint entry_point;
  3150. entry_point.name = "main";
  3151. entry_point.execution_model = execution_model;
  3152. if (strncmp(storage_class, "Input", 5) == 0 ||
  3153. strncmp(storage_class, "Output", 6) == 0) {
  3154. entry_point.interfaces = "%built_in_var";
  3155. }
  3156. entry_point.body =
  3157. std::string("%ld = OpLoad ") + data_type + " %built_in_var\n";
  3158. std::ostringstream execution_modes;
  3159. if (0 == std::strcmp(execution_model, "Fragment")) {
  3160. execution_modes << "OpExecutionMode %" << entry_point.name
  3161. << " OriginUpperLeft\n";
  3162. if (0 == std::strcmp(built_in, "FragDepth")) {
  3163. execution_modes << "OpExecutionMode %" << entry_point.name
  3164. << " DepthReplacing\n";
  3165. }
  3166. }
  3167. if (0 == std::strcmp(execution_model, "Geometry")) {
  3168. execution_modes << "OpExecutionMode %" << entry_point.name
  3169. << " InputPoints\n";
  3170. execution_modes << "OpExecutionMode %" << entry_point.name
  3171. << " OutputPoints\n";
  3172. }
  3173. if (0 == std::strcmp(execution_model, "GLCompute")) {
  3174. execution_modes << "OpExecutionMode %" << entry_point.name
  3175. << " LocalSize 1 1 1\n";
  3176. }
  3177. entry_point.execution_modes = execution_modes.str();
  3178. generator.entry_points_.push_back(std::move(entry_point));
  3179. CompileSuccessfully(generator.Build(), SPV_ENV_VULKAN_1_1);
  3180. ASSERT_EQ(test_result.validation_result,
  3181. ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3182. if (test_result.error_str) {
  3183. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str));
  3184. }
  3185. if (test_result.error_str2) {
  3186. EXPECT_THAT(getDiagnosticString(), HasSubstr(test_result.error_str2));
  3187. }
  3188. if (vuid) {
  3189. EXPECT_THAT(getDiagnosticString(), AnyVUID(vuid));
  3190. }
  3191. }
  3192. INSTANTIATE_TEST_SUITE_P(
  3193. SubgroupMaskNotVec4, ValidateVulkanSubgroupBuiltIns,
  3194. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3195. "SubgroupLeMask", "SubgroupLtMask"),
  3196. Values("GLCompute"), Values("Input"), Values("%u32vec3"),
  3197. Values("VUID-SubgroupEqMask-SubgroupEqMask-04371 "
  3198. "VUID-SubgroupGeMask-SubgroupGeMask-04373 "
  3199. "VUID-SubgroupGtMask-SubgroupGtMask-04375 "
  3200. "VUID-SubgroupLeMask-SubgroupLeMask-04377 "
  3201. "VUID-SubgroupLtMask-SubgroupLtMask-04379"),
  3202. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3203. "needs to be a 4-component 32-bit int vector"))));
  3204. INSTANTIATE_TEST_SUITE_P(
  3205. SubgroupMaskNotU32, ValidateVulkanSubgroupBuiltIns,
  3206. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3207. "SubgroupLeMask", "SubgroupLtMask"),
  3208. Values("GLCompute"), Values("Input"), Values("%f32vec4"),
  3209. Values("VUID-SubgroupEqMask-SubgroupEqMask-04371 "
  3210. "VUID-SubgroupGeMask-SubgroupGeMask-04373 "
  3211. "VUID-SubgroupGtMask-SubgroupGtMask-04375 "
  3212. "VUID-SubgroupLeMask-SubgroupLeMask-04377 "
  3213. "VUID-SubgroupLtMask-SubgroupLtMask-04379"),
  3214. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3215. "needs to be a 4-component 32-bit int vector"))));
  3216. INSTANTIATE_TEST_SUITE_P(
  3217. SubgroupMaskNotInput, ValidateVulkanSubgroupBuiltIns,
  3218. Combine(Values("SubgroupEqMask", "SubgroupGeMask", "SubgroupGtMask",
  3219. "SubgroupLeMask", "SubgroupLtMask"),
  3220. Values("GLCompute"), Values("Output", "Workgroup", "Private"),
  3221. Values("%u32vec4"),
  3222. Values("VUID-SubgroupEqMask-SubgroupEqMask-04370 "
  3223. "VUID-SubgroupGeMask-SubgroupGeMask-04372 "
  3224. "VUID-SubgroupGtMask-SubgroupGtMask-04374 "
  3225. "VUID-SubgroupLeMask-SubgroupLeMask-04376 "
  3226. "VUID-SubgroupLtMask-SubgroupLtMask-04378"),
  3227. Values(TestResult(
  3228. SPV_ERROR_INVALID_DATA,
  3229. "to be only used for variables with Input storage class"))));
  3230. INSTANTIATE_TEST_SUITE_P(SubgroupMaskOk, ValidateVulkanSubgroupBuiltIns,
  3231. Combine(Values("SubgroupEqMask", "SubgroupGeMask",
  3232. "SubgroupGtMask", "SubgroupLeMask",
  3233. "SubgroupLtMask"),
  3234. Values("GLCompute"), Values("Input"),
  3235. Values("%u32vec4"), Values(nullptr),
  3236. Values(TestResult(SPV_SUCCESS, ""))));
  3237. TEST_F(ValidateBuiltIns, SubgroupMaskMemberDecorate) {
  3238. const std::string text = R"(
  3239. OpCapability Shader
  3240. OpCapability GroupNonUniformBallot
  3241. OpMemoryModel Logical GLSL450
  3242. OpEntryPoint GLCompute %foo "foo"
  3243. OpExecutionMode %foo LocalSize 1 1 1
  3244. OpMemberDecorate %struct 0 BuiltIn SubgroupEqMask
  3245. %void = OpTypeVoid
  3246. %int = OpTypeInt 32 0
  3247. %struct = OpTypeStruct %int
  3248. %void_fn = OpTypeFunction %void
  3249. %foo = OpFunction %void None %void_fn
  3250. %entry = OpLabel
  3251. OpReturn
  3252. OpFunctionEnd
  3253. )";
  3254. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3255. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3256. EXPECT_THAT(
  3257. getDiagnosticString(),
  3258. HasSubstr(
  3259. "BuiltIn SubgroupEqMask cannot be used as a member decoration"));
  3260. }
  3261. INSTANTIATE_TEST_SUITE_P(
  3262. SubgroupInvocationIdAndSizeNotU32, ValidateVulkanSubgroupBuiltIns,
  3263. Combine(Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3264. Values("GLCompute"), Values("Input"), Values("%f32"),
  3265. Values("VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-"
  3266. "04381 VUID-SubgroupSize-SubgroupSize-04383"),
  3267. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3268. "needs to be a 32-bit int"))));
  3269. INSTANTIATE_TEST_SUITE_P(
  3270. SubgroupInvocationIdAndSizeNotInput, ValidateVulkanSubgroupBuiltIns,
  3271. Combine(Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3272. Values("GLCompute"), Values("Output", "Workgroup", "Private"),
  3273. Values("%u32"),
  3274. Values("VUID-SubgroupLocalInvocationId-SubgroupLocalInvocationId-"
  3275. "04380 VUID-SubgroupSize-SubgroupSize-04382"),
  3276. Values(TestResult(
  3277. SPV_ERROR_INVALID_DATA,
  3278. "to be only used for variables with Input storage class"))));
  3279. INSTANTIATE_TEST_SUITE_P(
  3280. SubgroupInvocationIdAndSizeOk, ValidateVulkanSubgroupBuiltIns,
  3281. Combine(Values("SubgroupLocalInvocationId", "SubgroupSize"),
  3282. Values("GLCompute"), Values("Input"), Values("%u32"),
  3283. Values(nullptr), Values(TestResult(SPV_SUCCESS, ""))));
  3284. TEST_F(ValidateBuiltIns, SubgroupSizeMemberDecorate) {
  3285. const std::string text = R"(
  3286. OpCapability Shader
  3287. OpCapability GroupNonUniform
  3288. OpMemoryModel Logical GLSL450
  3289. OpEntryPoint GLCompute %foo "foo"
  3290. OpExecutionMode %foo LocalSize 1 1 1
  3291. OpMemberDecorate %struct 0 BuiltIn SubgroupSize
  3292. %void = OpTypeVoid
  3293. %int = OpTypeInt 32 0
  3294. %struct = OpTypeStruct %int
  3295. %void_fn = OpTypeFunction %void
  3296. %foo = OpFunction %void None %void_fn
  3297. %entry = OpLabel
  3298. OpReturn
  3299. OpFunctionEnd
  3300. )";
  3301. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3302. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3303. EXPECT_THAT(
  3304. getDiagnosticString(),
  3305. HasSubstr("BuiltIn SubgroupSize cannot be used as a member decoration"));
  3306. }
  3307. INSTANTIATE_TEST_SUITE_P(
  3308. SubgroupNumAndIdNotCompute, ValidateVulkanSubgroupBuiltIns,
  3309. Combine(
  3310. Values("SubgroupId", "NumSubgroups"), Values("Vertex"), Values("Input"),
  3311. Values("%u32"),
  3312. Values("VUID-SubgroupId-SubgroupId-04367 "
  3313. "VUID-NumSubgroups-NumSubgroups-04293"),
  3314. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3315. "to be used only with GLCompute execution model"))));
  3316. INSTANTIATE_TEST_SUITE_P(
  3317. SubgroupNumAndIdNotU32, ValidateVulkanSubgroupBuiltIns,
  3318. Combine(Values("SubgroupId", "NumSubgroups"), Values("GLCompute"),
  3319. Values("Input"), Values("%f32"),
  3320. Values("VUID-SubgroupId-SubgroupId-04369 "
  3321. "VUID-NumSubgroups-NumSubgroups-04295"),
  3322. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3323. "needs to be a 32-bit int"))));
  3324. INSTANTIATE_TEST_SUITE_P(
  3325. SubgroupNumAndIdNotInput, ValidateVulkanSubgroupBuiltIns,
  3326. Combine(Values("SubgroupId", "NumSubgroups"), Values("GLCompute"),
  3327. Values("Output", "Workgroup", "Private"), Values("%u32"),
  3328. Values("VUID-SubgroupId-SubgroupId-04368 "
  3329. "VUID-NumSubgroups-NumSubgroups-04294"),
  3330. Values(TestResult(
  3331. SPV_ERROR_INVALID_DATA,
  3332. "to be only used for variables with Input storage class"))));
  3333. INSTANTIATE_TEST_SUITE_P(SubgroupNumAndIdOk, ValidateVulkanSubgroupBuiltIns,
  3334. Combine(Values("SubgroupId", "NumSubgroups"),
  3335. Values("GLCompute"), Values("Input"),
  3336. Values("%u32"), Values(nullptr),
  3337. Values(TestResult(SPV_SUCCESS, ""))));
  3338. TEST_F(ValidateBuiltIns, SubgroupIdMemberDecorate) {
  3339. const std::string text = R"(
  3340. OpCapability Shader
  3341. OpCapability GroupNonUniform
  3342. OpMemoryModel Logical GLSL450
  3343. OpEntryPoint GLCompute %foo "foo"
  3344. OpExecutionMode %foo LocalSize 1 1 1
  3345. OpMemberDecorate %struct 0 BuiltIn SubgroupId
  3346. %void = OpTypeVoid
  3347. %int = OpTypeInt 32 0
  3348. %struct = OpTypeStruct %int
  3349. %void_fn = OpTypeFunction %void
  3350. %foo = OpFunction %void None %void_fn
  3351. %entry = OpLabel
  3352. OpReturn
  3353. OpFunctionEnd
  3354. )";
  3355. CompileSuccessfully(text, SPV_ENV_VULKAN_1_1);
  3356. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions(SPV_ENV_VULKAN_1_1));
  3357. EXPECT_THAT(
  3358. getDiagnosticString(),
  3359. HasSubstr("BuiltIn SubgroupId cannot be used as a member decoration"));
  3360. }
  3361. TEST_F(ValidateBuiltIns, TargetIsType) {
  3362. const std::string text = R"(
  3363. OpCapability Shader
  3364. OpCapability Linkage
  3365. OpMemoryModel Logical GLSL450
  3366. OpDecorate %void BuiltIn Position
  3367. %void = OpTypeVoid
  3368. )";
  3369. CompileSuccessfully(text);
  3370. EXPECT_EQ(SPV_ERROR_INVALID_DATA, ValidateInstructions());
  3371. EXPECT_THAT(
  3372. getDiagnosticString(),
  3373. HasSubstr("BuiltIns can only target variables, structs or constants"));
  3374. }
  3375. TEST_F(ValidateBuiltIns, TargetIsVariable) {
  3376. const std::string text = R"(
  3377. OpCapability Shader
  3378. OpCapability Linkage
  3379. OpMemoryModel Logical GLSL450
  3380. OpDecorate %wg_var BuiltIn Position
  3381. %int = OpTypeInt 32 0
  3382. %int_wg_ptr = OpTypePointer Workgroup %int
  3383. %wg_var = OpVariable %int_wg_ptr Workgroup
  3384. )";
  3385. CompileSuccessfully(text);
  3386. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
  3387. }
  3388. TEST_F(ValidateBuiltIns, TargetIsStruct) {
  3389. const std::string text = R"(
  3390. OpCapability Shader
  3391. OpCapability Linkage
  3392. OpMemoryModel Logical GLSL450
  3393. OpDecorate %struct BuiltIn Position
  3394. %struct = OpTypeStruct
  3395. )";
  3396. CompileSuccessfully(text);
  3397. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
  3398. }
  3399. TEST_F(ValidateBuiltIns, TargetIsConstant) {
  3400. const std::string text = R"(
  3401. OpCapability Shader
  3402. OpCapability Linkage
  3403. OpMemoryModel Logical GLSL450
  3404. OpDecorate %int0 BuiltIn Position
  3405. %int = OpTypeInt 32 0
  3406. %int0 = OpConstant %int 0
  3407. )";
  3408. CompileSuccessfully(text);
  3409. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
  3410. }
  3411. TEST_F(ValidateBuiltIns, TargetIsSpecConstant) {
  3412. const std::string text = R"(
  3413. OpCapability Shader
  3414. OpCapability Linkage
  3415. OpMemoryModel Logical GLSL450
  3416. OpDecorate %int0 BuiltIn Position
  3417. %int = OpTypeInt 32 0
  3418. %int0 = OpSpecConstant %int 0
  3419. )";
  3420. CompileSuccessfully(text);
  3421. EXPECT_EQ(SPV_SUCCESS, ValidateInstructions());
  3422. }
  3423. INSTANTIATE_TEST_SUITE_P(
  3424. PrimitiveShadingRateOutputSuccess,
  3425. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3426. Combine(Values("PrimitiveShadingRateKHR"), Values("Vertex", "Geometry"),
  3427. Values("Output"), Values("%u32"),
  3428. Values("OpCapability FragmentShadingRateKHR\n"),
  3429. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3430. Values(nullptr), Values(TestResult())));
  3431. INSTANTIATE_TEST_SUITE_P(
  3432. PrimitiveShadingRateMeshOutputSuccess,
  3433. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3434. Combine(Values("PrimitiveShadingRateKHR"), Values("MeshNV"),
  3435. Values("Output"), Values("%u32"),
  3436. Values("OpCapability FragmentShadingRateKHR\nOpCapability "
  3437. "MeshShadingNV\n"),
  3438. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\nOpExtension "
  3439. "\"SPV_NV_mesh_shader\"\n"),
  3440. Values(nullptr), Values(TestResult())));
  3441. INSTANTIATE_TEST_SUITE_P(
  3442. PrimitiveShadingRateInvalidExecutionModel,
  3443. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3444. Combine(
  3445. Values("PrimitiveShadingRateKHR"), Values("Fragment"), Values("Output"),
  3446. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3447. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3448. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04484 "),
  3449. Values(TestResult(
  3450. SPV_ERROR_INVALID_DATA,
  3451. "Vulkan spec allows BuiltIn PrimitiveShadingRateKHR to be used "
  3452. "only with Vertex, Geometry, or MeshNV execution models."))));
  3453. INSTANTIATE_TEST_SUITE_P(
  3454. PrimitiveShadingRateInvalidStorageClass,
  3455. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3456. Combine(
  3457. Values("PrimitiveShadingRateKHR"), Values("Vertex"), Values("Input"),
  3458. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3459. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3460. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04485 "),
  3461. Values(TestResult(
  3462. SPV_ERROR_INVALID_DATA,
  3463. "Vulkan spec allows BuiltIn PrimitiveShadingRateKHR to be only "
  3464. "used for variables with Output storage class."))));
  3465. INSTANTIATE_TEST_SUITE_P(
  3466. PrimitiveShadingRateInvalidType,
  3467. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3468. Combine(
  3469. Values("PrimitiveShadingRateKHR"), Values("Vertex"), Values("Output"),
  3470. Values("%f32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3471. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3472. Values("VUID-PrimitiveShadingRateKHR-PrimitiveShadingRateKHR-04486 "),
  3473. Values(TestResult(
  3474. SPV_ERROR_INVALID_DATA,
  3475. "According to the Vulkan spec BuiltIn PrimitiveShadingRateKHR "
  3476. "variable needs to be a 32-bit int scalar."))));
  3477. INSTANTIATE_TEST_SUITE_P(
  3478. ShadingRateInputSuccess,
  3479. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3480. Combine(Values("ShadingRateKHR"), Values("Fragment"), Values("Input"),
  3481. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3482. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3483. Values(nullptr), Values(TestResult())));
  3484. INSTANTIATE_TEST_SUITE_P(
  3485. ShadingRateInvalidExecutionModel,
  3486. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3487. Combine(Values("ShadingRateKHR"), Values("Vertex"), Values("Input"),
  3488. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3489. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3490. Values("VUID-ShadingRateKHR-ShadingRateKHR-04490 "),
  3491. Values(TestResult(
  3492. SPV_ERROR_INVALID_DATA,
  3493. "Vulkan spec allows BuiltIn ShadingRateKHR to be used "
  3494. "only with the Fragment execution model."))));
  3495. INSTANTIATE_TEST_SUITE_P(
  3496. ShadingRateInvalidStorageClass,
  3497. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3498. Combine(Values("ShadingRateKHR"), Values("Fragment"), Values("Output"),
  3499. Values("%u32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3500. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3501. Values("VUID-ShadingRateKHR-ShadingRateKHR-04491 "),
  3502. Values(TestResult(
  3503. SPV_ERROR_INVALID_DATA,
  3504. "Vulkan spec allows BuiltIn ShadingRateKHR to be only "
  3505. "used for variables with Input storage class."))));
  3506. INSTANTIATE_TEST_SUITE_P(
  3507. ShadingRateInvalidType,
  3508. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3509. Combine(
  3510. Values("ShadingRateKHR"), Values("Fragment"), Values("Input"),
  3511. Values("%f32"), Values("OpCapability FragmentShadingRateKHR\n"),
  3512. Values("OpExtension \"SPV_KHR_fragment_shading_rate\"\n"),
  3513. Values("VUID-ShadingRateKHR-ShadingRateKHR-04492 "),
  3514. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3515. "According to the Vulkan spec BuiltIn ShadingRateKHR "
  3516. "variable needs to be a 32-bit int scalar."))));
  3517. INSTANTIATE_TEST_SUITE_P(
  3518. FragInvocationCountInputSuccess,
  3519. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3520. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3521. Values("Input"), Values("%u32"),
  3522. Values("OpCapability FragmentDensityEXT\n"),
  3523. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3524. Values(nullptr), Values(TestResult())));
  3525. INSTANTIATE_TEST_SUITE_P(
  3526. FragInvocationCountInvalidExecutionModel,
  3527. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3528. Combine(
  3529. Values("FragInvocationCountEXT"), Values("Vertex"), Values("Input"),
  3530. Values("%u32"), Values("OpCapability FragmentDensityEXT\n"),
  3531. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3532. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04217"),
  3533. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3534. "Vulkan spec allows BuiltIn FragInvocationCountEXT "
  3535. "to be used only with Fragment execution model."))));
  3536. INSTANTIATE_TEST_SUITE_P(
  3537. FragInvocationCountInvalidStorageClass,
  3538. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3539. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3540. Values("Output"), Values("%u32"),
  3541. Values("OpCapability FragmentDensityEXT\n"),
  3542. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3543. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04218"),
  3544. Values(TestResult(
  3545. SPV_ERROR_INVALID_DATA,
  3546. "Vulkan spec allows BuiltIn FragInvocationCountEXT to be only "
  3547. "used for variables with Input storage class."))));
  3548. INSTANTIATE_TEST_SUITE_P(
  3549. FragInvocationCountInvalidType,
  3550. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3551. Combine(Values("FragInvocationCountEXT"), Values("Fragment"),
  3552. Values("Input"), Values("%f32"),
  3553. Values("OpCapability FragmentDensityEXT\n"),
  3554. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3555. Values("VUID-FragInvocationCountEXT-FragInvocationCountEXT-04219"),
  3556. Values(TestResult(
  3557. SPV_ERROR_INVALID_DATA,
  3558. "According to the Vulkan spec BuiltIn FragInvocationCountEXT "
  3559. "variable needs to be a 32-bit int scalar."))));
  3560. INSTANTIATE_TEST_SUITE_P(
  3561. FragSizeInputSuccess,
  3562. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3563. Combine(Values("FragSizeEXT"), Values("Fragment"), Values("Input"),
  3564. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3565. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3566. Values(nullptr), Values(TestResult())));
  3567. INSTANTIATE_TEST_SUITE_P(
  3568. FragSizeInvalidExecutionModel,
  3569. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3570. Combine(Values("FragSizeEXT"), Values("Vertex"), Values("Input"),
  3571. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3572. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3573. Values("VUID-FragSizeEXT-FragSizeEXT-04220"),
  3574. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3575. "Vulkan spec allows BuiltIn FragSizeEXT to be "
  3576. "used only with Fragment execution model."))));
  3577. INSTANTIATE_TEST_SUITE_P(
  3578. FragSizeInvalidStorageClass,
  3579. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3580. Combine(
  3581. Values("FragSizeEXT"), Values("Fragment"), Values("Output"),
  3582. Values("%u32vec2"), Values("OpCapability FragmentDensityEXT\n"),
  3583. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3584. Values("VUID-FragSizeEXT-FragSizeEXT-04221"),
  3585. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3586. "Vulkan spec allows BuiltIn FragSizeEXT to be only "
  3587. "used for variables with Input storage class."))));
  3588. INSTANTIATE_TEST_SUITE_P(
  3589. FragSizeInvalidType,
  3590. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3591. Combine(Values("FragSizeEXT"), Values("Fragment"), Values("Input"),
  3592. Values("%u32vec3"), Values("OpCapability FragmentDensityEXT\n"),
  3593. Values("OpExtension \"SPV_EXT_fragment_invocation_density\"\n"),
  3594. Values("VUID-FragSizeEXT-FragSizeEXT-04222"),
  3595. Values(TestResult(
  3596. SPV_ERROR_INVALID_DATA,
  3597. "According to the Vulkan spec BuiltIn FragSizeEXT variable "
  3598. "needs to be a 2-component 32-bit int vector."))));
  3599. INSTANTIATE_TEST_SUITE_P(
  3600. FragStencilRefOutputSuccess,
  3601. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3602. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Output"),
  3603. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3604. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3605. Values(nullptr), Values(TestResult())));
  3606. INSTANTIATE_TEST_SUITE_P(
  3607. FragStencilRefInvalidExecutionModel,
  3608. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3609. Combine(Values("FragStencilRefEXT"), Values("Vertex"), Values("Output"),
  3610. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3611. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3612. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04223"),
  3613. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3614. "Vulkan spec allows BuiltIn FragStencilRefEXT to "
  3615. "be used only with Fragment execution model."))));
  3616. INSTANTIATE_TEST_SUITE_P(
  3617. FragStencilRefInvalidStorageClass,
  3618. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3619. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Input"),
  3620. Values("%u32", "%u64"), Values("OpCapability StencilExportEXT\n"),
  3621. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3622. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04224"),
  3623. Values(TestResult(
  3624. SPV_ERROR_INVALID_DATA,
  3625. "Vulkan spec allows BuiltIn FragStencilRefEXT to be only used "
  3626. "for variables with Output storage class."))));
  3627. INSTANTIATE_TEST_SUITE_P(
  3628. FragStencilRefInvalidType,
  3629. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3630. Combine(Values("FragStencilRefEXT"), Values("Fragment"), Values("Output"),
  3631. Values("%f32", "%f64", "%u32vec2"),
  3632. Values("OpCapability StencilExportEXT\n"),
  3633. Values("OpExtension \"SPV_EXT_shader_stencil_export\"\n"),
  3634. Values("VUID-FragStencilRefEXT-FragStencilRefEXT-04225"),
  3635. Values(TestResult(
  3636. SPV_ERROR_INVALID_DATA,
  3637. "According to the Vulkan spec BuiltIn FragStencilRefEXT "
  3638. "variable needs to be a int scalar."))));
  3639. INSTANTIATE_TEST_SUITE_P(
  3640. FullyCoveredEXTInputSuccess,
  3641. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3642. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Input"),
  3643. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3644. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3645. Values(nullptr), Values(TestResult())));
  3646. INSTANTIATE_TEST_SUITE_P(
  3647. FullyCoveredEXTInvalidExecutionModel,
  3648. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3649. Combine(Values("FullyCoveredEXT"), Values("Vertex"), Values("Input"),
  3650. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3651. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3652. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04232"),
  3653. Values(TestResult(SPV_ERROR_INVALID_DATA,
  3654. "Vulkan spec allows BuiltIn FullyCoveredEXT to "
  3655. "be used only with Fragment execution model."))));
  3656. INSTANTIATE_TEST_SUITE_P(
  3657. FullyCoveredEXTInvalidStorageClass,
  3658. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3659. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Output"),
  3660. Values("%bool"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3661. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3662. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04233"),
  3663. Values(TestResult(
  3664. SPV_ERROR_INVALID_DATA,
  3665. "Vulkan spec allows BuiltIn FullyCoveredEXT to be only used "
  3666. "for variables with Input storage class."))));
  3667. INSTANTIATE_TEST_SUITE_P(
  3668. FullyCoveredEXTInvalidType,
  3669. ValidateVulkanCombineBuiltInExecutionModelDataTypeCapabilityExtensionResult,
  3670. Combine(Values("FullyCoveredEXT"), Values("Fragment"), Values("Input"),
  3671. Values("%f32"), Values("OpCapability FragmentFullyCoveredEXT\n"),
  3672. Values("OpExtension \"SPV_EXT_fragment_fully_covered\"\n"),
  3673. Values("VUID-FullyCoveredEXT-FullyCoveredEXT-04234"),
  3674. Values(TestResult(
  3675. SPV_ERROR_INVALID_DATA,
  3676. "According to the Vulkan spec BuiltIn FullyCoveredEXT variable "
  3677. "needs to be a bool scalar."))));
  3678. } // namespace
  3679. } // namespace val
  3680. } // namespace spvtools