srg-layouts.py 136 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433
  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/m_CB")
  410. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["typeName"] == "/ExampleSRG/T")
  411. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 0)
  412. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 128)
  413. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  414. ok = testfuncs.verifyAllPredicates(predicates, j)
  415. return True if ok else False
  416. def verifyPackingOpenGL(thefile, compilerPath, silent):
  417. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-opengl", "--srg"])
  418. if ok:
  419. predicates = []
  420. # check all references of func()
  421. # Matches std140 (GL) standard here:
  422. # https://www.khronos.org/registry/OpenGL/specs/gl/glspec45.core.pdf#page=159
  423. # std140 : https://www.oreilly.com/library/view/opengl-programming-guide/9780132748445/app09lev1sec2.html
  424. # std430 : https://www.oreilly.com/library/view/opengl-programming-guide/9780132748445/app09lev1sec3.html
  425. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  426. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  427. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  428. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 12)
  429. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 16)
  430. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 12)
  431. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  432. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 16)
  433. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["typeName"] == "/ExampleSRG/S")
  434. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 32)
  435. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 48)
  436. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 80)
  437. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 32)
  438. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 112)
  439. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  440. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 116)
  441. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 4)
  442. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 120)
  443. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 4)
  444. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 112)
  445. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 12)
  446. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 128)
  447. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 8)
  448. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 144)
  449. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 8)
  450. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 128)
  451. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 24)
  452. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 160)
  453. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 12)
  454. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 192)
  455. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 12)
  456. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 160)
  457. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 48)
  458. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  459. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 208)
  460. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  461. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 212)
  462. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 4)
  463. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 216)
  464. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteSize"] == 4)
  465. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 220)
  466. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteSize"] == 4)
  467. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 224)
  468. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteSize"] == 4)
  469. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 228)
  470. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteSize"] == 4)
  471. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 232)
  472. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteSize"] == 4)
  473. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 236)
  474. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteSize"] == 4)
  475. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 240)
  476. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 4)
  477. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteOffset"] == 208)
  478. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25]["constantByteSize"] == 36)
  479. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteOffset"] == 244)
  480. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26]["constantByteSize"] == 12)
  481. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteOffset"] == 256)
  482. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27]["constantByteSize"] == 12)
  483. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteOffset"] == 272)
  484. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28]["constantByteSize"] == 12)
  485. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteOffset"] == 288)
  486. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29]["constantByteSize"] == 12)
  487. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteOffset"] == 256)
  488. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30]["constantByteSize"] == 64)
  489. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteOffset"] == 0)
  490. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["constantByteSize"] == 320)
  491. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31]["typeName"] == "/ExampleSRG/T")
  492. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  493. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 320)
  494. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  495. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 320)
  496. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  497. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 144)
  498. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "Buffer<float4>")
  499. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  500. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  501. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["type"] == "StructuredBuffer<S>")
  502. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["count"] == 1)
  503. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 16)
  504. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["type"] == "Buffer<float2>")
  505. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["count"] == 2)
  506. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 8)
  507. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["type"] == "StructuredBuffer<S>")
  508. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["count"] == 2)
  509. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 16)
  510. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["id"] == "m_texCube1")
  511. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["type"] == "TextureCube")
  512. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][0]["stride"] == 16)
  513. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  514. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  515. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForImageViews"][1]["stride"] == 12)
  516. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  517. ok = testfuncs.verifyAllPredicates(predicates, j)
  518. return True if ok else False
  519. def verifyStructsPackingOpenGL(thefile, compilerPath, silent):
  520. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-opengl", "--srg"])
  521. # Packing vectors in nested structs is trickier.
  522. # The following values match the dxc's OpenGL generation
  523. if ok:
  524. predicates = []
  525. # check all references of func()
  526. # Matches std340 (GL) standard here:
  527. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  528. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["qualifiedName"] == "/ExampleSRG/Sab/a")
  529. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteOffset"] == 0)
  530. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][0]["constantByteSize"] == 4)
  531. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["qualifiedName"] == "/ExampleSRG/Sab/b")
  532. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteOffset"] == 4)
  533. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][1]["constantByteSize"] == 8)
  534. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["qualifiedName"] == "/ExampleSRG/T/ab") # Complex type
  535. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["typeName"] == "/ExampleSRG/Sab")
  536. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteOffset"] == 0)
  537. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][2]["constantByteSize"] == 16)
  538. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["qualifiedName"] == "/ExampleSRG/Sba/b")
  539. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteOffset"] == 16)
  540. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][3]["constantByteSize"] == 8)
  541. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["qualifiedName"] == "/ExampleSRG/Sba/a")
  542. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteOffset"] == 24)
  543. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][4]["constantByteSize"] == 4)
  544. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["qualifiedName"] == "/ExampleSRG/T/ba") # Complex type
  545. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["typeName"] == "/ExampleSRG/Sba")
  546. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteOffset"] == 16)
  547. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][5]["constantByteSize"] == 16)
  548. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["qualifiedName"] == "/ExampleSRG/Sabc/a")
  549. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteOffset"] == 32)
  550. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][6]["constantByteSize"] == 4)
  551. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["qualifiedName"] == "/ExampleSRG/Sabc/b")
  552. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteOffset"] == 36)
  553. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][7]["constantByteSize"] == 8)
  554. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["qualifiedName"] == "/ExampleSRG/Sabc/c")
  555. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteOffset"] == 48)
  556. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][8]["constantByteSize"] == 12)
  557. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["qualifiedName"] == "/ExampleSRG/T/abc") # Complex type
  558. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["typeName"] == "/ExampleSRG/Sabc")
  559. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteOffset"] == 32)
  560. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][9]["constantByteSize"] == 32)
  561. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["qualifiedName"] == "/ExampleSRG/Sac/a")
  562. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 64)
  563. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteSize"] == 4)
  564. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["qualifiedName"] == "/ExampleSRG/Sac/c")
  565. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 68)
  566. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteSize"] == 12)
  567. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["qualifiedName"] == "/ExampleSRG/T/ac")
  568. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["typeName"] == "/ExampleSRG/Sac")
  569. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 64)
  570. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteSize"] == 16)
  571. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["qualifiedName"] == "/ExampleSRG/S/a")
  572. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 80)
  573. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteSize"] == 4)
  574. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["qualifiedName"] == "/ExampleSRG/S/b")
  575. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 96)
  576. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteSize"] == 16)
  577. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["qualifiedName"] == "/ExampleSRG/T/s")
  578. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["typeName"] == "/ExampleSRG/S")
  579. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 80)
  580. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteSize"] == 32)
  581. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["qualifiedName"] == "/ExampleSRG/T/a_float")
  582. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 112)
  583. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteSize"] == 4)
  584. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["qualifiedName"] == "/ExampleSRG/m_CB")
  585. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["typeName"] == "/ExampleSRG/T")
  586. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 0)
  587. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteSize"] == 128)
  588. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  589. ok = testfuncs.verifyAllPredicates(predicates, j)
  590. return True if ok else False
  591. def verifyPackingRelaxedUseSpaces(thefile, compilerPath, silent):
  592. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg"])
  593. if ok:
  594. predicates = []
  595. # check all references of func()
  596. # Matches Storage Buffer 1 (VK) standard here:
  597. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  598. # Shader Resource Group 0
  599. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  600. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  601. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 0)
  602. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  603. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  604. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  605. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  606. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 1)
  607. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  608. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  609. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  610. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  611. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  612. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  613. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  614. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  615. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  616. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  617. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  618. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  619. # Shader Resource Group 1
  620. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  621. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  622. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 0)
  623. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  624. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  625. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  626. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  627. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  628. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  629. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  630. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  631. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  632. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  633. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  634. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  635. # Shader Resource Group 2
  636. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  637. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  638. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  639. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  640. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  641. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  642. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  643. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  644. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  645. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  646. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  647. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  648. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  649. ok = testfuncs.verifyAllPredicates(predicates, j)
  650. return True if ok else False
  651. def verifyPackingRelaxedNoSpaces(thefile, compilerPath, silent):
  652. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg"])
  653. if ok:
  654. predicates = []
  655. # check all references of func()
  656. # Matches Storage Buffer 1 (VK) standard here:
  657. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  658. # Shader Resource Group 0
  659. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  660. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  661. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 0)
  662. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  663. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  664. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  665. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  666. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 1)
  667. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  668. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  669. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  670. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  671. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  672. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  673. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  674. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  675. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  676. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  677. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  678. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  679. # Shader Resource Group 1
  680. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  681. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  682. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 0)
  683. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  684. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  685. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  686. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  687. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  688. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  689. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  690. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  691. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  692. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  693. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  694. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  695. # Shader Resource Group 2
  696. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  697. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  698. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  699. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  700. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  701. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  702. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  703. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  704. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  705. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  706. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  707. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  708. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  709. ok = testfuncs.verifyAllPredicates(predicates, j)
  710. return True if ok else False
  711. def verifyPackingRelaxedUniqueIdx(thefile, compilerPath, silent):
  712. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg", "--unique-idx"])
  713. if ok:
  714. predicates = []
  715. # check all references of func()
  716. # Matches Storage Buffer 1 (VK) standard here:
  717. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  718. # Note! Bacause AZSLc emits the resource indices in order SRVs/UAVs, then Samplers, then CBVs
  719. # the indices (when using unique index) don't necessarily match the order of declaration.
  720. # Since the data is reflected this should not be a problem!
  721. # In fact, it verifies the consumer application is data driven and accepts the emitted register indices
  722. # Shader Resource Group 0
  723. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  724. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  725. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 2)
  726. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  727. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  728. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  729. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  730. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 3)
  731. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  732. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  733. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  734. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  735. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  736. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  737. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  738. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  739. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  740. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  741. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  742. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  743. # Shader Resource Group 1
  744. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  745. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  746. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 4)
  747. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  748. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  749. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  750. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  751. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  752. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  753. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  754. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  755. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  756. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  757. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  758. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  759. # Shader Resource Group 2
  760. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  761. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  762. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  763. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  764. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  765. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  766. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  767. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  768. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  769. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  770. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  771. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  772. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  773. ok = testfuncs.verifyAllPredicates(predicates, j)
  774. return True if ok else False
  775. def verifyPackingRelaxedUniqueIdxUseSpaces(thefile, compilerPath, silent):
  776. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--srg", "--unique-idx"])
  777. if ok:
  778. predicates = []
  779. # check all references of func()
  780. # Matches Storage Buffer 1 (VK) standard here:
  781. # https://github.com/Microsoft/DirectXShaderCompiler/blob/master/docs/SPIR-V.rst
  782. # Note! Bacause AZSLc emits the resource indices in order SRVs/UAVs, then Samplers, then CBVs
  783. # the indices (when using unique index) don't necessarily match the order of declaration.
  784. # Since the data is reflected this should not be a problem!
  785. # In fact, it verifies the consumer application is data driven and accepts the emitted register indices
  786. # Shader Resource Group 0
  787. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<S>")
  788. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["count"] == 1)
  789. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["index"] == 2)
  790. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["space"] == 0)
  791. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 16)
  792. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["type"] == "ConstantBuffer<S>")
  793. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["count"] == 2)
  794. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["index"] == 3)
  795. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["space"] == 0)
  796. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 16)
  797. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["type"] == "Buffer<float4>")
  798. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["count"] == 1)
  799. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["index"] == 0)
  800. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["space"] == 0)
  801. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 16)
  802. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["type"] == "StructuredBuffer<S>")
  803. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["count"] == 1)
  804. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["index"] == 1)
  805. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["space"] == 0)
  806. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 16)
  807. # Shader Resource Group 1
  808. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["type"] == "ConstantBuffer<Light>")
  809. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["count"] == 1)
  810. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["index"] == 4)
  811. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["space"] == 1)
  812. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 144)
  813. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["type"] == "Buffer<float3>")
  814. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["count"] == 2)
  815. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["index"] == 0)
  816. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["space"] == 1)
  817. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 12)
  818. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["type"] == "StructuredBuffer<S>")
  819. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["count"] == 2)
  820. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["index"] == 2)
  821. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["space"] == 1)
  822. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 16)
  823. # Shader Resource Group 2
  824. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["id"] == "m_texCube1")
  825. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["type"] == "TextureCube")
  826. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["count"] == 1)
  827. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["index"] == 0)
  828. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["space"] == 2)
  829. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][0]["stride"] == 16)
  830. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["id"] == "m_tex2d1")
  831. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["type"] == "Texture2D<float3>")
  832. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["count"] == 1)
  833. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["index"] == 1)
  834. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["space"] == 2)
  835. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForImageViews"][1]["stride"] == 12)
  836. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  837. ok = testfuncs.verifyAllPredicates(predicates, j)
  838. return True if ok else False
  839. def verifyPackingDirectXMatrices(thefile, compilerPath, silent):
  840. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--no-alignment-validation", "--srg"])
  841. if ok:
  842. predicates = []
  843. # check all references of func()
  844. # Matches 2 (DX) emission here:
  845. # http://shader-playground.timjones.io/206f18e88f838720db8e3415362551df
  846. # struct T2
  847. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0]["constantByteOffset"] == 0)
  848. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1]["constantByteOffset"] == 24)
  849. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2]["constantByteOffset"] == 32)
  850. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3]["constantByteOffset"] == 72)
  851. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4]["constantByteOffset"] == 80)
  852. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5]["constantByteOffset"] == 136)
  853. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6]["constantByteOffset"] == 144)
  854. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7]["constantByteOffset"] == 168)
  855. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8]["constantByteOffset"] == 176)
  856. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9]["constantByteOffset"] == 204)
  857. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 208)
  858. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 240)
  859. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 256)
  860. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 280)
  861. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 288)
  862. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 328)
  863. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 336)
  864. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 392)
  865. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 400)
  866. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 424)
  867. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 432)
  868. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 464)
  869. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 480)
  870. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 512)
  871. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 0)
  872. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 520) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  873. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["typeName"] == "/ExampleSRG/T2")
  874. # struct T3
  875. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 25]["constantByteOffset"] == 0 + 528)
  876. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 25]["constantByteOffset"] == 28 + 528)
  877. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 25]["constantByteOffset"] == 32 + 528)
  878. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 25]["constantByteOffset"] == 76 + 528)
  879. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 25]["constantByteOffset"] == 80 + 528)
  880. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 25]["constantByteOffset"] == 140 + 528)
  881. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 25]["constantByteOffset"] == 144 + 528)
  882. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 25]["constantByteOffset"] == 184 + 528)
  883. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 25]["constantByteOffset"] == 192 + 528)
  884. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 25]["constantByteOffset"] == 236 + 528)
  885. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 25]["constantByteOffset"] == 240 + 528)
  886. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 25]["constantByteOffset"] == 288 + 528)
  887. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 25]["constantByteOffset"] == 304 + 528)
  888. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 25]["constantByteOffset"] == 336 + 528)
  889. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 25]["constantByteOffset"] == 352 + 528)
  890. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 25]["constantByteOffset"] == 400 + 528)
  891. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 25]["constantByteOffset"] == 416 + 528)
  892. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 25]["constantByteOffset"] == 480 + 528)
  893. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 25]["constantByteOffset"] == 496 + 528)
  894. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 25]["constantByteOffset"] == 536 + 528)
  895. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 25]["constantByteOffset"] == 544 + 528)
  896. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 25]["constantByteOffset"] == 592 + 528)
  897. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 25]["constantByteOffset"] == 608 + 528)
  898. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 25]["constantByteOffset"] == 656 + 528)
  899. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteOffset"] == 528)
  900. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteSize"] == 664) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  901. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["typeName"] == "/ExampleSRG/T3")
  902. # struct T4
  903. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 50]["constantByteOffset"] == 0 + 1200)
  904. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 50]["constantByteOffset"] == 32 + 1200)
  905. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 50]["constantByteOffset"] == 48 + 1200)
  906. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 50]["constantByteOffset"] == 96 + 1200)
  907. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 50]["constantByteOffset"] == 112 + 1200)
  908. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 50]["constantByteOffset"] == 176 + 1200)
  909. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 50]["constantByteOffset"] == 192 + 1200)
  910. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 50]["constantByteOffset"] == 248 + 1200)
  911. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 50]["constantByteOffset"] == 256 + 1200)
  912. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 50]["constantByteOffset"] == 316 + 1200)
  913. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 50]["constantByteOffset"] == 320 + 1200)
  914. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 50]["constantByteOffset"] == 384 + 1200)
  915. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 50]["constantByteOffset"] == 400 + 1200)
  916. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 50]["constantByteOffset"] == 432 + 1200)
  917. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 50]["constantByteOffset"] == 448 + 1200)
  918. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 50]["constantByteOffset"] == 496 + 1200)
  919. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 50]["constantByteOffset"] == 512 + 1200)
  920. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 50]["constantByteOffset"] == 576 + 1200)
  921. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 50]["constantByteOffset"] == 592 + 1200)
  922. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 50]["constantByteOffset"] == 648 + 1200)
  923. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 50]["constantByteOffset"] == 656 + 1200)
  924. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 50]["constantByteOffset"] == 720 + 1200)
  925. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 50]["constantByteOffset"] == 736 + 1200)
  926. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 50]["constantByteOffset"] == 800 + 1200)
  927. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteOffset"] == 1200)
  928. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteSize"] == 808) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  929. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["typeName"] == "/ExampleSRG/T4")
  930. # struct TU
  931. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 75]["constantByteOffset"] == 0 + 2016)
  932. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 75]["constantByteOffset"] == 4 + 2016)
  933. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 75]["constantByteOffset"] == 16 + 2016)
  934. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 75]["constantByteOffset"] == 36 + 2016)
  935. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 75]["constantByteOffset"] == 48 + 2016)
  936. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 75]["constantByteOffset"] == 84 + 2016)
  937. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 75]["constantByteOffset"] == 96 + 2016)
  938. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 75]["constantByteOffset"] == 148 + 2016)
  939. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 75]["constantByteOffset"] == 152 + 2016)
  940. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 75]["constantByteOffset"] == 156 + 2016)
  941. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 75]["constantByteOffset"] == 160 + 2016)
  942. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 75]["constantByteOffset"] == 168 + 2016)
  943. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 75]["constantByteOffset"] == 176 + 2016)
  944. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 75]["constantByteOffset"] == 188 + 2016)
  945. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 75]["constantByteOffset"] == 192 + 2016)
  946. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 75]["constantByteOffset"] == 208 + 2016)
  947. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 75]["constantByteOffset"] == 212 + 2016)
  948. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 75]["constantByteOffset"] == 216 + 2016)
  949. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 75]["constantByteOffset"] == 224 + 2016)
  950. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 75]["constantByteOffset"] == 232 + 2016)
  951. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 75]["constantByteOffset"] == 240 + 2016)
  952. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 75]["constantByteOffset"] == 256 + 2016)
  953. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 75]["constantByteOffset"] == 272 + 2016)
  954. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 75]["constantByteOffset"] == 288 + 2016)
  955. # Special cases packing tests
  956. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24 + 75]["constantByteOffset"] == 296 + 2016)
  957. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25 + 75]["constantByteOffset"] == 304 + 2016)
  958. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26 + 75]["constantByteOffset"] == 312 + 2016)
  959. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27 + 75]["constantByteOffset"] == 320 + 2016)
  960. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28 + 75]["constantByteOffset"] == 332 + 2016)
  961. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29 + 75]["constantByteOffset"] == 336 + 2016)
  962. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30 + 75]["constantByteOffset"] == 344 + 2016)
  963. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31 + 75]["constantByteOffset"] == 352 + 2016)
  964. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][32 + 75]["constantByteOffset"] == 368 + 2016)
  965. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][33 + 75]["constantByteOffset"] == 384 + 2016)
  966. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][34 + 75]["constantByteOffset"] == 392 + 2016)
  967. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteOffset"] == 2016)
  968. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteSize"] == 400) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  969. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["typeName"] == "/ExampleSRG/TU")
  970. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  971. ok = testfuncs.verifyAllPredicates(predicates, j)
  972. return True if ok else False
  973. def verifyPackingVulkanMatrices(thefile, compilerPath, silent):
  974. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-vulkan", "--no-alignment-validation", "--srg"])
  975. if ok:
  976. predicates = []
  977. # check all references of func()
  978. # Matches Uniform Buffer 1 (VK) emission here:
  979. # http://shader-playground.timjones.io/206f18e88f838720db8e3415362551df
  980. # struct T2
  981. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0]["constantByteOffset"] == 0)
  982. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1]["constantByteOffset"] == 32)
  983. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2]["constantByteOffset"] == 48)
  984. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3]["constantByteOffset"] == 96)
  985. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4]["constantByteOffset"] == 112)
  986. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5]["constantByteOffset"] == 176)
  987. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6]["constantByteOffset"] == 192)
  988. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7]["constantByteOffset"] == 224)
  989. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8]["constantByteOffset"] == 240)
  990. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9]["constantByteOffset"] == 272)
  991. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10]["constantByteOffset"] == 288)
  992. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11]["constantByteOffset"] == 320)
  993. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12]["constantByteOffset"] == 336)
  994. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13]["constantByteOffset"] == 368)
  995. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14]["constantByteOffset"] == 384)
  996. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15]["constantByteOffset"] == 432)
  997. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16]["constantByteOffset"] == 448)
  998. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17]["constantByteOffset"] == 512)
  999. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18]["constantByteOffset"] == 528)
  1000. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19]["constantByteOffset"] == 560)
  1001. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20]["constantByteOffset"] == 576)
  1002. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21]["constantByteOffset"] == 608)
  1003. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22]["constantByteOffset"] == 624)
  1004. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23]["constantByteOffset"] == 656)
  1005. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteOffset"] == 0)
  1006. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["constantByteSize"] == 672) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1007. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24]["typeName"] == "/ExampleSRG/T2")
  1008. # struct T3
  1009. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 25]["constantByteOffset"] == 0 + 672)
  1010. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 25]["constantByteOffset"] == 32 + 672)
  1011. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 25]["constantByteOffset"] == 48 + 672)
  1012. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 25]["constantByteOffset"] == 96 + 672)
  1013. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 25]["constantByteOffset"] == 112 + 672)
  1014. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 25]["constantByteOffset"] == 176 + 672)
  1015. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 25]["constantByteOffset"] == 192 + 672)
  1016. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 25]["constantByteOffset"] == 240 + 672)
  1017. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 25]["constantByteOffset"] == 256 + 672)
  1018. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 25]["constantByteOffset"] == 304 + 672)
  1019. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 25]["constantByteOffset"] == 320 + 672)
  1020. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 25]["constantByteOffset"] == 368 + 672)
  1021. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 25]["constantByteOffset"] == 384 + 672)
  1022. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 25]["constantByteOffset"] == 416 + 672)
  1023. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 25]["constantByteOffset"] == 432 + 672)
  1024. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 25]["constantByteOffset"] == 480 + 672)
  1025. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 25]["constantByteOffset"] == 496 + 672)
  1026. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 25]["constantByteOffset"] == 560 + 672)
  1027. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 25]["constantByteOffset"] == 576 + 672)
  1028. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 25]["constantByteOffset"] == 624 + 672)
  1029. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 25]["constantByteOffset"] == 640 + 672)
  1030. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 25]["constantByteOffset"] == 688 + 672)
  1031. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 25]["constantByteOffset"] == 704 + 672)
  1032. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 25]["constantByteOffset"] == 752 + 672)
  1033. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteOffset"] == 672)
  1034. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["constantByteSize"] == 768) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1035. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][49]["typeName"] == "/ExampleSRG/T3")
  1036. # struct T4
  1037. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 50]["constantByteOffset"] == 0 + 1440)
  1038. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 50]["constantByteOffset"] == 32 + 1440)
  1039. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 50]["constantByteOffset"] == 48 + 1440)
  1040. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 50]["constantByteOffset"] == 96 + 1440)
  1041. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 50]["constantByteOffset"] == 112 + 1440)
  1042. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 50]["constantByteOffset"] == 176 + 1440)
  1043. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 50]["constantByteOffset"] == 192 + 1440)
  1044. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 50]["constantByteOffset"] == 256 + 1440)
  1045. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 50]["constantByteOffset"] == 272 + 1440)
  1046. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 50]["constantByteOffset"] == 336 + 1440)
  1047. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 50]["constantByteOffset"] == 352 + 1440)
  1048. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 50]["constantByteOffset"] == 416 + 1440)
  1049. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 50]["constantByteOffset"] == 432 + 1440)
  1050. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 50]["constantByteOffset"] == 464 + 1440)
  1051. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 50]["constantByteOffset"] == 480 + 1440)
  1052. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 50]["constantByteOffset"] == 528 + 1440)
  1053. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 50]["constantByteOffset"] == 544 + 1440)
  1054. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 50]["constantByteOffset"] == 608 + 1440)
  1055. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 50]["constantByteOffset"] == 624 + 1440)
  1056. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 50]["constantByteOffset"] == 688 + 1440)
  1057. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 50]["constantByteOffset"] == 704 + 1440)
  1058. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 50]["constantByteOffset"] == 768 + 1440)
  1059. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 50]["constantByteOffset"] == 784 + 1440)
  1060. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 50]["constantByteOffset"] == 848 + 1440)
  1061. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteOffset"] == 1440)
  1062. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["constantByteSize"] == 864) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1063. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][74]["typeName"] == "/ExampleSRG/T4")
  1064. # struct TU
  1065. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 0 + 75]["constantByteOffset"] == 0 + 2304)
  1066. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 1 + 75]["constantByteOffset"] == 4 + 2304)
  1067. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 2 + 75]["constantByteOffset"] == 8 + 2304)
  1068. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 3 + 75]["constantByteOffset"] == 16 + 2304)
  1069. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 4 + 75]["constantByteOffset"] == 20 + 2304)
  1070. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 5 + 75]["constantByteOffset"] == 32 + 2304)
  1071. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 6 + 75]["constantByteOffset"] == 48 + 2304)
  1072. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 7 + 75]["constantByteOffset"] == 64 + 2304)
  1073. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 8 + 75]["constantByteOffset"] == 68 + 2304)
  1074. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][ 9 + 75]["constantByteOffset"] == 72 + 2304)
  1075. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][10 + 75]["constantByteOffset"] == 80 + 2304)
  1076. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][11 + 75]["constantByteOffset"] == 88 + 2304)
  1077. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][12 + 75]["constantByteOffset"] == 96 + 2304)
  1078. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][13 + 75]["constantByteOffset"] == 108 + 2304)
  1079. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][14 + 75]["constantByteOffset"] == 112 + 2304)
  1080. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][15 + 75]["constantByteOffset"] == 128 + 2304)
  1081. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][16 + 75]["constantByteOffset"] == 132 + 2304)
  1082. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][17 + 75]["constantByteOffset"] == 136 + 2304)
  1083. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][18 + 75]["constantByteOffset"] == 144 + 2304)
  1084. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][19 + 75]["constantByteOffset"] == 152 + 2304)
  1085. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][20 + 75]["constantByteOffset"] == 160 + 2304)
  1086. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][21 + 75]["constantByteOffset"] == 176 + 2304)
  1087. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][22 + 75]["constantByteOffset"] == 192 + 2304)
  1088. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][23 + 75]["constantByteOffset"] == 208 + 2304)
  1089. # Special cases packing tests
  1090. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][24 + 75]["constantByteOffset"] == 216 + 2304)
  1091. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][25 + 75]["constantByteOffset"] == 224 + 2304)
  1092. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][26 + 75]["constantByteOffset"] == 232 + 2304)
  1093. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][27 + 75]["constantByteOffset"] == 240 + 2304)
  1094. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][28 + 75]["constantByteOffset"] == 252 + 2304)
  1095. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][29 + 75]["constantByteOffset"] == 256 + 2304)
  1096. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][30 + 75]["constantByteOffset"] == 264 + 2304)
  1097. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][31 + 75]["constantByteOffset"] == 272 + 2304)
  1098. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][32 + 75]["constantByteOffset"] == 288 + 2304)
  1099. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][33 + 75]["constantByteOffset"] == 304 + 2304)
  1100. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][34 + 75]["constantByteOffset"] == 312 + 2304)
  1101. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteOffset"] == 2304)
  1102. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["constantByteSize"] == 320) # Complex type. Size & offset match previous entries' sum. Confirmed in Dxc
  1103. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForSRGConstants"][110]["typeName"] == "/ExampleSRG/TU")
  1104. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  1105. ok = testfuncs.verifyAllPredicates(predicates, j)
  1106. return True if ok else False
  1107. def verifyPackingDirectXStride(thefile, compilerPath, silent):
  1108. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--no-alignment-validation", "--srg"])
  1109. if ok:
  1110. predicates = []
  1111. # Column major Constant Buffers
  1112. # Note that the stride here means size. ConstantBuffers should have stride of 0
  1113. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][0]["stride"] == 32)
  1114. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][1]["stride"] == 48)
  1115. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][2]["stride"] == 36)
  1116. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][3]["stride"] == 64)
  1117. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][4]["stride"] == 40)
  1118. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][5]["stride"] == 52)
  1119. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][6]["stride"] == 68)
  1120. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][7]["stride"] == 56)
  1121. predicates.append(lambda: j["ShaderResourceGroups"][0]["inputsForBufferViews"][8]["stride"] == 72)
  1122. # Row major Constant Buffers
  1123. # Note that the stride here means size. ConstantBuffers should have stride of 0
  1124. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][0]["stride"] == 32)
  1125. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][1]["stride"] == 36)
  1126. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][2]["stride"] == 48)
  1127. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][3]["stride"] == 40)
  1128. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][4]["stride"] == 64)
  1129. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][5]["stride"] == 52)
  1130. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][6]["stride"] == 56)
  1131. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][7]["stride"] == 68)
  1132. predicates.append(lambda: j["ShaderResourceGroups"][1]["inputsForBufferViews"][8]["stride"] == 72)
  1133. # Column major Structured Buffers
  1134. # Note that the stride is the size of a single element in the buffer. For DirectX packing layout majorness is ignored
  1135. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][0]["stride"] == 16 + 4)
  1136. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][1]["stride"] == 24 + 4)
  1137. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][2]["stride"] == 24 + 4)
  1138. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][3]["stride"] == 32 + 4)
  1139. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][4]["stride"] == 32 + 4)
  1140. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][5]["stride"] == 36 + 4)
  1141. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][6]["stride"] == 48 + 4)
  1142. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][7]["stride"] == 48 + 4)
  1143. predicates.append(lambda: j["ShaderResourceGroups"][2]["inputsForBufferViews"][8]["stride"] == 64 + 4)
  1144. # Row major Structured Buffers
  1145. # Note that the stride is the size of a single element in the buffer. For DirectX packing layout majorness is ignored
  1146. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][0]["stride"] == 16 + 4)
  1147. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][1]["stride"] == 24 + 4)
  1148. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][2]["stride"] == 24 + 4)
  1149. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][3]["stride"] == 32 + 4)
  1150. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][4]["stride"] == 32 + 4)
  1151. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][5]["stride"] == 36 + 4)
  1152. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][6]["stride"] == 48 + 4)
  1153. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][7]["stride"] == 48 + 4)
  1154. predicates.append(lambda: j["ShaderResourceGroups"][3]["inputsForBufferViews"][8]["stride"] == 64 + 4)
  1155. if not silent: print (fg.CYAN+ style.BRIGHT+ "input assembler layouts verification..."+ style.RESET_ALL)
  1156. ok = testfuncs.verifyAllPredicates(predicates, j)
  1157. return True if ok else False
  1158. def verifyPackingDirectXInlineConstants(thefile, compilerPath, silent):
  1159. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--pack-dx12", "--srg", "--root-const=52"])
  1160. if ok:
  1161. predicates = []
  1162. # Inline constant buffer reflection data validation
  1163. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["count"] == 1)
  1164. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["index"] == 0)
  1165. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["space"] == 1)
  1166. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["usage"] == "Read")
  1167. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["sizeInBytes"] == 60)
  1168. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["id"] == "Root_Constants")
  1169. # Inline constant structure members validation
  1170. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteOffset"] == 0)
  1171. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteSize"] == 16)
  1172. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantId"] == "varFloat4")
  1173. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["qualifiedName"] == "/Root_Constants/varFloat4")
  1174. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeDimensions"] == [])
  1175. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeKind"] == "Predefined")
  1176. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeName"] == "?float4")
  1177. # Inline constant structure members validation
  1178. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteOffset"] == 16)
  1179. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteSize"] == 44)
  1180. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantId"] == "mat3x3")
  1181. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["qualifiedName"] == "/Root_Constants/mat3x3")
  1182. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeDimensions"] == [])
  1183. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeKind"] == "Predefined")
  1184. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeName"] == "?float3x3")
  1185. if not silent: print (fg.CYAN+ style.BRIGHT+ "inline constant layouts verification..."+ style.RESET_ALL)
  1186. ok = testfuncs.verifyAllPredicates(predicates, j)
  1187. return True if ok else False
  1188. def verifyPackingMetalInlineConstants(thefile, compilerPath, silent):
  1189. j, ok = testfuncs.buildAndGetJson(thefile, compilerPath, silent, ["--namespace=mt", "--srg"])
  1190. if ok:
  1191. predicates = []
  1192. # Inline constant buffer reflection data validation
  1193. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["count"] == 1)
  1194. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["index"] == 0)
  1195. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["space"] == 1)
  1196. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["usage"] == "Read")
  1197. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["sizeInBytes"] == 64)
  1198. predicates.append(lambda: j["RootConstantBuffer"]["bufferForRootConstants"]["id"] == "Root_Constants")
  1199. # Inline constant structure members validation
  1200. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteOffset"] == 0)
  1201. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantByteSize"] == 16)
  1202. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["constantId"] == "varFloat4")
  1203. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["qualifiedName"] == "/Root_Constants/varFloat4")
  1204. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeDimensions"] == [])
  1205. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeKind"] == "Predefined")
  1206. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][0]["typeName"] == "?float4")
  1207. # Inline constant structure members validation
  1208. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteOffset"] == 16)
  1209. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantByteSize"] == 44)
  1210. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["constantId"] == "mat3x3")
  1211. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["qualifiedName"] == "/Root_Constants/mat3x3")
  1212. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeDimensions"] == [])
  1213. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeKind"] == "Predefined")
  1214. predicates.append(lambda: j["RootConstantBuffer"]["inputsForRootConstants"][1]["typeName"] == "?float3x3")
  1215. if not silent: print (fg.CYAN+ style.BRIGHT+ "inline constant layouts verification..."+ style.RESET_ALL)
  1216. ok = testfuncs.verifyAllPredicates(predicates, j)
  1217. return True if ok else False
  1218. result = 0 # to define for sub-tests
  1219. resultFailed = 0
  1220. def doTests(compiler, silent, azdxcpath):
  1221. global result
  1222. global resultFailed
  1223. # Working directory should have been set to this script's directory by the calling parent
  1224. # You can get it once doTests() is called, but not during initialization of the module,
  1225. # because at that time it will still be set to the working directory of the calling script
  1226. workDir = os.getcwd()
  1227. # Relaxed packing needs to be reviewed
  1228. #if verifyPackingRelaxed(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1229. #else: resultFailed += 1
  1230. if verifyPackingDirectX(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1231. else: resultFailed += 1
  1232. if verifyPackingVulkan(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1233. else: resultFailed += 1
  1234. if verifyStructsPackingVulkan(os.path.join(workDir, "srg-layouts-structs.azsl"), compiler, silent) : result += 1
  1235. else: resultFailed += 1
  1236. if verifyPackingOpenGL(os.path.join(workDir, "srg-layouts.azsl"), compiler, silent) : result += 1
  1237. else: resultFailed += 1
  1238. if verifyStructsPackingOpenGL(os.path.join(workDir, "srg-layouts-structs.azsl"), compiler, silent) : result += 1
  1239. else: resultFailed += 1
  1240. if verifyPackingRelaxedUseSpaces(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1241. else: resultFailed += 1
  1242. if verifyPackingRelaxedNoSpaces(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1243. else: resultFailed += 1
  1244. if verifyPackingRelaxedUniqueIdx(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1245. else: resultFailed += 1
  1246. if verifyPackingRelaxedUniqueIdxUseSpaces(os.path.join(workDir, "srg-layouts-spaces.azsl"), compiler, silent) : result += 1
  1247. else: resultFailed += 1
  1248. if verifyPackingDirectXMatrices(os.path.join(workDir, "srg-layouts-matrices.azsl"), compiler, silent) : result += 1
  1249. else: resultFailed += 1
  1250. if verifyPackingVulkanMatrices(os.path.join(workDir, "srg-layouts-matrices.azsl"), compiler, silent) : result += 1
  1251. else: resultFailed += 1
  1252. if verifyPackingDirectXStride(os.path.join(workDir, "srg-layouts-strides.azsl"), compiler, silent) : result += 1
  1253. else: resultFailed += 1
  1254. if verifyPackingDirectXInlineConstants(os.path.join(workDir, "inline-constant-layouts.azsl"), compiler, silent) : result += 1
  1255. else: resultFailed += 1
  1256. if verifyPackingMetalInlineConstants(os.path.join(workDir, "inline-constant-layouts.azsl"), compiler, silent) : result += 1
  1257. else: resultFailed += 1
  1258. if __name__ == "__main__":
  1259. print ("please call from testapp.py")