| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984 |
- /*
- * Copyright 2019-2021 Hans-Kristian Arntzen
- * SPDX-License-Identifier: Apache-2.0 OR MIT
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- /*
- * At your option, you may choose to accept this material under either:
- * 1. The Apache License, Version 2.0, found at <http://www.apache.org/licenses/LICENSE-2.0>, or
- * 2. The MIT License, found at <http://opensource.org/licenses/MIT>.
- */
- #include "spirv_cross_c.h"
- #if SPIRV_CROSS_C_API_CPP
- #include "spirv_cpp.hpp"
- #endif
- #if SPIRV_CROSS_C_API_GLSL
- #include "spirv_glsl.hpp"
- #else
- #include "spirv_cross.hpp"
- #endif
- #if SPIRV_CROSS_C_API_HLSL
- #include "spirv_hlsl.hpp"
- #endif
- #if SPIRV_CROSS_C_API_MSL
- #include "spirv_msl.hpp"
- #endif
- #if SPIRV_CROSS_C_API_REFLECT
- #include "spirv_reflect.hpp"
- #endif
- #ifdef HAVE_SPIRV_CROSS_GIT_VERSION
- #include "gitversion.h"
- #endif
- #include "spirv_parser.hpp"
- #include <memory>
- #include <new>
- #include <string.h>
- // clang-format off
- #ifdef _MSC_VER
- #pragma warning(push)
- #pragma warning(disable : 4996)
- #pragma warning(disable : 4065) // switch with 'default' but not 'case'.
- #endif
- #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS
- #define SPVC_BEGIN_SAFE_SCOPE try
- #else
- #define SPVC_BEGIN_SAFE_SCOPE
- #endif
- #ifndef SPIRV_CROSS_EXCEPTIONS_TO_ASSERTIONS
- #define SPVC_END_SAFE_SCOPE(context, error) \
- catch (const std::exception &e) \
- { \
- (context)->report_error(e.what()); \
- return (error); \
- }
- #else
- #define SPVC_END_SAFE_SCOPE(context, error)
- #endif
- using namespace SPIRV_CROSS_SPV_HEADER_NAMESPACE;
- using namespace std;
- using namespace SPIRV_CROSS_NAMESPACE;
- struct ScratchMemoryAllocation
- {
- virtual ~ScratchMemoryAllocation() = default;
- };
- struct StringAllocation : ScratchMemoryAllocation
- {
- explicit StringAllocation(const char *name)
- : str(name)
- {
- }
- explicit StringAllocation(std::string name)
- : str(std::move(name))
- {
- }
- std::string str;
- };
- template <typename T>
- struct TemporaryBuffer : ScratchMemoryAllocation
- {
- SmallVector<T> buffer;
- };
- template <typename T, typename... Ts>
- static inline std::unique_ptr<T> spvc_allocate(Ts &&... ts)
- {
- return std::unique_ptr<T>(new T(std::forward<Ts>(ts)...));
- }
- struct spvc_context_s
- {
- string last_error;
- SmallVector<unique_ptr<ScratchMemoryAllocation>> allocations;
- const char *allocate_name(const std::string &name);
- spvc_error_callback callback = nullptr;
- void *callback_userdata = nullptr;
- void report_error(std::string msg);
- };
- void spvc_context_s::report_error(std::string msg)
- {
- last_error = std::move(msg);
- if (callback)
- callback(callback_userdata, last_error.c_str());
- }
- const char *spvc_context_s::allocate_name(const std::string &name)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto alloc = spvc_allocate<StringAllocation>(name);
- auto *ret = alloc->str.c_str();
- allocations.emplace_back(std::move(alloc));
- return ret;
- }
- SPVC_END_SAFE_SCOPE(this, nullptr)
- }
- struct spvc_parsed_ir_s : ScratchMemoryAllocation
- {
- spvc_context context = nullptr;
- ParsedIR parsed;
- };
- struct spvc_compiler_s : ScratchMemoryAllocation
- {
- spvc_context context = nullptr;
- unique_ptr<Compiler> compiler;
- spvc_backend backend = SPVC_BACKEND_NONE;
- };
- struct spvc_compiler_options_s : ScratchMemoryAllocation
- {
- spvc_context context = nullptr;
- uint32_t backend_flags = 0;
- #if SPIRV_CROSS_C_API_GLSL
- CompilerGLSL::Options glsl;
- #endif
- #if SPIRV_CROSS_C_API_MSL
- CompilerMSL::Options msl;
- #endif
- #if SPIRV_CROSS_C_API_HLSL
- CompilerHLSL::Options hlsl;
- #endif
- };
- struct spvc_set_s : ScratchMemoryAllocation
- {
- std::unordered_set<VariableID> set;
- };
- // Dummy-inherit to we can keep our opaque type handle type safe in C-land as well,
- // and avoid just throwing void * around.
- struct spvc_type_s : SPIRType
- {
- };
- struct spvc_constant_s : SPIRConstant
- {
- };
- struct spvc_resources_s : ScratchMemoryAllocation
- {
- spvc_context context = nullptr;
- SmallVector<spvc_reflected_resource> uniform_buffers;
- SmallVector<spvc_reflected_resource> storage_buffers;
- SmallVector<spvc_reflected_resource> stage_inputs;
- SmallVector<spvc_reflected_resource> stage_outputs;
- SmallVector<spvc_reflected_resource> subpass_inputs;
- SmallVector<spvc_reflected_resource> storage_images;
- SmallVector<spvc_reflected_resource> sampled_images;
- SmallVector<spvc_reflected_resource> atomic_counters;
- SmallVector<spvc_reflected_resource> push_constant_buffers;
- SmallVector<spvc_reflected_resource> shader_record_buffers;
- SmallVector<spvc_reflected_resource> separate_images;
- SmallVector<spvc_reflected_resource> separate_samplers;
- SmallVector<spvc_reflected_resource> acceleration_structures;
- SmallVector<spvc_reflected_resource> gl_plain_uniforms;
- SmallVector<spvc_reflected_resource> tensors;
- SmallVector<spvc_reflected_builtin_resource> builtin_inputs;
- SmallVector<spvc_reflected_builtin_resource> builtin_outputs;
- bool copy_resources(SmallVector<spvc_reflected_resource> &outputs, const SmallVector<Resource> &inputs);
- bool copy_resources(SmallVector<spvc_reflected_builtin_resource> &outputs, const SmallVector<BuiltInResource> &inputs);
- bool copy_resources(const ShaderResources &resources);
- };
- spvc_result spvc_context_create(spvc_context *context)
- {
- auto *ctx = new (std::nothrow) spvc_context_s;
- if (!ctx)
- return SPVC_ERROR_OUT_OF_MEMORY;
- *context = ctx;
- return SPVC_SUCCESS;
- }
- void spvc_context_destroy(spvc_context context)
- {
- delete context;
- }
- void spvc_context_release_allocations(spvc_context context)
- {
- context->allocations.clear();
- }
- const char *spvc_context_get_last_error_string(spvc_context context)
- {
- return context->last_error.c_str();
- }
- SPVC_PUBLIC_API void spvc_context_set_error_callback(spvc_context context, spvc_error_callback cb, void *userdata)
- {
- context->callback = cb;
- context->callback_userdata = userdata;
- }
- spvc_result spvc_context_parse_spirv(spvc_context context, const SpvId *spirv, size_t word_count,
- spvc_parsed_ir *parsed_ir)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- std::unique_ptr<spvc_parsed_ir_s> pir(new (std::nothrow) spvc_parsed_ir_s);
- if (!pir)
- {
- context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- pir->context = context;
- Parser parser(spirv, word_count);
- parser.parse();
- pir->parsed = std::move(parser.get_parsed_ir());
- *parsed_ir = pir.get();
- context->allocations.push_back(std::move(pir));
- }
- SPVC_END_SAFE_SCOPE(context, SPVC_ERROR_INVALID_SPIRV)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_context_create_compiler(spvc_context context, spvc_backend backend, spvc_parsed_ir parsed_ir,
- spvc_capture_mode mode, spvc_compiler *compiler)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- std::unique_ptr<spvc_compiler_s> comp(new (std::nothrow) spvc_compiler_s);
- if (!comp)
- {
- context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- comp->backend = backend;
- comp->context = context;
- if (mode != SPVC_CAPTURE_MODE_COPY && mode != SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- {
- context->report_error("Invalid argument for capture mode.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- switch (backend)
- {
- case SPVC_BACKEND_NONE:
- if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- comp->compiler.reset(new Compiler(std::move(parsed_ir->parsed)));
- else if (mode == SPVC_CAPTURE_MODE_COPY)
- comp->compiler.reset(new Compiler(parsed_ir->parsed));
- break;
- #if SPIRV_CROSS_C_API_GLSL
- case SPVC_BACKEND_GLSL:
- if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- comp->compiler.reset(new CompilerGLSL(std::move(parsed_ir->parsed)));
- else if (mode == SPVC_CAPTURE_MODE_COPY)
- comp->compiler.reset(new CompilerGLSL(parsed_ir->parsed));
- break;
- #endif
- #if SPIRV_CROSS_C_API_HLSL
- case SPVC_BACKEND_HLSL:
- if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- comp->compiler.reset(new CompilerHLSL(std::move(parsed_ir->parsed)));
- else if (mode == SPVC_CAPTURE_MODE_COPY)
- comp->compiler.reset(new CompilerHLSL(parsed_ir->parsed));
- break;
- #endif
- #if SPIRV_CROSS_C_API_MSL
- case SPVC_BACKEND_MSL:
- if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- comp->compiler.reset(new CompilerMSL(std::move(parsed_ir->parsed)));
- else if (mode == SPVC_CAPTURE_MODE_COPY)
- comp->compiler.reset(new CompilerMSL(parsed_ir->parsed));
- break;
- #endif
- #if SPIRV_CROSS_C_API_CPP
- case SPVC_BACKEND_CPP:
- if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- comp->compiler.reset(new CompilerCPP(std::move(parsed_ir->parsed)));
- else if (mode == SPVC_CAPTURE_MODE_COPY)
- comp->compiler.reset(new CompilerCPP(parsed_ir->parsed));
- break;
- #endif
- #if SPIRV_CROSS_C_API_REFLECT
- case SPVC_BACKEND_JSON:
- if (mode == SPVC_CAPTURE_MODE_TAKE_OWNERSHIP)
- comp->compiler.reset(new CompilerReflection(std::move(parsed_ir->parsed)));
- else if (mode == SPVC_CAPTURE_MODE_COPY)
- comp->compiler.reset(new CompilerReflection(parsed_ir->parsed));
- break;
- #endif
- default:
- context->report_error("Invalid backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- *compiler = comp.get();
- context->allocations.push_back(std::move(comp));
- }
- SPVC_END_SAFE_SCOPE(context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_create_compiler_options(spvc_compiler compiler, spvc_compiler_options *options)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- std::unique_ptr<spvc_compiler_options_s> opt(new (std::nothrow) spvc_compiler_options_s);
- if (!opt)
- {
- compiler->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- opt->context = compiler->context;
- opt->backend_flags = 0;
- switch (compiler->backend)
- {
- #if SPIRV_CROSS_C_API_MSL
- case SPVC_BACKEND_MSL:
- opt->backend_flags |= SPVC_COMPILER_OPTION_MSL_BIT | SPVC_COMPILER_OPTION_COMMON_BIT;
- opt->glsl = static_cast<CompilerMSL *>(compiler->compiler.get())->get_common_options();
- opt->msl = static_cast<CompilerMSL *>(compiler->compiler.get())->get_msl_options();
- break;
- #endif
- #if SPIRV_CROSS_C_API_HLSL
- case SPVC_BACKEND_HLSL:
- opt->backend_flags |= SPVC_COMPILER_OPTION_HLSL_BIT | SPVC_COMPILER_OPTION_COMMON_BIT;
- opt->glsl = static_cast<CompilerHLSL *>(compiler->compiler.get())->get_common_options();
- opt->hlsl = static_cast<CompilerHLSL *>(compiler->compiler.get())->get_hlsl_options();
- break;
- #endif
- #if SPIRV_CROSS_C_API_GLSL
- case SPVC_BACKEND_GLSL:
- opt->backend_flags |= SPVC_COMPILER_OPTION_GLSL_BIT | SPVC_COMPILER_OPTION_COMMON_BIT;
- opt->glsl = static_cast<CompilerGLSL *>(compiler->compiler.get())->get_common_options();
- break;
- #endif
- default:
- break;
- }
- *options = opt.get();
- compiler->context->allocations.push_back(std::move(opt));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_options_set_bool(spvc_compiler_options options, spvc_compiler_option option,
- spvc_bool value)
- {
- return spvc_compiler_options_set_uint(options, option, value ? 1 : 0);
- }
- spvc_result spvc_compiler_options_set_uint(spvc_compiler_options options, spvc_compiler_option option, unsigned value)
- {
- (void)value;
- (void)option;
- uint32_t supported_mask = options->backend_flags;
- uint32_t required_mask = option & SPVC_COMPILER_OPTION_LANG_BITS;
- if ((required_mask | supported_mask) != supported_mask)
- {
- options->context->report_error("Option is not supported by current backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- switch (option)
- {
- #if SPIRV_CROSS_C_API_GLSL
- case SPVC_COMPILER_OPTION_FORCE_TEMPORARY:
- options->glsl.force_temporary = value != 0;
- break;
- case SPVC_COMPILER_OPTION_FLATTEN_MULTIDIMENSIONAL_ARRAYS:
- options->glsl.flatten_multidimensional_arrays = value != 0;
- break;
- case SPVC_COMPILER_OPTION_FIXUP_DEPTH_CONVENTION:
- options->glsl.vertex.fixup_clipspace = value != 0;
- break;
- case SPVC_COMPILER_OPTION_FLIP_VERTEX_Y:
- options->glsl.vertex.flip_vert_y = value != 0;
- break;
- case SPVC_COMPILER_OPTION_EMIT_LINE_DIRECTIVES:
- options->glsl.emit_line_directives = value != 0;
- break;
- case SPVC_COMPILER_OPTION_ENABLE_STORAGE_IMAGE_QUALIFIER_DEDUCTION:
- options->glsl.enable_storage_image_qualifier_deduction = value != 0;
- break;
- case SPVC_COMPILER_OPTION_FORCE_ZERO_INITIALIZED_VARIABLES:
- options->glsl.force_zero_initialized_variables = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_SUPPORT_NONZERO_BASE_INSTANCE:
- options->glsl.vertex.support_nonzero_base_instance = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_SEPARATE_SHADER_OBJECTS:
- options->glsl.separate_shader_objects = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_ENABLE_420PACK_EXTENSION:
- options->glsl.enable_420pack_extension = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_VERSION:
- options->glsl.version = value;
- break;
- case SPVC_COMPILER_OPTION_GLSL_ES:
- options->glsl.es = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_VULKAN_SEMANTICS:
- options->glsl.vulkan_semantics = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_ES_DEFAULT_FLOAT_PRECISION_HIGHP:
- options->glsl.fragment.default_float_precision =
- value != 0 ? CompilerGLSL::Options::Precision::Highp : CompilerGLSL::Options::Precision::Mediump;
- break;
- case SPVC_COMPILER_OPTION_GLSL_ES_DEFAULT_INT_PRECISION_HIGHP:
- options->glsl.fragment.default_int_precision =
- value != 0 ? CompilerGLSL::Options::Precision::Highp : CompilerGLSL::Options::Precision::Mediump;
- break;
- case SPVC_COMPILER_OPTION_GLSL_EMIT_PUSH_CONSTANT_AS_UNIFORM_BUFFER:
- options->glsl.emit_push_constant_as_uniform_buffer = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_EMIT_UNIFORM_BUFFER_AS_PLAIN_UNIFORMS:
- options->glsl.emit_uniform_buffer_as_plain_uniforms = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_FORCE_FLATTENED_IO_BLOCKS:
- options->glsl.force_flattened_io_blocks = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_OVR_MULTIVIEW_VIEW_COUNT:
- options->glsl.ovr_multiview_view_count = value;
- break;
- case SPVC_COMPILER_OPTION_RELAX_NAN_CHECKS:
- options->glsl.relax_nan_checks = value != 0;
- break;
- case SPVC_COMPILER_OPTION_GLSL_ENABLE_ROW_MAJOR_LOAD_WORKAROUND:
- options->glsl.enable_row_major_load_workaround = value != 0;
- break;
- #endif
- #if SPIRV_CROSS_C_API_HLSL
- case SPVC_COMPILER_OPTION_HLSL_SHADER_MODEL:
- options->hlsl.shader_model = value;
- break;
- case SPVC_COMPILER_OPTION_HLSL_POINT_SIZE_COMPAT:
- options->hlsl.point_size_compat = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_POINT_COORD_COMPAT:
- options->hlsl.point_coord_compat = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_SUPPORT_NONZERO_BASE_VERTEX_BASE_INSTANCE:
- options->hlsl.support_nonzero_base_vertex_base_instance = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_FORCE_STORAGE_BUFFER_AS_UAV:
- options->hlsl.force_storage_buffer_as_uav = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_NONWRITABLE_UAV_TEXTURE_AS_SRV:
- options->hlsl.nonwritable_uav_texture_as_srv = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_ENABLE_16BIT_TYPES:
- options->hlsl.enable_16bit_types = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_FLATTEN_MATRIX_VERTEX_INPUT_SEMANTICS:
- options->hlsl.flatten_matrix_vertex_input_semantics = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_USE_ENTRY_POINT_NAME:
- options->hlsl.use_entry_point_name = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_PRESERVE_STRUCTURED_BUFFERS:
- options->hlsl.preserve_structured_buffers = value != 0;
- break;
- case SPVC_COMPILER_OPTION_HLSL_USER_SEMANTIC:
- options->hlsl.user_semantic = value != 0;
- break;
- #endif
- #if SPIRV_CROSS_C_API_MSL
- case SPVC_COMPILER_OPTION_MSL_VERSION:
- options->msl.msl_version = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_TEXEL_BUFFER_TEXTURE_WIDTH:
- options->msl.texel_buffer_texture_width = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_SWIZZLE_BUFFER_INDEX:
- options->msl.swizzle_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_INDIRECT_PARAMS_BUFFER_INDEX:
- options->msl.indirect_params_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_OUTPUT_BUFFER_INDEX:
- options->msl.shader_output_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_PATCH_OUTPUT_BUFFER_INDEX:
- options->msl.shader_patch_output_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_TESS_FACTOR_OUTPUT_BUFFER_INDEX:
- options->msl.shader_tess_factor_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_INPUT_WORKGROUP_INDEX:
- options->msl.shader_input_wg_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_POINT_SIZE_BUILTIN:
- options->msl.enable_point_size_builtin = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_POINT_SIZE_DEFAULT:
- options->msl.enable_point_size_default = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_DISABLE_RASTERIZATION:
- options->msl.disable_rasterization = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_AUTO_DISABLE_RASTERIZATION:
- options->msl.auto_disable_rasterization = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_CAPTURE_OUTPUT_TO_BUFFER:
- options->msl.capture_output_to_buffer = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_SWIZZLE_TEXTURE_SAMPLES:
- options->msl.swizzle_texture_samples = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_PAD_FRAGMENT_OUTPUT_COMPONENTS:
- options->msl.pad_fragment_output_components = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_TESS_DOMAIN_ORIGIN_LOWER_LEFT:
- options->msl.tess_domain_origin_lower_left = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_PLATFORM:
- options->msl.platform = static_cast<CompilerMSL::Options::Platform>(value);
- break;
- case SPVC_COMPILER_OPTION_MSL_ARGUMENT_BUFFERS:
- options->msl.argument_buffers = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_TEXTURE_BUFFER_NATIVE:
- options->msl.texture_buffer_native = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_BUFFER_SIZE_BUFFER_INDEX:
- options->msl.buffer_size_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_MULTIVIEW:
- options->msl.multiview = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_VIEW_MASK_BUFFER_INDEX:
- options->msl.view_mask_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_DEVICE_INDEX:
- options->msl.device_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_VIEW_INDEX_FROM_DEVICE_INDEX:
- options->msl.view_index_from_device_index = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_DISPATCH_BASE:
- options->msl.dispatch_base = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_DYNAMIC_OFFSETS_BUFFER_INDEX:
- options->msl.dynamic_offsets_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_TEXTURE_1D_AS_2D:
- options->msl.texture_1D_as_2D = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_BASE_INDEX_ZERO:
- options->msl.enable_base_index_zero = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_FRAMEBUFFER_FETCH_SUBPASS:
- options->msl.use_framebuffer_fetch_subpasses = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_INVARIANT_FP_MATH:
- options->msl.invariant_float_math = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_EMULATE_CUBEMAP_ARRAY:
- options->msl.emulate_cube_array = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_DECORATION_BINDING:
- options->msl.enable_decoration_binding = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_FORCE_ACTIVE_ARGUMENT_BUFFER_RESOURCES:
- options->msl.force_active_argument_buffer_resources = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_FORCE_NATIVE_ARRAYS:
- options->msl.force_native_arrays = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_OUTPUT_MASK:
- options->msl.enable_frag_output_mask = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_DEPTH_BUILTIN:
- options->msl.enable_frag_depth_builtin = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_FRAG_STENCIL_REF_BUILTIN:
- options->msl.enable_frag_stencil_ref_builtin = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ENABLE_CLIP_DISTANCE_USER_VARYING:
- options->msl.enable_clip_distance_user_varying = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_MULTI_PATCH_WORKGROUP:
- options->msl.multi_patch_workgroup = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_INPUT_BUFFER_INDEX:
- options->msl.shader_input_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_INDEX_BUFFER_INDEX:
- options->msl.shader_index_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_VERTEX_FOR_TESSELLATION:
- options->msl.vertex_for_tessellation = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_VERTEX_INDEX_TYPE:
- options->msl.vertex_index_type = static_cast<CompilerMSL::Options::IndexType>(value);
- break;
- case SPVC_COMPILER_OPTION_MSL_MULTIVIEW_LAYERED_RENDERING:
- options->msl.multiview_layered_rendering = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ARRAYED_SUBPASS_INPUT:
- options->msl.arrayed_subpass_input = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_R32UI_LINEAR_TEXTURE_ALIGNMENT:
- options->msl.r32ui_linear_texture_alignment = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_R32UI_ALIGNMENT_CONSTANT_ID:
- options->msl.r32ui_alignment_constant_id = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_IOS_USE_SIMDGROUP_FUNCTIONS:
- options->msl.ios_use_simdgroup_functions = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_EMULATE_SUBGROUPS:
- options->msl.emulate_subgroups = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_FIXED_SUBGROUP_SIZE:
- options->msl.fixed_subgroup_size = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_FORCE_SAMPLE_RATE_SHADING:
- options->msl.force_sample_rate_shading = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_IOS_SUPPORT_BASE_VERTEX_INSTANCE:
- options->msl.ios_support_base_vertex_instance = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_RAW_BUFFER_TESE_INPUT:
- options->msl.raw_buffer_tese_input = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_SHADER_PATCH_INPUT_BUFFER_INDEX:
- options->msl.shader_patch_input_buffer_index = value;
- break;
- case SPVC_COMPILER_OPTION_MSL_MANUAL_HELPER_INVOCATION_UPDATES:
- options->msl.manual_helper_invocation_updates = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_CHECK_DISCARDED_FRAG_STORES:
- options->msl.check_discarded_frag_stores = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_ARGUMENT_BUFFERS_TIER:
- options->msl.argument_buffers_tier = static_cast<CompilerMSL::Options::ArgumentBuffersTier>(value);
- break;
- case SPVC_COMPILER_OPTION_MSL_SAMPLE_DREF_LOD_ARRAY_AS_GRAD:
- options->msl.sample_dref_lod_array_as_grad = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_READWRITE_TEXTURE_FENCES:
- options->msl.readwrite_texture_fences = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_REPLACE_RECURSIVE_INPUTS:
- options->msl.replace_recursive_inputs = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_AGX_MANUAL_CUBE_GRAD_FIXUP:
- options->msl.agx_manual_cube_grad_fixup = value != 0;
- break;
- case SPVC_COMPILER_OPTION_MSL_FORCE_FRAGMENT_WITH_SIDE_EFFECTS_EXECUTION:
- options->msl.force_fragment_with_side_effects_execution = value != 0;
- break;
- #endif
- default:
- options->context->report_error("Unknown option.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_install_compiler_options(spvc_compiler compiler, spvc_compiler_options options)
- {
- (void)options;
- switch (compiler->backend)
- {
- #if SPIRV_CROSS_C_API_GLSL
- case SPVC_BACKEND_GLSL:
- static_cast<CompilerGLSL &>(*compiler->compiler).set_common_options(options->glsl);
- break;
- #endif
- #if SPIRV_CROSS_C_API_HLSL
- case SPVC_BACKEND_HLSL:
- static_cast<CompilerHLSL &>(*compiler->compiler).set_common_options(options->glsl);
- static_cast<CompilerHLSL &>(*compiler->compiler).set_hlsl_options(options->hlsl);
- break;
- #endif
- #if SPIRV_CROSS_C_API_MSL
- case SPVC_BACKEND_MSL:
- static_cast<CompilerMSL &>(*compiler->compiler).set_common_options(options->glsl);
- static_cast<CompilerMSL &>(*compiler->compiler).set_msl_options(options->msl);
- break;
- #endif
- default:
- break;
- }
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_add_header_line(spvc_compiler compiler, const char *line)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend == SPVC_BACKEND_NONE)
- {
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- static_cast<CompilerGLSL *>(compiler->compiler.get())->add_header_line(line);
- return SPVC_SUCCESS;
- #else
- (void)line;
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_require_extension(spvc_compiler compiler, const char *line)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend == SPVC_BACKEND_NONE)
- {
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- static_cast<CompilerGLSL *>(compiler->compiler.get())->require_extension(line);
- return SPVC_SUCCESS;
- #else
- (void)line;
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- size_t spvc_compiler_get_num_required_extensions(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend != SPVC_BACKEND_GLSL)
- {
- compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- return static_cast<CompilerGLSL *>(compiler->compiler.get())->get_required_extensions().size();
- #else
- compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
- return 0;
- #endif
- }
- const char *spvc_compiler_get_required_extension(spvc_compiler compiler, size_t index)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend != SPVC_BACKEND_GLSL)
- {
- compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
- return nullptr;
- }
- auto &exts = static_cast<CompilerGLSL *>(compiler->compiler.get())->get_required_extensions();
- if (index < exts.size())
- return exts[index].c_str();
- else
- return nullptr;
- #else
- (void)index;
- compiler->context->report_error("Enabled extensions can only be queried on GLSL backend.");
- return nullptr;
- #endif
- }
- spvc_result spvc_compiler_flatten_buffer_block(spvc_compiler compiler, spvc_variable_id id)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend == SPVC_BACKEND_NONE)
- {
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- static_cast<CompilerGLSL *>(compiler->compiler.get())->flatten_buffer_block(id);
- return SPVC_SUCCESS;
- #else
- (void)id;
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_bool spvc_compiler_variable_is_depth_or_compare(spvc_compiler compiler, spvc_variable_id id)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend == SPVC_BACKEND_NONE)
- {
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- return static_cast<CompilerGLSL *>(compiler->compiler.get())->variable_is_depth_or_compare(id) ? SPVC_TRUE : SPVC_FALSE;
- #else
- (void)id;
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_FALSE;
- #endif
- }
- spvc_result spvc_compiler_mask_stage_output_by_location(spvc_compiler compiler,
- unsigned location, unsigned component)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend == SPVC_BACKEND_NONE)
- {
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- static_cast<CompilerGLSL *>(compiler->compiler.get())->mask_stage_output_by_location(location, component);
- return SPVC_SUCCESS;
- #else
- (void)location;
- (void)component;
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_mask_stage_output_by_builtin(spvc_compiler compiler, SpvBuiltIn builtin)
- {
- #if SPIRV_CROSS_C_API_GLSL
- if (compiler->backend == SPVC_BACKEND_NONE)
- {
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- static_cast<CompilerGLSL *>(compiler->compiler.get())->mask_stage_output_by_builtin(BuiltIn(builtin));
- return SPVC_SUCCESS;
- #else
- (void)builtin;
- compiler->context->report_error("Cross-compilation related option used on NONE backend which only supports reflection.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_hlsl_set_root_constants_layout(spvc_compiler compiler,
- const spvc_hlsl_root_constants *constant_info,
- size_t count)
- {
- #if SPIRV_CROSS_C_API_HLSL
- if (compiler->backend != SPVC_BACKEND_HLSL)
- {
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
- vector<RootConstants> roots;
- roots.reserve(count);
- for (size_t i = 0; i < count; i++)
- {
- RootConstants root;
- root.binding = constant_info[i].binding;
- root.space = constant_info[i].space;
- root.start = constant_info[i].start;
- root.end = constant_info[i].end;
- roots.push_back(root);
- }
- hlsl.set_root_constant_layouts(std::move(roots));
- return SPVC_SUCCESS;
- #else
- (void)constant_info;
- (void)count;
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_hlsl_add_vertex_attribute_remap(spvc_compiler compiler,
- const spvc_hlsl_vertex_attribute_remap *remap,
- size_t count)
- {
- #if SPIRV_CROSS_C_API_HLSL
- if (compiler->backend != SPVC_BACKEND_HLSL)
- {
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- HLSLVertexAttributeRemap re;
- auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
- for (size_t i = 0; i < count; i++)
- {
- re.location = remap[i].location;
- re.semantic = remap[i].semantic;
- hlsl.add_vertex_attribute_remap(re);
- }
- return SPVC_SUCCESS;
- #else
- (void)remap;
- (void)count;
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_variable_id spvc_compiler_hlsl_remap_num_workgroups_builtin(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_HLSL
- if (compiler->backend != SPVC_BACKEND_HLSL)
- {
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return 0;
- }
- auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
- return hlsl.remap_num_workgroups_builtin();
- #else
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return 0;
- #endif
- }
- spvc_result spvc_compiler_hlsl_set_resource_binding_flags(spvc_compiler compiler,
- spvc_hlsl_binding_flags flags)
- {
- #if SPIRV_CROSS_C_API_HLSL
- if (compiler->backend != SPVC_BACKEND_HLSL)
- {
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
- hlsl.set_resource_binding_flags(flags);
- return SPVC_SUCCESS;
- #else
- (void)flags;
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_hlsl_add_resource_binding(spvc_compiler compiler,
- const spvc_hlsl_resource_binding *binding)
- {
- #if SPIRV_CROSS_C_API_HLSL
- if (compiler->backend != SPVC_BACKEND_HLSL)
- {
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
- HLSLResourceBinding bind;
- bind.binding = binding->binding;
- bind.desc_set = binding->desc_set;
- bind.stage = static_cast<ExecutionModel>(binding->stage);
- bind.cbv.register_binding = binding->cbv.register_binding;
- bind.cbv.register_space = binding->cbv.register_space;
- bind.uav.register_binding = binding->uav.register_binding;
- bind.uav.register_space = binding->uav.register_space;
- bind.srv.register_binding = binding->srv.register_binding;
- bind.srv.register_space = binding->srv.register_space;
- bind.sampler.register_binding = binding->sampler.register_binding;
- bind.sampler.register_space = binding->sampler.register_space;
- hlsl.add_hlsl_resource_binding(bind);
- return SPVC_SUCCESS;
- #else
- (void)binding;
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_bool spvc_compiler_hlsl_is_resource_used(spvc_compiler compiler, SpvExecutionModel model, unsigned set,
- unsigned binding)
- {
- #if SPIRV_CROSS_C_API_HLSL
- if (compiler->backend != SPVC_BACKEND_HLSL)
- {
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_FALSE;
- }
- auto &hlsl = *static_cast<CompilerHLSL *>(compiler->compiler.get());
- return hlsl.is_hlsl_resource_binding_used(static_cast<ExecutionModel>(model), set, binding) ? SPVC_TRUE :
- SPVC_FALSE;
- #else
- (void)model;
- (void)set;
- (void)binding;
- compiler->context->report_error("HLSL function used on a non-HLSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_is_rasterization_disabled(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.get_is_rasterization_disabled() ? SPVC_TRUE : SPVC_FALSE;
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_needs_swizzle_buffer(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.needs_swizzle_buffer() ? SPVC_TRUE : SPVC_FALSE;
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_needs_buffer_size_buffer(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.needs_buffer_size_buffer() ? SPVC_TRUE : SPVC_FALSE;
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_needs_aux_buffer(spvc_compiler compiler)
- {
- return spvc_compiler_msl_needs_swizzle_buffer(compiler);
- }
- spvc_bool spvc_compiler_msl_needs_output_buffer(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.needs_output_buffer() ? SPVC_TRUE : SPVC_FALSE;
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_needs_patch_output_buffer(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.needs_patch_output_buffer() ? SPVC_TRUE : SPVC_FALSE;
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_needs_input_threadgroup_mem(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.needs_input_threadgroup_mem() ? SPVC_TRUE : SPVC_FALSE;
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_result spvc_compiler_msl_add_vertex_attribute(spvc_compiler compiler, const spvc_msl_vertex_attribute *va)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLShaderInterfaceVariable attr;
- attr.location = va->location;
- attr.format = static_cast<MSLShaderVariableFormat>(va->format);
- attr.builtin = static_cast<BuiltIn>(va->builtin);
- msl.add_msl_shader_input(attr);
- return SPVC_SUCCESS;
- #else
- (void)va;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_shader_input(spvc_compiler compiler, const spvc_msl_shader_interface_var *si)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLShaderInterfaceVariable input;
- input.location = si->location;
- input.format = static_cast<MSLShaderVariableFormat>(si->format);
- input.builtin = static_cast<BuiltIn>(si->builtin);
- input.vecsize = si->vecsize;
- msl.add_msl_shader_input(input);
- return SPVC_SUCCESS;
- #else
- (void)si;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_shader_input_2(spvc_compiler compiler, const spvc_msl_shader_interface_var_2 *si)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLShaderInterfaceVariable input;
- input.location = si->location;
- input.format = static_cast<MSLShaderVariableFormat>(si->format);
- input.builtin = static_cast<BuiltIn>(si->builtin);
- input.vecsize = si->vecsize;
- input.rate = static_cast<MSLShaderVariableRate>(si->rate);
- msl.add_msl_shader_input(input);
- return SPVC_SUCCESS;
- #else
- (void)si;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_shader_output(spvc_compiler compiler, const spvc_msl_shader_interface_var *so)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLShaderInterfaceVariable output;
- output.location = so->location;
- output.format = static_cast<MSLShaderVariableFormat>(so->format);
- output.builtin = static_cast<BuiltIn>(so->builtin);
- output.vecsize = so->vecsize;
- msl.add_msl_shader_output(output);
- return SPVC_SUCCESS;
- #else
- (void)so;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_shader_output_2(spvc_compiler compiler, const spvc_msl_shader_interface_var_2 *so)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLShaderInterfaceVariable output;
- output.location = so->location;
- output.format = static_cast<MSLShaderVariableFormat>(so->format);
- output.builtin = static_cast<BuiltIn>(so->builtin);
- output.vecsize = so->vecsize;
- output.rate = static_cast<MSLShaderVariableRate>(so->rate);
- msl.add_msl_shader_output(output);
- return SPVC_SUCCESS;
- #else
- (void)so;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_resource_binding(spvc_compiler compiler,
- const spvc_msl_resource_binding *binding)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLResourceBinding bind;
- bind.binding = binding->binding;
- bind.desc_set = binding->desc_set;
- bind.stage = static_cast<ExecutionModel>(binding->stage);
- bind.msl_buffer = binding->msl_buffer;
- bind.msl_texture = binding->msl_texture;
- bind.msl_sampler = binding->msl_sampler;
- msl.add_msl_resource_binding(bind);
- return SPVC_SUCCESS;
- #else
- (void)binding;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_resource_binding_2(spvc_compiler compiler,
- const spvc_msl_resource_binding_2 *binding)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLResourceBinding bind;
- bind.binding = binding->binding;
- bind.desc_set = binding->desc_set;
- bind.stage = static_cast<ExecutionModel>(binding->stage);
- bind.msl_buffer = binding->msl_buffer;
- bind.msl_texture = binding->msl_texture;
- bind.msl_sampler = binding->msl_sampler;
- bind.count = binding->count;
- msl.add_msl_resource_binding(bind);
- return SPVC_SUCCESS;
- #else
- (void)binding;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_dynamic_buffer(spvc_compiler compiler, unsigned desc_set, unsigned binding, unsigned index)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- msl.add_dynamic_buffer(desc_set, binding, index);
- return SPVC_SUCCESS;
- #else
- (void)binding;
- (void)desc_set;
- (void)index;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_inline_uniform_block(spvc_compiler compiler, unsigned desc_set, unsigned binding)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- msl.add_inline_uniform_block(desc_set, binding);
- return SPVC_SUCCESS;
- #else
- (void)binding;
- (void)desc_set;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_add_discrete_descriptor_set(spvc_compiler compiler, unsigned desc_set)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- msl.add_discrete_descriptor_set(desc_set);
- return SPVC_SUCCESS;
- #else
- (void)desc_set;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_set_argument_buffer_device_address_space(spvc_compiler compiler, unsigned desc_set, spvc_bool device_address)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- msl.set_argument_buffer_device_address_space(desc_set, bool(device_address));
- return SPVC_SUCCESS;
- #else
- (void)desc_set;
- (void)device_address;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_bool spvc_compiler_msl_is_shader_input_used(spvc_compiler compiler, unsigned location)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.is_msl_shader_input_used(location) ? SPVC_TRUE : SPVC_FALSE;
- #else
- (void)location;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_is_shader_output_used(spvc_compiler compiler, unsigned location)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.is_msl_shader_output_used(location) ? SPVC_TRUE : SPVC_FALSE;
- #else
- (void)location;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_bool spvc_compiler_msl_is_vertex_attribute_used(spvc_compiler compiler, unsigned location)
- {
- return spvc_compiler_msl_is_shader_input_used(compiler, location);
- }
- spvc_bool spvc_compiler_msl_is_resource_used(spvc_compiler compiler, SpvExecutionModel model, unsigned set,
- unsigned binding)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.is_msl_resource_binding_used(static_cast<ExecutionModel>(model), set, binding) ? SPVC_TRUE :
- SPVC_FALSE;
- #else
- (void)model;
- (void)set;
- (void)binding;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_FALSE;
- #endif
- }
- spvc_result spvc_compiler_msl_set_combined_sampler_suffix(spvc_compiler compiler, const char *suffix)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- msl.set_combined_sampler_suffix(suffix);
- return SPVC_SUCCESS;
- #else
- (void)suffix;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- const char *spvc_compiler_msl_get_combined_sampler_suffix(spvc_compiler compiler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return "";
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.get_combined_sampler_suffix();
- #else
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return "";
- #endif
- }
- #if SPIRV_CROSS_C_API_MSL
- static void spvc_convert_msl_sampler(MSLConstexprSampler &samp, const spvc_msl_constexpr_sampler *sampler)
- {
- samp.s_address = static_cast<MSLSamplerAddress>(sampler->s_address);
- samp.t_address = static_cast<MSLSamplerAddress>(sampler->t_address);
- samp.r_address = static_cast<MSLSamplerAddress>(sampler->r_address);
- samp.lod_clamp_min = sampler->lod_clamp_min;
- samp.lod_clamp_max = sampler->lod_clamp_max;
- samp.lod_clamp_enable = sampler->lod_clamp_enable != 0;
- samp.min_filter = static_cast<MSLSamplerFilter>(sampler->min_filter);
- samp.mag_filter = static_cast<MSLSamplerFilter>(sampler->mag_filter);
- samp.mip_filter = static_cast<MSLSamplerMipFilter>(sampler->mip_filter);
- samp.compare_enable = sampler->compare_enable != 0;
- samp.anisotropy_enable = sampler->anisotropy_enable != 0;
- samp.max_anisotropy = sampler->max_anisotropy;
- samp.compare_func = static_cast<MSLSamplerCompareFunc>(sampler->compare_func);
- samp.coord = static_cast<MSLSamplerCoord>(sampler->coord);
- samp.border_color = static_cast<MSLSamplerBorderColor>(sampler->border_color);
- }
- static void spvc_convert_msl_sampler_ycbcr_conversion(MSLConstexprSampler &samp, const spvc_msl_sampler_ycbcr_conversion *conv)
- {
- samp.ycbcr_conversion_enable = conv != nullptr;
- if (conv == nullptr) return;
- samp.planes = conv->planes;
- samp.resolution = static_cast<MSLFormatResolution>(conv->resolution);
- samp.chroma_filter = static_cast<MSLSamplerFilter>(conv->chroma_filter);
- samp.x_chroma_offset = static_cast<MSLChromaLocation>(conv->x_chroma_offset);
- samp.y_chroma_offset = static_cast<MSLChromaLocation>(conv->y_chroma_offset);
- for (int i = 0; i < 4; i++)
- samp.swizzle[i] = static_cast<MSLComponentSwizzle>(conv->swizzle[i]);
- samp.ycbcr_model = static_cast<MSLSamplerYCbCrModelConversion>(conv->ycbcr_model);
- samp.ycbcr_range = static_cast<MSLSamplerYCbCrRange>(conv->ycbcr_range);
- samp.bpc = conv->bpc;
- }
- #endif
- spvc_result spvc_compiler_msl_remap_constexpr_sampler(spvc_compiler compiler, spvc_variable_id id,
- const spvc_msl_constexpr_sampler *sampler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLConstexprSampler samp;
- spvc_convert_msl_sampler(samp, sampler);
- msl.remap_constexpr_sampler(id, samp);
- return SPVC_SUCCESS;
- #else
- (void)id;
- (void)sampler;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_remap_constexpr_sampler_by_binding(spvc_compiler compiler,
- unsigned desc_set, unsigned binding,
- const spvc_msl_constexpr_sampler *sampler)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLConstexprSampler samp;
- spvc_convert_msl_sampler(samp, sampler);
- msl.remap_constexpr_sampler_by_binding(desc_set, binding, samp);
- return SPVC_SUCCESS;
- #else
- (void)desc_set;
- (void)binding;
- (void)sampler;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_remap_constexpr_sampler_ycbcr(spvc_compiler compiler, spvc_variable_id id,
- const spvc_msl_constexpr_sampler *sampler,
- const spvc_msl_sampler_ycbcr_conversion *conv)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLConstexprSampler samp;
- spvc_convert_msl_sampler(samp, sampler);
- spvc_convert_msl_sampler_ycbcr_conversion(samp, conv);
- msl.remap_constexpr_sampler(id, samp);
- return SPVC_SUCCESS;
- #else
- (void)id;
- (void)sampler;
- (void)conv;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_remap_constexpr_sampler_by_binding_ycbcr(spvc_compiler compiler,
- unsigned desc_set, unsigned binding,
- const spvc_msl_constexpr_sampler *sampler,
- const spvc_msl_sampler_ycbcr_conversion *conv)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- MSLConstexprSampler samp;
- spvc_convert_msl_sampler(samp, sampler);
- spvc_convert_msl_sampler_ycbcr_conversion(samp, conv);
- msl.remap_constexpr_sampler_by_binding(desc_set, binding, samp);
- return SPVC_SUCCESS;
- #else
- (void)desc_set;
- (void)binding;
- (void)sampler;
- (void)conv;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- spvc_result spvc_compiler_msl_set_fragment_output_components(spvc_compiler compiler, unsigned location,
- unsigned components)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- msl.set_fragment_output_components(location, components);
- return SPVC_SUCCESS;
- #else
- (void)location;
- (void)components;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- #endif
- }
- unsigned spvc_compiler_msl_get_automatic_resource_binding(spvc_compiler compiler, spvc_variable_id id)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return uint32_t(-1);
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.get_automatic_msl_resource_binding(id);
- #else
- (void)id;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return uint32_t(-1);
- #endif
- }
- unsigned spvc_compiler_msl_get_automatic_resource_binding_secondary(spvc_compiler compiler, spvc_variable_id id)
- {
- #if SPIRV_CROSS_C_API_MSL
- if (compiler->backend != SPVC_BACKEND_MSL)
- {
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return uint32_t(-1);
- }
- auto &msl = *static_cast<CompilerMSL *>(compiler->compiler.get());
- return msl.get_automatic_msl_resource_binding_secondary(id);
- #else
- (void)id;
- compiler->context->report_error("MSL function used on a non-MSL backend.");
- return uint32_t(-1);
- #endif
- }
- spvc_result spvc_compiler_compile(spvc_compiler compiler, const char **source)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto result = compiler->compiler->compile();
- if (result.empty())
- {
- compiler->context->report_error("Unsupported SPIR-V.");
- return SPVC_ERROR_UNSUPPORTED_SPIRV;
- }
- *source = compiler->context->allocate_name(result);
- if (!*source)
- {
- compiler->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- return SPVC_SUCCESS;
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_UNSUPPORTED_SPIRV)
- }
- bool spvc_resources_s::copy_resources(SmallVector<spvc_reflected_resource> &outputs,
- const SmallVector<Resource> &inputs)
- {
- for (auto &i : inputs)
- {
- spvc_reflected_resource r;
- r.base_type_id = i.base_type_id;
- r.type_id = i.type_id;
- r.id = i.id;
- r.name = context->allocate_name(i.name);
- if (!r.name)
- return false;
- outputs.push_back(r);
- }
- return true;
- }
- bool spvc_resources_s::copy_resources(SmallVector<spvc_reflected_builtin_resource> &outputs,
- const SmallVector<BuiltInResource> &inputs)
- {
- for (auto &i : inputs)
- {
- spvc_reflected_builtin_resource br;
- br.value_type_id = i.value_type_id;
- br.builtin = SpvBuiltIn(i.builtin);
- auto &r = br.resource;
- r.base_type_id = i.resource.base_type_id;
- r.type_id = i.resource.type_id;
- r.id = i.resource.id;
- r.name = context->allocate_name(i.resource.name);
- if (!r.name)
- return false;
- outputs.push_back(br);
- }
- return true;
- }
- bool spvc_resources_s::copy_resources(const ShaderResources &resources)
- {
- if (!copy_resources(uniform_buffers, resources.uniform_buffers))
- return false;
- if (!copy_resources(storage_buffers, resources.storage_buffers))
- return false;
- if (!copy_resources(stage_inputs, resources.stage_inputs))
- return false;
- if (!copy_resources(stage_outputs, resources.stage_outputs))
- return false;
- if (!copy_resources(subpass_inputs, resources.subpass_inputs))
- return false;
- if (!copy_resources(storage_images, resources.storage_images))
- return false;
- if (!copy_resources(sampled_images, resources.sampled_images))
- return false;
- if (!copy_resources(atomic_counters, resources.atomic_counters))
- return false;
- if (!copy_resources(push_constant_buffers, resources.push_constant_buffers))
- return false;
- if (!copy_resources(shader_record_buffers, resources.shader_record_buffers))
- return false;
- if (!copy_resources(separate_images, resources.separate_images))
- return false;
- if (!copy_resources(separate_samplers, resources.separate_samplers))
- return false;
- if (!copy_resources(acceleration_structures, resources.acceleration_structures))
- return false;
- if (!copy_resources(gl_plain_uniforms, resources.gl_plain_uniforms))
- return false;
- if (!copy_resources(tensors, resources.tensors))
- return false;
- if (!copy_resources(builtin_inputs, resources.builtin_inputs))
- return false;
- if (!copy_resources(builtin_outputs, resources.builtin_outputs))
- return false;
- return true;
- }
- spvc_result spvc_compiler_get_active_interface_variables(spvc_compiler compiler, spvc_set *set)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- std::unique_ptr<spvc_set_s> ptr(new (std::nothrow) spvc_set_s);
- if (!ptr)
- {
- compiler->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- auto active = compiler->compiler->get_active_interface_variables();
- ptr->set = std::move(active);
- *set = ptr.get();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_set_enabled_interface_variables(spvc_compiler compiler, spvc_set set)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- compiler->compiler->set_enabled_interface_variables(set->set);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_create_shader_resources_for_active_variables(spvc_compiler compiler, spvc_resources *resources,
- spvc_set set)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- std::unique_ptr<spvc_resources_s> res(new (std::nothrow) spvc_resources_s);
- if (!res)
- {
- compiler->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- res->context = compiler->context;
- auto accessed_resources = compiler->compiler->get_shader_resources(set->set);
- if (!res->copy_resources(accessed_resources))
- {
- res->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- *resources = res.get();
- compiler->context->allocations.push_back(std::move(res));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_create_shader_resources(spvc_compiler compiler, spvc_resources *resources)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- std::unique_ptr<spvc_resources_s> res(new (std::nothrow) spvc_resources_s);
- if (!res)
- {
- compiler->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- res->context = compiler->context;
- auto accessed_resources = compiler->compiler->get_shader_resources();
- if (!res->copy_resources(accessed_resources))
- {
- res->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- *resources = res.get();
- compiler->context->allocations.push_back(std::move(res));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_resources_get_resource_list_for_type(spvc_resources resources, spvc_resource_type type,
- const spvc_reflected_resource **resource_list,
- size_t *resource_size)
- {
- const SmallVector<spvc_reflected_resource> *list = nullptr;
- switch (type)
- {
- case SPVC_RESOURCE_TYPE_UNIFORM_BUFFER:
- list = &resources->uniform_buffers;
- break;
- case SPVC_RESOURCE_TYPE_STORAGE_BUFFER:
- list = &resources->storage_buffers;
- break;
- case SPVC_RESOURCE_TYPE_STAGE_INPUT:
- list = &resources->stage_inputs;
- break;
- case SPVC_RESOURCE_TYPE_STAGE_OUTPUT:
- list = &resources->stage_outputs;
- break;
- case SPVC_RESOURCE_TYPE_SUBPASS_INPUT:
- list = &resources->subpass_inputs;
- break;
- case SPVC_RESOURCE_TYPE_STORAGE_IMAGE:
- list = &resources->storage_images;
- break;
- case SPVC_RESOURCE_TYPE_SAMPLED_IMAGE:
- list = &resources->sampled_images;
- break;
- case SPVC_RESOURCE_TYPE_ATOMIC_COUNTER:
- list = &resources->atomic_counters;
- break;
- case SPVC_RESOURCE_TYPE_PUSH_CONSTANT:
- list = &resources->push_constant_buffers;
- break;
- case SPVC_RESOURCE_TYPE_SEPARATE_IMAGE:
- list = &resources->separate_images;
- break;
- case SPVC_RESOURCE_TYPE_SEPARATE_SAMPLERS:
- list = &resources->separate_samplers;
- break;
- case SPVC_RESOURCE_TYPE_ACCELERATION_STRUCTURE:
- list = &resources->acceleration_structures;
- break;
- case SPVC_RESOURCE_TYPE_SHADER_RECORD_BUFFER:
- list = &resources->shader_record_buffers;
- break;
- case SPVC_RESOURCE_TYPE_GL_PLAIN_UNIFORM:
- list = &resources->gl_plain_uniforms;
- break;
- case SPVC_RESOURCE_TYPE_TENSOR:
- list = &resources->tensors;
- break;
- default:
- break;
- }
- if (!list)
- {
- resources->context->report_error("Invalid argument.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- *resource_size = list->size();
- *resource_list = list->data();
- return SPVC_SUCCESS;
- }
- spvc_result spvc_resources_get_builtin_resource_list_for_type(
- spvc_resources resources, spvc_builtin_resource_type type,
- const spvc_reflected_builtin_resource **resource_list,
- size_t *resource_size)
- {
- const SmallVector<spvc_reflected_builtin_resource> *list = nullptr;
- switch (type)
- {
- case SPVC_BUILTIN_RESOURCE_TYPE_STAGE_INPUT:
- list = &resources->builtin_inputs;
- break;
- case SPVC_BUILTIN_RESOURCE_TYPE_STAGE_OUTPUT:
- list = &resources->builtin_outputs;
- break;
- default:
- break;
- }
- if (!list)
- {
- resources->context->report_error("Invalid argument.");
- return SPVC_ERROR_INVALID_ARGUMENT;
- }
- *resource_size = list->size();
- *resource_list = list->data();
- return SPVC_SUCCESS;
- }
- void spvc_compiler_set_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration, unsigned argument)
- {
- compiler->compiler->set_decoration(id, static_cast<Decoration>(decoration), argument);
- }
- void spvc_compiler_set_decoration_string(spvc_compiler compiler, SpvId id, SpvDecoration decoration,
- const char *argument)
- {
- compiler->compiler->set_decoration_string(id, static_cast<Decoration>(decoration), argument);
- }
- void spvc_compiler_set_name(spvc_compiler compiler, SpvId id, const char *argument)
- {
- compiler->compiler->set_name(id, argument);
- }
- void spvc_compiler_set_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
- SpvDecoration decoration, unsigned argument)
- {
- compiler->compiler->set_member_decoration(id, member_index, static_cast<Decoration>(decoration), argument);
- }
- void spvc_compiler_set_member_decoration_string(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
- SpvDecoration decoration, const char *argument)
- {
- compiler->compiler->set_member_decoration_string(id, member_index, static_cast<Decoration>(decoration),
- argument);
- }
- void spvc_compiler_set_member_name(spvc_compiler compiler, spvc_type_id id, unsigned member_index, const char *argument)
- {
- compiler->compiler->set_member_name(id, member_index, argument);
- }
- void spvc_compiler_unset_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
- {
- compiler->compiler->unset_decoration(id, static_cast<Decoration>(decoration));
- }
- void spvc_compiler_unset_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
- SpvDecoration decoration)
- {
- compiler->compiler->unset_member_decoration(id, member_index, static_cast<Decoration>(decoration));
- }
- spvc_bool spvc_compiler_has_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
- {
- return compiler->compiler->has_decoration(id, static_cast<Decoration>(decoration)) ? SPVC_TRUE : SPVC_FALSE;
- }
- spvc_bool spvc_compiler_has_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
- SpvDecoration decoration)
- {
- return compiler->compiler->has_member_decoration(id, member_index, static_cast<Decoration>(decoration)) ?
- SPVC_TRUE :
- SPVC_FALSE;
- }
- const char *spvc_compiler_get_name(spvc_compiler compiler, SpvId id)
- {
- return compiler->compiler->get_name(id).c_str();
- }
- unsigned spvc_compiler_get_decoration(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
- {
- return compiler->compiler->get_decoration(id, static_cast<Decoration>(decoration));
- }
- const char *spvc_compiler_get_decoration_string(spvc_compiler compiler, SpvId id, SpvDecoration decoration)
- {
- return compiler->compiler->get_decoration_string(id, static_cast<Decoration>(decoration)).c_str();
- }
- unsigned spvc_compiler_get_member_decoration(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
- SpvDecoration decoration)
- {
- return compiler->compiler->get_member_decoration(id, member_index, static_cast<Decoration>(decoration));
- }
- const char *spvc_compiler_get_member_decoration_string(spvc_compiler compiler, spvc_type_id id, unsigned member_index,
- SpvDecoration decoration)
- {
- return compiler->compiler->get_member_decoration_string(id, member_index, static_cast<Decoration>(decoration))
- .c_str();
- }
- const char *spvc_compiler_get_member_name(spvc_compiler compiler, spvc_type_id id, unsigned member_index)
- {
- return compiler->compiler->get_member_name(id, member_index).c_str();
- }
- spvc_result spvc_compiler_get_entry_points(spvc_compiler compiler, const spvc_entry_point **entry_points,
- size_t *num_entry_points)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto entries = compiler->compiler->get_entry_points_and_stages();
- SmallVector<spvc_entry_point> translated;
- translated.reserve(entries.size());
- for (auto &entry : entries)
- {
- spvc_entry_point new_entry;
- new_entry.execution_model = static_cast<SpvExecutionModel>(entry.execution_model);
- new_entry.name = compiler->context->allocate_name(entry.name);
- if (!new_entry.name)
- {
- compiler->context->report_error("Out of memory.");
- return SPVC_ERROR_OUT_OF_MEMORY;
- }
- translated.push_back(new_entry);
- }
- auto ptr = spvc_allocate<TemporaryBuffer<spvc_entry_point>>();
- ptr->buffer = std::move(translated);
- *entry_points = ptr->buffer.data();
- *num_entry_points = ptr->buffer.size();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_set_entry_point(spvc_compiler compiler, const char *name, SpvExecutionModel model)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- compiler->compiler->set_entry_point(name, static_cast<ExecutionModel>(model));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_rename_entry_point(spvc_compiler compiler, const char *old_name, const char *new_name,
- SpvExecutionModel model)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- compiler->compiler->rename_entry_point(old_name, new_name, static_cast<ExecutionModel>(model));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- const char *spvc_compiler_get_cleansed_entry_point_name(spvc_compiler compiler, const char *name,
- SpvExecutionModel model)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto cleansed_name =
- compiler->compiler->get_cleansed_entry_point_name(name, static_cast<ExecutionModel>(model));
- return compiler->context->allocate_name(cleansed_name);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
- }
- void spvc_compiler_set_execution_mode(spvc_compiler compiler, SpvExecutionMode mode)
- {
- compiler->compiler->set_execution_mode(static_cast<ExecutionMode>(mode));
- }
- void spvc_compiler_set_execution_mode_with_arguments(spvc_compiler compiler, SpvExecutionMode mode, unsigned arg0,
- unsigned arg1,
- unsigned arg2)
- {
- compiler->compiler->set_execution_mode(static_cast<ExecutionMode>(mode), arg0, arg1, arg2);
- }
- void spvc_compiler_unset_execution_mode(spvc_compiler compiler, SpvExecutionMode mode)
- {
- compiler->compiler->unset_execution_mode(static_cast<ExecutionMode>(mode));
- }
- spvc_result spvc_compiler_get_execution_modes(spvc_compiler compiler, const SpvExecutionMode **modes, size_t *num_modes)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto ptr = spvc_allocate<TemporaryBuffer<SpvExecutionMode>>();
- compiler->compiler->get_execution_mode_bitset().for_each_bit(
- [&](uint32_t bit) { ptr->buffer.push_back(static_cast<SpvExecutionMode>(bit)); });
- *modes = ptr->buffer.data();
- *num_modes = ptr->buffer.size();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- unsigned spvc_compiler_get_execution_mode_argument(spvc_compiler compiler, SpvExecutionMode mode)
- {
- return compiler->compiler->get_execution_mode_argument(static_cast<ExecutionMode>(mode));
- }
- unsigned spvc_compiler_get_execution_mode_argument_by_index(spvc_compiler compiler, SpvExecutionMode mode,
- unsigned index)
- {
- return compiler->compiler->get_execution_mode_argument(static_cast<ExecutionMode>(mode), index);
- }
- SpvExecutionModel spvc_compiler_get_execution_model(spvc_compiler compiler)
- {
- return static_cast<SpvExecutionModel>(compiler->compiler->get_execution_model());
- }
- void spvc_compiler_update_active_builtins(spvc_compiler compiler)
- {
- compiler->compiler->update_active_builtins();
- }
- spvc_bool spvc_compiler_has_active_builtin(spvc_compiler compiler, SpvBuiltIn builtin, SpvStorageClass storage)
- {
- return compiler->compiler->has_active_builtin(static_cast<BuiltIn>(builtin), static_cast<StorageClass>(storage)) ?
- SPVC_TRUE :
- SPVC_FALSE;
- }
- spvc_type spvc_compiler_get_type_handle(spvc_compiler compiler, spvc_type_id id)
- {
- // Should only throw if an intentionally garbage ID is passed, but the IDs are not type-safe.
- SPVC_BEGIN_SAFE_SCOPE
- {
- return static_cast<spvc_type>(&compiler->compiler->get_type(id));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
- }
- spvc_type_id spvc_type_get_base_type_id(spvc_type type)
- {
- return type->self;
- }
- static spvc_basetype convert_basetype(SPIRType::BaseType type)
- {
- // For now the enums match up.
- return static_cast<spvc_basetype>(type);
- }
- spvc_basetype spvc_type_get_basetype(spvc_type type)
- {
- return convert_basetype(type->basetype);
- }
- unsigned spvc_type_get_bit_width(spvc_type type)
- {
- return type->width;
- }
- unsigned spvc_type_get_vector_size(spvc_type type)
- {
- return type->vecsize;
- }
- unsigned spvc_type_get_columns(spvc_type type)
- {
- return type->columns;
- }
- unsigned spvc_type_get_num_array_dimensions(spvc_type type)
- {
- return unsigned(type->array.size());
- }
- spvc_bool spvc_type_array_dimension_is_literal(spvc_type type, unsigned dimension)
- {
- return type->array_size_literal[dimension] ? SPVC_TRUE : SPVC_FALSE;
- }
- SpvId spvc_type_get_array_dimension(spvc_type type, unsigned dimension)
- {
- return type->array[dimension];
- }
- unsigned spvc_type_get_num_member_types(spvc_type type)
- {
- return unsigned(type->member_types.size());
- }
- spvc_type_id spvc_type_get_member_type(spvc_type type, unsigned index)
- {
- return type->member_types[index];
- }
- SpvStorageClass spvc_type_get_storage_class(spvc_type type)
- {
- return static_cast<SpvStorageClass>(type->storage);
- }
- // Image type query.
- spvc_type_id spvc_type_get_image_sampled_type(spvc_type type)
- {
- return type->image.type;
- }
- SpvDim spvc_type_get_image_dimension(spvc_type type)
- {
- return static_cast<SpvDim>(type->image.dim);
- }
- spvc_bool spvc_type_get_image_is_depth(spvc_type type)
- {
- return type->image.depth ? SPVC_TRUE : SPVC_FALSE;
- }
- spvc_bool spvc_type_get_image_arrayed(spvc_type type)
- {
- return type->image.arrayed ? SPVC_TRUE : SPVC_FALSE;
- }
- spvc_bool spvc_type_get_image_multisampled(spvc_type type)
- {
- return type->image.ms ? SPVC_TRUE : SPVC_FALSE;
- }
- spvc_bool spvc_type_get_image_is_storage(spvc_type type)
- {
- return type->image.sampled == 2 ? SPVC_TRUE : SPVC_FALSE;
- }
- SpvImageFormat spvc_type_get_image_storage_format(spvc_type type)
- {
- return static_cast<SpvImageFormat>(static_cast<const SPIRType *>(type)->image.format);
- }
- SpvAccessQualifier spvc_type_get_image_access_qualifier(spvc_type type)
- {
- return static_cast<SpvAccessQualifier>(static_cast<const SPIRType *>(type)->image.access);
- }
- spvc_result spvc_compiler_get_declared_struct_size(spvc_compiler compiler, spvc_type struct_type, size_t *size)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *size = compiler->compiler->get_declared_struct_size(*static_cast<const SPIRType *>(struct_type));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_get_declared_struct_size_runtime_array(spvc_compiler compiler, spvc_type struct_type,
- size_t array_size, size_t *size)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *size = compiler->compiler->get_declared_struct_size_runtime_array(*static_cast<const SPIRType *>(struct_type),
- array_size);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_get_declared_struct_member_size(spvc_compiler compiler, spvc_type struct_type, unsigned index, size_t *size)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *size = compiler->compiler->get_declared_struct_member_size(*static_cast<const SPIRType *>(struct_type), index);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_type_struct_member_offset(spvc_compiler compiler, spvc_type type, unsigned index, unsigned *offset)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *offset = compiler->compiler->type_struct_member_offset(*static_cast<const SPIRType *>(type), index);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_type_struct_member_array_stride(spvc_compiler compiler, spvc_type type, unsigned index, unsigned *stride)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *stride = compiler->compiler->type_struct_member_array_stride(*static_cast<const SPIRType *>(type), index);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_type_struct_member_matrix_stride(spvc_compiler compiler, spvc_type type, unsigned index, unsigned *stride)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *stride = compiler->compiler->type_struct_member_matrix_stride(*static_cast<const SPIRType *>(type), index);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_build_dummy_sampler_for_combined_images(spvc_compiler compiler, spvc_variable_id *id)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- *id = compiler->compiler->build_dummy_sampler_for_combined_images();
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_build_combined_image_samplers(spvc_compiler compiler)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- compiler->compiler->build_combined_image_samplers();
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_UNSUPPORTED_SPIRV)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_get_combined_image_samplers(spvc_compiler compiler,
- const spvc_combined_image_sampler **samplers,
- size_t *num_samplers)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto combined = compiler->compiler->get_combined_image_samplers();
- SmallVector<spvc_combined_image_sampler> translated;
- translated.reserve(combined.size());
- for (auto &c : combined)
- {
- spvc_combined_image_sampler trans = { c.combined_id, c.image_id, c.sampler_id };
- translated.push_back(trans);
- }
- auto ptr = spvc_allocate<TemporaryBuffer<spvc_combined_image_sampler>>();
- ptr->buffer = std::move(translated);
- *samplers = ptr->buffer.data();
- *num_samplers = ptr->buffer.size();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_get_specialization_constants(spvc_compiler compiler,
- const spvc_specialization_constant **constants,
- size_t *num_constants)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto spec_constants = compiler->compiler->get_specialization_constants();
- SmallVector<spvc_specialization_constant> translated;
- translated.reserve(spec_constants.size());
- for (auto &c : spec_constants)
- {
- spvc_specialization_constant trans = { c.id, c.constant_id };
- translated.push_back(trans);
- }
- auto ptr = spvc_allocate<TemporaryBuffer<spvc_specialization_constant>>();
- ptr->buffer = std::move(translated);
- *constants = ptr->buffer.data();
- *num_constants = ptr->buffer.size();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- spvc_constant spvc_compiler_get_constant_handle(spvc_compiler compiler, spvc_variable_id id)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- return static_cast<spvc_constant>(&compiler->compiler->get_constant(id));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
- }
- spvc_constant_id spvc_compiler_get_work_group_size_specialization_constants(spvc_compiler compiler,
- spvc_specialization_constant *x,
- spvc_specialization_constant *y,
- spvc_specialization_constant *z)
- {
- SpecializationConstant tmpx;
- SpecializationConstant tmpy;
- SpecializationConstant tmpz;
- spvc_constant_id ret = compiler->compiler->get_work_group_size_specialization_constants(tmpx, tmpy, tmpz);
- x->id = tmpx.id;
- x->constant_id = tmpx.constant_id;
- y->id = tmpy.id;
- y->constant_id = tmpy.constant_id;
- z->id = tmpz.id;
- z->constant_id = tmpz.constant_id;
- return ret;
- }
- spvc_result spvc_compiler_get_active_buffer_ranges(spvc_compiler compiler,
- spvc_variable_id id,
- const spvc_buffer_range **ranges,
- size_t *num_ranges)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto active_ranges = compiler->compiler->get_active_buffer_ranges(id);
- SmallVector<spvc_buffer_range> translated;
- translated.reserve(active_ranges.size());
- for (auto &r : active_ranges)
- {
- spvc_buffer_range trans = { r.index, r.offset, r.range };
- translated.push_back(trans);
- }
- auto ptr = spvc_allocate<TemporaryBuffer<spvc_buffer_range>>();
- ptr->buffer = std::move(translated);
- *ranges = ptr->buffer.data();
- *num_ranges = ptr->buffer.size();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- float spvc_constant_get_scalar_fp16(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_f16(column, row);
- }
- float spvc_constant_get_scalar_fp32(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_f32(column, row);
- }
- double spvc_constant_get_scalar_fp64(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_f64(column, row);
- }
- unsigned spvc_constant_get_scalar_u32(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar(column, row);
- }
- int spvc_constant_get_scalar_i32(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_i32(column, row);
- }
- unsigned long long spvc_constant_get_scalar_u64(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_u64(column, row);
- }
- long long spvc_constant_get_scalar_i64(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_i64(column, row);
- }
- unsigned spvc_constant_get_scalar_u16(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_u16(column, row);
- }
- int spvc_constant_get_scalar_i16(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_i16(column, row);
- }
- unsigned spvc_constant_get_scalar_u8(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_u8(column, row);
- }
- int spvc_constant_get_scalar_i8(spvc_constant constant, unsigned column, unsigned row)
- {
- return constant->scalar_i8(column, row);
- }
- void spvc_constant_get_subconstants(spvc_constant constant, const spvc_constant_id **constituents, size_t *count)
- {
- static_assert(sizeof(spvc_constant_id) == sizeof(constant->subconstants.front()), "ID size is not consistent.");
- *constituents = reinterpret_cast<spvc_constant_id *>(constant->subconstants.data());
- *count = constant->subconstants.size();
- }
- spvc_type_id spvc_constant_get_type(spvc_constant constant)
- {
- return constant->constant_type;
- }
- void spvc_constant_set_scalar_fp16(spvc_constant constant, unsigned column, unsigned row, unsigned short value)
- {
- constant->m.c[column].r[row].u32 = value;
- }
- void spvc_constant_set_scalar_fp32(spvc_constant constant, unsigned column, unsigned row, float value)
- {
- constant->m.c[column].r[row].f32 = value;
- }
- void spvc_constant_set_scalar_fp64(spvc_constant constant, unsigned column, unsigned row, double value)
- {
- constant->m.c[column].r[row].f64 = value;
- }
- void spvc_constant_set_scalar_u32(spvc_constant constant, unsigned column, unsigned row, unsigned value)
- {
- constant->m.c[column].r[row].u32 = value;
- }
- void spvc_constant_set_scalar_i32(spvc_constant constant, unsigned column, unsigned row, int value)
- {
- constant->m.c[column].r[row].i32 = value;
- }
- void spvc_constant_set_scalar_u64(spvc_constant constant, unsigned column, unsigned row, unsigned long long value)
- {
- constant->m.c[column].r[row].u64 = value;
- }
- void spvc_constant_set_scalar_i64(spvc_constant constant, unsigned column, unsigned row, long long value)
- {
- constant->m.c[column].r[row].i64 = value;
- }
- void spvc_constant_set_scalar_u16(spvc_constant constant, unsigned column, unsigned row, unsigned short value)
- {
- constant->m.c[column].r[row].u32 = uint32_t(value);
- }
- void spvc_constant_set_scalar_i16(spvc_constant constant, unsigned column, unsigned row, signed short value)
- {
- constant->m.c[column].r[row].u32 = uint32_t(value);
- }
- void spvc_constant_set_scalar_u8(spvc_constant constant, unsigned column, unsigned row, unsigned char value)
- {
- constant->m.c[column].r[row].u32 = uint32_t(value);
- }
- void spvc_constant_set_scalar_i8(spvc_constant constant, unsigned column, unsigned row, signed char value)
- {
- constant->m.c[column].r[row].u32 = uint32_t(value);
- }
- spvc_bool spvc_compiler_get_binary_offset_for_decoration(spvc_compiler compiler, spvc_variable_id id,
- SpvDecoration decoration,
- unsigned *word_offset)
- {
- uint32_t off = 0;
- bool ret = compiler->compiler->get_binary_offset_for_decoration(id, static_cast<Decoration>(decoration), off);
- if (ret)
- {
- *word_offset = off;
- return SPVC_TRUE;
- }
- else
- return SPVC_FALSE;
- }
- spvc_bool spvc_compiler_buffer_is_hlsl_counter_buffer(spvc_compiler compiler, spvc_variable_id id)
- {
- return compiler->compiler->buffer_is_hlsl_counter_buffer(id) ? SPVC_TRUE : SPVC_FALSE;
- }
- spvc_bool spvc_compiler_buffer_get_hlsl_counter_buffer(spvc_compiler compiler, spvc_variable_id id,
- spvc_variable_id *counter_id)
- {
- uint32_t buffer;
- bool ret = compiler->compiler->buffer_get_hlsl_counter_buffer(id, buffer);
- if (ret)
- {
- *counter_id = buffer;
- return SPVC_TRUE;
- }
- else
- return SPVC_FALSE;
- }
- spvc_result spvc_compiler_get_declared_capabilities(spvc_compiler compiler, const SpvCapability **capabilities,
- size_t *num_capabilities)
- {
- auto &caps = compiler->compiler->get_declared_capabilities();
- static_assert(sizeof(SpvCapability) == sizeof(Capability), "Enum size mismatch.");
- *capabilities = reinterpret_cast<const SpvCapability *>(caps.data());
- *num_capabilities = caps.size();
- return SPVC_SUCCESS;
- }
- spvc_result spvc_compiler_get_declared_extensions(spvc_compiler compiler, const char ***extensions,
- size_t *num_extensions)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto &exts = compiler->compiler->get_declared_extensions();
- SmallVector<const char *> duped;
- duped.reserve(exts.size());
- for (auto &ext : exts)
- duped.push_back(compiler->context->allocate_name(ext));
- auto ptr = spvc_allocate<TemporaryBuffer<const char *>>();
- ptr->buffer = std::move(duped);
- *extensions = ptr->buffer.data();
- *num_extensions = ptr->buffer.size();
- compiler->context->allocations.push_back(std::move(ptr));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_OUT_OF_MEMORY)
- return SPVC_SUCCESS;
- }
- const char *spvc_compiler_get_remapped_declared_block_name(spvc_compiler compiler, spvc_variable_id id)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto name = compiler->compiler->get_remapped_declared_block_name(id);
- return compiler->context->allocate_name(name);
- }
- SPVC_END_SAFE_SCOPE(compiler->context, nullptr)
- }
- spvc_result spvc_compiler_get_buffer_block_decorations(spvc_compiler compiler, spvc_variable_id id,
- const SpvDecoration **decorations, size_t *num_decorations)
- {
- SPVC_BEGIN_SAFE_SCOPE
- {
- auto flags = compiler->compiler->get_buffer_block_flags(id);
- auto bitset = spvc_allocate<TemporaryBuffer<SpvDecoration>>();
- flags.for_each_bit([&](uint32_t bit) { bitset->buffer.push_back(static_cast<SpvDecoration>(bit)); });
- *decorations = bitset->buffer.data();
- *num_decorations = bitset->buffer.size();
- compiler->context->allocations.push_back(std::move(bitset));
- }
- SPVC_END_SAFE_SCOPE(compiler->context, SPVC_ERROR_INVALID_ARGUMENT)
- return SPVC_SUCCESS;
- }
- unsigned spvc_msl_get_aux_buffer_struct_version(void)
- {
- return SPVC_MSL_AUX_BUFFER_STRUCT_VERSION;
- }
- void spvc_msl_vertex_attribute_init(spvc_msl_vertex_attribute *attr)
- {
- #if SPIRV_CROSS_C_API_MSL
- // Crude, but works.
- MSLShaderInterfaceVariable attr_default;
- attr->location = attr_default.location;
- attr->format = static_cast<spvc_msl_vertex_format>(attr_default.format);
- attr->builtin = static_cast<SpvBuiltIn>(attr_default.builtin);
- #else
- memset(attr, 0, sizeof(*attr));
- #endif
- }
- void spvc_msl_shader_interface_var_init(spvc_msl_shader_interface_var *var)
- {
- #if SPIRV_CROSS_C_API_MSL
- MSLShaderInterfaceVariable var_default;
- var->location = var_default.location;
- var->format = static_cast<spvc_msl_shader_variable_format>(var_default.format);
- var->builtin = static_cast<SpvBuiltIn>(var_default.builtin);
- var->vecsize = var_default.vecsize;
- #else
- memset(var, 0, sizeof(*var));
- #endif
- }
- void spvc_msl_shader_input_init(spvc_msl_shader_input *input)
- {
- spvc_msl_shader_interface_var_init(input);
- }
- void spvc_msl_shader_interface_var_init_2(spvc_msl_shader_interface_var_2 *var)
- {
- #if SPIRV_CROSS_C_API_MSL
- MSLShaderInterfaceVariable var_default;
- var->location = var_default.location;
- var->format = static_cast<spvc_msl_shader_variable_format>(var_default.format);
- var->builtin = static_cast<SpvBuiltIn>(var_default.builtin);
- var->vecsize = var_default.vecsize;
- var->rate = static_cast<spvc_msl_shader_variable_rate>(var_default.rate);
- #else
- memset(var, 0, sizeof(*var));
- #endif
- }
- void spvc_msl_resource_binding_init(spvc_msl_resource_binding *binding)
- {
- #if SPIRV_CROSS_C_API_MSL
- MSLResourceBinding binding_default;
- binding->desc_set = binding_default.desc_set;
- binding->binding = binding_default.binding;
- binding->msl_buffer = binding_default.msl_buffer;
- binding->msl_texture = binding_default.msl_texture;
- binding->msl_sampler = binding_default.msl_sampler;
- binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
- #else
- memset(binding, 0, sizeof(*binding));
- #endif
- }
- void spvc_msl_resource_binding_init_2(spvc_msl_resource_binding_2 *binding)
- {
- #if SPIRV_CROSS_C_API_MSL
- MSLResourceBinding binding_default;
- binding->desc_set = binding_default.desc_set;
- binding->binding = binding_default.binding;
- binding->msl_buffer = binding_default.msl_buffer;
- binding->msl_texture = binding_default.msl_texture;
- binding->msl_sampler = binding_default.msl_sampler;
- binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
- binding->count = 0;
- #else
- memset(binding, 0, sizeof(*binding));
- #endif
- }
- void spvc_hlsl_resource_binding_init(spvc_hlsl_resource_binding *binding)
- {
- #if SPIRV_CROSS_C_API_HLSL
- HLSLResourceBinding binding_default;
- binding->desc_set = binding_default.desc_set;
- binding->binding = binding_default.binding;
- binding->cbv.register_binding = binding_default.cbv.register_binding;
- binding->cbv.register_space = binding_default.cbv.register_space;
- binding->srv.register_binding = binding_default.srv.register_binding;
- binding->srv.register_space = binding_default.srv.register_space;
- binding->uav.register_binding = binding_default.uav.register_binding;
- binding->uav.register_space = binding_default.uav.register_space;
- binding->sampler.register_binding = binding_default.sampler.register_binding;
- binding->sampler.register_space = binding_default.sampler.register_space;
- binding->stage = static_cast<SpvExecutionModel>(binding_default.stage);
- #else
- memset(binding, 0, sizeof(*binding));
- #endif
- }
- void spvc_msl_constexpr_sampler_init(spvc_msl_constexpr_sampler *sampler)
- {
- #if SPIRV_CROSS_C_API_MSL
- MSLConstexprSampler defaults;
- sampler->anisotropy_enable = defaults.anisotropy_enable ? SPVC_TRUE : SPVC_FALSE;
- sampler->border_color = static_cast<spvc_msl_sampler_border_color>(defaults.border_color);
- sampler->compare_enable = defaults.compare_enable ? SPVC_TRUE : SPVC_FALSE;
- sampler->coord = static_cast<spvc_msl_sampler_coord>(defaults.coord);
- sampler->compare_func = static_cast<spvc_msl_sampler_compare_func>(defaults.compare_func);
- sampler->lod_clamp_enable = defaults.lod_clamp_enable ? SPVC_TRUE : SPVC_FALSE;
- sampler->lod_clamp_max = defaults.lod_clamp_max;
- sampler->lod_clamp_min = defaults.lod_clamp_min;
- sampler->mag_filter = static_cast<spvc_msl_sampler_filter>(defaults.mag_filter);
- sampler->min_filter = static_cast<spvc_msl_sampler_filter>(defaults.min_filter);
- sampler->mip_filter = static_cast<spvc_msl_sampler_mip_filter>(defaults.mip_filter);
- sampler->max_anisotropy = defaults.max_anisotropy;
- sampler->s_address = static_cast<spvc_msl_sampler_address>(defaults.s_address);
- sampler->t_address = static_cast<spvc_msl_sampler_address>(defaults.t_address);
- sampler->r_address = static_cast<spvc_msl_sampler_address>(defaults.r_address);
- #else
- memset(sampler, 0, sizeof(*sampler));
- #endif
- }
- void spvc_msl_sampler_ycbcr_conversion_init(spvc_msl_sampler_ycbcr_conversion *conv)
- {
- #if SPIRV_CROSS_C_API_MSL
- MSLConstexprSampler defaults;
- conv->planes = defaults.planes;
- conv->resolution = static_cast<spvc_msl_format_resolution>(defaults.resolution);
- conv->chroma_filter = static_cast<spvc_msl_sampler_filter>(defaults.chroma_filter);
- conv->x_chroma_offset = static_cast<spvc_msl_chroma_location>(defaults.x_chroma_offset);
- conv->y_chroma_offset = static_cast<spvc_msl_chroma_location>(defaults.y_chroma_offset);
- for (int i = 0; i < 4; i++)
- conv->swizzle[i] = static_cast<spvc_msl_component_swizzle>(defaults.swizzle[i]);
- conv->ycbcr_model = static_cast<spvc_msl_sampler_ycbcr_model_conversion>(defaults.ycbcr_model);
- conv->ycbcr_range = static_cast<spvc_msl_sampler_ycbcr_range>(defaults.ycbcr_range);
- #else
- memset(conv, 0, sizeof(*conv));
- #endif
- }
- unsigned spvc_compiler_get_current_id_bound(spvc_compiler compiler)
- {
- return compiler->compiler->get_current_id_bound();
- }
- void spvc_get_version(unsigned *major, unsigned *minor, unsigned *patch)
- {
- *major = SPVC_C_API_VERSION_MAJOR;
- *minor = SPVC_C_API_VERSION_MINOR;
- *patch = SPVC_C_API_VERSION_PATCH;
- }
- const char *spvc_get_commit_revision_and_timestamp(void)
- {
- #ifdef HAVE_SPIRV_CROSS_GIT_VERSION
- return SPIRV_CROSS_GIT_REVISION;
- #else
- return "";
- #endif
- }
- #ifdef _MSC_VER
- #pragma warning(pop)
- #endif
|