srg-layouts.py 152 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. """
  4. Copyright (c) Contributors to the Open 3D Engine Project.
  5. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  6. SPDX-License-Identifier: Apache-2.0 OR MIT
  7. """
  8. import sys
  9. import os
  10. sys.path.append("..")
  11. sys.path.append("../..")
  12. from clr import *
  13. import testfuncs
  14. def verifyPackingRelaxed(thefile, compilerPath, silent):
  15. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg"])
  16. if ok:
  17. predicates = []
  18. # check all references of func()
  19. # Matches Storage Buffer 1 (VK) standard here:
  20. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  21. predicates.append(lambda: j["ShaderResourceGroups"][0]["bufferForSRGConstants"]["count"] == 1)
  22. predicates.append(lambda: j["ShaderResourceGroups"][0]["bufferForSRGConstants"]["index"] == 0)
  23. predicates.append(lambda: j["ShaderResourceGroups"][0]["bufferForSRGConstants"]["space"] == 0)
  24. predicates.append(lambda: j["ShaderResourceGroups"][0]["bufferForSRGConstants"]["id"] == "ExampleSRG")
  25. predicates.append(lambda: j["ShaderResourceGroups"][0]["bufferForSRGConstants"]["usage"] == "Read")
  26. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  27. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  28. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  29. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 12)
  30. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 16)
  31. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 12)
  32. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  33. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 16) # Complex type. Size & offset match previous entries' sum
  34. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["typeName"] == "/ExampleSRG/S")
  35. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 32)
  36. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 32)
  37. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 64)
  38. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 32)
  39. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 96)
  40. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  41. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 112)
  42. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 4)
  43. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 128)
  44. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 4)
  45. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 96)
  46. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 12)
  47. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 112)
  48. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 8)
  49. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 128)
  50. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 8)
  51. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 112)
  52. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 16)
  53. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 128)
  54. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 12)
  55. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 144)
  56. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 12)
  57. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 128)
  58. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 32)
  59. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  60. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 160)
  61. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  62. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 176)
  63. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 4)
  64. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 192)
  65. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 4)
  66. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 208)
  67. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 4)
  68. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 224)
  69. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 4)
  70. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 240)
  71. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 4)
  72. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 256)
  73. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 4)
  74. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 272)
  75. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteSize"] == 4)
  76. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 288)
  77. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 4)
  78. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteOffset"] == 160)
  79. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteSize"] == 36)
  80. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteOffset"] == 208)
  81. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteSize"] == 12)
  82. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteOffset"] == 224)
  83. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteSize"] == 12)
  84. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteOffset"] == 240)
  85. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteSize"] == 12)
  86. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteOffset"] == 256)
  87. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteSize"] == 12)
  88. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteOffset"] == 208)
  89. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteSize"] == 64)
  90. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteOffset"] == 0)
  91. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteSize"] == 272)
  92. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["typeName"] == "/ExampleSRG/T")
  93. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<T>")
  94. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  95. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 1)
  96. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  97. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 268)
  98. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<T>")
  99. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  100. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 2)
  101. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  102. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 268)
  103. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  104. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 4)
  105. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  106. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 144)
  107. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "Buffer<float4>")
  108. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  109. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 0)
  110. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  111. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  112. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["type"] == "StructuredBuffer<S>")
  113. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["count"] == 1)
  114. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["index"] == 1)
  115. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["space"] == 0)
  116. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 12)
  117. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["type"] == "Buffer<float2>")
  118. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["count"] == 2)
  119. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["index"] == 2)
  120. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["space"] == 0)
  121. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 8)
  122. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["type"] == "StructuredBuffer<S>")
  123. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["count"] == 2)
  124. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["index"] == 4)
  125. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["space"] == 0)
  126. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 12)
  127. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["id"] == "m_texCube1")
  128. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["type"] == "TextureCube")
  129. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["count"] == 1)
  130. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["index"] == 6)
  131. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["space"] == 0)
  132. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["stride"] == 16)
  133. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  134. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  135. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["count"] == 1)
  136. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["index"] == 7)
  137. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["space"] == 0)
  138. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["stride"] == 12)
  139. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  140. ok = testfuncs.verifyAllPredicates(predicates, j)
  141. return True if ok else False
  142. def verifyPackingDirectX(thefile, compilerPath, silent):
  143. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--srg"])
  144. if ok:
  145. predicates = []
  146. # check all references of func()
  147. # Matches 2 (DX) standard here:
  148. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  149. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  150. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  151. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  152. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 12)
  153. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 16)
  154. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 12)
  155. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  156. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 12) # Complex type. Size & offset match previous entries' sum
  157. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["typeName"] == "/ExampleSRG/S")
  158. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 32)
  159. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 40) # float2x3 - 2 full registers of 16 bytes each and 2 elements of the last register of 4 bytes each
  160. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 80)
  161. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 28) # row float2x3 - 1 full register of 16 bytes and 3 elements of the last register of 4 bytes each
  162. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 112)
  163. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  164. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 128)
  165. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 4)
  166. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 144)
  167. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 4)
  168. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 112)
  169. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 36)
  170. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 160)
  171. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 8)
  172. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 176)
  173. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 8)
  174. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 160)
  175. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 24)
  176. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 192)
  177. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 12)
  178. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 208)
  179. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 12)
  180. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 192)
  181. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 28)
  182. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  183. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 224)
  184. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  185. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 240)
  186. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 4)
  187. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 256)
  188. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 4)
  189. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 272)
  190. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 4)
  191. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 288)
  192. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 4)
  193. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 304)
  194. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 4)
  195. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 320)
  196. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 4)
  197. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 336)
  198. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteSize"] == 4)
  199. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 352)
  200. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 4)
  201. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteOffset"] == 224)
  202. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteSize"] == 132)
  203. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteOffset"] == 368)
  204. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteSize"] == 12)
  205. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteOffset"] == 384)
  206. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteSize"] == 12)
  207. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteOffset"] == 400)
  208. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteSize"] == 12)
  209. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteOffset"] == 416)
  210. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteSize"] == 12)
  211. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteOffset"] == 368)
  212. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteSize"] == 60)
  213. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteOffset"] == 0)
  214. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteSize"] == 428)
  215. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["typeName"] == "/ExampleSRG/T")
  216. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  217. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 428)
  218. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  219. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 428)
  220. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  221. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 144)
  222. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "Buffer<float4>")
  223. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  224. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  225. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["type"] == "StructuredBuffer<S>")
  226. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["count"] == 1)
  227. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 12)
  228. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["type"] == "Buffer<float2>")
  229. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["count"] == 2)
  230. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 8)
  231. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["type"] == "StructuredBuffer<S>")
  232. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["count"] == 2)
  233. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 12)
  234. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["id"] == "m_texCube1")
  235. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["type"] == "TextureCube")
  236. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["stride"] == 16)
  237. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  238. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  239. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["stride"] == 12)
  240. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  241. ok = testfuncs.verifyAllPredicates(predicates, j)
  242. return True if ok else False
  243. def verifyPackingVulkan(thefile, compilerPath, silent):
  244. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-vulkan", "--srg"])
  245. if ok:
  246. predicates = []
  247. # check all references of func()
  248. # Matches Uniform Buffer 1 (VK) standard here:
  249. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  250. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  251. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  252. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  253. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 12)
  254. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 16)
  255. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 12)
  256. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  257. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 16) # Complex type. Size & offset match previous entries' sum
  258. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["typeName"] == "/ExampleSRG/S")
  259. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 32)
  260. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 48) # float2x3 - 3 full registers of 16 bytes each
  261. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 80)
  262. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 32) # row float2x3 - 2 full registers of 16 bytes each
  263. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 112)
  264. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 16) # each array element is 16-byte aligned
  265. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 128)
  266. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 16)
  267. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 144)
  268. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 16)
  269. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 112)
  270. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 48)
  271. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 160)
  272. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 16)
  273. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 176)
  274. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 16)
  275. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 160)
  276. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 32)
  277. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 192)
  278. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 12)
  279. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 208)
  280. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 12)
  281. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 192)
  282. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 32)
  283. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  284. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 224) # Confirmed: SpirV can't pack 4 bytes after an array
  285. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 16)
  286. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 240)
  287. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 16)
  288. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 256)
  289. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 16)
  290. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 272)
  291. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 16)
  292. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 288)
  293. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 16)
  294. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 304)
  295. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 16)
  296. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 320)
  297. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 16)
  298. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 336)
  299. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteSize"] == 16)
  300. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 352)
  301. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 16)
  302. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteOffset"] == 224)
  303. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteSize"] == 144)
  304. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteOffset"] == 368)
  305. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteSize"] == 12)
  306. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteOffset"] == 384)
  307. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteSize"] == 12)
  308. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteOffset"] == 400)
  309. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteSize"] == 12)
  310. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteOffset"] == 416)
  311. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteSize"] == 12)
  312. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteOffset"] == 368)
  313. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteSize"] == 64)
  314. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteOffset"] == 0)
  315. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteSize"] == 432)
  316. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["typeName"] == "/ExampleSRG/T")
  317. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  318. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 432)
  319. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  320. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 432)
  321. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  322. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 144)
  323. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "Buffer<float4>")
  324. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  325. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  326. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["type"] == "StructuredBuffer<S>")
  327. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["count"] == 1)
  328. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 16) # Note that StructuredBuffers in SpirV follow the base alignment for arrays rule (align-16)
  329. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["type"] == "Buffer<float2>")
  330. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["count"] == 2)
  331. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 16) # Note that Buffers in SpirV follow the base alignment for arrays rule (align-16)
  332. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["type"] == "StructuredBuffer<S>")
  333. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["count"] == 2)
  334. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 16) # Note that StructuredBuffers in SpirV follow the base alignment for arrays rule (align-16)
  335. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["id"] == "m_texCube1")
  336. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["type"] == "TextureCube")
  337. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["stride"] == 16)
  338. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  339. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  340. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["stride"] == 12)
  341. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  342. ok = testfuncs.verifyAllPredicates(predicates, j)
  343. return True if ok else False
  344. def verifyStructsPackingVulkan(thefile, compilerPath, silent):
  345. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-vulkan", "--srg"])
  346. # Packing vectors in nested structs is trickier.
  347. # The following values match the dxc's SpirV generation
  348. if ok:
  349. predicates = []
  350. # check all references of func()
  351. # Matches Uniform Buffer 1 (VK) standard here:
  352. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  353. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["qualifiedName"] == "/ExampleSRG/Sab/a")
  354. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  355. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  356. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["qualifiedName"] == "/ExampleSRG/Sab/b")
  357. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  358. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 8)
  359. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["qualifiedName"] == "/ExampleSRG/T/ab") # Complex type
  360. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["typeName"] == "/ExampleSRG/Sab")
  361. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 0)
  362. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 16)
  363. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["qualifiedName"] == "/ExampleSRG/Sba/b")
  364. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  365. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 8)
  366. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["qualifiedName"] == "/ExampleSRG/Sba/a")
  367. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 24)
  368. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 4)
  369. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["qualifiedName"] == "/ExampleSRG/T/ba") # Complex type
  370. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["typeName"] == "/ExampleSRG/Sba")
  371. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 16)
  372. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 16)
  373. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["qualifiedName"] == "/ExampleSRG/Sabc/a")
  374. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 32)
  375. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  376. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["qualifiedName"] == "/ExampleSRG/Sabc/b")
  377. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 36)
  378. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 8)
  379. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["qualifiedName"] == "/ExampleSRG/Sabc/c")
  380. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 48)
  381. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 12)
  382. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["qualifiedName"] == "/ExampleSRG/T/abc") # Complex type
  383. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["typeName"] == "/ExampleSRG/Sabc")
  384. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 32)
  385. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 32)
  386. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["qualifiedName"] == "/ExampleSRG/Sac/a")
  387. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 64)
  388. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 4)
  389. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["qualifiedName"] == "/ExampleSRG/Sac/c")
  390. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 68)
  391. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 12)
  392. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["qualifiedName"] == "/ExampleSRG/T/ac")
  393. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["typeName"] == "/ExampleSRG/Sac")
  394. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 64)
  395. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 16)
  396. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["qualifiedName"] == "/ExampleSRG/S/a")
  397. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 80)
  398. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 4)
  399. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["qualifiedName"] == "/ExampleSRG/S/b")
  400. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 96)
  401. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 16)
  402. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["qualifiedName"] == "/ExampleSRG/T/s")
  403. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  404. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 80)
  405. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 32)
  406. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["qualifiedName"] == "/ExampleSRG/T/a_float")
  407. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 112)
  408. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  409. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"] == "/ExampleSRG/U/a")
  410. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 128)
  411. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 4)
  412. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["qualifiedName"] == "/ExampleSRG/U/b")
  413. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 132)
  414. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 8)
  415. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["qualifiedName"] == "/ExampleSRG/U/c")
  416. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 140)
  417. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 4)
  418. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["qualifiedName"] == "/ExampleSRG/U/d")
  419. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 144)
  420. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 8)
  421. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["qualifiedName"] == "/ExampleSRG/T/u") # Complex type
  422. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["typeName"] == "/ExampleSRG/U")
  423. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 128)
  424. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 32)
  425. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["qualifiedName"] == "/ExampleSRG/m_CB")
  426. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["typeName"] == "/ExampleSRG/T")
  427. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 0)
  428. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 160)
  429. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  430. ok = testfuncs.verifyAllPredicates(predicates, j)
  431. return True if ok else False
  432. def verifyPackingOpenGL(thefile, compilerPath, silent):
  433. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-opengl", "--srg"])
  434. if ok:
  435. predicates = []
  436. # check all references of func()
  437. # Matches std140 (GL) standard here:
  438. # https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159
  439. # std140 : https://www.oreilly.com/library/view/opengl-programming-guide/9780132748445/app09lev1sec2.html
  440. # std430 : https://www.oreilly.com/library/view/opengl-programming-guide/9780132748445/app09lev1sec3.html
  441. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  442. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  443. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  444. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 12)
  445. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 16)
  446. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 12)
  447. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  448. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 16)
  449. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["typeName"] == "/ExampleSRG/S")
  450. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 32)
  451. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 48)
  452. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 80)
  453. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 32)
  454. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 112)
  455. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  456. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 116)
  457. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 4)
  458. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 120)
  459. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 4)
  460. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 112)
  461. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 12)
  462. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 128)
  463. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 8)
  464. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 144)
  465. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 8)
  466. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 128)
  467. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 24)
  468. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 160)
  469. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 12)
  470. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 192)
  471. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 12)
  472. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 160)
  473. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 48)
  474. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  475. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 208)
  476. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  477. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 212)
  478. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 4)
  479. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 216)
  480. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 4)
  481. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 220)
  482. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 4)
  483. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 224)
  484. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 4)
  485. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 228)
  486. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 4)
  487. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 232)
  488. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 4)
  489. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 236)
  490. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteSize"] == 4)
  491. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 240)
  492. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 4)
  493. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteOffset"] == 208)
  494. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteSize"] == 36)
  495. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteOffset"] == 244)
  496. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteSize"] == 12)
  497. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteOffset"] == 256)
  498. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteSize"] == 12)
  499. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteOffset"] == 272)
  500. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteSize"] == 12)
  501. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteOffset"] == 288)
  502. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteSize"] == 12)
  503. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteOffset"] == 256)
  504. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteSize"] == 64)
  505. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteOffset"] == 0)
  506. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteSize"] == 320)
  507. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["typeName"] == "/ExampleSRG/T")
  508. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  509. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 320)
  510. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  511. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 320)
  512. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  513. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 144)
  514. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "Buffer<float4>")
  515. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  516. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  517. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["type"] == "StructuredBuffer<S>")
  518. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["count"] == 1)
  519. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 16)
  520. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["type"] == "Buffer<float2>")
  521. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["count"] == 2)
  522. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 8)
  523. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["type"] == "StructuredBuffer<S>")
  524. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["count"] == 2)
  525. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 16)
  526. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["id"] == "m_texCube1")
  527. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["type"] == "TextureCube")
  528. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["stride"] == 16)
  529. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  530. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  531. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["stride"] == 12)
  532. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  533. ok = testfuncs.verifyAllPredicates(predicates, j)
  534. return True if ok else False
  535. def verifyStructsPackingOpenGL(thefile, compilerPath, silent):
  536. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-opengl", "--srg"])
  537. # Packing vectors in nested structs is trickier.
  538. # The following values match the dxc's OpenGL generation
  539. if ok:
  540. predicates = []
  541. # check all references of func()
  542. # Matches std340 (GL) standard here:
  543. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  544. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["qualifiedName"] == "/ExampleSRG/Sab/a")
  545. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  546. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  547. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["qualifiedName"] == "/ExampleSRG/Sab/b")
  548. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  549. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 8)
  550. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["qualifiedName"] == "/ExampleSRG/T/ab") # Complex type
  551. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["typeName"] == "/ExampleSRG/Sab")
  552. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 0)
  553. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 16)
  554. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["qualifiedName"] == "/ExampleSRG/Sba/b")
  555. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  556. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 8)
  557. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["qualifiedName"] == "/ExampleSRG/Sba/a")
  558. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 24)
  559. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 4)
  560. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["qualifiedName"] == "/ExampleSRG/T/ba") # Complex type
  561. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["typeName"] == "/ExampleSRG/Sba")
  562. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 16)
  563. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 16)
  564. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["qualifiedName"] == "/ExampleSRG/Sabc/a")
  565. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 32)
  566. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  567. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["qualifiedName"] == "/ExampleSRG/Sabc/b")
  568. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 36)
  569. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 8)
  570. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["qualifiedName"] == "/ExampleSRG/Sabc/c")
  571. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 48)
  572. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 12)
  573. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["qualifiedName"] == "/ExampleSRG/T/abc") # Complex type
  574. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["typeName"] == "/ExampleSRG/Sabc")
  575. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 32)
  576. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 32)
  577. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["qualifiedName"] == "/ExampleSRG/Sac/a")
  578. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 64)
  579. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 4)
  580. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["qualifiedName"] == "/ExampleSRG/Sac/c")
  581. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 68)
  582. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 12)
  583. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["qualifiedName"] == "/ExampleSRG/T/ac")
  584. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["typeName"] == "/ExampleSRG/Sac")
  585. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 64)
  586. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 16)
  587. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["qualifiedName"] == "/ExampleSRG/S/a")
  588. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 80)
  589. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 4)
  590. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["qualifiedName"] == "/ExampleSRG/S/b")
  591. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 96)
  592. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 16)
  593. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["qualifiedName"] == "/ExampleSRG/T/s")
  594. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  595. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 80)
  596. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 32)
  597. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["qualifiedName"] == "/ExampleSRG/T/a_float")
  598. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 112)
  599. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  600. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"] == "/ExampleSRG/U/a")
  601. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 116)
  602. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 4)
  603. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["qualifiedName"] == "/ExampleSRG/U/b")
  604. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 120)
  605. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 8)
  606. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["qualifiedName"] == "/ExampleSRG/U/c")
  607. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 128)
  608. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 4)
  609. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["qualifiedName"] == "/ExampleSRG/U/d")
  610. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 132)
  611. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 8)
  612. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["qualifiedName"] == "/ExampleSRG/T/u") # Complex type
  613. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["typeName"] == "/ExampleSRG/U")
  614. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 128)
  615. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 28)
  616. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["qualifiedName"] == "/ExampleSRG/m_CB")
  617. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["typeName"] == "/ExampleSRG/T")
  618. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 0)
  619. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 160)
  620. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  621. ok = testfuncs.verifyAllPredicates(predicates, j)
  622. return True if ok else False
  623. def verifyPackingRelaxedUseSpaces(thefile, compilerPath, silent):
  624. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg"])
  625. if ok:
  626. predicates = []
  627. # check all references of func()
  628. # Matches Storage Buffer 1 (VK) standard here:
  629. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  630. # Shader Resource Group 0
  631. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  632. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  633. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 0)
  634. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  635. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  636. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  637. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  638. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 1)
  639. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  640. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  641. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  642. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  643. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  644. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  645. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  646. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  647. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  648. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  649. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  650. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  651. # Shader Resource Group 1
  652. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  653. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  654. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 0)
  655. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  656. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  657. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  658. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  659. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  660. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  661. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  662. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  663. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  664. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  665. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  666. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  667. # Shader Resource Group 2
  668. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  669. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  670. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  671. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  672. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  673. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  674. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  675. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  676. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  677. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  678. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  679. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  680. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  681. ok = testfuncs.verifyAllPredicates(predicates, j)
  682. return True if ok else False
  683. def verifyPackingRelaxedNoSpaces(thefile, compilerPath, silent):
  684. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg"])
  685. if ok:
  686. predicates = []
  687. # check all references of func()
  688. # Matches Storage Buffer 1 (VK) standard here:
  689. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  690. # Shader Resource Group 0
  691. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  692. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  693. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 0)
  694. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  695. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  696. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  697. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  698. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 1)
  699. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  700. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  701. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  702. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  703. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  704. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  705. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  706. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  707. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  708. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  709. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  710. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  711. # Shader Resource Group 1
  712. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  713. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  714. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 0)
  715. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  716. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  717. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  718. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  719. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  720. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  721. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  722. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  723. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  724. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  725. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  726. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  727. # Shader Resource Group 2
  728. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  729. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  730. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  731. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  732. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  733. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  734. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  735. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  736. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  737. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  738. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  739. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  740. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  741. ok = testfuncs.verifyAllPredicates(predicates, j)
  742. return True if ok else False
  743. def verifyPackingRelaxedUniqueIdx(thefile, compilerPath, silent):
  744. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg", "--unique-idx"])
  745. if ok:
  746. predicates = []
  747. # check all references of func()
  748. # Matches Storage Buffer 1 (VK) standard here:
  749. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  750. # Note! Bacause AZSLc emits the resource indices in order SRVs/UAVs, then Samplers, then CBVs
  751. # the indices (when using unique index) don't necessarily match the order of declaration.
  752. # Since the data is reflected this should not be a problem!
  753. # In fact, it verifies the consumer application is data driven and accepts the emitted register indices
  754. # Shader Resource Group 0
  755. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  756. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  757. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 2)
  758. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  759. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  760. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  761. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  762. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 3)
  763. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  764. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  765. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  766. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  767. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  768. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  769. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  770. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  771. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  772. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  773. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  774. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  775. # Shader Resource Group 1
  776. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  777. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  778. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 4)
  779. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  780. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  781. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  782. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  783. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  784. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  785. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  786. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  787. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  788. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  789. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  790. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  791. # Shader Resource Group 2
  792. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  793. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  794. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  795. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  796. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  797. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  798. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  799. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  800. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  801. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  802. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  803. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  804. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  805. ok = testfuncs.verifyAllPredicates(predicates, j)
  806. return True if ok else False
  807. def verifyPackingRelaxedUniqueIdxUseSpaces(thefile, compilerPath, silent):
  808. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg", "--unique-idx"])
  809. if ok:
  810. predicates = []
  811. # check all references of func()
  812. # Matches Storage Buffer 1 (VK) standard here:
  813. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  814. # Note! Bacause AZSLc emits the resource indices in order SRVs/UAVs, then Samplers, then CBVs
  815. # the indices (when using unique index) don't necessarily match the order of declaration.
  816. # Since the data is reflected this should not be a problem!
  817. # In fact, it verifies the consumer application is data driven and accepts the emitted register indices
  818. # Shader Resource Group 0
  819. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  820. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  821. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 2)
  822. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  823. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  824. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  825. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  826. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 3)
  827. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  828. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  829. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  830. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  831. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  832. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  833. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  834. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  835. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  836. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  837. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  838. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  839. # Shader Resource Group 1
  840. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  841. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  842. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 4)
  843. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  844. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  845. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  846. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  847. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  848. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  849. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  850. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  851. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  852. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  853. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  854. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  855. # Shader Resource Group 2
  856. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  857. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  858. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  859. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  860. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  861. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  862. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  863. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  864. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  865. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  866. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  867. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  868. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  869. ok = testfuncs.verifyAllPredicates(predicates, j)
  870. return True if ok else False
  871. def verifyPackingUnboundedSpillSpaces(thefile, compilerPath, silent):
  872. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg", "--namespace=dx"])
  873. if ok:
  874. predicates = []
  875. # Shader Resource Group 0
  876. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["id"] == "m_texSRVa")
  877. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["type"] == "Texture2D<float4>")
  878. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["count"] == -1)
  879. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["index"] == 0)
  880. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["space"] == 1000)
  881. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["id"] == "m_texSRVb")
  882. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["type"] == "Texture2D<float4>")
  883. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["count"] == -1)
  884. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["index"] == 1)
  885. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["space"] == 1001)
  886. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][2]["id"] == "m_texSRVc")
  887. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][2]["type"] == "Texture2D<float4>")
  888. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][2]["count"] == 1)
  889. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][2]["index"] == 2)
  890. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][2]["space"] == 0)
  891. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][3]["id"] == "m_texSRVd")
  892. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][3]["type"] == "Texture2D<float4>")
  893. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][3]["count"] == 1)
  894. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][3]["index"] == 3)
  895. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][3]["space"] == 0)
  896. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][4]["id"] == "m_texUAVa")
  897. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][4]["type"] == "RWTexture2D<float4>")
  898. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][4]["count"] == -1)
  899. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][4]["index"] == 0)
  900. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][4]["space"] == 1002)
  901. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][5]["id"] == "m_texUAVb")
  902. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][5]["type"] == "RWTexture2D<float4>")
  903. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][5]["count"] == -1)
  904. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][5]["index"] == 1)
  905. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][5]["space"] == 1003)
  906. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][0]["id"] == "m_samplera")
  907. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][0]["count"] == -1)
  908. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][0]["index"] == 0)
  909. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][0]["space"] == 1004)
  910. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][1]["id"] == "m_samplerb")
  911. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][1]["count"] == -1)
  912. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][1]["index"] == 1)
  913. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSamplers"][1]["space"] == 1005)
  914. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["id"] == "m_structArraya")
  915. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<MyStruct>")
  916. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == -1)
  917. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 0)
  918. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 1006)
  919. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["id"] == "m_structArrayb")
  920. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<MyStruct>")
  921. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == -1)
  922. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 1)
  923. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 1007)
  924. # Shader Resource Group 1
  925. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][0]["id"] == "m_texSRVa")
  926. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][0]["type"] == "Texture2D<float4>")
  927. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][0]["count"] == -1)
  928. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][0]["index"] == 0)
  929. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][0]["space"] == 1008)
  930. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][1]["id"] == "m_texSRVb")
  931. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][1]["type"] == "Texture2D<float4>")
  932. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][1]["count"] == -1)
  933. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][1]["index"] == 1)
  934. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][1]["space"] == 1009)
  935. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][2]["id"] == "m_texSRVc")
  936. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][2]["type"] == "Texture2D<float4>")
  937. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][2]["count"] == 1)
  938. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][2]["index"] == 2)
  939. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][2]["space"] == 1)
  940. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][3]["id"] == "m_texSRVd")
  941. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][3]["type"] == "Texture2D<float4>")
  942. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][3]["count"] == 1)
  943. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][3]["index"] == 3)
  944. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][3]["space"] == 1)
  945. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][4]["id"] == "m_texUAVa")
  946. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][4]["type"] == "RWTexture2D<float4>")
  947. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][4]["count"] == -1)
  948. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][4]["index"] == 0)
  949. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][4]["space"] == 1010)
  950. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][5]["id"] == "m_texUAVb")
  951. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][5]["type"] == "RWTexture2D<float4>")
  952. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][5]["count"] == -1)
  953. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][5]["index"] == 1)
  954. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForImageViews"][5]["space"] == 1011)
  955. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][0]["id"] == "m_samplera")
  956. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][0]["count"] == -1)
  957. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][0]["index"] == 0)
  958. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][0]["space"] == 1012)
  959. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][1]["id"] == "m_samplerb")
  960. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][1]["count"] == -1)
  961. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][1]["index"] == 1)
  962. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForSamplers"][1]["space"] == 1013)
  963. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["id"] == "m_structArraya")
  964. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<MyStruct>")
  965. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == -1)
  966. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 0)
  967. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1014)
  968. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["id"] == "m_structArrayb")
  969. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<MyStruct>")
  970. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == -1)
  971. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 1)
  972. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1015)
  973. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  974. ok = testfuncs.verifyAllPredicates(predicates, j)
  975. return True if ok else False
  976. def verifyPackingDirectXMatrices(thefile, compilerPath, silent):
  977. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--no-alignment-validation", "--srg"])
  978. if ok:
  979. predicates = []
  980. # check all references of func()
  981. # Matches 2 (DX) emission here:
  982. # http://shader-playground.timjones.io/206f18e88f838720db8e3415362551df
  983. # struct T2
  984. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0]["constantByteOffset"] == 0)
  985. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1]["constantByteOffset"] == 24)
  986. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2]["constantByteOffset"] == 32)
  987. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3]["constantByteOffset"] == 72)
  988. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4]["constantByteOffset"] == 80)
  989. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5]["constantByteOffset"] == 136)
  990. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6]["constantByteOffset"] == 144)
  991. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7]["constantByteOffset"] == 168)
  992. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8]["constantByteOffset"] == 176)
  993. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9]["constantByteOffset"] == 204)
  994. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 208)
  995. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 240)
  996. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 256)
  997. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 280)
  998. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 288)
  999. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 328)
  1000. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 336)
  1001. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 392)
  1002. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 400)
  1003. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 424)
  1004. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 432)
  1005. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 464)
  1006. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 480)
  1007. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 512)
  1008. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 0)
  1009. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 520) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1010. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["typeName"] == "/ExampleSRG/T2")
  1011. # struct T3
  1012. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 25]["constantByteOffset"] == 0 + 528)
  1013. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 25]["constantByteOffset"] == 28 + 528)
  1014. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 25]["constantByteOffset"] == 32 + 528)
  1015. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 25]["constantByteOffset"] == 76 + 528)
  1016. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 25]["constantByteOffset"] == 80 + 528)
  1017. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 25]["constantByteOffset"] == 140 + 528)
  1018. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 25]["constantByteOffset"] == 144 + 528)
  1019. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 25]["constantByteOffset"] == 184 + 528)
  1020. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 25]["constantByteOffset"] == 192 + 528)
  1021. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 25]["constantByteOffset"] == 236 + 528)
  1022. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 25]["constantByteOffset"] == 240 + 528)
  1023. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 25]["constantByteOffset"] == 288 + 528)
  1024. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 25]["constantByteOffset"] == 304 + 528)
  1025. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 25]["constantByteOffset"] == 336 + 528)
  1026. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 25]["constantByteOffset"] == 352 + 528)
  1027. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 25]["constantByteOffset"] == 400 + 528)
  1028. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 25]["constantByteOffset"] == 416 + 528)
  1029. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 25]["constantByteOffset"] == 480 + 528)
  1030. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 25]["constantByteOffset"] == 496 + 528)
  1031. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 25]["constantByteOffset"] == 536 + 528)
  1032. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 25]["constantByteOffset"] == 544 + 528)
  1033. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 25]["constantByteOffset"] == 592 + 528)
  1034. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 25]["constantByteOffset"] == 608 + 528)
  1035. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 25]["constantByteOffset"] == 656 + 528)
  1036. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteOffset"] == 528)
  1037. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteSize"] == 664) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1038. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["typeName"] == "/ExampleSRG/T3")
  1039. # struct T4
  1040. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 50]["constantByteOffset"] == 0 + 1200)
  1041. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 50]["constantByteOffset"] == 32 + 1200)
  1042. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 50]["constantByteOffset"] == 48 + 1200)
  1043. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 50]["constantByteOffset"] == 96 + 1200)
  1044. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 50]["constantByteOffset"] == 112 + 1200)
  1045. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 50]["constantByteOffset"] == 176 + 1200)
  1046. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 50]["constantByteOffset"] == 192 + 1200)
  1047. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 50]["constantByteOffset"] == 248 + 1200)
  1048. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 50]["constantByteOffset"] == 256 + 1200)
  1049. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 50]["constantByteOffset"] == 316 + 1200)
  1050. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 50]["constantByteOffset"] == 320 + 1200)
  1051. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 50]["constantByteOffset"] == 384 + 1200)
  1052. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 50]["constantByteOffset"] == 400 + 1200)
  1053. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 50]["constantByteOffset"] == 432 + 1200)
  1054. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 50]["constantByteOffset"] == 448 + 1200)
  1055. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 50]["constantByteOffset"] == 496 + 1200)
  1056. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 50]["constantByteOffset"] == 512 + 1200)
  1057. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 50]["constantByteOffset"] == 576 + 1200)
  1058. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 50]["constantByteOffset"] == 592 + 1200)
  1059. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 50]["constantByteOffset"] == 648 + 1200)
  1060. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 50]["constantByteOffset"] == 656 + 1200)
  1061. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 50]["constantByteOffset"] == 720 + 1200)
  1062. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 50]["constantByteOffset"] == 736 + 1200)
  1063. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 50]["constantByteOffset"] == 800 + 1200)
  1064. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteOffset"] == 1200)
  1065. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteSize"] == 808) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1066. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["typeName"] == "/ExampleSRG/T4")
  1067. # struct TU
  1068. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 75]["constantByteOffset"] == 0 + 2016)
  1069. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 75]["constantByteOffset"] == 4 + 2016)
  1070. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 75]["constantByteOffset"] == 16 + 2016)
  1071. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 75]["constantByteOffset"] == 36 + 2016)
  1072. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 75]["constantByteOffset"] == 48 + 2016)
  1073. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 75]["constantByteOffset"] == 84 + 2016)
  1074. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 75]["constantByteOffset"] == 96 + 2016)
  1075. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 75]["constantByteOffset"] == 148 + 2016)
  1076. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 75]["constantByteOffset"] == 152 + 2016)
  1077. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 75]["constantByteOffset"] == 156 + 2016)
  1078. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 75]["constantByteOffset"] == 160 + 2016)
  1079. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 75]["constantByteOffset"] == 168 + 2016)
  1080. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 75]["constantByteOffset"] == 176 + 2016)
  1081. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 75]["constantByteOffset"] == 188 + 2016)
  1082. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 75]["constantByteOffset"] == 192 + 2016)
  1083. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 75]["constantByteOffset"] == 208 + 2016)
  1084. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 75]["constantByteOffset"] == 212 + 2016)
  1085. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 75]["constantByteOffset"] == 216 + 2016)
  1086. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 75]["constantByteOffset"] == 224 + 2016)
  1087. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 75]["constantByteOffset"] == 232 + 2016)
  1088. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 75]["constantByteOffset"] == 240 + 2016)
  1089. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 75]["constantByteOffset"] == 256 + 2016)
  1090. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 75]["constantByteOffset"] == 272 + 2016)
  1091. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 75]["constantByteOffset"] == 288 + 2016)
  1092. # Special cases packing tests
  1093. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24 + 75]["constantByteOffset"] == 296 + 2016)
  1094. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25 + 75]["constantByteOffset"] == 304 + 2016)
  1095. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26 + 75]["constantByteOffset"] == 312 + 2016)
  1096. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27 + 75]["constantByteOffset"] == 320 + 2016)
  1097. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28 + 75]["constantByteOffset"] == 332 + 2016)
  1098. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29 + 75]["constantByteOffset"] == 336 + 2016)
  1099. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30 + 75]["constantByteOffset"] == 344 + 2016)
  1100. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31 + 75]["constantByteOffset"] == 352 + 2016)
  1101. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][32 + 75]["constantByteOffset"] == 368 + 2016)
  1102. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][33 + 75]["constantByteOffset"] == 384 + 2016)
  1103. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][34 + 75]["constantByteOffset"] == 392 + 2016)
  1104. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteOffset"] == 2016)
  1105. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteSize"] == 400) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1106. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["typeName"] == "/ExampleSRG/TU")
  1107. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  1108. ok = testfuncs.verifyAllPredicates(predicates, j)
  1109. return True if ok else False
  1110. def verifyPackingVulkanMatrices(thefile, compilerPath, silent):
  1111. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-vulkan", "--no-alignment-validation", "--srg"])
  1112. if ok:
  1113. predicates = []
  1114. # check all references of func()
  1115. # Matches Uniform Buffer 1 (VK) emission here:
  1116. # http://shader-playground.timjones.io/206f18e88f838720db8e3415362551df
  1117. # struct T2
  1118. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0]["constantByteOffset"] == 0)
  1119. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1]["constantByteOffset"] == 32)
  1120. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2]["constantByteOffset"] == 48)
  1121. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3]["constantByteOffset"] == 96)
  1122. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4]["constantByteOffset"] == 112)
  1123. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5]["constantByteOffset"] == 176)
  1124. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6]["constantByteOffset"] == 192)
  1125. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7]["constantByteOffset"] == 224)
  1126. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8]["constantByteOffset"] == 240)
  1127. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9]["constantByteOffset"] == 272)
  1128. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 288)
  1129. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 320)
  1130. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 336)
  1131. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 368)
  1132. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 384)
  1133. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 432)
  1134. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 448)
  1135. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 512)
  1136. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 528)
  1137. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 560)
  1138. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 576)
  1139. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 608)
  1140. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 624)
  1141. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 656)
  1142. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 0)
  1143. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 672) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1144. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["typeName"] == "/ExampleSRG/T2")
  1145. # struct T3
  1146. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 25]["constantByteOffset"] == 0 + 672)
  1147. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 25]["constantByteOffset"] == 32 + 672)
  1148. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 25]["constantByteOffset"] == 48 + 672)
  1149. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 25]["constantByteOffset"] == 96 + 672)
  1150. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 25]["constantByteOffset"] == 112 + 672)
  1151. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 25]["constantByteOffset"] == 176 + 672)
  1152. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 25]["constantByteOffset"] == 192 + 672)
  1153. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 25]["constantByteOffset"] == 240 + 672)
  1154. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 25]["constantByteOffset"] == 256 + 672)
  1155. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 25]["constantByteOffset"] == 304 + 672)
  1156. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 25]["constantByteOffset"] == 320 + 672)
  1157. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 25]["constantByteOffset"] == 368 + 672)
  1158. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 25]["constantByteOffset"] == 384 + 672)
  1159. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 25]["constantByteOffset"] == 416 + 672)
  1160. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 25]["constantByteOffset"] == 432 + 672)
  1161. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 25]["constantByteOffset"] == 480 + 672)
  1162. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 25]["constantByteOffset"] == 496 + 672)
  1163. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 25]["constantByteOffset"] == 560 + 672)
  1164. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 25]["constantByteOffset"] == 576 + 672)
  1165. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 25]["constantByteOffset"] == 624 + 672)
  1166. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 25]["constantByteOffset"] == 640 + 672)
  1167. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 25]["constantByteOffset"] == 688 + 672)
  1168. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 25]["constantByteOffset"] == 704 + 672)
  1169. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 25]["constantByteOffset"] == 752 + 672)
  1170. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteOffset"] == 672)
  1171. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteSize"] == 768) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1172. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["typeName"] == "/ExampleSRG/T3")
  1173. # struct T4
  1174. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 50]["constantByteOffset"] == 0 + 1440)
  1175. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 50]["constantByteOffset"] == 32 + 1440)
  1176. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 50]["constantByteOffset"] == 48 + 1440)
  1177. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 50]["constantByteOffset"] == 96 + 1440)
  1178. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 50]["constantByteOffset"] == 112 + 1440)
  1179. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 50]["constantByteOffset"] == 176 + 1440)
  1180. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 50]["constantByteOffset"] == 192 + 1440)
  1181. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 50]["constantByteOffset"] == 256 + 1440)
  1182. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 50]["constantByteOffset"] == 272 + 1440)
  1183. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 50]["constantByteOffset"] == 336 + 1440)
  1184. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 50]["constantByteOffset"] == 352 + 1440)
  1185. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 50]["constantByteOffset"] == 416 + 1440)
  1186. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 50]["constantByteOffset"] == 432 + 1440)
  1187. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 50]["constantByteOffset"] == 464 + 1440)
  1188. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 50]["constantByteOffset"] == 480 + 1440)
  1189. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 50]["constantByteOffset"] == 528 + 1440)
  1190. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 50]["constantByteOffset"] == 544 + 1440)
  1191. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 50]["constantByteOffset"] == 608 + 1440)
  1192. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 50]["constantByteOffset"] == 624 + 1440)
  1193. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 50]["constantByteOffset"] == 688 + 1440)
  1194. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 50]["constantByteOffset"] == 704 + 1440)
  1195. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 50]["constantByteOffset"] == 768 + 1440)
  1196. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 50]["constantByteOffset"] == 784 + 1440)
  1197. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 50]["constantByteOffset"] == 848 + 1440)
  1198. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteOffset"] == 1440)
  1199. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteSize"] == 864) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1200. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["typeName"] == "/ExampleSRG/T4")
  1201. # struct TU
  1202. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 75]["constantByteOffset"] == 0 + 2304)
  1203. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 75]["constantByteOffset"] == 4 + 2304)
  1204. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 75]["constantByteOffset"] == 8 + 2304)
  1205. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 75]["constantByteOffset"] == 16 + 2304)
  1206. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 75]["constantByteOffset"] == 20 + 2304)
  1207. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 75]["constantByteOffset"] == 32 + 2304)
  1208. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 75]["constantByteOffset"] == 48 + 2304)
  1209. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 75]["constantByteOffset"] == 64 + 2304)
  1210. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 75]["constantByteOffset"] == 68 + 2304)
  1211. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 75]["constantByteOffset"] == 72 + 2304)
  1212. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 75]["constantByteOffset"] == 80 + 2304)
  1213. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 75]["constantByteOffset"] == 88 + 2304)
  1214. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 75]["constantByteOffset"] == 96 + 2304)
  1215. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 75]["constantByteOffset"] == 108 + 2304)
  1216. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 75]["constantByteOffset"] == 112 + 2304)
  1217. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 75]["constantByteOffset"] == 128 + 2304)
  1218. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 75]["constantByteOffset"] == 132 + 2304)
  1219. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 75]["constantByteOffset"] == 136 + 2304)
  1220. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 75]["constantByteOffset"] == 144 + 2304)
  1221. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 75]["constantByteOffset"] == 152 + 2304)
  1222. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 75]["constantByteOffset"] == 160 + 2304)
  1223. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 75]["constantByteOffset"] == 176 + 2304)
  1224. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 75]["constantByteOffset"] == 192 + 2304)
  1225. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 75]["constantByteOffset"] == 208 + 2304)
  1226. # Special cases packing tests
  1227. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24 + 75]["constantByteOffset"] == 216 + 2304)
  1228. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25 + 75]["constantByteOffset"] == 224 + 2304)
  1229. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26 + 75]["constantByteOffset"] == 232 + 2304)
  1230. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27 + 75]["constantByteOffset"] == 240 + 2304)
  1231. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28 + 75]["constantByteOffset"] == 252 + 2304)
  1232. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29 + 75]["constantByteOffset"] == 256 + 2304)
  1233. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30 + 75]["constantByteOffset"] == 264 + 2304)
  1234. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31 + 75]["constantByteOffset"] == 272 + 2304)
  1235. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][32 + 75]["constantByteOffset"] == 288 + 2304)
  1236. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][33 + 75]["constantByteOffset"] == 304 + 2304)
  1237. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][34 + 75]["constantByteOffset"] == 312 + 2304)
  1238. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteOffset"] == 2304)
  1239. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteSize"] == 320) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1240. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["typeName"] == "/ExampleSRG/TU")
  1241. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  1242. ok = testfuncs.verifyAllPredicates(predicates, j)
  1243. return True if ok else False
  1244. def verifyPackingDirectXStride(thefile, compilerPath, silent):
  1245. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--no-alignment-validation", "--srg"])
  1246. if ok:
  1247. predicates = []
  1248. # Column major Constant Buffers
  1249. # Note that the stride here means size. ConstantBuffers should have stride of 0
  1250. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 32)
  1251. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 48)
  1252. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 36)
  1253. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 64)
  1254. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 40)
  1255. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 52)
  1256. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 68)
  1257. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][7]["stride"] == 56)
  1258. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][8]["stride"] == 72)
  1259. # Row major Constant Buffers
  1260. # Note that the stride here means size. ConstantBuffers should have stride of 0
  1261. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 32)
  1262. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 36)
  1263. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 48)
  1264. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][3]["stride"] == 40)
  1265. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][4]["stride"] == 64)
  1266. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][5]["stride"] == 52)
  1267. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][6]["stride"] == 56)
  1268. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][7]["stride"] == 68)
  1269. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][8]["stride"] == 72)
  1270. # Column major Structured Buffers
  1271. # Note that the stride is the size of a single element in the buffer. For DirectX packing layout majorness is ignored
  1272. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][0]["stride"] == 16 + 4)
  1273. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][1]["stride"] == 24 + 4)
  1274. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][2]["stride"] == 24 + 4)
  1275. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][3]["stride"] == 32 + 4)
  1276. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][4]["stride"] == 32 + 4)
  1277. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][5]["stride"] == 36 + 4)
  1278. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][6]["stride"] == 48 + 4)
  1279. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][7]["stride"] == 48 + 4)
  1280. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][8]["stride"] == 64 + 4)
  1281. # Row major Structured Buffers
  1282. # Note that the stride is the size of a single element in the buffer. For DirectX packing layout majorness is ignored
  1283. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][0]["stride"] == 16 + 4)
  1284. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][1]["stride"] == 24 + 4)
  1285. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][2]["stride"] == 24 + 4)
  1286. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][3]["stride"] == 32 + 4)
  1287. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][4]["stride"] == 32 + 4)
  1288. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][5]["stride"] == 36 + 4)
  1289. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][6]["stride"] == 48 + 4)
  1290. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][7]["stride"] == 48 + 4)
  1291. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][8]["stride"] == 64 + 4)
  1292. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  1293. ok = testfuncs.verifyAllPredicates(predicates, j)
  1294. return True if ok else False
  1295. def verifyPackingDirectXInlineConstants(thefile, compilerPath, silent):
  1296. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--srg", "--root-const=52"])
  1297. if ok:
  1298. predicates = []
  1299. # Inline constant buffer reflection data validation
  1300. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["count"] == 1)
  1301. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["index"] == 0)
  1302. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["space"] == 1)
  1303. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["usage"] == "Read")
  1304. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["sizeInBytes"] == 60)
  1305. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["id"] == "Root_Constants")
  1306. # Inline constant structure members validation
  1307. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteOffset"] == 0)
  1308. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteSize"] == 16)
  1309. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantId"] == "varFloat4")
  1310. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["qualifiedName"] == "/Root_Constants/varFloat4")
  1311. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeDimensions"] == [])
  1312. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeKind"] == "Predefined")
  1313. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeName"] == "?float4")
  1314. # Inline constant structure members validation
  1315. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteOffset"] == 16)
  1316. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteSize"] == 44)
  1317. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantId"] == "mat3x3")
  1318. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["qualifiedName"] == "/Root_Constants/mat3x3")
  1319. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeDimensions"] == [])
  1320. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeKind"] == "Predefined")
  1321. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeName"] == "?float3x3")
  1322. if not silent: print (fg.CYAN+ style.BRIGHT+ "inline constant layouts verification..."+ style.RESET_ALL)
  1323. ok = testfuncs.verifyAllPredicates(predicates, j)
  1324. return True if ok else False
  1325. def verifyPackingMetalInlineConstants(thefile, compilerPath, silent):
  1326. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--namespace=mt", "--srg"])
  1327. if ok:
  1328. predicates = []
  1329. # Inline constant buffer reflection data validation
  1330. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["count"] == 1)
  1331. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["index"] == 0)
  1332. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["space"] == 1)
  1333. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["usage"] == "Read")
  1334. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["sizeInBytes"] == 64)
  1335. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["id"] == "Root_Constants")
  1336. # Inline constant structure members validation
  1337. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteOffset"] == 0)
  1338. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteSize"] == 16)
  1339. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantId"] == "varFloat4")
  1340. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["qualifiedName"] == "/Root_Constants/varFloat4")
  1341. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeDimensions"] == [])
  1342. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeKind"] == "Predefined")
  1343. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeName"] == "?float4")
  1344. # Inline constant structure members validation
  1345. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteOffset"] == 16)
  1346. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteSize"] == 44)
  1347. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantId"] == "mat3x3")
  1348. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["qualifiedName"] == "/Root_Constants/mat3x3")
  1349. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeDimensions"] == [])
  1350. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeKind"] == "Predefined")
  1351. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeName"] == "?float3x3")
  1352. if not silent: print (fg.CYAN+ style.BRIGHT+ "inline constant layouts verification..."+ style.RESET_ALL)
  1353. ok = testfuncs.verifyAllPredicates(predicates, j)
  1354. return True if ok else False
  1355. result = 0 # to define for sub-tests
  1356. resultFailed = 0
  1357. def doTests(compiler, silent, azdxcpath):
  1358. global result
  1359. global resultFailed
  1360. # Working directory should have been set to this script's directory by the calling parent
  1361. # You can get it once doTests() is called, but not during initialization of the module,
  1362. # because at that time it will still be set to the working directory of the calling script
  1363. workDir = os.getcwd()
  1364. # Relaxed packing needs to be reviewed
  1365. #if verifyPackingRelaxed(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1366. #else: resultFailed += 1
  1367. if verifyPackingDirectX(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1368. else: resultFailed += 1
  1369. if verifyPackingVulkan(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1370. else: resultFailed += 1
  1371. if verifyStructsPackingVulkan(os.path.join(workDir, "srg-layouts-structs.azsl"), compiler, silent) : result += 1
  1372. else: resultFailed += 1
  1373. if verifyPackingOpenGL(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1374. else: resultFailed += 1
  1375. if verifyStructsPackingOpenGL(os.path.join(workDir, "srg-layouts-structs.azsl"), compiler, silent) : result += 1
  1376. else: resultFailed += 1
  1377. if verifyPackingRelaxedUseSpaces(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1378. else: resultFailed += 1
  1379. if verifyPackingRelaxedNoSpaces(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1380. else: resultFailed += 1
  1381. if verifyPackingRelaxedUniqueIdx(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1382. else: resultFailed += 1
  1383. if verifyPackingRelaxedUniqueIdxUseSpaces(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1384. else: resultFailed += 1
  1385. if verifyPackingUnboundedSpillSpaces(os.path.join(workDir, "srg-layouts-multiple-unbounded-arrays.azsl"), compiler, silent) : result += 1
  1386. else: resultFailed += 1
  1387. if verifyPackingDirectXMatrices(os.path.join(workDir, "srg-layouts-matrices.azsl"), compiler, silent) : result += 1
  1388. else: resultFailed += 1
  1389. if verifyPackingVulkanMatrices(os.path.join(workDir, "srg-layouts-matrices.azsl"), compiler, silent) : result += 1
  1390. else: resultFailed += 1
  1391. if verifyPackingDirectXStride(os.path.join(workDir, "srg-layouts-strides.azsl"), compiler, silent) : result += 1
  1392. else: resultFailed += 1
  1393. if verifyPackingDirectXInlineConstants(os.path.join(workDir, "inline-constant-layouts.azsl"), compiler, silent) : result += 1
  1394. else: resultFailed += 1
  1395. if verifyPackingMetalInlineConstants(os.path.join(workDir, "inline-constant-layouts.azsl"), compiler, silent) : result += 1
  1396. else: resultFailed += 1
  1397. if __name__ == "__main__":
  1398. print ("please call from testapp.py")