spirv_cross_c.cpp 94 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984
  1. /*
  2. * Copyright 2019-2021 Hans-Kristian Arntzen
  3. * SPDX-License-Identifier: Apache-2.0 OR MIT
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. */
  17. /*
  18. * At your option, you may choose to accept this material under either:
  19. * 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
  20. * 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
  21. */
  22. #include "spirv_cross_c.h"
  23. #if SPIRV_CROSS_C_API_CPP
  24. #include "spirv_cpp.hpp"
  25. #endif
  26. #if SPIRV_CROSS_C_API_GLSL
  27. #include "spirv_glsl.hpp"
  28. #else
  29. #include "spirv_cross.hpp"
  30. #endif
  31. #if SPIRV_CROSS_C_API_HLSL
  32. #include "spirv_hlsl.hpp"
  33. #endif
  34. #if SPIRV_CROSS_C_API_MSL
  35. #include "spirv_msl.hpp"
  36. #endif
  37. #if SPIRV_CROSS_C_API_REFLECT
  38. #include "spirv_reflect.hpp"
  39. #endif
  40. #ifdef HAVE_SPIRV_CROSS_GIT_VERSION
  41. #include "gitversion.h"
  42. #endif
  43. #include "spirv_parser.hpp"
  44. #include <memory>
  45. #include <new>
  46. #include <string.h>
  47. // clang-format off
  48. #ifdef _MSC_VER
  49. #pragma warning(push)
  50. #pragma warning(disable : 4996)
  51. #pragma warning(disable : 4065) // switch with 'default' but not 'case'.
  52. #endif
  53. #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS
  54. #define SPVC_BEGIN_SAFE_SCOPE try
  55. #else
  56. #define SPVC_BEGIN_SAFE_SCOPE
  57. #endif
  58. #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS
  59. #define SPVC_END_SAFE_SCOPE(context, error) \
  60. catch (const std::exception &e) \
  61. { \
  62. (context)->report_error(e.what()); \
  63. return (error); \
  64. }
  65. #else
  66. #define SPVC_END_SAFE_SCOPE(context, error)
  67. #endif
  68. using namespace SPIRV_CROSS_SPV_HEADER_NAMESPACE;
  69. using namespace std;
  70. using namespace SPIRV_CROSS_NAMESPACE;
  71. struct ScratchMemoryAllocation
  72. {
  73. virtual ~ScratchMemoryAllocation() = default;
  74. };
  75. struct StringAllocation : ScratchMemoryAllocation
  76. {
  77. explicit StringAllocation(const char *name)
  78. : str(name)
  79. {
  80. }
  81. explicit StringAllocation(std::string name)
  82. : str(std::move(name))
  83. {
  84. }
  85. std::string str;
  86. };
  87. template <typename T>
  88. struct TemporaryBuffer : ScratchMemoryAllocation
  89. {
  90. SmallVector<T> buffer;
  91. };
  92. template <typename T, typename... Ts>
  93. static inline std::unique_ptr<T> spvc_allocate(Ts &&... ts)
  94. {
  95. return std::unique_ptr<T>(new T(std::forward<Ts>(ts)...));
  96. }
  97. struct spvc_context_s
  98. {
  99. string last_error;
  100. SmallVector<unique_ptr<ScratchMemoryAllocation>> allocations;
  101. const char *allocate_name(const std::string &name);
  102. spvc_error_callback callback = nullptr;
  103. void *callback_userdata = nullptr;
  104. void report_error(std::string msg);
  105. };
  106. void spvc_context_s::report_error(std::string msg)
  107. {
  108. last_error = std::move(msg);
  109. if (callback)
  110. callback(callback_userdata, last_error.c_str());
  111. }
  112. const char *spvc_context_s::allocate_name(const std::string &name)
  113. {
  114. SPVC_BEGIN_SAFE_SCOPE
  115. {
  116. auto alloc = spvc_allocate<StringAllocation>(name);
  117. auto *ret = alloc->str.c_str();
  118. allocations.emplace_back(std::move(alloc));
  119. return ret;
  120. }
  121. SPVC_END_SAFE_SCOPE(this, nullptr)
  122. }
  123. struct spvc_parsed_ir_s : ScratchMemoryAllocation
  124. {
  125. spvc_context context = nullptr;
  126. ParsedIR parsed;
  127. };
  128. struct spvc_compiler_s : ScratchMemoryAllocation
  129. {
  130. spvc_context context = nullptr;
  131. unique_ptr<Compiler> compiler;
  132. spvc_backend backend = SPVC_BACKEND_NONE;
  133. };
  134. struct spvc_compiler_options_s : ScratchMemoryAllocation
  135. {
  136. spvc_context context = nullptr;
  137. uint32_t backend_flags = 0;
  138. #if SPIRV_CROSS_C_API_GLSL
  139. CompilerGLSL::Options glsl;
  140. #endif
  141. #if SPIRV_CROSS_C_API_MSL
  142. CompilerMSL::Options msl;
  143. #endif
  144. #if SPIRV_CROSS_C_API_HLSL
  145. CompilerHLSL::Options hlsl;
  146. #endif
  147. };
  148. struct spvc_set_s : ScratchMemoryAllocation
  149. {
  150. std::unordered_set<VariableID> set;
  151. };
  152. // Dummy-inherit to we can keep our opaque type handle type safe in C-land as well,
  153. // and avoid just throwing void * around.
  154. struct spvc_type_s : SPIRType
  155. {
  156. };
  157. struct spvc_constant_s : SPIRConstant
  158. {
  159. };
  160. struct spvc_resources_s : ScratchMemoryAllocation
  161. {
  162. spvc_context context = nullptr;
  163. SmallVector<spvc_reflected_resource> uniform_buffers;
  164. SmallVector<spvc_reflected_resource> storage_buffers;
  165. SmallVector<spvc_reflected_resource> stage_inputs;
  166. SmallVector<spvc_reflected_resource> stage_outputs;
  167. SmallVector<spvc_reflected_resource> subpass_inputs;
  168. SmallVector<spvc_reflected_resource> storage_images;
  169. SmallVector<spvc_reflected_resource> sampled_images;
  170. SmallVector<spvc_reflected_resource> atomic_counters;
  171. SmallVector<spvc_reflected_resource> push_constant_buffers;
  172. SmallVector<spvc_reflected_resource> shader_record_buffers;
  173. SmallVector<spvc_reflected_resource> separate_images;
  174. SmallVector<spvc_reflected_resource> separate_samplers;
  175. SmallVector<spvc_reflected_resource> acceleration_structures;
  176. SmallVector<spvc_reflected_resource> gl_plain_uniforms;
  177. SmallVector<spvc_reflected_resource> tensors;
  178. SmallVector<spvc_reflected_builtin_resource> builtin_inputs;
  179. SmallVector<spvc_reflected_builtin_resource> builtin_outputs;
  180. bool copy_resources(SmallVector<spvc_reflected_resource> &outputs, const SmallVector<Resource> &inputs);
  181. bool copy_resources(SmallVector<spvc_reflected_builtin_resource> &outputs, const SmallVector<BuiltInResource> &inputs);
  182. bool copy_resources(const ShaderResources &resources);
  183. };
  184. spvc_result spvc_context_create(spvc_context *context)
  185. {
  186. auto *ctx = new (std::nothrow) spvc_context_s;
  187. if (!ctx)
  188. return SPVC_ERROR_OUT_OF_MEMORY;
  189. *context = ctx;
  190. return SPVC_SUCCESS;
  191. }
  192. void spvc_context_destroy(spvc_context context)
  193. {
  194. delete context;
  195. }
  196. void spvc_context_release_allocations(spvc_context context)
  197. {
  198. context->allocations.clear();
  199. }
  200. const char *spvc_context_get_last_error_string(spvc_context context)
  201. {
  202. return context->last_error.c_str();
  203. }
  204. SPVC_PUBLIC_API void spvc_context_set_error_callback(spvc_context context, spvc_error_callback cb, void *userdata)
  205. {
  206. context->callback = cb;
  207. context->callback_userdata = userdata;
  208. }
  209. spvc_result spvc_context_parse_spirv(spvc_context context, const SpvId *spirv, size_t word_count,
  210. spvc_parsed_ir *parsed_ir)
  211. {
  212. SPVC_BEGIN_SAFE_SCOPE
  213. {
  214. std::unique_ptr<spvc_parsed_ir_s> pir(new (std::nothrow) spvc_parsed_ir_s);
  215. if (!pir)
  216. {
  217. context->report_error("Out of memory.");
  218. return SPVC_ERROR_OUT_OF_MEMORY;
  219. }
  220. pir->context = context;
  221. Parser parser(spirv, word_count);
  222. parser.parse();
  223. pir->parsed = std::move(parser.get_parsed_ir());
  224. *parsed_ir = pir.get();
  225. context->allocations.push_back(std::move(pir));
  226. }
  227. SPVC_END_SAFE_SCOPE(context, SPVC_ERROR_INVALID_SPIRV)
  228. return SPVC_SUCCESS;
  229. }
  230. spvc_result spvc_context_create_compiler(spvc_context context, spvc_backend backend, spvc_parsed_ir parsed_ir,
  231. spvc_capture_mode mode, spvc_compiler *compiler)
  232. {
  233. SPVC_BEGIN_SAFE_SCOPE
  234. {
  235. std::unique_ptr<spvc_compiler_s> comp(new (std::nothrow) spvc_compiler_s);
  236. if (!comp)
  237. {
  238. context->report_error("Out of memory.");
  239. return SPVC_ERROR_OUT_OF_MEMORY;
  240. }
  241. comp->backend = backend;
  242. comp->context = context;
  243. if (mode != SPVC_CAPTURE_MODE_COPY && mode != SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  244. {
  245. context->report_error("Invalid argument for capture mode.");
  246. return SPVC_ERROR_INVALID_ARGUMENT;
  247. }
  248. switch (backend)
  249. {
  250. case SPVC_BACKEND_NONE:
  251. if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  252. comp->compiler.reset(new Compiler(std::move(parsed_ir->parsed)));
  253. else if (mode == SPVC_CAPTURE_MODE_COPY)
  254. comp->compiler.reset(new Compiler(parsed_ir->parsed));
  255. break;
  256. #if SPIRV_CROSS_C_API_GLSL
  257. case SPVC_BACKEND_GLSL:
  258. if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  259. comp->compiler.reset(new CompilerGLSL(std::move(parsed_ir->parsed)));
  260. else if (mode == SPVC_CAPTURE_MODE_COPY)
  261. comp->compiler.reset(new CompilerGLSL(parsed_ir->parsed));
  262. break;
  263. #endif
  264. #if SPIRV_CROSS_C_API_HLSL
  265. case SPVC_BACKEND_HLSL:
  266. if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  267. comp->compiler.reset(new CompilerHLSL(std::move(parsed_ir->parsed)));
  268. else if (mode == SPVC_CAPTURE_MODE_COPY)
  269. comp->compiler.reset(new CompilerHLSL(parsed_ir->parsed));
  270. break;
  271. #endif
  272. #if SPIRV_CROSS_C_API_MSL
  273. case SPVC_BACKEND_MSL:
  274. if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  275. comp->compiler.reset(new CompilerMSL(std::move(parsed_ir->parsed)));
  276. else if (mode == SPVC_CAPTURE_MODE_COPY)
  277. comp->compiler.reset(new CompilerMSL(parsed_ir->parsed));
  278. break;
  279. #endif
  280. #if SPIRV_CROSS_C_API_CPP
  281. case SPVC_BACKEND_CPP:
  282. if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  283. comp->compiler.reset(new CompilerCPP(std::move(parsed_ir->parsed)));
  284. else if (mode == SPVC_CAPTURE_MODE_COPY)
  285. comp->compiler.reset(new CompilerCPP(parsed_ir->parsed));
  286. break;
  287. #endif
  288. #if SPIRV_CROSS_C_API_REFLECT
  289. case SPVC_BACKEND_JSON:
  290. if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
  291. comp->compiler.reset(new CompilerReflection(std::move(parsed_ir->parsed)));
  292. else if (mode == SPVC_CAPTURE_MODE_COPY)
  293. comp->compiler.reset(new CompilerReflection(parsed_ir->parsed));
  294. break;
  295. #endif
  296. default:
  297. context->report_error("Invalid backend.");
  298. return SPVC_ERROR_INVALID_ARGUMENT;
  299. }
  300. *compiler = comp.get();
  301. context->allocations.push_back(std::move(comp));
  302. }
  303. SPVC_END_SAFE_SCOPE(context, SPVC_ERROR_OUT_OF_MEMORY)
  304. return SPVC_SUCCESS;
  305. }
  306. spvc_result spvc_compiler_create_compiler_options(spvc_compiler compiler, spvc_compiler_options *options)
  307. {
  308. SPVC_BEGIN_SAFE_SCOPE
  309. {
  310. std::unique_ptr<spvc_compiler_options_s> opt(new (std::nothrow) spvc_compiler_options_s);
  311. if (!opt)
  312. {
  313. compiler->context->report_error("Out of memory.");
  314. return SPVC_ERROR_OUT_OF_MEMORY;
  315. }
  316. opt->context = compiler->context;
  317. opt->backend_flags = 0;
  318. switch (compiler->backend)
  319. {
  320. #if SPIRV_CROSS_C_API_MSL
  321. case SPVC_BACKEND_MSL:
  322. opt->backend_flags |= SPVC_COMPILER_OPTION_MSL_BIT | SPVC_COMPILER_OPTION_COMMON_BIT;
  323. opt->glsl = static_cast<CompilerMSL *>(compiler->compiler.get())->get_common_options();
  324. opt->msl = static_cast<CompilerMSL *>(compiler->compiler.get())->get_msl_options();
  325. break;
  326. #endif
  327. #if SPIRV_CROSS_C_API_HLSL
  328. case SPVC_BACKEND_HLSL:
  329. opt->backend_flags |= SPVC_COMPILER_OPTION_HLSL_BIT | SPVC_COMPILER_OPTION_COMMON_BIT;
  330. opt->glsl = static_cast<CompilerHLSL *>(compiler->compiler.get())->get_common_options();
  331. opt->hlsl = static_cast<CompilerHLSL *>(compiler->compiler.get())->get_hlsl_options();
  332. break;
  333. #endif
  334. #if SPIRV_CROSS_C_API_GLSL
  335. case SPVC_BACKEND_GLSL:
  336. opt->backend_flags |= SPVC_COMPILER_OPTION_GLSL_BIT | SPVC_COMPILER_OPTION_COMMON_BIT;
  337. opt->glsl = static_cast<CompilerGLSL *>(compiler->compiler.get())->get_common_options();
  338. break;
  339. #endif
  340. default:
  341. break;
  342. }
  343. *options = opt.get();
  344. compiler->context->allocations.push_back(std::move(opt));
  345. }
  346. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  347. return SPVC_SUCCESS;
  348. }
  349. spvc_result spvc_compiler_options_set_bool(spvc_compiler_options options, spvc_compiler_option option,
  350. spvc_bool value)
  351. {
  352. return spvc_compiler_options_set_uint(options, option, value ? 1 : 0);
  353. }
  354. spvc_result spvc_compiler_options_set_uint(spvc_compiler_options options, spvc_compiler_option option, unsigned value)
  355. {
  356. (void)value;
  357. (void)option;
  358. uint32_t supported_mask = options->backend_flags;
  359. uint32_t required_mask = option & SPVC_COMPILER_OPTION_LANG_BITS;
  360. if ((required_mask | supported_mask) != supported_mask)
  361. {
  362. options->context->report_error("Option is not supported by current backend.");
  363. return SPVC_ERROR_INVALID_ARGUMENT;
  364. }
  365. switch (option)
  366. {
  367. #if SPIRV_CROSS_C_API_GLSL
  368. case SPVC_COMPILER_OPTION_FORCE_TEMPORARY:
  369. options->glsl.force_temporary = value != 0;
  370. break;
  371. case SPVC_COMPILER_OPTION_FLATTEN_MULTIDIMENSIONAL_ARRAYS:
  372. options->glsl.flatten_multidimensional_arrays = value != 0;
  373. break;
  374. case SPVC_COMPILER_OPTION_FIXUP_DEPTH_CONVENTION:
  375. options->glsl.vertex.fixup_clipspace = value != 0;
  376. break;
  377. case SPVC_COMPILER_OPTION_FLIP_VERTEX_Y:
  378. options->glsl.vertex.flip_vert_y = value != 0;
  379. break;
  380. case SPVC_COMPILER_OPTION_EMIT_LINE_DIRECTIVES:
  381. options->glsl.emit_line_directives = value != 0;
  382. break;
  383. case SPVC_COMPILER_OPTION_ENABLE_STORAGE_IMAGE_QUALIFIER_DEDUCTION:
  384. options->glsl.enable_storage_image_qualifier_deduction = value != 0;
  385. break;
  386. case SPVC_COMPILER_OPTION_FORCE_ZERO_INITIALIZED_VARIABLES:
  387. options->glsl.force_zero_initialized_variables = value != 0;
  388. break;
  389. case SPVC_COMPILER_OPTION_GLSL_SUPPORT_NONZERO_BASE_INSTANCE:
  390. options->glsl.vertex.support_nonzero_base_instance = value != 0;
  391. break;
  392. case SPVC_COMPILER_OPTION_GLSL_SEPARATE_SHADER_OBJECTS:
  393. options->glsl.separate_shader_objects = value != 0;
  394. break;
  395. case SPVC_COMPILER_OPTION_GLSL_ENABLE_420PACK_EXTENSION:
  396. options->glsl.enable_420pack_extension = value != 0;
  397. break;
  398. case SPVC_COMPILER_OPTION_GLSL_VERSION:
  399. options->glsl.version = value;
  400. break;
  401. case SPVC_COMPILER_OPTION_GLSL_ES:
  402. options->glsl.es = value != 0;
  403. break;
  404. case SPVC_COMPILER_OPTION_GLSL_VULKAN_SEMANTICS:
  405. options->glsl.vulkan_semantics = value != 0;
  406. break;
  407. case SPVC_COMPILER_OPTION_GLSL_ES_DEFAULT_FLOAT_PRECISION_HIGHP:
  408. options->glsl.fragment.default_float_precision =
  409. value != 0 ? CompilerGLSL::Options::Precision::Highp : CompilerGLSL::Options::Precision::Mediump;
  410. break;
  411. case SPVC_COMPILER_OPTION_GLSL_ES_DEFAULT_INT_PRECISION_HIGHP:
  412. options->glsl.fragment.default_int_precision =
  413. value != 0 ? CompilerGLSL::Options::Precision::Highp : CompilerGLSL::Options::Precision::Mediump;
  414. break;
  415. case SPVC_COMPILER_OPTION_GLSL_EMIT_PUSH_CONSTANT_AS_UNIFORM_BUFFER:
  416. options->glsl.emit_push_constant_as_uniform_buffer = value != 0;
  417. break;
  418. case SPVC_COMPILER_OPTION_GLSL_EMIT_UNIFORM_BUFFER_AS_PLAIN_UNIFORMS:
  419. options->glsl.emit_uniform_buffer_as_plain_uniforms = value != 0;
  420. break;
  421. case SPVC_COMPILER_OPTION_GLSL_FORCE_FLATTENED_IO_BLOCKS:
  422. options->glsl.force_flattened_io_blocks = value != 0;
  423. break;
  424. case SPVC_COMPILER_OPTION_GLSL_OVR_MULTIVIEW_VIEW_COUNT:
  425. options->glsl.ovr_multiview_view_count = value;
  426. break;
  427. case SPVC_COMPILER_OPTION_RELAX_NAN_CHECKS:
  428. options->glsl.relax_nan_checks = value != 0;
  429. break;
  430. case SPVC_COMPILER_OPTION_GLSL_ENABLE_ROW_MAJOR_LOAD_WORKAROUND:
  431. options->glsl.enable_row_major_load_workaround = value != 0;
  432. break;
  433. #endif
  434. #if SPIRV_CROSS_C_API_HLSL
  435. case SPVC_COMPILER_OPTION_HLSL_SHADER_MODEL:
  436. options->hlsl.shader_model = value;
  437. break;
  438. case SPVC_COMPILER_OPTION_HLSL_POINT_SIZE_COMPAT:
  439. options->hlsl.point_size_compat = value != 0;
  440. break;
  441. case SPVC_COMPILER_OPTION_HLSL_POINT_COORD_COMPAT:
  442. options->hlsl.point_coord_compat = value != 0;
  443. break;
  444. case SPVC_COMPILER_OPTION_HLSL_SUPPORT_NONZERO_BASE_VERTEX_BASE_INSTANCE:
  445. options->hlsl.support_nonzero_base_vertex_base_instance = value != 0;
  446. break;
  447. case SPVC_COMPILER_OPTION_HLSL_FORCE_STORAGE_BUFFER_AS_UAV:
  448. options->hlsl.force_storage_buffer_as_uav = value != 0;
  449. break;
  450. case SPVC_COMPILER_OPTION_HLSL_NONWRITABLE_UAV_TEXTURE_AS_SRV:
  451. options->hlsl.nonwritable_uav_texture_as_srv = value != 0;
  452. break;
  453. case SPVC_COMPILER_OPTION_HLSL_ENABLE_16BIT_TYPES:
  454. options->hlsl.enable_16bit_types = value != 0;
  455. break;
  456. case SPVC_COMPILER_OPTION_HLSL_FLATTEN_MATRIX_VERTEX_INPUT_SEMANTICS:
  457. options->hlsl.flatten_matrix_vertex_input_semantics = value != 0;
  458. break;
  459. case SPVC_COMPILER_OPTION_HLSL_USE_ENTRY_POINT_NAME:
  460. options->hlsl.use_entry_point_name = value != 0;
  461. break;
  462. case SPVC_COMPILER_OPTION_HLSL_PRESERVE_STRUCTURED_BUFFERS:
  463. options->hlsl.preserve_structured_buffers = value != 0;
  464. break;
  465. case SPVC_COMPILER_OPTION_HLSL_USER_SEMANTIC:
  466. options->hlsl.user_semantic = value != 0;
  467. break;
  468. #endif
  469. #if SPIRV_CROSS_C_API_MSL
  470. case SPVC_COMPILER_OPTION_MSL_VERSION:
  471. options->msl.msl_version = value;
  472. break;
  473. case SPVC_COMPILER_OPTION_MSL_TEXEL_BUFFER_TEXTURE_WIDTH:
  474. options->msl.texel_buffer_texture_width = value;
  475. break;
  476. case SPVC_COMPILER_OPTION_MSL_SWIZZLE_BUFFER_INDEX:
  477. options->msl.swizzle_buffer_index = value;
  478. break;
  479. case SPVC_COMPILER_OPTION_MSL_INDIRECT_PARAMS_BUFFER_INDEX:
  480. options->msl.indirect_params_buffer_index = value;
  481. break;
  482. case SPVC_COMPILER_OPTION_MSL_SHADER_OUTPUT_BUFFER_INDEX:
  483. options->msl.shader_output_buffer_index = value;
  484. break;
  485. case SPVC_COMPILER_OPTION_MSL_SHADER_PATCH_OUTPUT_BUFFER_INDEX:
  486. options->msl.shader_patch_output_buffer_index = value;
  487. break;
  488. case SPVC_COMPILER_OPTION_MSL_SHADER_TESS_FACTOR_OUTPUT_BUFFER_INDEX:
  489. options->msl.shader_tess_factor_buffer_index = value;
  490. break;
  491. case SPVC_COMPILER_OPTION_MSL_SHADER_INPUT_WORKGROUP_INDEX:
  492. options->msl.shader_input_wg_index = value;
  493. break;
  494. case SPVC_COMPILER_OPTION_MSL_ENABLE_POINT_SIZE_BUILTIN:
  495. options->msl.enable_point_size_builtin = value != 0;
  496. break;
  497. case SPVC_COMPILER_OPTION_MSL_ENABLE_POINT_SIZE_DEFAULT:
  498. options->msl.enable_point_size_default = value != 0;
  499. break;
  500. case SPVC_COMPILER_OPTION_MSL_DISABLE_RASTERIZATION:
  501. options->msl.disable_rasterization = value != 0;
  502. break;
  503. case SPVC_COMPILER_OPTION_MSL_AUTO_DISABLE_RASTERIZATION:
  504. options->msl.auto_disable_rasterization = value != 0;
  505. break;
  506. case SPVC_COMPILER_OPTION_MSL_CAPTURE_OUTPUT_TO_BUFFER:
  507. options->msl.capture_output_to_buffer = value != 0;
  508. break;
  509. case SPVC_COMPILER_OPTION_MSL_SWIZZLE_TEXTURE_SAMPLES:
  510. options->msl.swizzle_texture_samples = value != 0;
  511. break;
  512. case SPVC_COMPILER_OPTION_MSL_PAD_FRAGMENT_OUTPUT_COMPONENTS:
  513. options->msl.pad_fragment_output_components = value != 0;
  514. break;
  515. case SPVC_COMPILER_OPTION_MSL_TESS_DOMAIN_ORIGIN_LOWER_LEFT:
  516. options->msl.tess_domain_origin_lower_left = value != 0;
  517. break;
  518. case SPVC_COMPILER_OPTION_MSL_PLATFORM:
  519. options->msl.platform = static_cast<CompilerMSL::Options::Platform>(value);
  520. break;
  521. case SPVC_COMPILER_OPTION_MSL_ARGUMENT_BUFFERS:
  522. options->msl.argument_buffers = value != 0;
  523. break;
  524. case SPVC_COMPILER_OPTION_MSL_TEXTURE_BUFFER_NATIVE:
  525. options->msl.texture_buffer_native = value != 0;
  526. break;
  527. case SPVC_COMPILER_OPTION_MSL_BUFFER_SIZE_BUFFER_INDEX:
  528. options->msl.buffer_size_buffer_index = value;
  529. break;
  530. case SPVC_COMPILER_OPTION_MSL_MULTIVIEW:
  531. options->msl.multiview = value != 0;
  532. break;
  533. case SPVC_COMPILER_OPTION_MSL_VIEW_MASK_BUFFER_INDEX:
  534. options->msl.view_mask_buffer_index = value;
  535. break;
  536. case SPVC_COMPILER_OPTION_MSL_DEVICE_INDEX:
  537. options->msl.device_index = value;
  538. break;
  539. case SPVC_COMPILER_OPTION_MSL_VIEW_INDEX_FROM_DEVICE_INDEX:
  540. options->msl.view_index_from_device_index = value != 0;
  541. break;
  542. case SPVC_COMPILER_OPTION_MSL_DISPATCH_BASE:
  543. options->msl.dispatch_base = value != 0;
  544. break;
  545. case SPVC_COMPILER_OPTION_MSL_DYNAMIC_OFFSETS_BUFFER_INDEX:
  546. options->msl.dynamic_offsets_buffer_index = value;
  547. break;
  548. case SPVC_COMPILER_OPTION_MSL_TEXTURE_1D_AS_2D:
  549. options->msl.texture_1D_as_2D = value != 0;
  550. break;
  551. case SPVC_COMPILER_OPTION_MSL_ENABLE_BASE_INDEX_ZERO:
  552. options->msl.enable_base_index_zero = value != 0;
  553. break;
  554. case SPVC_COMPILER_OPTION_MSL_FRAMEBUFFER_FETCH_SUBPASS:
  555. options->msl.use_framebuffer_fetch_subpasses = value != 0;
  556. break;
  557. case SPVC_COMPILER_OPTION_MSL_INVARIANT_FP_MATH:
  558. options->msl.invariant_float_math = value != 0;
  559. break;
  560. case SPVC_COMPILER_OPTION_MSL_EMULATE_CUBEMAP_ARRAY:
  561. options->msl.emulate_cube_array = value != 0;
  562. break;
  563. case SPVC_COMPILER_OPTION_MSL_ENABLE_DECORATION_BINDING:
  564. options->msl.enable_decoration_binding = value != 0;
  565. break;
  566. case SPVC_COMPILER_OPTION_MSL_FORCE_ACTIVE_ARGUMENT_BUFFER_RESOURCES:
  567. options->msl.force_active_argument_buffer_resources = value != 0;
  568. break;
  569. case SPVC_COMPILER_OPTION_MSL_FORCE_NATIVE_ARRAYS:
  570. options->msl.force_native_arrays = value != 0;
  571. break;
  572. case SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_OUTPUT_MASK:
  573. options->msl.enable_frag_output_mask = value;
  574. break;
  575. case SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_DEPTH_BUILTIN:
  576. options->msl.enable_frag_depth_builtin = value != 0;
  577. break;
  578. case SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_STENCIL_REF_BUILTIN:
  579. options->msl.enable_frag_stencil_ref_builtin = value != 0;
  580. break;
  581. case SPVC_COMPILER_OPTION_MSL_ENABLE_CLIP_DISTANCE_USER_VARYING:
  582. options->msl.enable_clip_distance_user_varying = value != 0;
  583. break;
  584. case SPVC_COMPILER_OPTION_MSL_MULTI_PATCH_WORKGROUP:
  585. options->msl.multi_patch_workgroup = value != 0;
  586. break;
  587. case SPVC_COMPILER_OPTION_MSL_SHADER_INPUT_BUFFER_INDEX:
  588. options->msl.shader_input_buffer_index = value;
  589. break;
  590. case SPVC_COMPILER_OPTION_MSL_SHADER_INDEX_BUFFER_INDEX:
  591. options->msl.shader_index_buffer_index = value;
  592. break;
  593. case SPVC_COMPILER_OPTION_MSL_VERTEX_FOR_TESSELLATION:
  594. options->msl.vertex_for_tessellation = value != 0;
  595. break;
  596. case SPVC_COMPILER_OPTION_MSL_VERTEX_INDEX_TYPE:
  597. options->msl.vertex_index_type = static_cast<CompilerMSL::Options::IndexType>(value);
  598. break;
  599. case SPVC_COMPILER_OPTION_MSL_MULTIVIEW_LAYERED_RENDERING:
  600. options->msl.multiview_layered_rendering = value != 0;
  601. break;
  602. case SPVC_COMPILER_OPTION_MSL_ARRAYED_SUBPASS_INPUT:
  603. options->msl.arrayed_subpass_input = value != 0;
  604. break;
  605. case SPVC_COMPILER_OPTION_MSL_R32UI_LINEAR_TEXTURE_ALIGNMENT:
  606. options->msl.r32ui_linear_texture_alignment = value;
  607. break;
  608. case SPVC_COMPILER_OPTION_MSL_R32UI_ALIGNMENT_CONSTANT_ID:
  609. options->msl.r32ui_alignment_constant_id = value;
  610. break;
  611. case SPVC_COMPILER_OPTION_MSL_IOS_USE_SIMDGROUP_FUNCTIONS:
  612. options->msl.ios_use_simdgroup_functions = value != 0;
  613. break;
  614. case SPVC_COMPILER_OPTION_MSL_EMULATE_SUBGROUPS:
  615. options->msl.emulate_subgroups = value != 0;
  616. break;
  617. case SPVC_COMPILER_OPTION_MSL_FIXED_SUBGROUP_SIZE:
  618. options->msl.fixed_subgroup_size = value;
  619. break;
  620. case SPVC_COMPILER_OPTION_MSL_FORCE_SAMPLE_RATE_SHADING:
  621. options->msl.force_sample_rate_shading = value != 0;
  622. break;
  623. case SPVC_COMPILER_OPTION_MSL_IOS_SUPPORT_BASE_VERTEX_INSTANCE:
  624. options->msl.ios_support_base_vertex_instance = value != 0;
  625. break;
  626. case SPVC_COMPILER_OPTION_MSL_RAW_BUFFER_TESE_INPUT:
  627. options->msl.raw_buffer_tese_input = value != 0;
  628. break;
  629. case SPVC_COMPILER_OPTION_MSL_SHADER_PATCH_INPUT_BUFFER_INDEX:
  630. options->msl.shader_patch_input_buffer_index = value;
  631. break;
  632. case SPVC_COMPILER_OPTION_MSL_MANUAL_HELPER_INVOCATION_UPDATES:
  633. options->msl.manual_helper_invocation_updates = value != 0;
  634. break;
  635. case SPVC_COMPILER_OPTION_MSL_CHECK_DISCARDED_FRAG_STORES:
  636. options->msl.check_discarded_frag_stores = value != 0;
  637. break;
  638. case SPVC_COMPILER_OPTION_MSL_ARGUMENT_BUFFERS_TIER:
  639. options->msl.argument_buffers_tier = static_cast<CompilerMSL::Options::ArgumentBuffersTier>(value);
  640. break;
  641. case SPVC_COMPILER_OPTION_MSL_SAMPLE_DREF_LOD_ARRAY_AS_GRAD:
  642. options->msl.sample_dref_lod_array_as_grad = value != 0;
  643. break;
  644. case SPVC_COMPILER_OPTION_MSL_READWRITE_TEXTURE_FENCES:
  645. options->msl.readwrite_texture_fences = value != 0;
  646. break;
  647. case SPVC_COMPILER_OPTION_MSL_REPLACE_RECURSIVE_INPUTS:
  648. options->msl.replace_recursive_inputs = value != 0;
  649. break;
  650. case SPVC_COMPILER_OPTION_MSL_AGX_MANUAL_CUBE_GRAD_FIXUP:
  651. options->msl.agx_manual_cube_grad_fixup = value != 0;
  652. break;
  653. case SPVC_COMPILER_OPTION_MSL_FORCE_FRAGMENT_WITH_SIDE_EFFECTS_EXECUTION:
  654. options->msl.force_fragment_with_side_effects_execution = value != 0;
  655. break;
  656. #endif
  657. default:
  658. options->context->report_error("Unknown option.");
  659. return SPVC_ERROR_INVALID_ARGUMENT;
  660. }
  661. return SPVC_SUCCESS;
  662. }
  663. spvc_result spvc_compiler_install_compiler_options(spvc_compiler compiler, spvc_compiler_options options)
  664. {
  665. (void)options;
  666. switch (compiler->backend)
  667. {
  668. #if SPIRV_CROSS_C_API_GLSL
  669. case SPVC_BACKEND_GLSL:
  670. static_cast<CompilerGLSL &>(*compiler->compiler).set_common_options(options->glsl);
  671. break;
  672. #endif
  673. #if SPIRV_CROSS_C_API_HLSL
  674. case SPVC_BACKEND_HLSL:
  675. static_cast<CompilerHLSL &>(*compiler->compiler).set_common_options(options->glsl);
  676. static_cast<CompilerHLSL &>(*compiler->compiler).set_hlsl_options(options->hlsl);
  677. break;
  678. #endif
  679. #if SPIRV_CROSS_C_API_MSL
  680. case SPVC_BACKEND_MSL:
  681. static_cast<CompilerMSL &>(*compiler->compiler).set_common_options(options->glsl);
  682. static_cast<CompilerMSL &>(*compiler->compiler).set_msl_options(options->msl);
  683. break;
  684. #endif
  685. default:
  686. break;
  687. }
  688. return SPVC_SUCCESS;
  689. }
  690. spvc_result spvc_compiler_add_header_line(spvc_compiler compiler, const char *line)
  691. {
  692. #if SPIRV_CROSS_C_API_GLSL
  693. if (compiler->backend == SPVC_BACKEND_NONE)
  694. {
  695. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  696. return SPVC_ERROR_INVALID_ARGUMENT;
  697. }
  698. static_cast<CompilerGLSL *>(compiler->compiler.get())->add_header_line(line);
  699. return SPVC_SUCCESS;
  700. #else
  701. (void)line;
  702. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  703. return SPVC_ERROR_INVALID_ARGUMENT;
  704. #endif
  705. }
  706. spvc_result spvc_compiler_require_extension(spvc_compiler compiler, const char *line)
  707. {
  708. #if SPIRV_CROSS_C_API_GLSL
  709. if (compiler->backend == SPVC_BACKEND_NONE)
  710. {
  711. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  712. return SPVC_ERROR_INVALID_ARGUMENT;
  713. }
  714. static_cast<CompilerGLSL *>(compiler->compiler.get())->require_extension(line);
  715. return SPVC_SUCCESS;
  716. #else
  717. (void)line;
  718. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  719. return SPVC_ERROR_INVALID_ARGUMENT;
  720. #endif
  721. }
  722. size_t spvc_compiler_get_num_required_extensions(spvc_compiler compiler)
  723. {
  724. #if SPIRV_CROSS_C_API_GLSL
  725. if (compiler->backend != SPVC_BACKEND_GLSL)
  726. {
  727. compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
  728. return SPVC_ERROR_INVALID_ARGUMENT;
  729. }
  730. return static_cast<CompilerGLSL *>(compiler->compiler.get())->get_required_extensions().size();
  731. #else
  732. compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
  733. return 0;
  734. #endif
  735. }
  736. const char *spvc_compiler_get_required_extension(spvc_compiler compiler, size_t index)
  737. {
  738. #if SPIRV_CROSS_C_API_GLSL
  739. if (compiler->backend != SPVC_BACKEND_GLSL)
  740. {
  741. compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
  742. return nullptr;
  743. }
  744. auto &exts = static_cast<CompilerGLSL *>(compiler->compiler.get())->get_required_extensions();
  745. if (index < exts.size())
  746. return exts[index].c_str();
  747. else
  748. return nullptr;
  749. #else
  750. (void)index;
  751. compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
  752. return nullptr;
  753. #endif
  754. }
  755. spvc_result spvc_compiler_flatten_buffer_block(spvc_compiler compiler, spvc_variable_id id)
  756. {
  757. #if SPIRV_CROSS_C_API_GLSL
  758. if (compiler->backend == SPVC_BACKEND_NONE)
  759. {
  760. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  761. return SPVC_ERROR_INVALID_ARGUMENT;
  762. }
  763. static_cast<CompilerGLSL *>(compiler->compiler.get())->flatten_buffer_block(id);
  764. return SPVC_SUCCESS;
  765. #else
  766. (void)id;
  767. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  768. return SPVC_ERROR_INVALID_ARGUMENT;
  769. #endif
  770. }
  771. spvc_bool spvc_compiler_variable_is_depth_or_compare(spvc_compiler compiler, spvc_variable_id id)
  772. {
  773. #if SPIRV_CROSS_C_API_GLSL
  774. if (compiler->backend == SPVC_BACKEND_NONE)
  775. {
  776. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  777. return SPVC_ERROR_INVALID_ARGUMENT;
  778. }
  779. return static_cast<CompilerGLSL *>(compiler->compiler.get())->variable_is_depth_or_compare(id) ? SPVC_TRUE : SPVC_FALSE;
  780. #else
  781. (void)id;
  782. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  783. return SPVC_FALSE;
  784. #endif
  785. }
  786. spvc_result spvc_compiler_mask_stage_output_by_location(spvc_compiler compiler,
  787. unsigned location, unsigned component)
  788. {
  789. #if SPIRV_CROSS_C_API_GLSL
  790. if (compiler->backend == SPVC_BACKEND_NONE)
  791. {
  792. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  793. return SPVC_ERROR_INVALID_ARGUMENT;
  794. }
  795. static_cast<CompilerGLSL *>(compiler->compiler.get())->mask_stage_output_by_location(location, component);
  796. return SPVC_SUCCESS;
  797. #else
  798. (void)location;
  799. (void)component;
  800. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  801. return SPVC_ERROR_INVALID_ARGUMENT;
  802. #endif
  803. }
  804. spvc_result spvc_compiler_mask_stage_output_by_builtin(spvc_compiler compiler, SpvBuiltIn builtin)
  805. {
  806. #if SPIRV_CROSS_C_API_GLSL
  807. if (compiler->backend == SPVC_BACKEND_NONE)
  808. {
  809. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  810. return SPVC_ERROR_INVALID_ARGUMENT;
  811. }
  812. static_cast<CompilerGLSL *>(compiler->compiler.get())->mask_stage_output_by_builtin(BuiltIn(builtin));
  813. return SPVC_SUCCESS;
  814. #else
  815. (void)builtin;
  816. compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
  817. return SPVC_ERROR_INVALID_ARGUMENT;
  818. #endif
  819. }
  820. spvc_result spvc_compiler_hlsl_set_root_constants_layout(spvc_compiler compiler,
  821. const spvc_hlsl_root_constants *constant_info,
  822. size_t count)
  823. {
  824. #if SPIRV_CROSS_C_API_HLSL
  825. if (compiler->backend != SPVC_BACKEND_HLSL)
  826. {
  827. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  828. return SPVC_ERROR_INVALID_ARGUMENT;
  829. }
  830. auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
  831. vector<RootConstants> roots;
  832. roots.reserve(count);
  833. for (size_t i = 0; i < count; i++)
  834. {
  835. RootConstants root;
  836. root.binding = constant_info[i].binding;
  837. root.space = constant_info[i].space;
  838. root.start = constant_info[i].start;
  839. root.end = constant_info[i].end;
  840. roots.push_back(root);
  841. }
  842. hlsl.set_root_constant_layouts(std::move(roots));
  843. return SPVC_SUCCESS;
  844. #else
  845. (void)constant_info;
  846. (void)count;
  847. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  848. return SPVC_ERROR_INVALID_ARGUMENT;
  849. #endif
  850. }
  851. spvc_result spvc_compiler_hlsl_add_vertex_attribute_remap(spvc_compiler compiler,
  852. const spvc_hlsl_vertex_attribute_remap *remap,
  853. size_t count)
  854. {
  855. #if SPIRV_CROSS_C_API_HLSL
  856. if (compiler->backend != SPVC_BACKEND_HLSL)
  857. {
  858. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  859. return SPVC_ERROR_INVALID_ARGUMENT;
  860. }
  861. HLSLVertexAttributeRemap re;
  862. auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
  863. for (size_t i = 0; i < count; i++)
  864. {
  865. re.location = remap[i].location;
  866. re.semantic = remap[i].semantic;
  867. hlsl.add_vertex_attribute_remap(re);
  868. }
  869. return SPVC_SUCCESS;
  870. #else
  871. (void)remap;
  872. (void)count;
  873. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  874. return SPVC_ERROR_INVALID_ARGUMENT;
  875. #endif
  876. }
  877. spvc_variable_id spvc_compiler_hlsl_remap_num_workgroups_builtin(spvc_compiler compiler)
  878. {
  879. #if SPIRV_CROSS_C_API_HLSL
  880. if (compiler->backend != SPVC_BACKEND_HLSL)
  881. {
  882. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  883. return 0;
  884. }
  885. auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
  886. return hlsl.remap_num_workgroups_builtin();
  887. #else
  888. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  889. return 0;
  890. #endif
  891. }
  892. spvc_result spvc_compiler_hlsl_set_resource_binding_flags(spvc_compiler compiler,
  893. spvc_hlsl_binding_flags flags)
  894. {
  895. #if SPIRV_CROSS_C_API_HLSL
  896. if (compiler->backend != SPVC_BACKEND_HLSL)
  897. {
  898. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  899. return SPVC_ERROR_INVALID_ARGUMENT;
  900. }
  901. auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
  902. hlsl.set_resource_binding_flags(flags);
  903. return SPVC_SUCCESS;
  904. #else
  905. (void)flags;
  906. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  907. return SPVC_ERROR_INVALID_ARGUMENT;
  908. #endif
  909. }
  910. spvc_result spvc_compiler_hlsl_add_resource_binding(spvc_compiler compiler,
  911. const spvc_hlsl_resource_binding *binding)
  912. {
  913. #if SPIRV_CROSS_C_API_HLSL
  914. if (compiler->backend != SPVC_BACKEND_HLSL)
  915. {
  916. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  917. return SPVC_ERROR_INVALID_ARGUMENT;
  918. }
  919. auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
  920. HLSLResourceBinding bind;
  921. bind.binding = binding->binding;
  922. bind.desc_set = binding->desc_set;
  923. bind.stage = static_cast<ExecutionModel>(binding->stage);
  924. bind.cbv.register_binding = binding->cbv.register_binding;
  925. bind.cbv.register_space = binding->cbv.register_space;
  926. bind.uav.register_binding = binding->uav.register_binding;
  927. bind.uav.register_space = binding->uav.register_space;
  928. bind.srv.register_binding = binding->srv.register_binding;
  929. bind.srv.register_space = binding->srv.register_space;
  930. bind.sampler.register_binding = binding->sampler.register_binding;
  931. bind.sampler.register_space = binding->sampler.register_space;
  932. hlsl.add_hlsl_resource_binding(bind);
  933. return SPVC_SUCCESS;
  934. #else
  935. (void)binding;
  936. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  937. return SPVC_ERROR_INVALID_ARGUMENT;
  938. #endif
  939. }
  940. spvc_bool spvc_compiler_hlsl_is_resource_used(spvc_compiler compiler, SpvExecutionModel model, unsigned set,
  941. unsigned binding)
  942. {
  943. #if SPIRV_CROSS_C_API_HLSL
  944. if (compiler->backend != SPVC_BACKEND_HLSL)
  945. {
  946. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  947. return SPVC_FALSE;
  948. }
  949. auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
  950. return hlsl.is_hlsl_resource_binding_used(static_cast<ExecutionModel>(model), set, binding) ? SPVC_TRUE :
  951. SPVC_FALSE;
  952. #else
  953. (void)model;
  954. (void)set;
  955. (void)binding;
  956. compiler->context->report_error("HLSL function used on a non-HLSL backend.");
  957. return SPVC_FALSE;
  958. #endif
  959. }
  960. spvc_bool spvc_compiler_msl_is_rasterization_disabled(spvc_compiler compiler)
  961. {
  962. #if SPIRV_CROSS_C_API_MSL
  963. if (compiler->backend != SPVC_BACKEND_MSL)
  964. {
  965. compiler->context->report_error("MSL function used on a non-MSL backend.");
  966. return SPVC_FALSE;
  967. }
  968. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  969. return msl.get_is_rasterization_disabled() ? SPVC_TRUE : SPVC_FALSE;
  970. #else
  971. compiler->context->report_error("MSL function used on a non-MSL backend.");
  972. return SPVC_FALSE;
  973. #endif
  974. }
  975. spvc_bool spvc_compiler_msl_needs_swizzle_buffer(spvc_compiler compiler)
  976. {
  977. #if SPIRV_CROSS_C_API_MSL
  978. if (compiler->backend != SPVC_BACKEND_MSL)
  979. {
  980. compiler->context->report_error("MSL function used on a non-MSL backend.");
  981. return SPVC_FALSE;
  982. }
  983. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  984. return msl.needs_swizzle_buffer() ? SPVC_TRUE : SPVC_FALSE;
  985. #else
  986. compiler->context->report_error("MSL function used on a non-MSL backend.");
  987. return SPVC_FALSE;
  988. #endif
  989. }
  990. spvc_bool spvc_compiler_msl_needs_buffer_size_buffer(spvc_compiler compiler)
  991. {
  992. #if SPIRV_CROSS_C_API_MSL
  993. if (compiler->backend != SPVC_BACKEND_MSL)
  994. {
  995. compiler->context->report_error("MSL function used on a non-MSL backend.");
  996. return SPVC_FALSE;
  997. }
  998. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  999. return msl.needs_buffer_size_buffer() ? SPVC_TRUE : SPVC_FALSE;
  1000. #else
  1001. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1002. return SPVC_FALSE;
  1003. #endif
  1004. }
  1005. spvc_bool spvc_compiler_msl_needs_aux_buffer(spvc_compiler compiler)
  1006. {
  1007. return spvc_compiler_msl_needs_swizzle_buffer(compiler);
  1008. }
  1009. spvc_bool spvc_compiler_msl_needs_output_buffer(spvc_compiler compiler)
  1010. {
  1011. #if SPIRV_CROSS_C_API_MSL
  1012. if (compiler->backend != SPVC_BACKEND_MSL)
  1013. {
  1014. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1015. return SPVC_FALSE;
  1016. }
  1017. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1018. return msl.needs_output_buffer() ? SPVC_TRUE : SPVC_FALSE;
  1019. #else
  1020. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1021. return SPVC_FALSE;
  1022. #endif
  1023. }
  1024. spvc_bool spvc_compiler_msl_needs_patch_output_buffer(spvc_compiler compiler)
  1025. {
  1026. #if SPIRV_CROSS_C_API_MSL
  1027. if (compiler->backend != SPVC_BACKEND_MSL)
  1028. {
  1029. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1030. return SPVC_FALSE;
  1031. }
  1032. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1033. return msl.needs_patch_output_buffer() ? SPVC_TRUE : SPVC_FALSE;
  1034. #else
  1035. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1036. return SPVC_FALSE;
  1037. #endif
  1038. }
  1039. spvc_bool spvc_compiler_msl_needs_input_threadgroup_mem(spvc_compiler compiler)
  1040. {
  1041. #if SPIRV_CROSS_C_API_MSL
  1042. if (compiler->backend != SPVC_BACKEND_MSL)
  1043. {
  1044. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1045. return SPVC_FALSE;
  1046. }
  1047. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1048. return msl.needs_input_threadgroup_mem() ? SPVC_TRUE : SPVC_FALSE;
  1049. #else
  1050. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1051. return SPVC_FALSE;
  1052. #endif
  1053. }
  1054. spvc_result spvc_compiler_msl_add_vertex_attribute(spvc_compiler compiler, const spvc_msl_vertex_attribute *va)
  1055. {
  1056. #if SPIRV_CROSS_C_API_MSL
  1057. if (compiler->backend != SPVC_BACKEND_MSL)
  1058. {
  1059. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1060. return SPVC_ERROR_INVALID_ARGUMENT;
  1061. }
  1062. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1063. MSLShaderInterfaceVariable attr;
  1064. attr.location = va->location;
  1065. attr.format = static_cast<MSLShaderVariableFormat>(va->format);
  1066. attr.builtin = static_cast<BuiltIn>(va->builtin);
  1067. msl.add_msl_shader_input(attr);
  1068. return SPVC_SUCCESS;
  1069. #else
  1070. (void)va;
  1071. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1072. return SPVC_ERROR_INVALID_ARGUMENT;
  1073. #endif
  1074. }
  1075. spvc_result spvc_compiler_msl_add_shader_input(spvc_compiler compiler, const spvc_msl_shader_interface_var *si)
  1076. {
  1077. #if SPIRV_CROSS_C_API_MSL
  1078. if (compiler->backend != SPVC_BACKEND_MSL)
  1079. {
  1080. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1081. return SPVC_ERROR_INVALID_ARGUMENT;
  1082. }
  1083. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1084. MSLShaderInterfaceVariable input;
  1085. input.location = si->location;
  1086. input.format = static_cast<MSLShaderVariableFormat>(si->format);
  1087. input.builtin = static_cast<BuiltIn>(si->builtin);
  1088. input.vecsize = si->vecsize;
  1089. msl.add_msl_shader_input(input);
  1090. return SPVC_SUCCESS;
  1091. #else
  1092. (void)si;
  1093. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1094. return SPVC_ERROR_INVALID_ARGUMENT;
  1095. #endif
  1096. }
  1097. spvc_result spvc_compiler_msl_add_shader_input_2(spvc_compiler compiler, const spvc_msl_shader_interface_var_2 *si)
  1098. {
  1099. #if SPIRV_CROSS_C_API_MSL
  1100. if (compiler->backend != SPVC_BACKEND_MSL)
  1101. {
  1102. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1103. return SPVC_ERROR_INVALID_ARGUMENT;
  1104. }
  1105. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1106. MSLShaderInterfaceVariable input;
  1107. input.location = si->location;
  1108. input.format = static_cast<MSLShaderVariableFormat>(si->format);
  1109. input.builtin = static_cast<BuiltIn>(si->builtin);
  1110. input.vecsize = si->vecsize;
  1111. input.rate = static_cast<MSLShaderVariableRate>(si->rate);
  1112. msl.add_msl_shader_input(input);
  1113. return SPVC_SUCCESS;
  1114. #else
  1115. (void)si;
  1116. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1117. return SPVC_ERROR_INVALID_ARGUMENT;
  1118. #endif
  1119. }
  1120. spvc_result spvc_compiler_msl_add_shader_output(spvc_compiler compiler, const spvc_msl_shader_interface_var *so)
  1121. {
  1122. #if SPIRV_CROSS_C_API_MSL
  1123. if (compiler->backend != SPVC_BACKEND_MSL)
  1124. {
  1125. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1126. return SPVC_ERROR_INVALID_ARGUMENT;
  1127. }
  1128. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1129. MSLShaderInterfaceVariable output;
  1130. output.location = so->location;
  1131. output.format = static_cast<MSLShaderVariableFormat>(so->format);
  1132. output.builtin = static_cast<BuiltIn>(so->builtin);
  1133. output.vecsize = so->vecsize;
  1134. msl.add_msl_shader_output(output);
  1135. return SPVC_SUCCESS;
  1136. #else
  1137. (void)so;
  1138. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1139. return SPVC_ERROR_INVALID_ARGUMENT;
  1140. #endif
  1141. }
  1142. spvc_result spvc_compiler_msl_add_shader_output_2(spvc_compiler compiler, const spvc_msl_shader_interface_var_2 *so)
  1143. {
  1144. #if SPIRV_CROSS_C_API_MSL
  1145. if (compiler->backend != SPVC_BACKEND_MSL)
  1146. {
  1147. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1148. return SPVC_ERROR_INVALID_ARGUMENT;
  1149. }
  1150. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1151. MSLShaderInterfaceVariable output;
  1152. output.location = so->location;
  1153. output.format = static_cast<MSLShaderVariableFormat>(so->format);
  1154. output.builtin = static_cast<BuiltIn>(so->builtin);
  1155. output.vecsize = so->vecsize;
  1156. output.rate = static_cast<MSLShaderVariableRate>(so->rate);
  1157. msl.add_msl_shader_output(output);
  1158. return SPVC_SUCCESS;
  1159. #else
  1160. (void)so;
  1161. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1162. return SPVC_ERROR_INVALID_ARGUMENT;
  1163. #endif
  1164. }
  1165. spvc_result spvc_compiler_msl_add_resource_binding(spvc_compiler compiler,
  1166. const spvc_msl_resource_binding *binding)
  1167. {
  1168. #if SPIRV_CROSS_C_API_MSL
  1169. if (compiler->backend != SPVC_BACKEND_MSL)
  1170. {
  1171. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1172. return SPVC_ERROR_INVALID_ARGUMENT;
  1173. }
  1174. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1175. MSLResourceBinding bind;
  1176. bind.binding = binding->binding;
  1177. bind.desc_set = binding->desc_set;
  1178. bind.stage = static_cast<ExecutionModel>(binding->stage);
  1179. bind.msl_buffer = binding->msl_buffer;
  1180. bind.msl_texture = binding->msl_texture;
  1181. bind.msl_sampler = binding->msl_sampler;
  1182. msl.add_msl_resource_binding(bind);
  1183. return SPVC_SUCCESS;
  1184. #else
  1185. (void)binding;
  1186. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1187. return SPVC_ERROR_INVALID_ARGUMENT;
  1188. #endif
  1189. }
  1190. spvc_result spvc_compiler_msl_add_resource_binding_2(spvc_compiler compiler,
  1191. const spvc_msl_resource_binding_2 *binding)
  1192. {
  1193. #if SPIRV_CROSS_C_API_MSL
  1194. if (compiler->backend != SPVC_BACKEND_MSL)
  1195. {
  1196. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1197. return SPVC_ERROR_INVALID_ARGUMENT;
  1198. }
  1199. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1200. MSLResourceBinding bind;
  1201. bind.binding = binding->binding;
  1202. bind.desc_set = binding->desc_set;
  1203. bind.stage = static_cast<ExecutionModel>(binding->stage);
  1204. bind.msl_buffer = binding->msl_buffer;
  1205. bind.msl_texture = binding->msl_texture;
  1206. bind.msl_sampler = binding->msl_sampler;
  1207. bind.count = binding->count;
  1208. msl.add_msl_resource_binding(bind);
  1209. return SPVC_SUCCESS;
  1210. #else
  1211. (void)binding;
  1212. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1213. return SPVC_ERROR_INVALID_ARGUMENT;
  1214. #endif
  1215. }
  1216. spvc_result spvc_compiler_msl_add_dynamic_buffer(spvc_compiler compiler, unsigned desc_set, unsigned binding, unsigned index)
  1217. {
  1218. #if SPIRV_CROSS_C_API_MSL
  1219. if (compiler->backend != SPVC_BACKEND_MSL)
  1220. {
  1221. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1222. return SPVC_ERROR_INVALID_ARGUMENT;
  1223. }
  1224. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1225. msl.add_dynamic_buffer(desc_set, binding, index);
  1226. return SPVC_SUCCESS;
  1227. #else
  1228. (void)binding;
  1229. (void)desc_set;
  1230. (void)index;
  1231. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1232. return SPVC_ERROR_INVALID_ARGUMENT;
  1233. #endif
  1234. }
  1235. spvc_result spvc_compiler_msl_add_inline_uniform_block(spvc_compiler compiler, unsigned desc_set, unsigned binding)
  1236. {
  1237. #if SPIRV_CROSS_C_API_MSL
  1238. if (compiler->backend != SPVC_BACKEND_MSL)
  1239. {
  1240. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1241. return SPVC_ERROR_INVALID_ARGUMENT;
  1242. }
  1243. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1244. msl.add_inline_uniform_block(desc_set, binding);
  1245. return SPVC_SUCCESS;
  1246. #else
  1247. (void)binding;
  1248. (void)desc_set;
  1249. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1250. return SPVC_ERROR_INVALID_ARGUMENT;
  1251. #endif
  1252. }
  1253. spvc_result spvc_compiler_msl_add_discrete_descriptor_set(spvc_compiler compiler, unsigned desc_set)
  1254. {
  1255. #if SPIRV_CROSS_C_API_MSL
  1256. if (compiler->backend != SPVC_BACKEND_MSL)
  1257. {
  1258. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1259. return SPVC_ERROR_INVALID_ARGUMENT;
  1260. }
  1261. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1262. msl.add_discrete_descriptor_set(desc_set);
  1263. return SPVC_SUCCESS;
  1264. #else
  1265. (void)desc_set;
  1266. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1267. return SPVC_ERROR_INVALID_ARGUMENT;
  1268. #endif
  1269. }
  1270. spvc_result spvc_compiler_msl_set_argument_buffer_device_address_space(spvc_compiler compiler, unsigned desc_set, spvc_bool device_address)
  1271. {
  1272. #if SPIRV_CROSS_C_API_MSL
  1273. if (compiler->backend != SPVC_BACKEND_MSL)
  1274. {
  1275. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1276. return SPVC_ERROR_INVALID_ARGUMENT;
  1277. }
  1278. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1279. msl.set_argument_buffer_device_address_space(desc_set, bool(device_address));
  1280. return SPVC_SUCCESS;
  1281. #else
  1282. (void)desc_set;
  1283. (void)device_address;
  1284. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1285. return SPVC_ERROR_INVALID_ARGUMENT;
  1286. #endif
  1287. }
  1288. spvc_bool spvc_compiler_msl_is_shader_input_used(spvc_compiler compiler, unsigned location)
  1289. {
  1290. #if SPIRV_CROSS_C_API_MSL
  1291. if (compiler->backend != SPVC_BACKEND_MSL)
  1292. {
  1293. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1294. return SPVC_FALSE;
  1295. }
  1296. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1297. return msl.is_msl_shader_input_used(location) ? SPVC_TRUE : SPVC_FALSE;
  1298. #else
  1299. (void)location;
  1300. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1301. return SPVC_FALSE;
  1302. #endif
  1303. }
  1304. spvc_bool spvc_compiler_msl_is_shader_output_used(spvc_compiler compiler, unsigned location)
  1305. {
  1306. #if SPIRV_CROSS_C_API_MSL
  1307. if (compiler->backend != SPVC_BACKEND_MSL)
  1308. {
  1309. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1310. return SPVC_FALSE;
  1311. }
  1312. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1313. return msl.is_msl_shader_output_used(location) ? SPVC_TRUE : SPVC_FALSE;
  1314. #else
  1315. (void)location;
  1316. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1317. return SPVC_FALSE;
  1318. #endif
  1319. }
  1320. spvc_bool spvc_compiler_msl_is_vertex_attribute_used(spvc_compiler compiler, unsigned location)
  1321. {
  1322. return spvc_compiler_msl_is_shader_input_used(compiler, location);
  1323. }
  1324. spvc_bool spvc_compiler_msl_is_resource_used(spvc_compiler compiler, SpvExecutionModel model, unsigned set,
  1325. unsigned binding)
  1326. {
  1327. #if SPIRV_CROSS_C_API_MSL
  1328. if (compiler->backend != SPVC_BACKEND_MSL)
  1329. {
  1330. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1331. return SPVC_FALSE;
  1332. }
  1333. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1334. return msl.is_msl_resource_binding_used(static_cast<ExecutionModel>(model), set, binding) ? SPVC_TRUE :
  1335. SPVC_FALSE;
  1336. #else
  1337. (void)model;
  1338. (void)set;
  1339. (void)binding;
  1340. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1341. return SPVC_FALSE;
  1342. #endif
  1343. }
  1344. spvc_result spvc_compiler_msl_set_combined_sampler_suffix(spvc_compiler compiler, const char *suffix)
  1345. {
  1346. #if SPIRV_CROSS_C_API_MSL
  1347. if (compiler->backend != SPVC_BACKEND_MSL)
  1348. {
  1349. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1350. return SPVC_ERROR_INVALID_ARGUMENT;
  1351. }
  1352. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1353. msl.set_combined_sampler_suffix(suffix);
  1354. return SPVC_SUCCESS;
  1355. #else
  1356. (void)suffix;
  1357. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1358. return SPVC_ERROR_INVALID_ARGUMENT;
  1359. #endif
  1360. }
  1361. const char *spvc_compiler_msl_get_combined_sampler_suffix(spvc_compiler compiler)
  1362. {
  1363. #if SPIRV_CROSS_C_API_MSL
  1364. if (compiler->backend != SPVC_BACKEND_MSL)
  1365. {
  1366. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1367. return "";
  1368. }
  1369. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1370. return msl.get_combined_sampler_suffix();
  1371. #else
  1372. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1373. return "";
  1374. #endif
  1375. }
  1376. #if SPIRV_CROSS_C_API_MSL
  1377. static void spvc_convert_msl_sampler(MSLConstexprSampler &samp, const spvc_msl_constexpr_sampler *sampler)
  1378. {
  1379. samp.s_address = static_cast<MSLSamplerAddress>(sampler->s_address);
  1380. samp.t_address = static_cast<MSLSamplerAddress>(sampler->t_address);
  1381. samp.r_address = static_cast<MSLSamplerAddress>(sampler->r_address);
  1382. samp.lod_clamp_min = sampler->lod_clamp_min;
  1383. samp.lod_clamp_max = sampler->lod_clamp_max;
  1384. samp.lod_clamp_enable = sampler->lod_clamp_enable != 0;
  1385. samp.min_filter = static_cast<MSLSamplerFilter>(sampler->min_filter);
  1386. samp.mag_filter = static_cast<MSLSamplerFilter>(sampler->mag_filter);
  1387. samp.mip_filter = static_cast<MSLSamplerMipFilter>(sampler->mip_filter);
  1388. samp.compare_enable = sampler->compare_enable != 0;
  1389. samp.anisotropy_enable = sampler->anisotropy_enable != 0;
  1390. samp.max_anisotropy = sampler->max_anisotropy;
  1391. samp.compare_func = static_cast<MSLSamplerCompareFunc>(sampler->compare_func);
  1392. samp.coord = static_cast<MSLSamplerCoord>(sampler->coord);
  1393. samp.border_color = static_cast<MSLSamplerBorderColor>(sampler->border_color);
  1394. }
  1395. static void spvc_convert_msl_sampler_ycbcr_conversion(MSLConstexprSampler &samp, const spvc_msl_sampler_ycbcr_conversion *conv)
  1396. {
  1397. samp.ycbcr_conversion_enable = conv != nullptr;
  1398. if (conv == nullptr) return;
  1399. samp.planes = conv->planes;
  1400. samp.resolution = static_cast<MSLFormatResolution>(conv->resolution);
  1401. samp.chroma_filter = static_cast<MSLSamplerFilter>(conv->chroma_filter);
  1402. samp.x_chroma_offset = static_cast<MSLChromaLocation>(conv->x_chroma_offset);
  1403. samp.y_chroma_offset = static_cast<MSLChromaLocation>(conv->y_chroma_offset);
  1404. for (int i = 0; i < 4; i++)
  1405. samp.swizzle[i] = static_cast<MSLComponentSwizzle>(conv->swizzle[i]);
  1406. samp.ycbcr_model = static_cast<MSLSamplerYCbCrModelConversion>(conv->ycbcr_model);
  1407. samp.ycbcr_range = static_cast<MSLSamplerYCbCrRange>(conv->ycbcr_range);
  1408. samp.bpc = conv->bpc;
  1409. }
  1410. #endif
  1411. spvc_result spvc_compiler_msl_remap_constexpr_sampler(spvc_compiler compiler, spvc_variable_id id,
  1412. const spvc_msl_constexpr_sampler *sampler)
  1413. {
  1414. #if SPIRV_CROSS_C_API_MSL
  1415. if (compiler->backend != SPVC_BACKEND_MSL)
  1416. {
  1417. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1418. return SPVC_ERROR_INVALID_ARGUMENT;
  1419. }
  1420. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1421. MSLConstexprSampler samp;
  1422. spvc_convert_msl_sampler(samp, sampler);
  1423. msl.remap_constexpr_sampler(id, samp);
  1424. return SPVC_SUCCESS;
  1425. #else
  1426. (void)id;
  1427. (void)sampler;
  1428. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1429. return SPVC_ERROR_INVALID_ARGUMENT;
  1430. #endif
  1431. }
  1432. spvc_result spvc_compiler_msl_remap_constexpr_sampler_by_binding(spvc_compiler compiler,
  1433. unsigned desc_set, unsigned binding,
  1434. const spvc_msl_constexpr_sampler *sampler)
  1435. {
  1436. #if SPIRV_CROSS_C_API_MSL
  1437. if (compiler->backend != SPVC_BACKEND_MSL)
  1438. {
  1439. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1440. return SPVC_ERROR_INVALID_ARGUMENT;
  1441. }
  1442. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1443. MSLConstexprSampler samp;
  1444. spvc_convert_msl_sampler(samp, sampler);
  1445. msl.remap_constexpr_sampler_by_binding(desc_set, binding, samp);
  1446. return SPVC_SUCCESS;
  1447. #else
  1448. (void)desc_set;
  1449. (void)binding;
  1450. (void)sampler;
  1451. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1452. return SPVC_ERROR_INVALID_ARGUMENT;
  1453. #endif
  1454. }
  1455. spvc_result spvc_compiler_msl_remap_constexpr_sampler_ycbcr(spvc_compiler compiler, spvc_variable_id id,
  1456. const spvc_msl_constexpr_sampler *sampler,
  1457. const spvc_msl_sampler_ycbcr_conversion *conv)
  1458. {
  1459. #if SPIRV_CROSS_C_API_MSL
  1460. if (compiler->backend != SPVC_BACKEND_MSL)
  1461. {
  1462. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1463. return SPVC_ERROR_INVALID_ARGUMENT;
  1464. }
  1465. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1466. MSLConstexprSampler samp;
  1467. spvc_convert_msl_sampler(samp, sampler);
  1468. spvc_convert_msl_sampler_ycbcr_conversion(samp, conv);
  1469. msl.remap_constexpr_sampler(id, samp);
  1470. return SPVC_SUCCESS;
  1471. #else
  1472. (void)id;
  1473. (void)sampler;
  1474. (void)conv;
  1475. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1476. return SPVC_ERROR_INVALID_ARGUMENT;
  1477. #endif
  1478. }
  1479. spvc_result spvc_compiler_msl_remap_constexpr_sampler_by_binding_ycbcr(spvc_compiler compiler,
  1480. unsigned desc_set, unsigned binding,
  1481. const spvc_msl_constexpr_sampler *sampler,
  1482. const spvc_msl_sampler_ycbcr_conversion *conv)
  1483. {
  1484. #if SPIRV_CROSS_C_API_MSL
  1485. if (compiler->backend != SPVC_BACKEND_MSL)
  1486. {
  1487. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1488. return SPVC_ERROR_INVALID_ARGUMENT;
  1489. }
  1490. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1491. MSLConstexprSampler samp;
  1492. spvc_convert_msl_sampler(samp, sampler);
  1493. spvc_convert_msl_sampler_ycbcr_conversion(samp, conv);
  1494. msl.remap_constexpr_sampler_by_binding(desc_set, binding, samp);
  1495. return SPVC_SUCCESS;
  1496. #else
  1497. (void)desc_set;
  1498. (void)binding;
  1499. (void)sampler;
  1500. (void)conv;
  1501. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1502. return SPVC_ERROR_INVALID_ARGUMENT;
  1503. #endif
  1504. }
  1505. spvc_result spvc_compiler_msl_set_fragment_output_components(spvc_compiler compiler, unsigned location,
  1506. unsigned components)
  1507. {
  1508. #if SPIRV_CROSS_C_API_MSL
  1509. if (compiler->backend != SPVC_BACKEND_MSL)
  1510. {
  1511. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1512. return SPVC_ERROR_INVALID_ARGUMENT;
  1513. }
  1514. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1515. msl.set_fragment_output_components(location, components);
  1516. return SPVC_SUCCESS;
  1517. #else
  1518. (void)location;
  1519. (void)components;
  1520. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1521. return SPVC_ERROR_INVALID_ARGUMENT;
  1522. #endif
  1523. }
  1524. unsigned spvc_compiler_msl_get_automatic_resource_binding(spvc_compiler compiler, spvc_variable_id id)
  1525. {
  1526. #if SPIRV_CROSS_C_API_MSL
  1527. if (compiler->backend != SPVC_BACKEND_MSL)
  1528. {
  1529. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1530. return uint32_t(-1);
  1531. }
  1532. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1533. return msl.get_automatic_msl_resource_binding(id);
  1534. #else
  1535. (void)id;
  1536. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1537. return uint32_t(-1);
  1538. #endif
  1539. }
  1540. unsigned spvc_compiler_msl_get_automatic_resource_binding_secondary(spvc_compiler compiler, spvc_variable_id id)
  1541. {
  1542. #if SPIRV_CROSS_C_API_MSL
  1543. if (compiler->backend != SPVC_BACKEND_MSL)
  1544. {
  1545. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1546. return uint32_t(-1);
  1547. }
  1548. auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
  1549. return msl.get_automatic_msl_resource_binding_secondary(id);
  1550. #else
  1551. (void)id;
  1552. compiler->context->report_error("MSL function used on a non-MSL backend.");
  1553. return uint32_t(-1);
  1554. #endif
  1555. }
  1556. spvc_result spvc_compiler_compile(spvc_compiler compiler, const char **source)
  1557. {
  1558. SPVC_BEGIN_SAFE_SCOPE
  1559. {
  1560. auto result = compiler->compiler->compile();
  1561. if (result.empty())
  1562. {
  1563. compiler->context->report_error("Unsupported SPIR-V.");
  1564. return SPVC_ERROR_UNSUPPORTED_SPIRV;
  1565. }
  1566. *source = compiler->context->allocate_name(result);
  1567. if (!*source)
  1568. {
  1569. compiler->context->report_error("Out of memory.");
  1570. return SPVC_ERROR_OUT_OF_MEMORY;
  1571. }
  1572. return SPVC_SUCCESS;
  1573. }
  1574. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_UNSUPPORTED_SPIRV)
  1575. }
  1576. bool spvc_resources_s::copy_resources(SmallVector<spvc_reflected_resource> &outputs,
  1577. const SmallVector<Resource> &inputs)
  1578. {
  1579. for (auto &i : inputs)
  1580. {
  1581. spvc_reflected_resource r;
  1582. r.base_type_id = i.base_type_id;
  1583. r.type_id = i.type_id;
  1584. r.id = i.id;
  1585. r.name = context->allocate_name(i.name);
  1586. if (!r.name)
  1587. return false;
  1588. outputs.push_back(r);
  1589. }
  1590. return true;
  1591. }
  1592. bool spvc_resources_s::copy_resources(SmallVector<spvc_reflected_builtin_resource> &outputs,
  1593. const SmallVector<BuiltInResource> &inputs)
  1594. {
  1595. for (auto &i : inputs)
  1596. {
  1597. spvc_reflected_builtin_resource br;
  1598. br.value_type_id = i.value_type_id;
  1599. br.builtin = SpvBuiltIn(i.builtin);
  1600. auto &r = br.resource;
  1601. r.base_type_id = i.resource.base_type_id;
  1602. r.type_id = i.resource.type_id;
  1603. r.id = i.resource.id;
  1604. r.name = context->allocate_name(i.resource.name);
  1605. if (!r.name)
  1606. return false;
  1607. outputs.push_back(br);
  1608. }
  1609. return true;
  1610. }
  1611. bool spvc_resources_s::copy_resources(const ShaderResources &resources)
  1612. {
  1613. if (!copy_resources(uniform_buffers, resources.uniform_buffers))
  1614. return false;
  1615. if (!copy_resources(storage_buffers, resources.storage_buffers))
  1616. return false;
  1617. if (!copy_resources(stage_inputs, resources.stage_inputs))
  1618. return false;
  1619. if (!copy_resources(stage_outputs, resources.stage_outputs))
  1620. return false;
  1621. if (!copy_resources(subpass_inputs, resources.subpass_inputs))
  1622. return false;
  1623. if (!copy_resources(storage_images, resources.storage_images))
  1624. return false;
  1625. if (!copy_resources(sampled_images, resources.sampled_images))
  1626. return false;
  1627. if (!copy_resources(atomic_counters, resources.atomic_counters))
  1628. return false;
  1629. if (!copy_resources(push_constant_buffers, resources.push_constant_buffers))
  1630. return false;
  1631. if (!copy_resources(shader_record_buffers, resources.shader_record_buffers))
  1632. return false;
  1633. if (!copy_resources(separate_images, resources.separate_images))
  1634. return false;
  1635. if (!copy_resources(separate_samplers, resources.separate_samplers))
  1636. return false;
  1637. if (!copy_resources(acceleration_structures, resources.acceleration_structures))
  1638. return false;
  1639. if (!copy_resources(gl_plain_uniforms, resources.gl_plain_uniforms))
  1640. return false;
  1641. if (!copy_resources(tensors, resources.tensors))
  1642. return false;
  1643. if (!copy_resources(builtin_inputs, resources.builtin_inputs))
  1644. return false;
  1645. if (!copy_resources(builtin_outputs, resources.builtin_outputs))
  1646. return false;
  1647. return true;
  1648. }
  1649. spvc_result spvc_compiler_get_active_interface_variables(spvc_compiler compiler, spvc_set *set)
  1650. {
  1651. SPVC_BEGIN_SAFE_SCOPE
  1652. {
  1653. std::unique_ptr<spvc_set_s> ptr(new (std::nothrow) spvc_set_s);
  1654. if (!ptr)
  1655. {
  1656. compiler->context->report_error("Out of memory.");
  1657. return SPVC_ERROR_OUT_OF_MEMORY;
  1658. }
  1659. auto active = compiler->compiler->get_active_interface_variables();
  1660. ptr->set = std::move(active);
  1661. *set = ptr.get();
  1662. compiler->context->allocations.push_back(std::move(ptr));
  1663. }
  1664. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  1665. return SPVC_SUCCESS;
  1666. }
  1667. spvc_result spvc_compiler_set_enabled_interface_variables(spvc_compiler compiler, spvc_set set)
  1668. {
  1669. SPVC_BEGIN_SAFE_SCOPE
  1670. {
  1671. compiler->compiler->set_enabled_interface_variables(set->set);
  1672. }
  1673. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  1674. return SPVC_SUCCESS;
  1675. }
  1676. spvc_result spvc_compiler_create_shader_resources_for_active_variables(spvc_compiler compiler, spvc_resources *resources,
  1677. spvc_set set)
  1678. {
  1679. SPVC_BEGIN_SAFE_SCOPE
  1680. {
  1681. std::unique_ptr<spvc_resources_s> res(new (std::nothrow) spvc_resources_s);
  1682. if (!res)
  1683. {
  1684. compiler->context->report_error("Out of memory.");
  1685. return SPVC_ERROR_OUT_OF_MEMORY;
  1686. }
  1687. res->context = compiler->context;
  1688. auto accessed_resources = compiler->compiler->get_shader_resources(set->set);
  1689. if (!res->copy_resources(accessed_resources))
  1690. {
  1691. res->context->report_error("Out of memory.");
  1692. return SPVC_ERROR_OUT_OF_MEMORY;
  1693. }
  1694. *resources = res.get();
  1695. compiler->context->allocations.push_back(std::move(res));
  1696. }
  1697. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  1698. return SPVC_SUCCESS;
  1699. }
  1700. spvc_result spvc_compiler_create_shader_resources(spvc_compiler compiler, spvc_resources *resources)
  1701. {
  1702. SPVC_BEGIN_SAFE_SCOPE
  1703. {
  1704. std::unique_ptr<spvc_resources_s> res(new (std::nothrow) spvc_resources_s);
  1705. if (!res)
  1706. {
  1707. compiler->context->report_error("Out of memory.");
  1708. return SPVC_ERROR_OUT_OF_MEMORY;
  1709. }
  1710. res->context = compiler->context;
  1711. auto accessed_resources = compiler->compiler->get_shader_resources();
  1712. if (!res->copy_resources(accessed_resources))
  1713. {
  1714. res->context->report_error("Out of memory.");
  1715. return SPVC_ERROR_OUT_OF_MEMORY;
  1716. }
  1717. *resources = res.get();
  1718. compiler->context->allocations.push_back(std::move(res));
  1719. }
  1720. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  1721. return SPVC_SUCCESS;
  1722. }
  1723. spvc_result spvc_resources_get_resource_list_for_type(spvc_resources resources, spvc_resource_type type,
  1724. const spvc_reflected_resource **resource_list,
  1725. size_t *resource_size)
  1726. {
  1727. const SmallVector<spvc_reflected_resource> *list = nullptr;
  1728. switch (type)
  1729. {
  1730. case SPVC_RESOURCE_TYPE_UNIFORM_BUFFER:
  1731. list = &resources->uniform_buffers;
  1732. break;
  1733. case SPVC_RESOURCE_TYPE_STORAGE_BUFFER:
  1734. list = &resources->storage_buffers;
  1735. break;
  1736. case SPVC_RESOURCE_TYPE_STAGE_INPUT:
  1737. list = &resources->stage_inputs;
  1738. break;
  1739. case SPVC_RESOURCE_TYPE_STAGE_OUTPUT:
  1740. list = &resources->stage_outputs;
  1741. break;
  1742. case SPVC_RESOURCE_TYPE_SUBPASS_INPUT:
  1743. list = &resources->subpass_inputs;
  1744. break;
  1745. case SPVC_RESOURCE_TYPE_STORAGE_IMAGE:
  1746. list = &resources->storage_images;
  1747. break;
  1748. case SPVC_RESOURCE_TYPE_SAMPLED_IMAGE:
  1749. list = &resources->sampled_images;
  1750. break;
  1751. case SPVC_RESOURCE_TYPE_ATOMIC_COUNTER:
  1752. list = &resources->atomic_counters;
  1753. break;
  1754. case SPVC_RESOURCE_TYPE_PUSH_CONSTANT:
  1755. list = &resources->push_constant_buffers;
  1756. break;
  1757. case SPVC_RESOURCE_TYPE_SEPARATE_IMAGE:
  1758. list = &resources->separate_images;
  1759. break;
  1760. case SPVC_RESOURCE_TYPE_SEPARATE_SAMPLERS:
  1761. list = &resources->separate_samplers;
  1762. break;
  1763. case SPVC_RESOURCE_TYPE_ACCELERATION_STRUCTURE:
  1764. list = &resources->acceleration_structures;
  1765. break;
  1766. case SPVC_RESOURCE_TYPE_SHADER_RECORD_BUFFER:
  1767. list = &resources->shader_record_buffers;
  1768. break;
  1769. case SPVC_RESOURCE_TYPE_GL_PLAIN_UNIFORM:
  1770. list = &resources->gl_plain_uniforms;
  1771. break;
  1772. case SPVC_RESOURCE_TYPE_TENSOR:
  1773. list = &resources->tensors;
  1774. break;
  1775. default:
  1776. break;
  1777. }
  1778. if (!list)
  1779. {
  1780. resources->context->report_error("Invalid argument.");
  1781. return SPVC_ERROR_INVALID_ARGUMENT;
  1782. }
  1783. *resource_size = list->size();
  1784. *resource_list = list->data();
  1785. return SPVC_SUCCESS;
  1786. }
  1787. spvc_result spvc_resources_get_builtin_resource_list_for_type(
  1788. spvc_resources resources, spvc_builtin_resource_type type,
  1789. const spvc_reflected_builtin_resource **resource_list,
  1790. size_t *resource_size)
  1791. {
  1792. const SmallVector<spvc_reflected_builtin_resource> *list = nullptr;
  1793. switch (type)
  1794. {
  1795. case SPVC_BUILTIN_RESOURCE_TYPE_STAGE_INPUT:
  1796. list = &resources->builtin_inputs;
  1797. break;
  1798. case SPVC_BUILTIN_RESOURCE_TYPE_STAGE_OUTPUT:
  1799. list = &resources->builtin_outputs;
  1800. break;
  1801. default:
  1802. break;
  1803. }
  1804. if (!list)
  1805. {
  1806. resources->context->report_error("Invalid argument.");
  1807. return SPVC_ERROR_INVALID_ARGUMENT;
  1808. }
  1809. *resource_size = list->size();
  1810. *resource_list = list->data();
  1811. return SPVC_SUCCESS;
  1812. }
  1813. void spvc_compiler_set_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration, unsigned argument)
  1814. {
  1815. compiler->compiler->set_decoration(id, static_cast<Decoration>(decoration), argument);
  1816. }
  1817. void spvc_compiler_set_decoration_string(spvc_compiler compiler, SpvId id, SpvDecoration decoration,
  1818. const char *argument)
  1819. {
  1820. compiler->compiler->set_decoration_string(id, static_cast<Decoration>(decoration), argument);
  1821. }
  1822. void spvc_compiler_set_name(spvc_compiler compiler, SpvId id, const char *argument)
  1823. {
  1824. compiler->compiler->set_name(id, argument);
  1825. }
  1826. void spvc_compiler_set_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
  1827. SpvDecoration decoration, unsigned argument)
  1828. {
  1829. compiler->compiler->set_member_decoration(id, member_index, static_cast<Decoration>(decoration), argument);
  1830. }
  1831. void spvc_compiler_set_member_decoration_string(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
  1832. SpvDecoration decoration, const char *argument)
  1833. {
  1834. compiler->compiler->set_member_decoration_string(id, member_index, static_cast<Decoration>(decoration),
  1835. argument);
  1836. }
  1837. void spvc_compiler_set_member_name(spvc_compiler compiler, spvc_type_id id, unsigned member_index, const char *argument)
  1838. {
  1839. compiler->compiler->set_member_name(id, member_index, argument);
  1840. }
  1841. void spvc_compiler_unset_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
  1842. {
  1843. compiler->compiler->unset_decoration(id, static_cast<Decoration>(decoration));
  1844. }
  1845. void spvc_compiler_unset_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
  1846. SpvDecoration decoration)
  1847. {
  1848. compiler->compiler->unset_member_decoration(id, member_index, static_cast<Decoration>(decoration));
  1849. }
  1850. spvc_bool spvc_compiler_has_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
  1851. {
  1852. return compiler->compiler->has_decoration(id, static_cast<Decoration>(decoration)) ? SPVC_TRUE : SPVC_FALSE;
  1853. }
  1854. spvc_bool spvc_compiler_has_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
  1855. SpvDecoration decoration)
  1856. {
  1857. return compiler->compiler->has_member_decoration(id, member_index, static_cast<Decoration>(decoration)) ?
  1858. SPVC_TRUE :
  1859. SPVC_FALSE;
  1860. }
  1861. const char *spvc_compiler_get_name(spvc_compiler compiler, SpvId id)
  1862. {
  1863. return compiler->compiler->get_name(id).c_str();
  1864. }
  1865. unsigned spvc_compiler_get_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
  1866. {
  1867. return compiler->compiler->get_decoration(id, static_cast<Decoration>(decoration));
  1868. }
  1869. const char *spvc_compiler_get_decoration_string(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
  1870. {
  1871. return compiler->compiler->get_decoration_string(id, static_cast<Decoration>(decoration)).c_str();
  1872. }
  1873. unsigned spvc_compiler_get_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
  1874. SpvDecoration decoration)
  1875. {
  1876. return compiler->compiler->get_member_decoration(id, member_index, static_cast<Decoration>(decoration));
  1877. }
  1878. const char *spvc_compiler_get_member_decoration_string(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
  1879. SpvDecoration decoration)
  1880. {
  1881. return compiler->compiler->get_member_decoration_string(id, member_index, static_cast<Decoration>(decoration))
  1882. .c_str();
  1883. }
  1884. const char *spvc_compiler_get_member_name(spvc_compiler compiler, spvc_type_id id, unsigned member_index)
  1885. {
  1886. return compiler->compiler->get_member_name(id, member_index).c_str();
  1887. }
  1888. spvc_result spvc_compiler_get_entry_points(spvc_compiler compiler, const spvc_entry_point **entry_points,
  1889. size_t *num_entry_points)
  1890. {
  1891. SPVC_BEGIN_SAFE_SCOPE
  1892. {
  1893. auto entries = compiler->compiler->get_entry_points_and_stages();
  1894. SmallVector<spvc_entry_point> translated;
  1895. translated.reserve(entries.size());
  1896. for (auto &entry : entries)
  1897. {
  1898. spvc_entry_point new_entry;
  1899. new_entry.execution_model = static_cast<SpvExecutionModel>(entry.execution_model);
  1900. new_entry.name = compiler->context->allocate_name(entry.name);
  1901. if (!new_entry.name)
  1902. {
  1903. compiler->context->report_error("Out of memory.");
  1904. return SPVC_ERROR_OUT_OF_MEMORY;
  1905. }
  1906. translated.push_back(new_entry);
  1907. }
  1908. auto ptr = spvc_allocate<TemporaryBuffer<spvc_entry_point>>();
  1909. ptr->buffer = std::move(translated);
  1910. *entry_points = ptr->buffer.data();
  1911. *num_entry_points = ptr->buffer.size();
  1912. compiler->context->allocations.push_back(std::move(ptr));
  1913. }
  1914. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  1915. return SPVC_SUCCESS;
  1916. }
  1917. spvc_result spvc_compiler_set_entry_point(spvc_compiler compiler, const char *name, SpvExecutionModel model)
  1918. {
  1919. SPVC_BEGIN_SAFE_SCOPE
  1920. {
  1921. compiler->compiler->set_entry_point(name, static_cast<ExecutionModel>(model));
  1922. }
  1923. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  1924. return SPVC_SUCCESS;
  1925. }
  1926. spvc_result spvc_compiler_rename_entry_point(spvc_compiler compiler, const char *old_name, const char *new_name,
  1927. SpvExecutionModel model)
  1928. {
  1929. SPVC_BEGIN_SAFE_SCOPE
  1930. {
  1931. compiler->compiler->rename_entry_point(old_name, new_name, static_cast<ExecutionModel>(model));
  1932. }
  1933. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  1934. return SPVC_SUCCESS;
  1935. }
  1936. const char *spvc_compiler_get_cleansed_entry_point_name(spvc_compiler compiler, const char *name,
  1937. SpvExecutionModel model)
  1938. {
  1939. SPVC_BEGIN_SAFE_SCOPE
  1940. {
  1941. auto cleansed_name =
  1942. compiler->compiler->get_cleansed_entry_point_name(name, static_cast<ExecutionModel>(model));
  1943. return compiler->context->allocate_name(cleansed_name);
  1944. }
  1945. SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
  1946. }
  1947. void spvc_compiler_set_execution_mode(spvc_compiler compiler, SpvExecutionMode mode)
  1948. {
  1949. compiler->compiler->set_execution_mode(static_cast<ExecutionMode>(mode));
  1950. }
  1951. void spvc_compiler_set_execution_mode_with_arguments(spvc_compiler compiler, SpvExecutionMode mode, unsigned arg0,
  1952. unsigned arg1,
  1953. unsigned arg2)
  1954. {
  1955. compiler->compiler->set_execution_mode(static_cast<ExecutionMode>(mode), arg0, arg1, arg2);
  1956. }
  1957. void spvc_compiler_unset_execution_mode(spvc_compiler compiler, SpvExecutionMode mode)
  1958. {
  1959. compiler->compiler->unset_execution_mode(static_cast<ExecutionMode>(mode));
  1960. }
  1961. spvc_result spvc_compiler_get_execution_modes(spvc_compiler compiler, const SpvExecutionMode **modes, size_t *num_modes)
  1962. {
  1963. SPVC_BEGIN_SAFE_SCOPE
  1964. {
  1965. auto ptr = spvc_allocate<TemporaryBuffer<SpvExecutionMode>>();
  1966. compiler->compiler->get_execution_mode_bitset().for_each_bit(
  1967. [&](uint32_t bit) { ptr->buffer.push_back(static_cast<SpvExecutionMode>(bit)); });
  1968. *modes = ptr->buffer.data();
  1969. *num_modes = ptr->buffer.size();
  1970. compiler->context->allocations.push_back(std::move(ptr));
  1971. }
  1972. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  1973. return SPVC_SUCCESS;
  1974. }
  1975. unsigned spvc_compiler_get_execution_mode_argument(spvc_compiler compiler, SpvExecutionMode mode)
  1976. {
  1977. return compiler->compiler->get_execution_mode_argument(static_cast<ExecutionMode>(mode));
  1978. }
  1979. unsigned spvc_compiler_get_execution_mode_argument_by_index(spvc_compiler compiler, SpvExecutionMode mode,
  1980. unsigned index)
  1981. {
  1982. return compiler->compiler->get_execution_mode_argument(static_cast<ExecutionMode>(mode), index);
  1983. }
  1984. SpvExecutionModel spvc_compiler_get_execution_model(spvc_compiler compiler)
  1985. {
  1986. return static_cast<SpvExecutionModel>(compiler->compiler->get_execution_model());
  1987. }
  1988. void spvc_compiler_update_active_builtins(spvc_compiler compiler)
  1989. {
  1990. compiler->compiler->update_active_builtins();
  1991. }
  1992. spvc_bool spvc_compiler_has_active_builtin(spvc_compiler compiler, SpvBuiltIn builtin, SpvStorageClass storage)
  1993. {
  1994. return compiler->compiler->has_active_builtin(static_cast<BuiltIn>(builtin), static_cast<StorageClass>(storage)) ?
  1995. SPVC_TRUE :
  1996. SPVC_FALSE;
  1997. }
  1998. spvc_type spvc_compiler_get_type_handle(spvc_compiler compiler, spvc_type_id id)
  1999. {
  2000. // Should only throw if an intentionally garbage ID is passed, but the IDs are not type-safe.
  2001. SPVC_BEGIN_SAFE_SCOPE
  2002. {
  2003. return static_cast<spvc_type>(&compiler->compiler->get_type(id));
  2004. }
  2005. SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
  2006. }
  2007. spvc_type_id spvc_type_get_base_type_id(spvc_type type)
  2008. {
  2009. return type->self;
  2010. }
  2011. static spvc_basetype convert_basetype(SPIRType::BaseType type)
  2012. {
  2013. // For now the enums match up.
  2014. return static_cast<spvc_basetype>(type);
  2015. }
  2016. spvc_basetype spvc_type_get_basetype(spvc_type type)
  2017. {
  2018. return convert_basetype(type->basetype);
  2019. }
  2020. unsigned spvc_type_get_bit_width(spvc_type type)
  2021. {
  2022. return type->width;
  2023. }
  2024. unsigned spvc_type_get_vector_size(spvc_type type)
  2025. {
  2026. return type->vecsize;
  2027. }
  2028. unsigned spvc_type_get_columns(spvc_type type)
  2029. {
  2030. return type->columns;
  2031. }
  2032. unsigned spvc_type_get_num_array_dimensions(spvc_type type)
  2033. {
  2034. return unsigned(type->array.size());
  2035. }
  2036. spvc_bool spvc_type_array_dimension_is_literal(spvc_type type, unsigned dimension)
  2037. {
  2038. return type->array_size_literal[dimension] ? SPVC_TRUE : SPVC_FALSE;
  2039. }
  2040. SpvId spvc_type_get_array_dimension(spvc_type type, unsigned dimension)
  2041. {
  2042. return type->array[dimension];
  2043. }
  2044. unsigned spvc_type_get_num_member_types(spvc_type type)
  2045. {
  2046. return unsigned(type->member_types.size());
  2047. }
  2048. spvc_type_id spvc_type_get_member_type(spvc_type type, unsigned index)
  2049. {
  2050. return type->member_types[index];
  2051. }
  2052. SpvStorageClass spvc_type_get_storage_class(spvc_type type)
  2053. {
  2054. return static_cast<SpvStorageClass>(type->storage);
  2055. }
  2056. // Image type query.
  2057. spvc_type_id spvc_type_get_image_sampled_type(spvc_type type)
  2058. {
  2059. return type->image.type;
  2060. }
  2061. SpvDim spvc_type_get_image_dimension(spvc_type type)
  2062. {
  2063. return static_cast<SpvDim>(type->image.dim);
  2064. }
  2065. spvc_bool spvc_type_get_image_is_depth(spvc_type type)
  2066. {
  2067. return type->image.depth ? SPVC_TRUE : SPVC_FALSE;
  2068. }
  2069. spvc_bool spvc_type_get_image_arrayed(spvc_type type)
  2070. {
  2071. return type->image.arrayed ? SPVC_TRUE : SPVC_FALSE;
  2072. }
  2073. spvc_bool spvc_type_get_image_multisampled(spvc_type type)
  2074. {
  2075. return type->image.ms ? SPVC_TRUE : SPVC_FALSE;
  2076. }
  2077. spvc_bool spvc_type_get_image_is_storage(spvc_type type)
  2078. {
  2079. return type->image.sampled == 2 ? SPVC_TRUE : SPVC_FALSE;
  2080. }
  2081. SpvImageFormat spvc_type_get_image_storage_format(spvc_type type)
  2082. {
  2083. return static_cast<SpvImageFormat>(static_cast<const SPIRType *>(type)->image.format);
  2084. }
  2085. SpvAccessQualifier spvc_type_get_image_access_qualifier(spvc_type type)
  2086. {
  2087. return static_cast<SpvAccessQualifier>(static_cast<const SPIRType *>(type)->image.access);
  2088. }
  2089. spvc_result spvc_compiler_get_declared_struct_size(spvc_compiler compiler, spvc_type struct_type, size_t *size)
  2090. {
  2091. SPVC_BEGIN_SAFE_SCOPE
  2092. {
  2093. *size = compiler->compiler->get_declared_struct_size(*static_cast<const SPIRType *>(struct_type));
  2094. }
  2095. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2096. return SPVC_SUCCESS;
  2097. }
  2098. spvc_result spvc_compiler_get_declared_struct_size_runtime_array(spvc_compiler compiler, spvc_type struct_type,
  2099. size_t array_size, size_t *size)
  2100. {
  2101. SPVC_BEGIN_SAFE_SCOPE
  2102. {
  2103. *size = compiler->compiler->get_declared_struct_size_runtime_array(*static_cast<const SPIRType *>(struct_type),
  2104. array_size);
  2105. }
  2106. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2107. return SPVC_SUCCESS;
  2108. }
  2109. spvc_result spvc_compiler_get_declared_struct_member_size(spvc_compiler compiler, spvc_type struct_type, unsigned index, size_t *size)
  2110. {
  2111. SPVC_BEGIN_SAFE_SCOPE
  2112. {
  2113. *size = compiler->compiler->get_declared_struct_member_size(*static_cast<const SPIRType *>(struct_type), index);
  2114. }
  2115. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2116. return SPVC_SUCCESS;
  2117. }
  2118. spvc_result spvc_compiler_type_struct_member_offset(spvc_compiler compiler, spvc_type type, unsigned index, unsigned *offset)
  2119. {
  2120. SPVC_BEGIN_SAFE_SCOPE
  2121. {
  2122. *offset = compiler->compiler->type_struct_member_offset(*static_cast<const SPIRType *>(type), index);
  2123. }
  2124. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2125. return SPVC_SUCCESS;
  2126. }
  2127. spvc_result spvc_compiler_type_struct_member_array_stride(spvc_compiler compiler, spvc_type type, unsigned index, unsigned *stride)
  2128. {
  2129. SPVC_BEGIN_SAFE_SCOPE
  2130. {
  2131. *stride = compiler->compiler->type_struct_member_array_stride(*static_cast<const SPIRType *>(type), index);
  2132. }
  2133. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2134. return SPVC_SUCCESS;
  2135. }
  2136. spvc_result spvc_compiler_type_struct_member_matrix_stride(spvc_compiler compiler, spvc_type type, unsigned index, unsigned *stride)
  2137. {
  2138. SPVC_BEGIN_SAFE_SCOPE
  2139. {
  2140. *stride = compiler->compiler->type_struct_member_matrix_stride(*static_cast<const SPIRType *>(type), index);
  2141. }
  2142. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2143. return SPVC_SUCCESS;
  2144. }
  2145. spvc_result spvc_compiler_build_dummy_sampler_for_combined_images(spvc_compiler compiler, spvc_variable_id *id)
  2146. {
  2147. SPVC_BEGIN_SAFE_SCOPE
  2148. {
  2149. *id = compiler->compiler->build_dummy_sampler_for_combined_images();
  2150. }
  2151. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2152. return SPVC_SUCCESS;
  2153. }
  2154. spvc_result spvc_compiler_build_combined_image_samplers(spvc_compiler compiler)
  2155. {
  2156. SPVC_BEGIN_SAFE_SCOPE
  2157. {
  2158. compiler->compiler->build_combined_image_samplers();
  2159. }
  2160. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_UNSUPPORTED_SPIRV)
  2161. return SPVC_SUCCESS;
  2162. }
  2163. spvc_result spvc_compiler_get_combined_image_samplers(spvc_compiler compiler,
  2164. const spvc_combined_image_sampler **samplers,
  2165. size_t *num_samplers)
  2166. {
  2167. SPVC_BEGIN_SAFE_SCOPE
  2168. {
  2169. auto combined = compiler->compiler->get_combined_image_samplers();
  2170. SmallVector<spvc_combined_image_sampler> translated;
  2171. translated.reserve(combined.size());
  2172. for (auto &c : combined)
  2173. {
  2174. spvc_combined_image_sampler trans = { c.combined_id, c.image_id, c.sampler_id };
  2175. translated.push_back(trans);
  2176. }
  2177. auto ptr = spvc_allocate<TemporaryBuffer<spvc_combined_image_sampler>>();
  2178. ptr->buffer = std::move(translated);
  2179. *samplers = ptr->buffer.data();
  2180. *num_samplers = ptr->buffer.size();
  2181. compiler->context->allocations.push_back(std::move(ptr));
  2182. }
  2183. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  2184. return SPVC_SUCCESS;
  2185. }
  2186. spvc_result spvc_compiler_get_specialization_constants(spvc_compiler compiler,
  2187. const spvc_specialization_constant **constants,
  2188. size_t *num_constants)
  2189. {
  2190. SPVC_BEGIN_SAFE_SCOPE
  2191. {
  2192. auto spec_constants = compiler->compiler->get_specialization_constants();
  2193. SmallVector<spvc_specialization_constant> translated;
  2194. translated.reserve(spec_constants.size());
  2195. for (auto &c : spec_constants)
  2196. {
  2197. spvc_specialization_constant trans = { c.id, c.constant_id };
  2198. translated.push_back(trans);
  2199. }
  2200. auto ptr = spvc_allocate<TemporaryBuffer<spvc_specialization_constant>>();
  2201. ptr->buffer = std::move(translated);
  2202. *constants = ptr->buffer.data();
  2203. *num_constants = ptr->buffer.size();
  2204. compiler->context->allocations.push_back(std::move(ptr));
  2205. }
  2206. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  2207. return SPVC_SUCCESS;
  2208. }
  2209. spvc_constant spvc_compiler_get_constant_handle(spvc_compiler compiler, spvc_variable_id id)
  2210. {
  2211. SPVC_BEGIN_SAFE_SCOPE
  2212. {
  2213. return static_cast<spvc_constant>(&compiler->compiler->get_constant(id));
  2214. }
  2215. SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
  2216. }
  2217. spvc_constant_id spvc_compiler_get_work_group_size_specialization_constants(spvc_compiler compiler,
  2218. spvc_specialization_constant *x,
  2219. spvc_specialization_constant *y,
  2220. spvc_specialization_constant *z)
  2221. {
  2222. SpecializationConstant tmpx;
  2223. SpecializationConstant tmpy;
  2224. SpecializationConstant tmpz;
  2225. spvc_constant_id ret = compiler->compiler->get_work_group_size_specialization_constants(tmpx, tmpy, tmpz);
  2226. x->id = tmpx.id;
  2227. x->constant_id = tmpx.constant_id;
  2228. y->id = tmpy.id;
  2229. y->constant_id = tmpy.constant_id;
  2230. z->id = tmpz.id;
  2231. z->constant_id = tmpz.constant_id;
  2232. return ret;
  2233. }
  2234. spvc_result spvc_compiler_get_active_buffer_ranges(spvc_compiler compiler,
  2235. spvc_variable_id id,
  2236. const spvc_buffer_range **ranges,
  2237. size_t *num_ranges)
  2238. {
  2239. SPVC_BEGIN_SAFE_SCOPE
  2240. {
  2241. auto active_ranges = compiler->compiler->get_active_buffer_ranges(id);
  2242. SmallVector<spvc_buffer_range> translated;
  2243. translated.reserve(active_ranges.size());
  2244. for (auto &r : active_ranges)
  2245. {
  2246. spvc_buffer_range trans = { r.index, r.offset, r.range };
  2247. translated.push_back(trans);
  2248. }
  2249. auto ptr = spvc_allocate<TemporaryBuffer<spvc_buffer_range>>();
  2250. ptr->buffer = std::move(translated);
  2251. *ranges = ptr->buffer.data();
  2252. *num_ranges = ptr->buffer.size();
  2253. compiler->context->allocations.push_back(std::move(ptr));
  2254. }
  2255. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  2256. return SPVC_SUCCESS;
  2257. }
  2258. float spvc_constant_get_scalar_fp16(spvc_constant constant, unsigned column, unsigned row)
  2259. {
  2260. return constant->scalar_f16(column, row);
  2261. }
  2262. float spvc_constant_get_scalar_fp32(spvc_constant constant, unsigned column, unsigned row)
  2263. {
  2264. return constant->scalar_f32(column, row);
  2265. }
  2266. double spvc_constant_get_scalar_fp64(spvc_constant constant, unsigned column, unsigned row)
  2267. {
  2268. return constant->scalar_f64(column, row);
  2269. }
  2270. unsigned spvc_constant_get_scalar_u32(spvc_constant constant, unsigned column, unsigned row)
  2271. {
  2272. return constant->scalar(column, row);
  2273. }
  2274. int spvc_constant_get_scalar_i32(spvc_constant constant, unsigned column, unsigned row)
  2275. {
  2276. return constant->scalar_i32(column, row);
  2277. }
  2278. unsigned long long spvc_constant_get_scalar_u64(spvc_constant constant, unsigned column, unsigned row)
  2279. {
  2280. return constant->scalar_u64(column, row);
  2281. }
  2282. long long spvc_constant_get_scalar_i64(spvc_constant constant, unsigned column, unsigned row)
  2283. {
  2284. return constant->scalar_i64(column, row);
  2285. }
  2286. unsigned spvc_constant_get_scalar_u16(spvc_constant constant, unsigned column, unsigned row)
  2287. {
  2288. return constant->scalar_u16(column, row);
  2289. }
  2290. int spvc_constant_get_scalar_i16(spvc_constant constant, unsigned column, unsigned row)
  2291. {
  2292. return constant->scalar_i16(column, row);
  2293. }
  2294. unsigned spvc_constant_get_scalar_u8(spvc_constant constant, unsigned column, unsigned row)
  2295. {
  2296. return constant->scalar_u8(column, row);
  2297. }
  2298. int spvc_constant_get_scalar_i8(spvc_constant constant, unsigned column, unsigned row)
  2299. {
  2300. return constant->scalar_i8(column, row);
  2301. }
  2302. void spvc_constant_get_subconstants(spvc_constant constant, const spvc_constant_id **constituents, size_t *count)
  2303. {
  2304. static_assert(sizeof(spvc_constant_id) == sizeof(constant->subconstants.front()), "ID size is not consistent.");
  2305. *constituents = reinterpret_cast<spvc_constant_id *>(constant->subconstants.data());
  2306. *count = constant->subconstants.size();
  2307. }
  2308. spvc_type_id spvc_constant_get_type(spvc_constant constant)
  2309. {
  2310. return constant->constant_type;
  2311. }
  2312. void spvc_constant_set_scalar_fp16(spvc_constant constant, unsigned column, unsigned row, unsigned short value)
  2313. {
  2314. constant->m.c[column].r[row].u32 = value;
  2315. }
  2316. void spvc_constant_set_scalar_fp32(spvc_constant constant, unsigned column, unsigned row, float value)
  2317. {
  2318. constant->m.c[column].r[row].f32 = value;
  2319. }
  2320. void spvc_constant_set_scalar_fp64(spvc_constant constant, unsigned column, unsigned row, double value)
  2321. {
  2322. constant->m.c[column].r[row].f64 = value;
  2323. }
  2324. void spvc_constant_set_scalar_u32(spvc_constant constant, unsigned column, unsigned row, unsigned value)
  2325. {
  2326. constant->m.c[column].r[row].u32 = value;
  2327. }
  2328. void spvc_constant_set_scalar_i32(spvc_constant constant, unsigned column, unsigned row, int value)
  2329. {
  2330. constant->m.c[column].r[row].i32 = value;
  2331. }
  2332. void spvc_constant_set_scalar_u64(spvc_constant constant, unsigned column, unsigned row, unsigned long long value)
  2333. {
  2334. constant->m.c[column].r[row].u64 = value;
  2335. }
  2336. void spvc_constant_set_scalar_i64(spvc_constant constant, unsigned column, unsigned row, long long value)
  2337. {
  2338. constant->m.c[column].r[row].i64 = value;
  2339. }
  2340. void spvc_constant_set_scalar_u16(spvc_constant constant, unsigned column, unsigned row, unsigned short value)
  2341. {
  2342. constant->m.c[column].r[row].u32 = uint32_t(value);
  2343. }
  2344. void spvc_constant_set_scalar_i16(spvc_constant constant, unsigned column, unsigned row, signed short value)
  2345. {
  2346. constant->m.c[column].r[row].u32 = uint32_t(value);
  2347. }
  2348. void spvc_constant_set_scalar_u8(spvc_constant constant, unsigned column, unsigned row, unsigned char value)
  2349. {
  2350. constant->m.c[column].r[row].u32 = uint32_t(value);
  2351. }
  2352. void spvc_constant_set_scalar_i8(spvc_constant constant, unsigned column, unsigned row, signed char value)
  2353. {
  2354. constant->m.c[column].r[row].u32 = uint32_t(value);
  2355. }
  2356. spvc_bool spvc_compiler_get_binary_offset_for_decoration(spvc_compiler compiler, spvc_variable_id id,
  2357. SpvDecoration decoration,
  2358. unsigned *word_offset)
  2359. {
  2360. uint32_t off = 0;
  2361. bool ret = compiler->compiler->get_binary_offset_for_decoration(id, static_cast<Decoration>(decoration), off);
  2362. if (ret)
  2363. {
  2364. *word_offset = off;
  2365. return SPVC_TRUE;
  2366. }
  2367. else
  2368. return SPVC_FALSE;
  2369. }
  2370. spvc_bool spvc_compiler_buffer_is_hlsl_counter_buffer(spvc_compiler compiler, spvc_variable_id id)
  2371. {
  2372. return compiler->compiler->buffer_is_hlsl_counter_buffer(id) ? SPVC_TRUE : SPVC_FALSE;
  2373. }
  2374. spvc_bool spvc_compiler_buffer_get_hlsl_counter_buffer(spvc_compiler compiler, spvc_variable_id id,
  2375. spvc_variable_id *counter_id)
  2376. {
  2377. uint32_t buffer;
  2378. bool ret = compiler->compiler->buffer_get_hlsl_counter_buffer(id, buffer);
  2379. if (ret)
  2380. {
  2381. *counter_id = buffer;
  2382. return SPVC_TRUE;
  2383. }
  2384. else
  2385. return SPVC_FALSE;
  2386. }
  2387. spvc_result spvc_compiler_get_declared_capabilities(spvc_compiler compiler, const SpvCapability **capabilities,
  2388. size_t *num_capabilities)
  2389. {
  2390. auto &caps = compiler->compiler->get_declared_capabilities();
  2391. static_assert(sizeof(SpvCapability) == sizeof(Capability), "Enum size mismatch.");
  2392. *capabilities = reinterpret_cast<const SpvCapability *>(caps.data());
  2393. *num_capabilities = caps.size();
  2394. return SPVC_SUCCESS;
  2395. }
  2396. spvc_result spvc_compiler_get_declared_extensions(spvc_compiler compiler, const char ***extensions,
  2397. size_t *num_extensions)
  2398. {
  2399. SPVC_BEGIN_SAFE_SCOPE
  2400. {
  2401. auto &exts = compiler->compiler->get_declared_extensions();
  2402. SmallVector<const char *> duped;
  2403. duped.reserve(exts.size());
  2404. for (auto &ext : exts)
  2405. duped.push_back(compiler->context->allocate_name(ext));
  2406. auto ptr = spvc_allocate<TemporaryBuffer<const char *>>();
  2407. ptr->buffer = std::move(duped);
  2408. *extensions = ptr->buffer.data();
  2409. *num_extensions = ptr->buffer.size();
  2410. compiler->context->allocations.push_back(std::move(ptr));
  2411. }
  2412. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
  2413. return SPVC_SUCCESS;
  2414. }
  2415. const char *spvc_compiler_get_remapped_declared_block_name(spvc_compiler compiler, spvc_variable_id id)
  2416. {
  2417. SPVC_BEGIN_SAFE_SCOPE
  2418. {
  2419. auto name = compiler->compiler->get_remapped_declared_block_name(id);
  2420. return compiler->context->allocate_name(name);
  2421. }
  2422. SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
  2423. }
  2424. spvc_result spvc_compiler_get_buffer_block_decorations(spvc_compiler compiler, spvc_variable_id id,
  2425. const SpvDecoration **decorations, size_t *num_decorations)
  2426. {
  2427. SPVC_BEGIN_SAFE_SCOPE
  2428. {
  2429. auto flags = compiler->compiler->get_buffer_block_flags(id);
  2430. auto bitset = spvc_allocate<TemporaryBuffer<SpvDecoration>>();
  2431. flags.for_each_bit([&](uint32_t bit) { bitset->buffer.push_back(static_cast<SpvDecoration>(bit)); });
  2432. *decorations = bitset->buffer.data();
  2433. *num_decorations = bitset->buffer.size();
  2434. compiler->context->allocations.push_back(std::move(bitset));
  2435. }
  2436. SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
  2437. return SPVC_SUCCESS;
  2438. }
  2439. unsigned spvc_msl_get_aux_buffer_struct_version(void)
  2440. {
  2441. return SPVC_MSL_AUX_BUFFER_STRUCT_VERSION;
  2442. }
  2443. void spvc_msl_vertex_attribute_init(spvc_msl_vertex_attribute *attr)
  2444. {
  2445. #if SPIRV_CROSS_C_API_MSL
  2446. // Crude, but works.
  2447. MSLShaderInterfaceVariable attr_default;
  2448. attr->location = attr_default.location;
  2449. attr->format = static_cast<spvc_msl_vertex_format>(attr_default.format);
  2450. attr->builtin = static_cast<SpvBuiltIn>(attr_default.builtin);
  2451. #else
  2452. memset(attr, 0, sizeof(*attr));
  2453. #endif
  2454. }
  2455. void spvc_msl_shader_interface_var_init(spvc_msl_shader_interface_var *var)
  2456. {
  2457. #if SPIRV_CROSS_C_API_MSL
  2458. MSLShaderInterfaceVariable var_default;
  2459. var->location = var_default.location;
  2460. var->format = static_cast<spvc_msl_shader_variable_format>(var_default.format);
  2461. var->builtin = static_cast<SpvBuiltIn>(var_default.builtin);
  2462. var->vecsize = var_default.vecsize;
  2463. #else
  2464. memset(var, 0, sizeof(*var));
  2465. #endif
  2466. }
  2467. void spvc_msl_shader_input_init(spvc_msl_shader_input *input)
  2468. {
  2469. spvc_msl_shader_interface_var_init(input);
  2470. }
  2471. void spvc_msl_shader_interface_var_init_2(spvc_msl_shader_interface_var_2 *var)
  2472. {
  2473. #if SPIRV_CROSS_C_API_MSL
  2474. MSLShaderInterfaceVariable var_default;
  2475. var->location = var_default.location;
  2476. var->format = static_cast<spvc_msl_shader_variable_format>(var_default.format);
  2477. var->builtin = static_cast<SpvBuiltIn>(var_default.builtin);
  2478. var->vecsize = var_default.vecsize;
  2479. var->rate = static_cast<spvc_msl_shader_variable_rate>(var_default.rate);
  2480. #else
  2481. memset(var, 0, sizeof(*var));
  2482. #endif
  2483. }
  2484. void spvc_msl_resource_binding_init(spvc_msl_resource_binding *binding)
  2485. {
  2486. #if SPIRV_CROSS_C_API_MSL
  2487. MSLResourceBinding binding_default;
  2488. binding->desc_set = binding_default.desc_set;
  2489. binding->binding = binding_default.binding;
  2490. binding->msl_buffer = binding_default.msl_buffer;
  2491. binding->msl_texture = binding_default.msl_texture;
  2492. binding->msl_sampler = binding_default.msl_sampler;
  2493. binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
  2494. #else
  2495. memset(binding, 0, sizeof(*binding));
  2496. #endif
  2497. }
  2498. void spvc_msl_resource_binding_init_2(spvc_msl_resource_binding_2 *binding)
  2499. {
  2500. #if SPIRV_CROSS_C_API_MSL
  2501. MSLResourceBinding binding_default;
  2502. binding->desc_set = binding_default.desc_set;
  2503. binding->binding = binding_default.binding;
  2504. binding->msl_buffer = binding_default.msl_buffer;
  2505. binding->msl_texture = binding_default.msl_texture;
  2506. binding->msl_sampler = binding_default.msl_sampler;
  2507. binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
  2508. binding->count = 0;
  2509. #else
  2510. memset(binding, 0, sizeof(*binding));
  2511. #endif
  2512. }
  2513. void spvc_hlsl_resource_binding_init(spvc_hlsl_resource_binding *binding)
  2514. {
  2515. #if SPIRV_CROSS_C_API_HLSL
  2516. HLSLResourceBinding binding_default;
  2517. binding->desc_set = binding_default.desc_set;
  2518. binding->binding = binding_default.binding;
  2519. binding->cbv.register_binding = binding_default.cbv.register_binding;
  2520. binding->cbv.register_space = binding_default.cbv.register_space;
  2521. binding->srv.register_binding = binding_default.srv.register_binding;
  2522. binding->srv.register_space = binding_default.srv.register_space;
  2523. binding->uav.register_binding = binding_default.uav.register_binding;
  2524. binding->uav.register_space = binding_default.uav.register_space;
  2525. binding->sampler.register_binding = binding_default.sampler.register_binding;
  2526. binding->sampler.register_space = binding_default.sampler.register_space;
  2527. binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
  2528. #else
  2529. memset(binding, 0, sizeof(*binding));
  2530. #endif
  2531. }
  2532. void spvc_msl_constexpr_sampler_init(spvc_msl_constexpr_sampler *sampler)
  2533. {
  2534. #if SPIRV_CROSS_C_API_MSL
  2535. MSLConstexprSampler defaults;
  2536. sampler->anisotropy_enable = defaults.anisotropy_enable ? SPVC_TRUE : SPVC_FALSE;
  2537. sampler->border_color = static_cast<spvc_msl_sampler_border_color>(defaults.border_color);
  2538. sampler->compare_enable = defaults.compare_enable ? SPVC_TRUE : SPVC_FALSE;
  2539. sampler->coord = static_cast<spvc_msl_sampler_coord>(defaults.coord);
  2540. sampler->compare_func = static_cast<spvc_msl_sampler_compare_func>(defaults.compare_func);
  2541. sampler->lod_clamp_enable = defaults.lod_clamp_enable ? SPVC_TRUE : SPVC_FALSE;
  2542. sampler->lod_clamp_max = defaults.lod_clamp_max;
  2543. sampler->lod_clamp_min = defaults.lod_clamp_min;
  2544. sampler->mag_filter = static_cast<spvc_msl_sampler_filter>(defaults.mag_filter);
  2545. sampler->min_filter = static_cast<spvc_msl_sampler_filter>(defaults.min_filter);
  2546. sampler->mip_filter = static_cast<spvc_msl_sampler_mip_filter>(defaults.mip_filter);
  2547. sampler->max_anisotropy = defaults.max_anisotropy;
  2548. sampler->s_address = static_cast<spvc_msl_sampler_address>(defaults.s_address);
  2549. sampler->t_address = static_cast<spvc_msl_sampler_address>(defaults.t_address);
  2550. sampler->r_address = static_cast<spvc_msl_sampler_address>(defaults.r_address);
  2551. #else
  2552. memset(sampler, 0, sizeof(*sampler));
  2553. #endif
  2554. }
  2555. void spvc_msl_sampler_ycbcr_conversion_init(spvc_msl_sampler_ycbcr_conversion *conv)
  2556. {
  2557. #if SPIRV_CROSS_C_API_MSL
  2558. MSLConstexprSampler defaults;
  2559. conv->planes = defaults.planes;
  2560. conv->resolution = static_cast<spvc_msl_format_resolution>(defaults.resolution);
  2561. conv->chroma_filter = static_cast<spvc_msl_sampler_filter>(defaults.chroma_filter);
  2562. conv->x_chroma_offset = static_cast<spvc_msl_chroma_location>(defaults.x_chroma_offset);
  2563. conv->y_chroma_offset = static_cast<spvc_msl_chroma_location>(defaults.y_chroma_offset);
  2564. for (int i = 0; i < 4; i++)
  2565. conv->swizzle[i] = static_cast<spvc_msl_component_swizzle>(defaults.swizzle[i]);
  2566. conv->ycbcr_model = static_cast<spvc_msl_sampler_ycbcr_model_conversion>(defaults.ycbcr_model);
  2567. conv->ycbcr_range = static_cast<spvc_msl_sampler_ycbcr_range>(defaults.ycbcr_range);
  2568. #else
  2569. memset(conv, 0, sizeof(*conv));
  2570. #endif
  2571. }
  2572. unsigned spvc_compiler_get_current_id_bound(spvc_compiler compiler)
  2573. {
  2574. return compiler->compiler->get_current_id_bound();
  2575. }
  2576. void spvc_get_version(unsigned *major, unsigned *minor, unsigned *patch)
  2577. {
  2578. *major = SPVC_C_API_VERSION_MAJOR;
  2579. *minor = SPVC_C_API_VERSION_MINOR;
  2580. *patch = SPVC_C_API_VERSION_PATCH;
  2581. }
  2582. const char *spvc_get_commit_revision_and_timestamp(void)
  2583. {
  2584. #ifdef HAVE_SPIRV_CROSS_GIT_VERSION
  2585. return SPIRV_CROSS_GIT_REVISION;
  2586. #else
  2587. return "";
  2588. #endif
  2589. }
  2590. #ifdef _MSC_VER
  2591. #pragma warning(pop)
  2592. #endif