12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355 |
- /*
- Simple DirectMedia Layer
- Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- */
- /* WIKI CATEGORY: GPU */
- /**
- * # CategoryGPU
- *
- * The GPU API offers a cross-platform way for apps to talk to modern graphics
- * hardware. It offers both 3D graphics and compute support, in the style of
- * Metal, Vulkan, and Direct3D 12.
- *
- * A basic workflow might be something like this:
- *
- * The app creates a GPU device with SDL_CreateGPUDevice(), and assigns it to
- * a window with SDL_ClaimWindowForGPUDevice()--although strictly speaking you
- * can render offscreen entirely, perhaps for image processing, and not use a
- * window at all.
- *
- * Next, the app prepares static data (things that are created once and used
- * over and over). For example:
- *
- * - Shaders (programs that run on the GPU): use SDL_CreateGPUShader().
- * - Vertex buffers (arrays of geometry data) and other rendering data: use
- * SDL_CreateGPUBuffer() and SDL_UploadToGPUBuffer().
- * - Textures (images): use SDL_CreateGPUTexture() and
- * SDL_UploadToGPUTexture().
- * - Samplers (how textures should be read from): use SDL_CreateGPUSampler().
- * - Render pipelines (precalculated rendering state): use
- * SDL_CreateGPUGraphicsPipeline()
- *
- * To render, the app creates one or more command buffers, with
- * SDL_AcquireGPUCommandBuffer(). Command buffers collect rendering
- * instructions that will be submitted to the GPU in batch. Complex scenes can
- * use multiple command buffers, maybe configured across multiple threads in
- * parallel, as long as they are submitted in the correct order, but many apps
- * will just need one command buffer per frame.
- *
- * Rendering can happen to a texture (what other APIs call a "render target")
- * or it can happen to the swapchain texture (which is just a special texture
- * that represents a window's contents). The app can use
- * SDL_WaitAndAcquireGPUSwapchainTexture() to render to the window.
- *
- * Rendering actually happens in a Render Pass, which is encoded into a
- * command buffer. One can encode multiple render passes (or alternate between
- * render and compute passes) in a single command buffer, but many apps might
- * simply need a single render pass in a single command buffer. Render Passes
- * can render to up to four color textures and one depth texture
- * simultaneously. If the set of textures being rendered to needs to change,
- * the Render Pass must be ended and a new one must be begun.
- *
- * The app calls SDL_BeginGPURenderPass(). Then it sets states it needs for
- * each draw:
- *
- * - SDL_BindGPUGraphicsPipeline()
- * - SDL_SetGPUViewport()
- * - SDL_BindGPUVertexBuffers()
- * - SDL_BindGPUVertexSamplers()
- * - etc
- *
- * Then, make the actual draw commands with these states:
- *
- * - SDL_DrawGPUPrimitives()
- * - SDL_DrawGPUPrimitivesIndirect()
- * - SDL_DrawGPUIndexedPrimitivesIndirect()
- * - etc
- *
- * After all the drawing commands for a pass are complete, the app should call
- * SDL_EndGPURenderPass(). Once a render pass ends all render-related state is
- * reset.
- *
- * The app can begin new Render Passes and make new draws in the same command
- * buffer until the entire scene is rendered.
- *
- * Once all of the render commands for the scene are complete, the app calls
- * SDL_SubmitGPUCommandBuffer() to send it to the GPU for processing.
- *
- * If the app needs to read back data from texture or buffers, the API has an
- * efficient way of doing this, provided that the app is willing to tolerate
- * some latency. When the app uses SDL_DownloadFromGPUTexture() or
- * SDL_DownloadFromGPUBuffer(), submitting the command buffer with
- * SDL_SubmitGPUCommandBufferAndAcquireFence() will return a fence handle that
- * the app can poll or wait on in a thread. Once the fence indicates that the
- * command buffer is done processing, it is safe to read the downloaded data.
- * Make sure to call SDL_ReleaseGPUFence() when done with the fence.
- *
- * The API also has "compute" support. The app calls SDL_BeginGPUComputePass()
- * with compute-writeable textures and/or buffers, which can be written to in
- * a compute shader. Then it sets states it needs for the compute dispatches:
- *
- * - SDL_BindGPUComputePipeline()
- * - SDL_BindGPUComputeStorageBuffers()
- * - SDL_BindGPUComputeStorageTextures()
- *
- * Then, dispatch compute work:
- *
- * - SDL_DispatchGPUCompute()
- *
- * For advanced users, this opens up powerful GPU-driven workflows.
- *
- * Graphics and compute pipelines require the use of shaders, which as
- * mentioned above are small programs executed on the GPU. Each backend
- * (Vulkan, Metal, D3D12) requires a different shader format. When the app
- * creates the GPU device, the app lets the device know which shader formats
- * the app can provide. It will then select the appropriate backend depending
- * on the available shader formats and the backends available on the platform.
- * When creating shaders, the app must provide the correct shader format for
- * the selected backend. If you would like to learn more about why the API
- * works this way, there is a detailed
- * [blog post](https://moonside.games/posts/layers-all-the-way-down/)
- * explaining this situation.
- *
- * It is optimal for apps to pre-compile the shader formats they might use,
- * but for ease of use SDL provides a separate project,
- * [SDL_shadercross](https://github.com/libsdl-org/SDL_shadercross)
- * , for performing runtime shader cross-compilation. It also has a CLI
- * interface for offline precompilation as well.
- *
- * This is an extremely quick overview that leaves out several important
- * details. Already, though, one can see that GPU programming can be quite
- * complex! If you just need simple 2D graphics, the
- * [Render API](https://wiki.libsdl.org/SDL3/CategoryRender)
- * is much easier to use but still hardware-accelerated. That said, even for
- * 2D applications the performance benefits and expressiveness of the GPU API
- * are significant.
- *
- * The GPU API targets a feature set with a wide range of hardware support and
- * ease of portability. It is designed so that the app won't have to branch
- * itself by querying feature support. If you need cutting-edge features with
- * limited hardware support, this API is probably not for you.
- *
- * Examples demonstrating proper usage of this API can be found
- * [here](https://github.com/TheSpydog/SDL_gpu_examples)
- * .
- *
- * ## Performance considerations
- *
- * Here are some basic tips for maximizing your rendering performance.
- *
- * - Beginning a new render pass is relatively expensive. Use as few render
- * passes as you can.
- * - Minimize the amount of state changes. For example, binding a pipeline is
- * relatively cheap, but doing it hundreds of times when you don't need to
- * will slow the performance significantly.
- * - Perform your data uploads as early as possible in the frame.
- * - Don't churn resources. Creating and releasing resources is expensive.
- * It's better to create what you need up front and cache it.
- * - Don't use uniform buffers for large amounts of data (more than a matrix
- * or so). Use a storage buffer instead.
- * - Use cycling correctly. There is a detailed explanation of cycling further
- * below.
- * - Use culling techniques to minimize pixel writes. The less writing the GPU
- * has to do the better. Culling can be a very advanced topic but even
- * simple culling techniques can boost performance significantly.
- *
- * In general try to remember the golden rule of performance: doing things is
- * more expensive than not doing things. Don't Touch The Driver!
- *
- * ## FAQ
- *
- * **Question: When are you adding more advanced features, like ray tracing or
- * mesh shaders?**
- *
- * Answer: We don't have immediate plans to add more bleeding-edge features,
- * but we certainly might in the future, when these features prove worthwhile,
- * and reasonable to implement across several platforms and underlying APIs.
- * So while these things are not in the "never" category, they are definitely
- * not "near future" items either.
- *
- * **Question: Why is my shader not working?**
- *
- * Answer: A common oversight when using shaders is not properly laying out
- * the shader resources/registers correctly. The GPU API is very strict with
- * how it wants resources to be laid out and it's difficult for the API to
- * automatically validate shaders to see if they have a compatible layout. See
- * the documentation for SDL_CreateGPUShader() and
- * SDL_CreateGPUComputePipeline() for information on the expected layout.
- *
- * Another common issue is not setting the correct number of samplers,
- * textures, and buffers in SDL_GPUShaderCreateInfo. If possible use shader
- * reflection to extract the required information from the shader
- * automatically instead of manually filling in the struct's values.
- *
- * **Question: My application isn't performing very well. Is this the GPU
- * API's fault?**
- *
- * Answer: No. Long answer: The GPU API is a relatively thin layer over the
- * underlying graphics API. While it's possible that we have done something
- * inefficiently, it's very unlikely especially if you are relatively
- * inexperienced with GPU rendering. Please see the performance tips above and
- * make sure you are following them. Additionally, tools like RenderDoc can be
- * very helpful for diagnosing incorrect behavior and performance issues.
- *
- * ## System Requirements
- *
- * **Vulkan:** Supported on Windows, Linux, Nintendo Switch, and certain
- * Android devices. Requires Vulkan 1.0 with the following extensions and
- * device features:
- *
- * - `VK_KHR_swapchain`
- * - `VK_KHR_maintenance1`
- * - `independentBlend`
- * - `imageCubeArray`
- * - `depthClamp`
- * - `shaderClipDistance`
- * - `drawIndirectFirstInstance`
- * - `sampleRateShading`
- *
- * **D3D12:** Supported on Windows 10 or newer, Xbox One (GDK), and Xbox
- * Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level
- * 11_1.
- *
- * **Metal:** Supported on macOS 10.14+ and iOS/tvOS 13.0+. Hardware
- * requirements vary by operating system:
- *
- * - macOS requires an Apple Silicon or
- * [Intel Mac2 family](https://developer.apple.com/documentation/metal/mtlfeatureset/mtlfeatureset_macos_gpufamily2_v1?language=objc)
- * GPU
- * - iOS/tvOS requires an A9 GPU or newer
- * - iOS Simulator and tvOS Simulator are unsupported
- *
- * ## Coordinate System
- *
- * The GPU API uses a left-handed coordinate system, following the convention
- * of D3D12 and Metal. Specifically: - **Normalized Device Coordinates:** The
- * lower-left corner has an x,y coordinate of `(-1.0, -1.0)`. The upper-right
- * corner is `(1.0, 1.0)`. Z values range from `[0.0, 1.0]` where 0 is the
- * near plane. - **Viewport Coordinates:** The top-left corner has an x,y
- * coordinate of `(0, 0)` and extends to the bottom-right corner at
- * `(viewportWidth, viewportHeight)`. +Y is down. - **Texture Coordinates:**
- * The top-left corner has an x,y coordinate of `(0, 0)` and extends to the
- * bottom-right corner at `(1.0, 1.0)`. +Y is down.
- *
- * If the backend driver differs from this convention (e.g. Vulkan, which has
- * an NDC that assumes +Y is down), SDL will automatically convert the
- * coordinate system behind the scenes, so you don't need to perform any
- * coordinate flipping logic in your shaders.
- *
- * ## Uniform Data
- *
- * Uniforms are for passing data to shaders. The uniform data will be constant
- * across all executions of the shader.
- *
- * There are 4 available uniform slots per shader stage (where the stages are
- * vertex, fragment, and compute). Uniform data pushed to a slot on a stage
- * keeps its value throughout the command buffer until you call the relevant
- * Push function on that slot again.
- *
- * For example, you could write your vertex shaders to read a camera matrix
- * from uniform binding slot 0, push the camera matrix at the start of the
- * command buffer, and that data will be used for every subsequent draw call.
- *
- * It is valid to push uniform data during a render or compute pass.
- *
- * Uniforms are best for pushing small amounts of data. If you are pushing
- * more than a matrix or two per call you should consider using a storage
- * buffer instead.
- *
- * ## A Note On Cycling
- *
- * When using a command buffer, operations do not occur immediately - they
- * occur some time after the command buffer is submitted.
- *
- * When a resource is used in a pending or active command buffer, it is
- * considered to be "bound". When a resource is no longer used in any pending
- * or active command buffers, it is considered to be "unbound".
- *
- * If data resources are bound, it is unspecified when that data will be
- * unbound unless you acquire a fence when submitting the command buffer and
- * wait on it. However, this doesn't mean you need to track resource usage
- * manually.
- *
- * All of the functions and structs that involve writing to a resource have a
- * "cycle" bool. SDL_GPUTransferBuffer, SDL_GPUBuffer, and SDL_GPUTexture all
- * effectively function as ring buffers on internal resources. When cycle is
- * true, if the resource is bound, the cycle rotates to the next unbound
- * internal resource, or if none are available, a new one is created. This
- * means you don't have to worry about complex state tracking and
- * synchronization as long as cycling is correctly employed.
- *
- * For example: you can call SDL_MapGPUTransferBuffer(), write texture data,
- * SDL_UnmapGPUTransferBuffer(), and then SDL_UploadToGPUTexture(). The next
- * time you write texture data to the transfer buffer, if you set the cycle
- * param to true, you don't have to worry about overwriting any data that is
- * not yet uploaded.
- *
- * Another example: If you are using a texture in a render pass every frame,
- * this can cause a data dependency between frames. If you set cycle to true
- * in the SDL_GPUColorTargetInfo struct, you can prevent this data dependency.
- *
- * Cycling will never undefine already bound data. When cycling, all data in
- * the resource is considered to be undefined for subsequent commands until
- * that data is written again. You must take care not to read undefined data.
- *
- * Note that when cycling a texture, the entire texture will be cycled, even
- * if only part of the texture is used in the call, so you must consider the
- * entire texture to contain undefined data after cycling.
- *
- * You must also take care not to overwrite a section of data that has been
- * referenced in a command without cycling first. It is OK to overwrite
- * unreferenced data in a bound resource without cycling, but overwriting a
- * section of data that has already been referenced will produce unexpected
- * results.
- */
- #ifndef SDL_gpu_h_
- #define SDL_gpu_h_
- #include <SDL3/SDL_stdinc.h>
- #include <SDL3/SDL_pixels.h>
- #include <SDL3/SDL_properties.h>
- #include <SDL3/SDL_rect.h>
- #include <SDL3/SDL_surface.h>
- #include <SDL3/SDL_video.h>
- #include <SDL3/SDL_begin_code.h>
- #ifdef __cplusplus
- extern "C" {
- #endif /* __cplusplus */
- /* Type Declarations */
- /**
- * An opaque handle representing the SDL_GPU context.
- *
- * \since This struct is available since SDL 3.2.0.
- */
- typedef struct SDL_GPUDevice SDL_GPUDevice;
- /**
- * An opaque handle representing a buffer.
- *
- * Used for vertices, indices, indirect draw commands, and general compute
- * data.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUBuffer
- * \sa SDL_UploadToGPUBuffer
- * \sa SDL_DownloadFromGPUBuffer
- * \sa SDL_CopyGPUBufferToBuffer
- * \sa SDL_BindGPUVertexBuffers
- * \sa SDL_BindGPUIndexBuffer
- * \sa SDL_BindGPUVertexStorageBuffers
- * \sa SDL_BindGPUFragmentStorageBuffers
- * \sa SDL_DrawGPUPrimitivesIndirect
- * \sa SDL_DrawGPUIndexedPrimitivesIndirect
- * \sa SDL_BindGPUComputeStorageBuffers
- * \sa SDL_DispatchGPUComputeIndirect
- * \sa SDL_ReleaseGPUBuffer
- */
- typedef struct SDL_GPUBuffer SDL_GPUBuffer;
- /**
- * An opaque handle representing a transfer buffer.
- *
- * Used for transferring data to and from the device.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTransferBuffer
- * \sa SDL_MapGPUTransferBuffer
- * \sa SDL_UnmapGPUTransferBuffer
- * \sa SDL_UploadToGPUBuffer
- * \sa SDL_UploadToGPUTexture
- * \sa SDL_DownloadFromGPUBuffer
- * \sa SDL_DownloadFromGPUTexture
- * \sa SDL_ReleaseGPUTransferBuffer
- */
- typedef struct SDL_GPUTransferBuffer SDL_GPUTransferBuffer;
- /**
- * An opaque handle representing a texture.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- * \sa SDL_UploadToGPUTexture
- * \sa SDL_DownloadFromGPUTexture
- * \sa SDL_CopyGPUTextureToTexture
- * \sa SDL_BindGPUVertexSamplers
- * \sa SDL_BindGPUVertexStorageTextures
- * \sa SDL_BindGPUFragmentSamplers
- * \sa SDL_BindGPUFragmentStorageTextures
- * \sa SDL_BindGPUComputeStorageTextures
- * \sa SDL_GenerateMipmapsForGPUTexture
- * \sa SDL_BlitGPUTexture
- * \sa SDL_ReleaseGPUTexture
- */
- typedef struct SDL_GPUTexture SDL_GPUTexture;
- /**
- * An opaque handle representing a sampler.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUSampler
- * \sa SDL_BindGPUVertexSamplers
- * \sa SDL_BindGPUFragmentSamplers
- * \sa SDL_ReleaseGPUSampler
- */
- typedef struct SDL_GPUSampler SDL_GPUSampler;
- /**
- * An opaque handle representing a compiled shader object.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- * \sa SDL_CreateGPUGraphicsPipeline
- * \sa SDL_ReleaseGPUShader
- */
- typedef struct SDL_GPUShader SDL_GPUShader;
- /**
- * An opaque handle representing a compute pipeline.
- *
- * Used during compute passes.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUComputePipeline
- * \sa SDL_BindGPUComputePipeline
- * \sa SDL_ReleaseGPUComputePipeline
- */
- typedef struct SDL_GPUComputePipeline SDL_GPUComputePipeline;
- /**
- * An opaque handle representing a graphics pipeline.
- *
- * Used during render passes.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- * \sa SDL_BindGPUGraphicsPipeline
- * \sa SDL_ReleaseGPUGraphicsPipeline
- */
- typedef struct SDL_GPUGraphicsPipeline SDL_GPUGraphicsPipeline;
- /**
- * An opaque handle representing a command buffer.
- *
- * Most state is managed via command buffers. When setting state using a
- * command buffer, that state is local to the command buffer.
- *
- * Commands only begin execution on the GPU once SDL_SubmitGPUCommandBuffer is
- * called. Once the command buffer is submitted, it is no longer valid to use
- * it.
- *
- * Command buffers are executed in submission order. If you submit command
- * buffer A and then command buffer B all commands in A will begin executing
- * before any command in B begins executing.
- *
- * In multi-threading scenarios, you should only access a command buffer on
- * the thread you acquired it from.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_AcquireGPUCommandBuffer
- * \sa SDL_SubmitGPUCommandBuffer
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- */
- typedef struct SDL_GPUCommandBuffer SDL_GPUCommandBuffer;
- /**
- * An opaque handle representing a render pass.
- *
- * This handle is transient and should not be held or referenced after
- * SDL_EndGPURenderPass is called.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPURenderPass
- * \sa SDL_EndGPURenderPass
- */
- typedef struct SDL_GPURenderPass SDL_GPURenderPass;
- /**
- * An opaque handle representing a compute pass.
- *
- * This handle is transient and should not be held or referenced after
- * SDL_EndGPUComputePass is called.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPUComputePass
- * \sa SDL_EndGPUComputePass
- */
- typedef struct SDL_GPUComputePass SDL_GPUComputePass;
- /**
- * An opaque handle representing a copy pass.
- *
- * This handle is transient and should not be held or referenced after
- * SDL_EndGPUCopyPass is called.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPUCopyPass
- * \sa SDL_EndGPUCopyPass
- */
- typedef struct SDL_GPUCopyPass SDL_GPUCopyPass;
- /**
- * An opaque handle representing a fence.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- * \sa SDL_QueryGPUFence
- * \sa SDL_WaitForGPUFences
- * \sa SDL_ReleaseGPUFence
- */
- typedef struct SDL_GPUFence SDL_GPUFence;
- /**
- * Specifies the primitive topology of a graphics pipeline.
- *
- * If you are using POINTLIST you must include a point size output in the
- * vertex shader.
- *
- * - For HLSL compiling to SPIRV you must decorate a float output with
- * [[vk::builtin("PointSize")]].
- * - For GLSL you must set the gl_PointSize builtin.
- * - For MSL you must include a float output with the [[point_size]]
- * decorator.
- *
- * Note that sized point topology is totally unsupported on D3D12. Any size
- * other than 1 will be ignored. In general, you should avoid using point
- * topology for both compatibility and performance reasons. You WILL regret
- * using it.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUPrimitiveType
- {
- SDL_GPU_PRIMITIVETYPE_TRIANGLELIST, /**< A series of separate triangles. */
- SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP, /**< A series of connected triangles. */
- SDL_GPU_PRIMITIVETYPE_LINELIST, /**< A series of separate lines. */
- SDL_GPU_PRIMITIVETYPE_LINESTRIP, /**< A series of connected lines. */
- SDL_GPU_PRIMITIVETYPE_POINTLIST /**< A series of separate points. */
- } SDL_GPUPrimitiveType;
- /**
- * Specifies how the contents of a texture attached to a render pass are
- * treated at the beginning of the render pass.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPURenderPass
- */
- typedef enum SDL_GPULoadOp
- {
- SDL_GPU_LOADOP_LOAD, /**< The previous contents of the texture will be preserved. */
- SDL_GPU_LOADOP_CLEAR, /**< The contents of the texture will be cleared to a color. */
- SDL_GPU_LOADOP_DONT_CARE /**< The previous contents of the texture need not be preserved. The contents will be undefined. */
- } SDL_GPULoadOp;
- /**
- * Specifies how the contents of a texture attached to a render pass are
- * treated at the end of the render pass.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPURenderPass
- */
- typedef enum SDL_GPUStoreOp
- {
- SDL_GPU_STOREOP_STORE, /**< The contents generated during the render pass will be written to memory. */
- SDL_GPU_STOREOP_DONT_CARE, /**< The contents generated during the render pass are not needed and may be discarded. The contents will be undefined. */
- SDL_GPU_STOREOP_RESOLVE, /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture may then be discarded and will be undefined. */
- SDL_GPU_STOREOP_RESOLVE_AND_STORE /**< The multisample contents generated during the render pass will be resolved to a non-multisample texture. The contents in the multisample texture will be written to memory. */
- } SDL_GPUStoreOp;
- /**
- * Specifies the size of elements in an index buffer.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUIndexElementSize
- {
- SDL_GPU_INDEXELEMENTSIZE_16BIT, /**< The index elements are 16-bit. */
- SDL_GPU_INDEXELEMENTSIZE_32BIT /**< The index elements are 32-bit. */
- } SDL_GPUIndexElementSize;
- /**
- * Specifies the pixel format of a texture.
- *
- * Texture format support varies depending on driver, hardware, and usage
- * flags. In general, you should use SDL_GPUTextureSupportsFormat to query if
- * a format is supported before using it. However, there are a few guaranteed
- * formats.
- *
- * FIXME: Check universal support for 32-bit component formats FIXME: Check
- * universal support for SIMULTANEOUS_READ_WRITE
- *
- * For SAMPLER usage, the following formats are universally supported:
- *
- * - R8G8B8A8_UNORM
- * - B8G8R8A8_UNORM
- * - R8_UNORM
- * - R8_SNORM
- * - R8G8_UNORM
- * - R8G8_SNORM
- * - R8G8B8A8_SNORM
- * - R16_FLOAT
- * - R16G16_FLOAT
- * - R16G16B16A16_FLOAT
- * - R32_FLOAT
- * - R32G32_FLOAT
- * - R32G32B32A32_FLOAT
- * - R11G11B10_UFLOAT
- * - R8G8B8A8_UNORM_SRGB
- * - B8G8R8A8_UNORM_SRGB
- * - D16_UNORM
- *
- * For COLOR_TARGET usage, the following formats are universally supported:
- *
- * - R8G8B8A8_UNORM
- * - B8G8R8A8_UNORM
- * - R8_UNORM
- * - R16_FLOAT
- * - R16G16_FLOAT
- * - R16G16B16A16_FLOAT
- * - R32_FLOAT
- * - R32G32_FLOAT
- * - R32G32B32A32_FLOAT
- * - R8_UINT
- * - R8G8_UINT
- * - R8G8B8A8_UINT
- * - R16_UINT
- * - R16G16_UINT
- * - R16G16B16A16_UINT
- * - R8_INT
- * - R8G8_INT
- * - R8G8B8A8_INT
- * - R16_INT
- * - R16G16_INT
- * - R16G16B16A16_INT
- * - R8G8B8A8_UNORM_SRGB
- * - B8G8R8A8_UNORM_SRGB
- *
- * For STORAGE usages, the following formats are universally supported:
- *
- * - R8G8B8A8_UNORM
- * - R8G8B8A8_SNORM
- * - R16G16B16A16_FLOAT
- * - R32_FLOAT
- * - R32G32_FLOAT
- * - R32G32B32A32_FLOAT
- * - R8G8B8A8_UINT
- * - R16G16B16A16_UINT
- * - R8G8B8A8_INT
- * - R16G16B16A16_INT
- *
- * For DEPTH_STENCIL_TARGET usage, the following formats are universally
- * supported:
- *
- * - D16_UNORM
- * - Either (but not necessarily both!) D24_UNORM or D32_FLOAT
- * - Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_FLOAT_S8_UINT
- *
- * Unless D16_UNORM is sufficient for your purposes, always check which of
- * D24/D32 is supported before creating a depth-stencil texture!
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- * \sa SDL_GPUTextureSupportsFormat
- */
- typedef enum SDL_GPUTextureFormat
- {
- SDL_GPU_TEXTUREFORMAT_INVALID,
- /* Unsigned Normalized Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_A8_UNORM,
- SDL_GPU_TEXTUREFORMAT_R8_UNORM,
- SDL_GPU_TEXTUREFORMAT_R8G8_UNORM,
- SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM,
- SDL_GPU_TEXTUREFORMAT_R16_UNORM,
- SDL_GPU_TEXTUREFORMAT_R16G16_UNORM,
- SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM,
- SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM,
- SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM,
- SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM,
- SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM,
- SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM,
- /* Compressed Unsigned Normalized Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM,
- SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM,
- SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM,
- SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM,
- SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM,
- SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM,
- /* Compressed Signed Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT,
- /* Compressed Unsigned Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT,
- /* Signed Normalized Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_R8_SNORM,
- SDL_GPU_TEXTUREFORMAT_R8G8_SNORM,
- SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM,
- SDL_GPU_TEXTUREFORMAT_R16_SNORM,
- SDL_GPU_TEXTUREFORMAT_R16G16_SNORM,
- SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM,
- /* Signed Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_R16_FLOAT,
- SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT,
- SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT,
- SDL_GPU_TEXTUREFORMAT_R32_FLOAT,
- SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT,
- SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT,
- /* Unsigned Float Color Formats */
- SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT,
- /* Unsigned Integer Color Formats */
- SDL_GPU_TEXTUREFORMAT_R8_UINT,
- SDL_GPU_TEXTUREFORMAT_R8G8_UINT,
- SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT,
- SDL_GPU_TEXTUREFORMAT_R16_UINT,
- SDL_GPU_TEXTUREFORMAT_R16G16_UINT,
- SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT,
- SDL_GPU_TEXTUREFORMAT_R32_UINT,
- SDL_GPU_TEXTUREFORMAT_R32G32_UINT,
- SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT,
- /* Signed Integer Color Formats */
- SDL_GPU_TEXTUREFORMAT_R8_INT,
- SDL_GPU_TEXTUREFORMAT_R8G8_INT,
- SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT,
- SDL_GPU_TEXTUREFORMAT_R16_INT,
- SDL_GPU_TEXTUREFORMAT_R16G16_INT,
- SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT,
- SDL_GPU_TEXTUREFORMAT_R32_INT,
- SDL_GPU_TEXTUREFORMAT_R32G32_INT,
- SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT,
- /* SRGB Unsigned Normalized Color Formats */
- SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB,
- /* Compressed SRGB Unsigned Normalized Color Formats */
- SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB,
- /* Depth Formats */
- SDL_GPU_TEXTUREFORMAT_D16_UNORM,
- SDL_GPU_TEXTUREFORMAT_D24_UNORM,
- SDL_GPU_TEXTUREFORMAT_D32_FLOAT,
- SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT,
- SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT,
- /* Compressed ASTC Normalized Float Color Formats*/
- SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM,
- SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM,
- /* Compressed SRGB ASTC Normalized Float Color Formats*/
- SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB,
- SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB,
- /* Compressed ASTC Signed Float Color Formats*/
- SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT,
- SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT
- } SDL_GPUTextureFormat;
- /**
- * Specifies how a texture is intended to be used by the client.
- *
- * A texture must have at least one usage flag. Note that some usage flag
- * combinations are invalid.
- *
- * With regards to compute storage usage, READ | WRITE means that you can have
- * shader A that only writes into the texture and shader B that only reads
- * from the texture and bind the same texture to either shader respectively.
- * SIMULTANEOUS means that you can do reads and writes within the same shader
- * or compute pass. It also implies that atomic ops can be used, since those
- * are read-modify-write operations. If you use SIMULTANEOUS, you are
- * responsible for avoiding data races, as there is no data synchronization
- * within a compute pass. Note that SIMULTANEOUS usage is only supported by a
- * limited number of texture formats.
- *
- * \since This datatype is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- */
- typedef Uint32 SDL_GPUTextureUsageFlags;
- #define SDL_GPU_TEXTUREUSAGE_SAMPLER (1u << 0) /**< Texture supports sampling. */
- #define SDL_GPU_TEXTUREUSAGE_COLOR_TARGET (1u << 1) /**< Texture is a color render target. */
- #define SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET (1u << 2) /**< Texture is a depth stencil target. */
- #define SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Texture supports storage reads in graphics stages. */
- #define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Texture supports storage reads in the compute stage. */
- #define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Texture supports storage writes in the compute stage. */
- #define SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE (1u << 6) /**< Texture supports reads and writes in the same compute shader. This is NOT equivalent to READ | WRITE. */
- /**
- * Specifies the type of a texture.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- */
- typedef enum SDL_GPUTextureType
- {
- SDL_GPU_TEXTURETYPE_2D, /**< The texture is a 2-dimensional image. */
- SDL_GPU_TEXTURETYPE_2D_ARRAY, /**< The texture is a 2-dimensional array image. */
- SDL_GPU_TEXTURETYPE_3D, /**< The texture is a 3-dimensional image. */
- SDL_GPU_TEXTURETYPE_CUBE, /**< The texture is a cube image. */
- SDL_GPU_TEXTURETYPE_CUBE_ARRAY /**< The texture is a cube array image. */
- } SDL_GPUTextureType;
- /**
- * Specifies the sample count of a texture.
- *
- * Used in multisampling. Note that this value only applies when the texture
- * is used as a render target.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- * \sa SDL_GPUTextureSupportsSampleCount
- */
- typedef enum SDL_GPUSampleCount
- {
- SDL_GPU_SAMPLECOUNT_1, /**< No multisampling. */
- SDL_GPU_SAMPLECOUNT_2, /**< MSAA 2x */
- SDL_GPU_SAMPLECOUNT_4, /**< MSAA 4x */
- SDL_GPU_SAMPLECOUNT_8 /**< MSAA 8x */
- } SDL_GPUSampleCount;
- /**
- * Specifies the face of a cube map.
- *
- * Can be passed in as the layer field in texture-related structs.
- *
- * \since This enum is available since SDL 3.2.0.
- */
- typedef enum SDL_GPUCubeMapFace
- {
- SDL_GPU_CUBEMAPFACE_POSITIVEX,
- SDL_GPU_CUBEMAPFACE_NEGATIVEX,
- SDL_GPU_CUBEMAPFACE_POSITIVEY,
- SDL_GPU_CUBEMAPFACE_NEGATIVEY,
- SDL_GPU_CUBEMAPFACE_POSITIVEZ,
- SDL_GPU_CUBEMAPFACE_NEGATIVEZ
- } SDL_GPUCubeMapFace;
- /**
- * Specifies how a buffer is intended to be used by the client.
- *
- * A buffer must have at least one usage flag. Note that some usage flag
- * combinations are invalid.
- *
- * Unlike textures, READ | WRITE can be used for simultaneous read-write
- * usage. The same data synchronization concerns as textures apply.
- *
- * If you use a STORAGE flag, the data in the buffer must respect std140
- * layout conventions. In practical terms this means you must ensure that vec3
- * and vec4 fields are 16-byte aligned.
- *
- * \since This datatype is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUBuffer
- */
- typedef Uint32 SDL_GPUBufferUsageFlags;
- #define SDL_GPU_BUFFERUSAGE_VERTEX (1u << 0) /**< Buffer is a vertex buffer. */
- #define SDL_GPU_BUFFERUSAGE_INDEX (1u << 1) /**< Buffer is an index buffer. */
- #define SDL_GPU_BUFFERUSAGE_INDIRECT (1u << 2) /**< Buffer is an indirect buffer. */
- #define SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ (1u << 3) /**< Buffer supports storage reads in graphics stages. */
- #define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ (1u << 4) /**< Buffer supports storage reads in the compute stage. */
- #define SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE (1u << 5) /**< Buffer supports storage writes in the compute stage. */
- /**
- * Specifies how a transfer buffer is intended to be used by the client.
- *
- * Note that mapping and copying FROM an upload transfer buffer or TO a
- * download transfer buffer is undefined behavior.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTransferBuffer
- */
- typedef enum SDL_GPUTransferBufferUsage
- {
- SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD,
- SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD
- } SDL_GPUTransferBufferUsage;
- /**
- * Specifies which stage a shader program corresponds to.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- typedef enum SDL_GPUShaderStage
- {
- SDL_GPU_SHADERSTAGE_VERTEX,
- SDL_GPU_SHADERSTAGE_FRAGMENT
- } SDL_GPUShaderStage;
- /**
- * Specifies the format of shader code.
- *
- * Each format corresponds to a specific backend that accepts it.
- *
- * \since This datatype is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- typedef Uint32 SDL_GPUShaderFormat;
- #define SDL_GPU_SHADERFORMAT_INVALID 0
- #define SDL_GPU_SHADERFORMAT_PRIVATE (1u << 0) /**< Shaders for NDA'd platforms. */
- #define SDL_GPU_SHADERFORMAT_SPIRV (1u << 1) /**< SPIR-V shaders for Vulkan. */
- #define SDL_GPU_SHADERFORMAT_DXBC (1u << 2) /**< DXBC SM5_1 shaders for D3D12. */
- #define SDL_GPU_SHADERFORMAT_DXIL (1u << 3) /**< DXIL SM6_0 shaders for D3D12. */
- #define SDL_GPU_SHADERFORMAT_MSL (1u << 4) /**< MSL shaders for Metal. */
- #define SDL_GPU_SHADERFORMAT_METALLIB (1u << 5) /**< Precompiled metallib shaders for Metal. */
- /**
- * Specifies the format of a vertex attribute.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUVertexElementFormat
- {
- SDL_GPU_VERTEXELEMENTFORMAT_INVALID,
- /* 32-bit Signed Integers */
- SDL_GPU_VERTEXELEMENTFORMAT_INT,
- SDL_GPU_VERTEXELEMENTFORMAT_INT2,
- SDL_GPU_VERTEXELEMENTFORMAT_INT3,
- SDL_GPU_VERTEXELEMENTFORMAT_INT4,
- /* 32-bit Unsigned Integers */
- SDL_GPU_VERTEXELEMENTFORMAT_UINT,
- SDL_GPU_VERTEXELEMENTFORMAT_UINT2,
- SDL_GPU_VERTEXELEMENTFORMAT_UINT3,
- SDL_GPU_VERTEXELEMENTFORMAT_UINT4,
- /* 32-bit Floats */
- SDL_GPU_VERTEXELEMENTFORMAT_FLOAT,
- SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
- SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3,
- SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4,
- /* 8-bit Signed Integers */
- SDL_GPU_VERTEXELEMENTFORMAT_BYTE2,
- SDL_GPU_VERTEXELEMENTFORMAT_BYTE4,
- /* 8-bit Unsigned Integers */
- SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2,
- SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4,
- /* 8-bit Signed Normalized */
- SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM,
- SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM,
- /* 8-bit Unsigned Normalized */
- SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM,
- SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM,
- /* 16-bit Signed Integers */
- SDL_GPU_VERTEXELEMENTFORMAT_SHORT2,
- SDL_GPU_VERTEXELEMENTFORMAT_SHORT4,
- /* 16-bit Unsigned Integers */
- SDL_GPU_VERTEXELEMENTFORMAT_USHORT2,
- SDL_GPU_VERTEXELEMENTFORMAT_USHORT4,
- /* 16-bit Signed Normalized */
- SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM,
- SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM,
- /* 16-bit Unsigned Normalized */
- SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM,
- SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM,
- /* 16-bit Floats */
- SDL_GPU_VERTEXELEMENTFORMAT_HALF2,
- SDL_GPU_VERTEXELEMENTFORMAT_HALF4
- } SDL_GPUVertexElementFormat;
- /**
- * Specifies the rate at which vertex attributes are pulled from buffers.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUVertexInputRate
- {
- SDL_GPU_VERTEXINPUTRATE_VERTEX, /**< Attribute addressing is a function of the vertex index. */
- SDL_GPU_VERTEXINPUTRATE_INSTANCE /**< Attribute addressing is a function of the instance index. */
- } SDL_GPUVertexInputRate;
- /**
- * Specifies the fill mode of the graphics pipeline.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUFillMode
- {
- SDL_GPU_FILLMODE_FILL, /**< Polygons will be rendered via rasterization. */
- SDL_GPU_FILLMODE_LINE /**< Polygon edges will be drawn as line segments. */
- } SDL_GPUFillMode;
- /**
- * Specifies the facing direction in which triangle faces will be culled.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUCullMode
- {
- SDL_GPU_CULLMODE_NONE, /**< No triangles are culled. */
- SDL_GPU_CULLMODE_FRONT, /**< Front-facing triangles are culled. */
- SDL_GPU_CULLMODE_BACK /**< Back-facing triangles are culled. */
- } SDL_GPUCullMode;
- /**
- * Specifies the vertex winding that will cause a triangle to be determined to
- * be front-facing.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUFrontFace
- {
- SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE, /**< A triangle with counter-clockwise vertex winding will be considered front-facing. */
- SDL_GPU_FRONTFACE_CLOCKWISE /**< A triangle with clockwise vertex winding will be considered front-facing. */
- } SDL_GPUFrontFace;
- /**
- * Specifies a comparison operator for depth, stencil and sampler operations.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUCompareOp
- {
- SDL_GPU_COMPAREOP_INVALID,
- SDL_GPU_COMPAREOP_NEVER, /**< The comparison always evaluates false. */
- SDL_GPU_COMPAREOP_LESS, /**< The comparison evaluates reference < test. */
- SDL_GPU_COMPAREOP_EQUAL, /**< The comparison evaluates reference == test. */
- SDL_GPU_COMPAREOP_LESS_OR_EQUAL, /**< The comparison evaluates reference <= test. */
- SDL_GPU_COMPAREOP_GREATER, /**< The comparison evaluates reference > test. */
- SDL_GPU_COMPAREOP_NOT_EQUAL, /**< The comparison evaluates reference != test. */
- SDL_GPU_COMPAREOP_GREATER_OR_EQUAL, /**< The comparison evalutes reference >= test. */
- SDL_GPU_COMPAREOP_ALWAYS /**< The comparison always evaluates true. */
- } SDL_GPUCompareOp;
- /**
- * Specifies what happens to a stored stencil value if stencil tests fail or
- * pass.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUStencilOp
- {
- SDL_GPU_STENCILOP_INVALID,
- SDL_GPU_STENCILOP_KEEP, /**< Keeps the current value. */
- SDL_GPU_STENCILOP_ZERO, /**< Sets the value to 0. */
- SDL_GPU_STENCILOP_REPLACE, /**< Sets the value to reference. */
- SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP, /**< Increments the current value and clamps to the maximum value. */
- SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP, /**< Decrements the current value and clamps to 0. */
- SDL_GPU_STENCILOP_INVERT, /**< Bitwise-inverts the current value. */
- SDL_GPU_STENCILOP_INCREMENT_AND_WRAP, /**< Increments the current value and wraps back to 0. */
- SDL_GPU_STENCILOP_DECREMENT_AND_WRAP /**< Decrements the current value and wraps to the maximum value. */
- } SDL_GPUStencilOp;
- /**
- * Specifies the operator to be used when pixels in a render target are
- * blended with existing pixels in the texture.
- *
- * The source color is the value written by the fragment shader. The
- * destination color is the value currently existing in the texture.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUBlendOp
- {
- SDL_GPU_BLENDOP_INVALID,
- SDL_GPU_BLENDOP_ADD, /**< (source * source_factor) + (destination * destination_factor) */
- SDL_GPU_BLENDOP_SUBTRACT, /**< (source * source_factor) - (destination * destination_factor) */
- SDL_GPU_BLENDOP_REVERSE_SUBTRACT, /**< (destination * destination_factor) - (source * source_factor) */
- SDL_GPU_BLENDOP_MIN, /**< min(source, destination) */
- SDL_GPU_BLENDOP_MAX /**< max(source, destination) */
- } SDL_GPUBlendOp;
- /**
- * Specifies a blending factor to be used when pixels in a render target are
- * blended with existing pixels in the texture.
- *
- * The source color is the value written by the fragment shader. The
- * destination color is the value currently existing in the texture.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef enum SDL_GPUBlendFactor
- {
- SDL_GPU_BLENDFACTOR_INVALID,
- SDL_GPU_BLENDFACTOR_ZERO, /**< 0 */
- SDL_GPU_BLENDFACTOR_ONE, /**< 1 */
- SDL_GPU_BLENDFACTOR_SRC_COLOR, /**< source color */
- SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR, /**< 1 - source color */
- SDL_GPU_BLENDFACTOR_DST_COLOR, /**< destination color */
- SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR, /**< 1 - destination color */
- SDL_GPU_BLENDFACTOR_SRC_ALPHA, /**< source alpha */
- SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA, /**< 1 - source alpha */
- SDL_GPU_BLENDFACTOR_DST_ALPHA, /**< destination alpha */
- SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA, /**< 1 - destination alpha */
- SDL_GPU_BLENDFACTOR_CONSTANT_COLOR, /**< blend constant */
- SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR, /**< 1 - blend constant */
- SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE /**< min(source alpha, 1 - destination alpha) */
- } SDL_GPUBlendFactor;
- /**
- * Specifies which color components are written in a graphics pipeline.
- *
- * \since This datatype is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- */
- typedef Uint8 SDL_GPUColorComponentFlags;
- #define SDL_GPU_COLORCOMPONENT_R (1u << 0) /**< the red component */
- #define SDL_GPU_COLORCOMPONENT_G (1u << 1) /**< the green component */
- #define SDL_GPU_COLORCOMPONENT_B (1u << 2) /**< the blue component */
- #define SDL_GPU_COLORCOMPONENT_A (1u << 3) /**< the alpha component */
- /**
- * Specifies a filter operation used by a sampler.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUSampler
- */
- typedef enum SDL_GPUFilter
- {
- SDL_GPU_FILTER_NEAREST, /**< Point filtering. */
- SDL_GPU_FILTER_LINEAR /**< Linear filtering. */
- } SDL_GPUFilter;
- /**
- * Specifies a mipmap mode used by a sampler.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUSampler
- */
- typedef enum SDL_GPUSamplerMipmapMode
- {
- SDL_GPU_SAMPLERMIPMAPMODE_NEAREST, /**< Point filtering. */
- SDL_GPU_SAMPLERMIPMAPMODE_LINEAR /**< Linear filtering. */
- } SDL_GPUSamplerMipmapMode;
- /**
- * Specifies behavior of texture sampling when the coordinates exceed the 0-1
- * range.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUSampler
- */
- typedef enum SDL_GPUSamplerAddressMode
- {
- SDL_GPU_SAMPLERADDRESSMODE_REPEAT, /**< Specifies that the coordinates will wrap around. */
- SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT, /**< Specifies that the coordinates will wrap around mirrored. */
- SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE /**< Specifies that the coordinates will clamp to the 0-1 range. */
- } SDL_GPUSamplerAddressMode;
- /**
- * Specifies the timing that will be used to present swapchain textures to the
- * OS.
- *
- * VSYNC mode will always be supported. IMMEDIATE and MAILBOX modes may not be
- * supported on certain systems.
- *
- * It is recommended to query SDL_WindowSupportsGPUPresentMode after claiming
- * the window if you wish to change the present mode to IMMEDIATE or MAILBOX.
- *
- * - VSYNC: Waits for vblank before presenting. No tearing is possible. If
- * there is a pending image to present, the new image is enqueued for
- * presentation. Disallows tearing at the cost of visual latency.
- * - IMMEDIATE: Immediately presents. Lowest latency option, but tearing may
- * occur.
- * - MAILBOX: Waits for vblank before presenting. No tearing is possible. If
- * there is a pending image to present, the pending image is replaced by the
- * new image. Similar to VSYNC, but with reduced visual latency.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_SetGPUSwapchainParameters
- * \sa SDL_WindowSupportsGPUPresentMode
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- */
- typedef enum SDL_GPUPresentMode
- {
- SDL_GPU_PRESENTMODE_VSYNC,
- SDL_GPU_PRESENTMODE_IMMEDIATE,
- SDL_GPU_PRESENTMODE_MAILBOX
- } SDL_GPUPresentMode;
- /**
- * Specifies the texture format and colorspace of the swapchain textures.
- *
- * SDR will always be supported. Other compositions may not be supported on
- * certain systems.
- *
- * It is recommended to query SDL_WindowSupportsGPUSwapchainComposition after
- * claiming the window if you wish to change the swapchain composition from
- * SDR.
- *
- * - SDR: B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in sRGB encoding.
- * - SDR_LINEAR: B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are
- * stored in memory in sRGB encoding but accessed in shaders in "linear
- * sRGB" encoding which is sRGB but with a linear transfer function.
- * - HDR_EXTENDED_LINEAR: R16G16B16A16_FLOAT swapchain. Pixel values are in
- * extended linear sRGB encoding and permits values outside of the [0, 1]
- * range.
- * - HDR10_ST2084: A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in
- * BT.2020 ST2084 (PQ) encoding.
- *
- * \since This enum is available since SDL 3.2.0.
- *
- * \sa SDL_SetGPUSwapchainParameters
- * \sa SDL_WindowSupportsGPUSwapchainComposition
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- */
- typedef enum SDL_GPUSwapchainComposition
- {
- SDL_GPU_SWAPCHAINCOMPOSITION_SDR,
- SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR,
- SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR,
- SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084
- } SDL_GPUSwapchainComposition;
- /* Structures */
- /**
- * A structure specifying a viewport.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_SetGPUViewport
- */
- typedef struct SDL_GPUViewport
- {
- float x; /**< The left offset of the viewport. */
- float y; /**< The top offset of the viewport. */
- float w; /**< The width of the viewport. */
- float h; /**< The height of the viewport. */
- float min_depth; /**< The minimum depth of the viewport. */
- float max_depth; /**< The maximum depth of the viewport. */
- } SDL_GPUViewport;
- /**
- * A structure specifying parameters related to transferring data to or from a
- * texture.
- *
- * If either of `pixels_per_row` or `rows_per_layer` is zero, then width and
- * height of passed SDL_GPUTextureRegion to SDL_UploadToGPUTexture
- *
- * / SDL_DownloadFromGPUTexture are used as default values respectively and
- * data is considered to be tightly packed.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUTexture
- * \sa SDL_DownloadFromGPUTexture
- */
- typedef struct SDL_GPUTextureTransferInfo
- {
- SDL_GPUTransferBuffer *transfer_buffer; /**< The transfer buffer used in the transfer operation. */
- Uint32 offset; /**< The starting byte of the image data in the transfer buffer. */
- Uint32 pixels_per_row; /**< The number of pixels from one row to the next. */
- Uint32 rows_per_layer; /**< The number of rows from one layer/depth-slice to the next. */
- } SDL_GPUTextureTransferInfo;
- /**
- * A structure specifying a location in a transfer buffer.
- *
- * Used when transferring buffer data to or from a transfer buffer.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUBuffer
- * \sa SDL_DownloadFromGPUBuffer
- */
- typedef struct SDL_GPUTransferBufferLocation
- {
- SDL_GPUTransferBuffer *transfer_buffer; /**< The transfer buffer used in the transfer operation. */
- Uint32 offset; /**< The starting byte of the buffer data in the transfer buffer. */
- } SDL_GPUTransferBufferLocation;
- /**
- * A structure specifying a location in a texture.
- *
- * Used when copying data from one texture to another.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CopyGPUTextureToTexture
- */
- typedef struct SDL_GPUTextureLocation
- {
- SDL_GPUTexture *texture; /**< The texture used in the copy operation. */
- Uint32 mip_level; /**< The mip level index of the location. */
- Uint32 layer; /**< The layer index of the location. */
- Uint32 x; /**< The left offset of the location. */
- Uint32 y; /**< The top offset of the location. */
- Uint32 z; /**< The front offset of the location. */
- } SDL_GPUTextureLocation;
- /**
- * A structure specifying a region of a texture.
- *
- * Used when transferring data to or from a texture.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUTexture
- * \sa SDL_DownloadFromGPUTexture
- * \sa SDL_CreateGPUTexture
- */
- typedef struct SDL_GPUTextureRegion
- {
- SDL_GPUTexture *texture; /**< The texture used in the copy operation. */
- Uint32 mip_level; /**< The mip level index to transfer. */
- Uint32 layer; /**< The layer index to transfer. */
- Uint32 x; /**< The left offset of the region. */
- Uint32 y; /**< The top offset of the region. */
- Uint32 z; /**< The front offset of the region. */
- Uint32 w; /**< The width of the region. */
- Uint32 h; /**< The height of the region. */
- Uint32 d; /**< The depth of the region. */
- } SDL_GPUTextureRegion;
- /**
- * A structure specifying a region of a texture used in the blit operation.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BlitGPUTexture
- */
- typedef struct SDL_GPUBlitRegion
- {
- SDL_GPUTexture *texture; /**< The texture. */
- Uint32 mip_level; /**< The mip level index of the region. */
- Uint32 layer_or_depth_plane; /**< The layer index or depth plane of the region. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */
- Uint32 x; /**< The left offset of the region. */
- Uint32 y; /**< The top offset of the region. */
- Uint32 w; /**< The width of the region. */
- Uint32 h; /**< The height of the region. */
- } SDL_GPUBlitRegion;
- /**
- * A structure specifying a location in a buffer.
- *
- * Used when copying data between buffers.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CopyGPUBufferToBuffer
- */
- typedef struct SDL_GPUBufferLocation
- {
- SDL_GPUBuffer *buffer; /**< The buffer. */
- Uint32 offset; /**< The starting byte within the buffer. */
- } SDL_GPUBufferLocation;
- /**
- * A structure specifying a region of a buffer.
- *
- * Used when transferring data to or from buffers.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUBuffer
- * \sa SDL_DownloadFromGPUBuffer
- */
- typedef struct SDL_GPUBufferRegion
- {
- SDL_GPUBuffer *buffer; /**< The buffer. */
- Uint32 offset; /**< The starting byte within the buffer. */
- Uint32 size; /**< The size in bytes of the region. */
- } SDL_GPUBufferRegion;
- /**
- * A structure specifying the parameters of an indirect draw command.
- *
- * Note that the `first_vertex` and `first_instance` parameters are NOT
- * compatible with built-in vertex/instance ID variables in shaders (for
- * example, SV_VertexID); GPU APIs and shader languages do not define these
- * built-in variables consistently, so if your shader depends on them, the
- * only way to keep behavior consistent and portable is to always pass 0 for
- * the correlating parameter in the draw calls.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_DrawGPUPrimitivesIndirect
- */
- typedef struct SDL_GPUIndirectDrawCommand
- {
- Uint32 num_vertices; /**< The number of vertices to draw. */
- Uint32 num_instances; /**< The number of instances to draw. */
- Uint32 first_vertex; /**< The index of the first vertex to draw. */
- Uint32 first_instance; /**< The ID of the first instance to draw. */
- } SDL_GPUIndirectDrawCommand;
- /**
- * A structure specifying the parameters of an indexed indirect draw command.
- *
- * Note that the `first_vertex` and `first_instance` parameters are NOT
- * compatible with built-in vertex/instance ID variables in shaders (for
- * example, SV_VertexID); GPU APIs and shader languages do not define these
- * built-in variables consistently, so if your shader depends on them, the
- * only way to keep behavior consistent and portable is to always pass 0 for
- * the correlating parameter in the draw calls.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_DrawGPUIndexedPrimitivesIndirect
- */
- typedef struct SDL_GPUIndexedIndirectDrawCommand
- {
- Uint32 num_indices; /**< The number of indices to draw per instance. */
- Uint32 num_instances; /**< The number of instances to draw. */
- Uint32 first_index; /**< The base index within the index buffer. */
- Sint32 vertex_offset; /**< The value added to the vertex index before indexing into the vertex buffer. */
- Uint32 first_instance; /**< The ID of the first instance to draw. */
- } SDL_GPUIndexedIndirectDrawCommand;
- /**
- * A structure specifying the parameters of an indexed dispatch command.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_DispatchGPUComputeIndirect
- */
- typedef struct SDL_GPUIndirectDispatchCommand
- {
- Uint32 groupcount_x; /**< The number of local workgroups to dispatch in the X dimension. */
- Uint32 groupcount_y; /**< The number of local workgroups to dispatch in the Y dimension. */
- Uint32 groupcount_z; /**< The number of local workgroups to dispatch in the Z dimension. */
- } SDL_GPUIndirectDispatchCommand;
- /* State structures */
- /**
- * A structure specifying the parameters of a sampler.
- *
- * Note that mip_lod_bias is a no-op for the Metal driver. For Metal, LOD bias
- * must be applied via shader instead.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUSampler
- * \sa SDL_GPUFilter
- * \sa SDL_GPUSamplerMipmapMode
- * \sa SDL_GPUSamplerAddressMode
- * \sa SDL_GPUCompareOp
- */
- typedef struct SDL_GPUSamplerCreateInfo
- {
- SDL_GPUFilter min_filter; /**< The minification filter to apply to lookups. */
- SDL_GPUFilter mag_filter; /**< The magnification filter to apply to lookups. */
- SDL_GPUSamplerMipmapMode mipmap_mode; /**< The mipmap filter to apply to lookups. */
- SDL_GPUSamplerAddressMode address_mode_u; /**< The addressing mode for U coordinates outside [0, 1). */
- SDL_GPUSamplerAddressMode address_mode_v; /**< The addressing mode for V coordinates outside [0, 1). */
- SDL_GPUSamplerAddressMode address_mode_w; /**< The addressing mode for W coordinates outside [0, 1). */
- float mip_lod_bias; /**< The bias to be added to mipmap LOD calculation. */
- float max_anisotropy; /**< The anisotropy value clamp used by the sampler. If enable_anisotropy is false, this is ignored. */
- SDL_GPUCompareOp compare_op; /**< The comparison operator to apply to fetched data before filtering. */
- float min_lod; /**< Clamps the minimum of the computed LOD value. */
- float max_lod; /**< Clamps the maximum of the computed LOD value. */
- bool enable_anisotropy; /**< true to enable anisotropic filtering. */
- bool enable_compare; /**< true to enable comparison against a reference value during lookups. */
- Uint8 padding1;
- Uint8 padding2;
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUSamplerCreateInfo;
- /**
- * A structure specifying the parameters of vertex buffers used in a graphics
- * pipeline.
- *
- * When you call SDL_BindGPUVertexBuffers, you specify the binding slots of
- * the vertex buffers. For example if you called SDL_BindGPUVertexBuffers with
- * a first_slot of 2 and num_bindings of 3, the binding slots 2, 3, 4 would be
- * used by the vertex buffers you pass in.
- *
- * Vertex attributes are linked to buffers via the buffer_slot field of
- * SDL_GPUVertexAttribute. For example, if an attribute has a buffer_slot of
- * 0, then that attribute belongs to the vertex buffer bound at slot 0.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUVertexAttribute
- * \sa SDL_GPUVertexInputRate
- */
- typedef struct SDL_GPUVertexBufferDescription
- {
- Uint32 slot; /**< The binding slot of the vertex buffer. */
- Uint32 pitch; /**< The byte pitch between consecutive elements of the vertex buffer. */
- SDL_GPUVertexInputRate input_rate; /**< Whether attribute addressing is a function of the vertex index or instance index. */
- Uint32 instance_step_rate; /**< Reserved for future use. Must be set to 0. */
- } SDL_GPUVertexBufferDescription;
- /**
- * A structure specifying a vertex attribute.
- *
- * All vertex attribute locations provided to an SDL_GPUVertexInputState must
- * be unique.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUVertexBufferDescription
- * \sa SDL_GPUVertexInputState
- * \sa SDL_GPUVertexElementFormat
- */
- typedef struct SDL_GPUVertexAttribute
- {
- Uint32 location; /**< The shader input location index. */
- Uint32 buffer_slot; /**< The binding slot of the associated vertex buffer. */
- SDL_GPUVertexElementFormat format; /**< The size and type of the attribute data. */
- Uint32 offset; /**< The byte offset of this attribute relative to the start of the vertex element. */
- } SDL_GPUVertexAttribute;
- /**
- * A structure specifying the parameters of a graphics pipeline vertex input
- * state.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUGraphicsPipelineCreateInfo
- * \sa SDL_GPUVertexBufferDescription
- * \sa SDL_GPUVertexAttribute
- */
- typedef struct SDL_GPUVertexInputState
- {
- const SDL_GPUVertexBufferDescription *vertex_buffer_descriptions; /**< A pointer to an array of vertex buffer descriptions. */
- Uint32 num_vertex_buffers; /**< The number of vertex buffer descriptions in the above array. */
- const SDL_GPUVertexAttribute *vertex_attributes; /**< A pointer to an array of vertex attribute descriptions. */
- Uint32 num_vertex_attributes; /**< The number of vertex attribute descriptions in the above array. */
- } SDL_GPUVertexInputState;
- /**
- * A structure specifying the stencil operation state of a graphics pipeline.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUDepthStencilState
- */
- typedef struct SDL_GPUStencilOpState
- {
- SDL_GPUStencilOp fail_op; /**< The action performed on samples that fail the stencil test. */
- SDL_GPUStencilOp pass_op; /**< The action performed on samples that pass the depth and stencil tests. */
- SDL_GPUStencilOp depth_fail_op; /**< The action performed on samples that pass the stencil test and fail the depth test. */
- SDL_GPUCompareOp compare_op; /**< The comparison operator used in the stencil test. */
- } SDL_GPUStencilOpState;
- /**
- * A structure specifying the blend state of a color target.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUColorTargetDescription
- */
- typedef struct SDL_GPUColorTargetBlendState
- {
- SDL_GPUBlendFactor src_color_blendfactor; /**< The value to be multiplied by the source RGB value. */
- SDL_GPUBlendFactor dst_color_blendfactor; /**< The value to be multiplied by the destination RGB value. */
- SDL_GPUBlendOp color_blend_op; /**< The blend operation for the RGB components. */
- SDL_GPUBlendFactor src_alpha_blendfactor; /**< The value to be multiplied by the source alpha. */
- SDL_GPUBlendFactor dst_alpha_blendfactor; /**< The value to be multiplied by the destination alpha. */
- SDL_GPUBlendOp alpha_blend_op; /**< The blend operation for the alpha component. */
- SDL_GPUColorComponentFlags color_write_mask; /**< A bitmask specifying which of the RGBA components are enabled for writing. Writes to all channels if enable_color_write_mask is false. */
- bool enable_blend; /**< Whether blending is enabled for the color target. */
- bool enable_color_write_mask; /**< Whether the color write mask is enabled. */
- Uint8 padding1;
- Uint8 padding2;
- } SDL_GPUColorTargetBlendState;
- /**
- * A structure specifying code and metadata for creating a shader object.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- typedef struct SDL_GPUShaderCreateInfo
- {
- size_t code_size; /**< The size in bytes of the code pointed to. */
- const Uint8 *code; /**< A pointer to shader code. */
- const char *entrypoint; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */
- SDL_GPUShaderFormat format; /**< The format of the shader code. */
- SDL_GPUShaderStage stage; /**< The stage the shader program corresponds to. */
- Uint32 num_samplers; /**< The number of samplers defined in the shader. */
- Uint32 num_storage_textures; /**< The number of storage textures defined in the shader. */
- Uint32 num_storage_buffers; /**< The number of storage buffers defined in the shader. */
- Uint32 num_uniform_buffers; /**< The number of uniform buffers defined in the shader. */
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUShaderCreateInfo;
- /**
- * A structure specifying the parameters of a texture.
- *
- * Usage flags can be bitwise OR'd together for combinations of usages. Note
- * that certain usage combinations are invalid, for example SAMPLER and
- * GRAPHICS_STORAGE.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- * \sa SDL_GPUTextureType
- * \sa SDL_GPUTextureFormat
- * \sa SDL_GPUTextureUsageFlags
- * \sa SDL_GPUSampleCount
- */
- typedef struct SDL_GPUTextureCreateInfo
- {
- SDL_GPUTextureType type; /**< The base dimensionality of the texture. */
- SDL_GPUTextureFormat format; /**< The pixel format of the texture. */
- SDL_GPUTextureUsageFlags usage; /**< How the texture is intended to be used by the client. */
- Uint32 width; /**< The width of the texture. */
- Uint32 height; /**< The height of the texture. */
- Uint32 layer_count_or_depth; /**< The layer count or depth of the texture. This value is treated as a layer count on 2D array textures, and as a depth value on 3D textures. */
- Uint32 num_levels; /**< The number of mip levels in the texture. */
- SDL_GPUSampleCount sample_count; /**< The number of samples per texel. Only applies if the texture is used as a render target. */
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUTextureCreateInfo;
- /**
- * A structure specifying the parameters of a buffer.
- *
- * Usage flags can be bitwise OR'd together for combinations of usages. Note
- * that certain combinations are invalid, for example VERTEX and INDEX.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUBuffer
- * \sa SDL_GPUBufferUsageFlags
- */
- typedef struct SDL_GPUBufferCreateInfo
- {
- SDL_GPUBufferUsageFlags usage; /**< How the buffer is intended to be used by the client. */
- Uint32 size; /**< The size in bytes of the buffer. */
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUBufferCreateInfo;
- /**
- * A structure specifying the parameters of a transfer buffer.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTransferBuffer
- */
- typedef struct SDL_GPUTransferBufferCreateInfo
- {
- SDL_GPUTransferBufferUsage usage; /**< How the transfer buffer is intended to be used by the client. */
- Uint32 size; /**< The size in bytes of the transfer buffer. */
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUTransferBufferCreateInfo;
- /* Pipeline state structures */
- /**
- * A structure specifying the parameters of the graphics pipeline rasterizer
- * state.
- *
- * Note that SDL_GPU_FILLMODE_LINE is not supported on many Android devices.
- * For those devices, the fill mode will automatically fall back to FILL.
- *
- * Also note that the D3D12 driver will enable depth clamping even if
- * enable_depth_clip is true. If you need this clamp+clip behavior, consider
- * enabling depth clip and then manually clamping depth in your fragment
- * shaders on Metal and Vulkan.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUGraphicsPipelineCreateInfo
- */
- typedef struct SDL_GPURasterizerState
- {
- SDL_GPUFillMode fill_mode; /**< Whether polygons will be filled in or drawn as lines. */
- SDL_GPUCullMode cull_mode; /**< The facing direction in which triangles will be culled. */
- SDL_GPUFrontFace front_face; /**< The vertex winding that will cause a triangle to be determined as front-facing. */
- float depth_bias_constant_factor; /**< A scalar factor controlling the depth value added to each fragment. */
- float depth_bias_clamp; /**< The maximum depth bias of a fragment. */
- float depth_bias_slope_factor; /**< A scalar factor applied to a fragment's slope in depth calculations. */
- bool enable_depth_bias; /**< true to bias fragment depth values. */
- bool enable_depth_clip; /**< true to enable depth clip, false to enable depth clamp. */
- Uint8 padding1;
- Uint8 padding2;
- } SDL_GPURasterizerState;
- /**
- * A structure specifying the parameters of the graphics pipeline multisample
- * state.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUGraphicsPipelineCreateInfo
- */
- typedef struct SDL_GPUMultisampleState
- {
- SDL_GPUSampleCount sample_count; /**< The number of samples to be used in rasterization. */
- Uint32 sample_mask; /**< Reserved for future use. Must be set to 0. */
- bool enable_mask; /**< Reserved for future use. Must be set to false. */
- bool enable_alpha_to_coverage; /**< true enables the alpha-to-coverage feature. */
- Uint8 padding2;
- Uint8 padding3;
- } SDL_GPUMultisampleState;
- /**
- * A structure specifying the parameters of the graphics pipeline depth
- * stencil state.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUGraphicsPipelineCreateInfo
- */
- typedef struct SDL_GPUDepthStencilState
- {
- SDL_GPUCompareOp compare_op; /**< The comparison operator used for depth testing. */
- SDL_GPUStencilOpState back_stencil_state; /**< The stencil op state for back-facing triangles. */
- SDL_GPUStencilOpState front_stencil_state; /**< The stencil op state for front-facing triangles. */
- Uint8 compare_mask; /**< Selects the bits of the stencil values participating in the stencil test. */
- Uint8 write_mask; /**< Selects the bits of the stencil values updated by the stencil test. */
- bool enable_depth_test; /**< true enables the depth test. */
- bool enable_depth_write; /**< true enables depth writes. Depth writes are always disabled when enable_depth_test is false. */
- bool enable_stencil_test; /**< true enables the stencil test. */
- Uint8 padding1;
- Uint8 padding2;
- Uint8 padding3;
- } SDL_GPUDepthStencilState;
- /**
- * A structure specifying the parameters of color targets used in a graphics
- * pipeline.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUGraphicsPipelineTargetInfo
- */
- typedef struct SDL_GPUColorTargetDescription
- {
- SDL_GPUTextureFormat format; /**< The pixel format of the texture to be used as a color target. */
- SDL_GPUColorTargetBlendState blend_state; /**< The blend state to be used for the color target. */
- } SDL_GPUColorTargetDescription;
- /**
- * A structure specifying the descriptions of render targets used in a
- * graphics pipeline.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_GPUGraphicsPipelineCreateInfo
- * \sa SDL_GPUColorTargetDescription
- * \sa SDL_GPUTextureFormat
- */
- typedef struct SDL_GPUGraphicsPipelineTargetInfo
- {
- const SDL_GPUColorTargetDescription *color_target_descriptions; /**< A pointer to an array of color target descriptions. */
- Uint32 num_color_targets; /**< The number of color target descriptions in the above array. */
- SDL_GPUTextureFormat depth_stencil_format; /**< The pixel format of the depth-stencil target. Ignored if has_depth_stencil_target is false. */
- bool has_depth_stencil_target; /**< true specifies that the pipeline uses a depth-stencil target. */
- Uint8 padding1;
- Uint8 padding2;
- Uint8 padding3;
- } SDL_GPUGraphicsPipelineTargetInfo;
- /**
- * A structure specifying the parameters of a graphics pipeline state.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- * \sa SDL_GPUShader
- * \sa SDL_GPUVertexInputState
- * \sa SDL_GPUPrimitiveType
- * \sa SDL_GPURasterizerState
- * \sa SDL_GPUMultisampleState
- * \sa SDL_GPUDepthStencilState
- * \sa SDL_GPUGraphicsPipelineTargetInfo
- */
- typedef struct SDL_GPUGraphicsPipelineCreateInfo
- {
- SDL_GPUShader *vertex_shader; /**< The vertex shader used by the graphics pipeline. */
- SDL_GPUShader *fragment_shader; /**< The fragment shader used by the graphics pipeline. */
- SDL_GPUVertexInputState vertex_input_state; /**< The vertex layout of the graphics pipeline. */
- SDL_GPUPrimitiveType primitive_type; /**< The primitive topology of the graphics pipeline. */
- SDL_GPURasterizerState rasterizer_state; /**< The rasterizer state of the graphics pipeline. */
- SDL_GPUMultisampleState multisample_state; /**< The multisample state of the graphics pipeline. */
- SDL_GPUDepthStencilState depth_stencil_state; /**< The depth-stencil state of the graphics pipeline. */
- SDL_GPUGraphicsPipelineTargetInfo target_info; /**< Formats and blend modes for the render targets of the graphics pipeline. */
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUGraphicsPipelineCreateInfo;
- /**
- * A structure specifying the parameters of a compute pipeline state.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUComputePipeline
- * \sa SDL_GPUShaderFormat
- */
- typedef struct SDL_GPUComputePipelineCreateInfo
- {
- size_t code_size; /**< The size in bytes of the compute shader code pointed to. */
- const Uint8 *code; /**< A pointer to compute shader code. */
- const char *entrypoint; /**< A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader. */
- SDL_GPUShaderFormat format; /**< The format of the compute shader code. */
- Uint32 num_samplers; /**< The number of samplers defined in the shader. */
- Uint32 num_readonly_storage_textures; /**< The number of readonly storage textures defined in the shader. */
- Uint32 num_readonly_storage_buffers; /**< The number of readonly storage buffers defined in the shader. */
- Uint32 num_readwrite_storage_textures; /**< The number of read-write storage textures defined in the shader. */
- Uint32 num_readwrite_storage_buffers; /**< The number of read-write storage buffers defined in the shader. */
- Uint32 num_uniform_buffers; /**< The number of uniform buffers defined in the shader. */
- Uint32 threadcount_x; /**< The number of threads in the X dimension. This should match the value in the shader. */
- Uint32 threadcount_y; /**< The number of threads in the Y dimension. This should match the value in the shader. */
- Uint32 threadcount_z; /**< The number of threads in the Z dimension. This should match the value in the shader. */
- SDL_PropertiesID props; /**< A properties ID for extensions. Should be 0 if no extensions are needed. */
- } SDL_GPUComputePipelineCreateInfo;
- /**
- * A structure specifying the parameters of a color target used by a render
- * pass.
- *
- * The load_op field determines what is done with the texture at the beginning
- * of the render pass.
- *
- * - LOAD: Loads the data currently in the texture. Not recommended for
- * multisample textures as it requires significant memory bandwidth.
- * - CLEAR: Clears the texture to a single color.
- * - DONT_CARE: The driver will do whatever it wants with the texture memory.
- * This is a good option if you know that every single pixel will be touched
- * in the render pass.
- *
- * The store_op field determines what is done with the color results of the
- * render pass.
- *
- * - STORE: Stores the results of the render pass in the texture. Not
- * recommended for multisample textures as it requires significant memory
- * bandwidth.
- * - DONT_CARE: The driver will do whatever it wants with the texture memory.
- * This is often a good option for depth/stencil textures.
- * - RESOLVE: Resolves a multisample texture into resolve_texture, which must
- * have a sample count of 1. Then the driver may discard the multisample
- * texture memory. This is the most performant method of resolving a
- * multisample target.
- * - RESOLVE_AND_STORE: Resolves a multisample texture into the
- * resolve_texture, which must have a sample count of 1. Then the driver
- * stores the multisample texture's contents. Not recommended as it requires
- * significant memory bandwidth.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPURenderPass
- */
- typedef struct SDL_GPUColorTargetInfo
- {
- SDL_GPUTexture *texture; /**< The texture that will be used as a color target by a render pass. */
- Uint32 mip_level; /**< The mip level to use as a color target. */
- Uint32 layer_or_depth_plane; /**< The layer index or depth plane to use as a color target. This value is treated as a layer index on 2D array and cube textures, and as a depth plane on 3D textures. */
- SDL_FColor clear_color; /**< The color to clear the color target to at the start of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */
- SDL_GPULoadOp load_op; /**< What is done with the contents of the color target at the beginning of the render pass. */
- SDL_GPUStoreOp store_op; /**< What is done with the results of the render pass. */
- SDL_GPUTexture *resolve_texture; /**< The texture that will receive the results of a multisample resolve operation. Ignored if a RESOLVE* store_op is not used. */
- Uint32 resolve_mip_level; /**< The mip level of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */
- Uint32 resolve_layer; /**< The layer index of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used. */
- bool cycle; /**< true cycles the texture if the texture is bound and load_op is not LOAD */
- bool cycle_resolve_texture; /**< true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used. */
- Uint8 padding1;
- Uint8 padding2;
- } SDL_GPUColorTargetInfo;
- /**
- * A structure specifying the parameters of a depth-stencil target used by a
- * render pass.
- *
- * The load_op field determines what is done with the depth contents of the
- * texture at the beginning of the render pass.
- *
- * - LOAD: Loads the depth values currently in the texture.
- * - CLEAR: Clears the texture to a single depth.
- * - DONT_CARE: The driver will do whatever it wants with the memory. This is
- * a good option if you know that every single pixel will be touched in the
- * render pass.
- *
- * The store_op field determines what is done with the depth results of the
- * render pass.
- *
- * - STORE: Stores the depth results in the texture.
- * - DONT_CARE: The driver will do whatever it wants with the depth results.
- * This is often a good option for depth/stencil textures that don't need to
- * be reused again.
- *
- * The stencil_load_op field determines what is done with the stencil contents
- * of the texture at the beginning of the render pass.
- *
- * - LOAD: Loads the stencil values currently in the texture.
- * - CLEAR: Clears the stencil values to a single value.
- * - DONT_CARE: The driver will do whatever it wants with the memory. This is
- * a good option if you know that every single pixel will be touched in the
- * render pass.
- *
- * The stencil_store_op field determines what is done with the stencil results
- * of the render pass.
- *
- * - STORE: Stores the stencil results in the texture.
- * - DONT_CARE: The driver will do whatever it wants with the stencil results.
- * This is often a good option for depth/stencil textures that don't need to
- * be reused again.
- *
- * Note that depth/stencil targets do not support multisample resolves.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPURenderPass
- */
- typedef struct SDL_GPUDepthStencilTargetInfo
- {
- SDL_GPUTexture *texture; /**< The texture that will be used as the depth stencil target by the render pass. */
- float clear_depth; /**< The value to clear the depth component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */
- SDL_GPULoadOp load_op; /**< What is done with the depth contents at the beginning of the render pass. */
- SDL_GPUStoreOp store_op; /**< What is done with the depth results of the render pass. */
- SDL_GPULoadOp stencil_load_op; /**< What is done with the stencil contents at the beginning of the render pass. */
- SDL_GPUStoreOp stencil_store_op; /**< What is done with the stencil results of the render pass. */
- bool cycle; /**< true cycles the texture if the texture is bound and any load ops are not LOAD */
- Uint8 clear_stencil; /**< The value to clear the stencil component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used. */
- Uint8 padding1;
- Uint8 padding2;
- } SDL_GPUDepthStencilTargetInfo;
- /**
- * A structure containing parameters for a blit command.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BlitGPUTexture
- */
- typedef struct SDL_GPUBlitInfo {
- SDL_GPUBlitRegion source; /**< The source region for the blit. */
- SDL_GPUBlitRegion destination; /**< The destination region for the blit. */
- SDL_GPULoadOp load_op; /**< What is done with the contents of the destination before the blit. */
- SDL_FColor clear_color; /**< The color to clear the destination region to before the blit. Ignored if load_op is not SDL_GPU_LOADOP_CLEAR. */
- SDL_FlipMode flip_mode; /**< The flip mode for the source region. */
- SDL_GPUFilter filter; /**< The filter mode used when blitting. */
- bool cycle; /**< true cycles the destination texture if it is already bound. */
- Uint8 padding1;
- Uint8 padding2;
- Uint8 padding3;
- } SDL_GPUBlitInfo;
- /* Binding structs */
- /**
- * A structure specifying parameters in a buffer binding call.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BindGPUVertexBuffers
- * \sa SDL_BindGPUIndexBuffer
- */
- typedef struct SDL_GPUBufferBinding
- {
- SDL_GPUBuffer *buffer; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_VERTEX for SDL_BindGPUVertexBuffers, or SDL_GPU_BUFFERUSAGE_INDEX for SDL_BindGPUIndexBuffer. */
- Uint32 offset; /**< The starting byte of the data to bind in the buffer. */
- } SDL_GPUBufferBinding;
- /**
- * A structure specifying parameters in a sampler binding call.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BindGPUVertexSamplers
- * \sa SDL_BindGPUFragmentSamplers
- */
- typedef struct SDL_GPUTextureSamplerBinding
- {
- SDL_GPUTexture *texture; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER. */
- SDL_GPUSampler *sampler; /**< The sampler to bind. */
- } SDL_GPUTextureSamplerBinding;
- /**
- * A structure specifying parameters related to binding buffers in a compute
- * pass.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPUComputePass
- */
- typedef struct SDL_GPUStorageBufferReadWriteBinding
- {
- SDL_GPUBuffer *buffer; /**< The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE. */
- bool cycle; /**< true cycles the buffer if it is already bound. */
- Uint8 padding1;
- Uint8 padding2;
- Uint8 padding3;
- } SDL_GPUStorageBufferReadWriteBinding;
- /**
- * A structure specifying parameters related to binding textures in a compute
- * pass.
- *
- * \since This struct is available since SDL 3.2.0.
- *
- * \sa SDL_BeginGPUComputePass
- */
- typedef struct SDL_GPUStorageTextureReadWriteBinding
- {
- SDL_GPUTexture *texture; /**< The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE or SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE. */
- Uint32 mip_level; /**< The mip level index to bind. */
- Uint32 layer; /**< The layer index to bind. */
- bool cycle; /**< true cycles the texture if it is already bound. */
- Uint8 padding1;
- Uint8 padding2;
- Uint8 padding3;
- } SDL_GPUStorageTextureReadWriteBinding;
- /* Functions */
- /* Device */
- /**
- * Checks for GPU runtime support.
- *
- * \param format_flags a bitflag indicating which shader formats the app is
- * able to provide.
- * \param name the preferred GPU driver, or NULL to let SDL pick the optimal
- * driver.
- * \returns true if supported, false otherwise.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUDevice
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsShaderFormats(
- SDL_GPUShaderFormat format_flags,
- const char *name);
- /**
- * Checks for GPU runtime support.
- *
- * \param props the properties to use.
- * \returns true if supported, false otherwise.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUDeviceWithProperties
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_GPUSupportsProperties(
- SDL_PropertiesID props);
- /**
- * Creates a GPU context.
- *
- * \param format_flags a bitflag indicating which shader formats the app is
- * able to provide.
- * \param debug_mode enable debug mode properties and validations.
- * \param name the preferred GPU driver, or NULL to let SDL pick the optimal
- * driver.
- * \returns a GPU context on success or NULL on failure; call SDL_GetError()
- * for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_GetGPUShaderFormats
- * \sa SDL_GetGPUDeviceDriver
- * \sa SDL_DestroyGPUDevice
- * \sa SDL_GPUSupportsShaderFormats
- */
- extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDevice(
- SDL_GPUShaderFormat format_flags,
- bool debug_mode,
- const char *name);
- /**
- * Creates a GPU context.
- *
- * These are the supported properties:
- *
- * - `SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN`: enable debug mode
- * properties and validations, defaults to true.
- * - `SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN`: enable to prefer
- * energy efficiency over maximum GPU performance, defaults to false.
- * - `SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN`: enable to automatically log
- * useful debug information on device creation, defaults to true.
- * - `SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING`: the name of the GPU driver to
- * use, if a specific one is desired.
- *
- * These are the current shader format properties:
- *
- * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN`: The app is able to
- * provide shaders for an NDA platform.
- * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN`: The app is able to
- * provide SPIR-V shaders if applicable.
- * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN`: The app is able to
- * provide DXBC shaders if applicable
- * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN`: The app is able to
- * provide DXIL shaders if applicable.
- * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN`: The app is able to
- * provide MSL shaders if applicable.
- * - `SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN`: The app is able to
- * provide Metal shader libraries if applicable.
- *
- * With the D3D12 renderer:
- *
- * - `SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING`: the prefix to
- * use for all vertex semantics, default is "TEXCOORD".
- *
- * \param props the properties to use.
- * \returns a GPU context on success or NULL on failure; call SDL_GetError()
- * for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_GetGPUShaderFormats
- * \sa SDL_GetGPUDeviceDriver
- * \sa SDL_DestroyGPUDevice
- * \sa SDL_GPUSupportsProperties
- */
- extern SDL_DECLSPEC SDL_GPUDevice * SDLCALL SDL_CreateGPUDeviceWithProperties(
- SDL_PropertiesID props);
- #define SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN "SDL.gpu.device.create.debugmode"
- #define SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN "SDL.gpu.device.create.preferlowpower"
- #define SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN "SDL.gpu.device.create.verbose"
- #define SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING "SDL.gpu.device.create.name"
- #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN "SDL.gpu.device.create.shaders.private"
- #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN "SDL.gpu.device.create.shaders.spirv"
- #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN "SDL.gpu.device.create.shaders.dxbc"
- #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN "SDL.gpu.device.create.shaders.dxil"
- #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN "SDL.gpu.device.create.shaders.msl"
- #define SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN "SDL.gpu.device.create.shaders.metallib"
- #define SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING "SDL.gpu.device.create.d3d12.semantic"
- /**
- * Destroys a GPU context previously returned by SDL_CreateGPUDevice.
- *
- * \param device a GPU Context to destroy.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUDevice
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DestroyGPUDevice(SDL_GPUDevice *device);
- /**
- * Get the number of GPU drivers compiled into SDL.
- *
- * \returns the number of built in GPU drivers.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_GetGPUDriver
- */
- extern SDL_DECLSPEC int SDLCALL SDL_GetNumGPUDrivers(void);
- /**
- * Get the name of a built in GPU driver.
- *
- * The GPU drivers are presented in the order in which they are normally
- * checked during initialization.
- *
- * The names of drivers are all simple, low-ASCII identifiers, like "vulkan",
- * "metal" or "direct3d12". These never have Unicode characters, and are not
- * meant to be proper names.
- *
- * \param index the index of a GPU driver.
- * \returns the name of the GPU driver with the given **index**.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_GetNumGPUDrivers
- */
- extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDriver(int index);
- /**
- * Returns the name of the backend used to create this GPU context.
- *
- * \param device a GPU context to query.
- * \returns the name of the device's driver, or NULL on error.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC const char * SDLCALL SDL_GetGPUDeviceDriver(SDL_GPUDevice *device);
- /**
- * Returns the supported shader formats for this GPU context.
- *
- * \param device a GPU context to query.
- * \returns a bitflag indicating which shader formats the driver is able to
- * consume.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC SDL_GPUShaderFormat SDLCALL SDL_GetGPUShaderFormats(SDL_GPUDevice *device);
- /**
- * Get the properties associated with a GPU device.
- *
- * All properties are optional and may differ between GPU backends and SDL
- * versions.
- *
- * The following properties are provided by SDL:
- *
- * `SDL_PROP_GPU_DEVICE_NAME_STRING`: Contains the name of the underlying
- * device as reported by the system driver. This string has no standardized
- * format, is highly inconsistent between hardware devices and drivers, and is
- * able to change at any time. Do not attempt to parse this string as it is
- * bound to fail at some point in the future when system drivers are updated,
- * new hardware devices are introduced, or when SDL adds new GPU backends or
- * modifies existing ones.
- *
- * Strings that have been found in the wild include:
- *
- * - GTX 970
- * - GeForce GTX 970
- * - NVIDIA GeForce GTX 970
- * - Microsoft Direct3D12 (NVIDIA GeForce GTX 970)
- * - NVIDIA Graphics Device
- * - GeForce GPU
- * - P106-100
- * - AMD 15D8:C9
- * - AMD Custom GPU 0405
- * - AMD Radeon (TM) Graphics
- * - ASUS Radeon RX 470 Series
- * - Intel(R) Arc(tm) A380 Graphics (DG2)
- * - Virtio-GPU Venus (NVIDIA TITAN V)
- * - SwiftShader Device (LLVM 16.0.0)
- * - llvmpipe (LLVM 15.0.4, 256 bits)
- * - Microsoft Basic Render Driver
- * - unknown device
- *
- * The above list shows that the same device can have different formats, the
- * vendor name may or may not appear in the string, the included vendor name
- * may not be the vendor of the chipset on the device, some manufacturers
- * include pseudo-legal marks while others don't, some devices may not use a
- * marketing name in the string, the device string may be wrapped by the name
- * of a translation interface, the device may be emulated in software, or the
- * string may contain generic text that does not identify the device at all.
- *
- * `SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING`: Contains the self-reported name
- * of the underlying system driver.
- *
- * Strings that have been found in the wild include:
- *
- * - Intel Corporation
- * - Intel open-source Mesa driver
- * - Qualcomm Technologies Inc. Adreno Vulkan Driver
- * - MoltenVK
- * - Mali-G715
- * - venus
- *
- * `SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING`: Contains the self-reported
- * version of the underlying system driver. This is a relatively short version
- * string in an unspecified format. If SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING
- * is available then that property should be preferred over this one as it may
- * contain additional information that is useful for identifying the exact
- * driver version used.
- *
- * Strings that have been found in the wild include:
- *
- * - 53.0.0
- * - 0.405.2463
- * - 32.0.15.6614
- *
- * `SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING`: Contains the detailed version
- * information of the underlying system driver as reported by the driver. This
- * is an arbitrary string with no standardized format and it may contain
- * newlines. This property should be preferred over
- * SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING if it is available as it usually
- * contains the same information but in a format that is easier to read.
- *
- * Strings that have been found in the wild include:
- *
- * - 101.6559
- * - 1.2.11
- * - Mesa 21.2.2 (LLVM 12.0.1)
- * - Mesa 22.2.0-devel (git-f226222 2022-04-14 impish-oibaf-ppa)
- * - v1.r53p0-00eac0.824c4f31403fb1fbf8ee1042422c2129
- *
- * This string has also been observed to be a multiline string (which has a
- * trailing newline):
- *
- * ```
- * Driver Build: 85da404, I46ff5fc46f, 1606794520
- * Date: 11/30/20
- * Compiler Version: EV031.31.04.01
- * Driver Branch: promo490_3_Google
- * ```
- *
- * \param device a GPU context to query.
- * \returns a valid property ID on success or 0 on failure; call
- * SDL_GetError() for more information.
- *
- * \threadsafety It is safe to call this function from any thread.
- *
- * \since This function is available since SDL 3.4.0.
- */
- extern SDL_DECLSPEC SDL_PropertiesID SDLCALL SDL_GetGPUDeviceProperties(SDL_GPUDevice *device);
- #define SDL_PROP_GPU_DEVICE_NAME_STRING "SDL.gpu.device.name"
- #define SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING "SDL.gpu.device.driver_name"
- #define SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING "SDL.gpu.device.driver_version"
- #define SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING "SDL.gpu.device.driver_info"
- /* State Creation */
- /**
- * Creates a pipeline object to be used in a compute workflow.
- *
- * Shader resource bindings must be authored to follow a particular order
- * depending on the shader format.
- *
- * For SPIR-V shaders, use the following resource sets:
- *
- * - 0: Sampled textures, followed by read-only storage textures, followed by
- * read-only storage buffers
- * - 1: Read-write storage textures, followed by read-write storage buffers
- * - 2: Uniform buffers
- *
- * For DXBC and DXIL shaders, use the following register order:
- *
- * - (t[n], space0): Sampled textures, followed by read-only storage textures,
- * followed by read-only storage buffers
- * - (u[n], space1): Read-write storage textures, followed by read-write
- * storage buffers
- * - (b[n], space2): Uniform buffers
- *
- * For MSL/metallib, use the following order:
- *
- * - [[buffer]]: Uniform buffers, followed by read-only storage buffers,
- * followed by read-write storage buffers
- * - [[texture]]: Sampled textures, followed by read-only storage textures,
- * followed by read-write storage textures
- *
- * There are optional properties that can be provided through `props`. These
- * are the supported properties:
- *
- * - `SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING`: a name that can be
- * displayed in debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the compute pipeline to
- * create.
- * \returns a compute pipeline object on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_BindGPUComputePipeline
- * \sa SDL_ReleaseGPUComputePipeline
- */
- extern SDL_DECLSPEC SDL_GPUComputePipeline * SDLCALL SDL_CreateGPUComputePipeline(
- SDL_GPUDevice *device,
- const SDL_GPUComputePipelineCreateInfo *createinfo);
- #define SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING "SDL.gpu.computepipeline.create.name"
- /**
- * Creates a pipeline object to be used in a graphics workflow.
- *
- * There are optional properties that can be provided through `props`. These
- * are the supported properties:
- *
- * - `SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING`: a name that can be
- * displayed in debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the graphics pipeline to
- * create.
- * \returns a graphics pipeline object on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- * \sa SDL_BindGPUGraphicsPipeline
- * \sa SDL_ReleaseGPUGraphicsPipeline
- */
- extern SDL_DECLSPEC SDL_GPUGraphicsPipeline * SDLCALL SDL_CreateGPUGraphicsPipeline(
- SDL_GPUDevice *device,
- const SDL_GPUGraphicsPipelineCreateInfo *createinfo);
- #define SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING "SDL.gpu.graphicspipeline.create.name"
- /**
- * Creates a sampler object to be used when binding textures in a graphics
- * workflow.
- *
- * There are optional properties that can be provided through `props`. These
- * are the supported properties:
- *
- * - `SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING`: a name that can be displayed
- * in debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the sampler to create.
- * \returns a sampler object on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_BindGPUVertexSamplers
- * \sa SDL_BindGPUFragmentSamplers
- * \sa SDL_ReleaseGPUSampler
- */
- extern SDL_DECLSPEC SDL_GPUSampler * SDLCALL SDL_CreateGPUSampler(
- SDL_GPUDevice *device,
- const SDL_GPUSamplerCreateInfo *createinfo);
- #define SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING "SDL.gpu.sampler.create.name"
- /**
- * Creates a shader to be used when creating a graphics pipeline.
- *
- * Shader resource bindings must be authored to follow a particular order
- * depending on the shader format.
- *
- * For SPIR-V shaders, use the following resource sets:
- *
- * For vertex shaders:
- *
- * - 0: Sampled textures, followed by storage textures, followed by storage
- * buffers
- * - 1: Uniform buffers
- *
- * For fragment shaders:
- *
- * - 2: Sampled textures, followed by storage textures, followed by storage
- * buffers
- * - 3: Uniform buffers
- *
- * For DXBC and DXIL shaders, use the following register order:
- *
- * For vertex shaders:
- *
- * - (t[n], space0): Sampled textures, followed by storage textures, followed
- * by storage buffers
- * - (s[n], space0): Samplers with indices corresponding to the sampled
- * textures
- * - (b[n], space1): Uniform buffers
- *
- * For pixel shaders:
- *
- * - (t[n], space2): Sampled textures, followed by storage textures, followed
- * by storage buffers
- * - (s[n], space2): Samplers with indices corresponding to the sampled
- * textures
- * - (b[n], space3): Uniform buffers
- *
- * For MSL/metallib, use the following order:
- *
- * - [[texture]]: Sampled textures, followed by storage textures
- * - [[sampler]]: Samplers with indices corresponding to the sampled textures
- * - [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0
- * is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on.
- * Rather than manually authoring vertex buffer indices, use the
- * [[stage_in]] attribute which will automatically use the vertex input
- * information from the SDL_GPUGraphicsPipeline.
- *
- * Shader semantics other than system-value semantics do not matter in D3D12
- * and for ease of use the SDL implementation assumes that non system-value
- * semantics will all be TEXCOORD. If you are using HLSL as the shader source
- * language, your vertex semantics should start at TEXCOORD0 and increment
- * like so: TEXCOORD1, TEXCOORD2, etc. If you wish to change the semantic
- * prefix to something other than TEXCOORD you can use
- * SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with
- * SDL_CreateGPUDeviceWithProperties().
- *
- * There are optional properties that can be provided through `props`. These
- * are the supported properties:
- *
- * - `SDL_PROP_GPU_SHADER_CREATE_NAME_STRING`: a name that can be displayed in
- * debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the shader to create.
- * \returns a shader object on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUGraphicsPipeline
- * \sa SDL_ReleaseGPUShader
- */
- extern SDL_DECLSPEC SDL_GPUShader * SDLCALL SDL_CreateGPUShader(
- SDL_GPUDevice *device,
- const SDL_GPUShaderCreateInfo *createinfo);
- #define SDL_PROP_GPU_SHADER_CREATE_NAME_STRING "SDL.gpu.shader.create.name"
- /**
- * Creates a texture object to be used in graphics or compute workflows.
- *
- * The contents of this texture are undefined until data is written to the
- * texture.
- *
- * Note that certain combinations of usage flags are invalid. For example, a
- * texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags.
- *
- * If you request a sample count higher than the hardware supports, the
- * implementation will automatically fall back to the highest available sample
- * count.
- *
- * There are optional properties that can be provided through
- * SDL_GPUTextureCreateInfo's `props`. These are the supported properties:
- *
- * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT`: (Direct3D 12 only) if
- * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture
- * to a color with this red intensity. Defaults to zero.
- * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT`: (Direct3D 12 only) if
- * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture
- * to a color with this green intensity. Defaults to zero.
- * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT`: (Direct3D 12 only) if
- * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture
- * to a color with this blue intensity. Defaults to zero.
- * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT`: (Direct3D 12 only) if
- * the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture
- * to a color with this alpha intensity. Defaults to zero.
- * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT`: (Direct3D 12 only)
- * if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear
- * the texture to a depth of this value. Defaults to zero.
- * - `SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8`: (Direct3D 12
- * only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
- * clear the texture to a stencil of this value. Defaults to zero.
- * - `SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING`: a name that can be displayed
- * in debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the texture to create.
- * \returns a texture object on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUTexture
- * \sa SDL_DownloadFromGPUTexture
- * \sa SDL_BindGPUVertexSamplers
- * \sa SDL_BindGPUVertexStorageTextures
- * \sa SDL_BindGPUFragmentSamplers
- * \sa SDL_BindGPUFragmentStorageTextures
- * \sa SDL_BindGPUComputeStorageTextures
- * \sa SDL_BlitGPUTexture
- * \sa SDL_ReleaseGPUTexture
- * \sa SDL_GPUTextureSupportsFormat
- */
- extern SDL_DECLSPEC SDL_GPUTexture * SDLCALL SDL_CreateGPUTexture(
- SDL_GPUDevice *device,
- const SDL_GPUTextureCreateInfo *createinfo);
- #define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT "SDL.gpu.texture.create.d3d12.clear.r"
- #define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT "SDL.gpu.texture.create.d3d12.clear.g"
- #define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT "SDL.gpu.texture.create.d3d12.clear.b"
- #define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT "SDL.gpu.texture.create.d3d12.clear.a"
- #define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT "SDL.gpu.texture.create.d3d12.clear.depth"
- #define SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_UINT8 "SDL.gpu.texture.create.d3d12.clear.stencil"
- #define SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING "SDL.gpu.texture.create.name"
- /**
- * Creates a buffer object to be used in graphics or compute workflows.
- *
- * The contents of this buffer are undefined until data is written to the
- * buffer.
- *
- * Note that certain combinations of usage flags are invalid. For example, a
- * buffer cannot have both the VERTEX and INDEX flags.
- *
- * If you use a STORAGE flag, the data in the buffer must respect std140
- * layout conventions. In practical terms this means you must ensure that vec3
- * and vec4 fields are 16-byte aligned.
- *
- * For better understanding of underlying concepts and memory management with
- * SDL GPU API, you may refer
- * [this blog post](https://moonside.games/posts/sdl-gpu-concepts-cycling/)
- * .
- *
- * There are optional properties that can be provided through `props`. These
- * are the supported properties:
- *
- * - `SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING`: a name that can be displayed in
- * debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the buffer to create.
- * \returns a buffer object on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUBuffer
- * \sa SDL_DownloadFromGPUBuffer
- * \sa SDL_CopyGPUBufferToBuffer
- * \sa SDL_BindGPUVertexBuffers
- * \sa SDL_BindGPUIndexBuffer
- * \sa SDL_BindGPUVertexStorageBuffers
- * \sa SDL_BindGPUFragmentStorageBuffers
- * \sa SDL_DrawGPUPrimitivesIndirect
- * \sa SDL_DrawGPUIndexedPrimitivesIndirect
- * \sa SDL_BindGPUComputeStorageBuffers
- * \sa SDL_DispatchGPUComputeIndirect
- * \sa SDL_ReleaseGPUBuffer
- */
- extern SDL_DECLSPEC SDL_GPUBuffer * SDLCALL SDL_CreateGPUBuffer(
- SDL_GPUDevice *device,
- const SDL_GPUBufferCreateInfo *createinfo);
- #define SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING "SDL.gpu.buffer.create.name"
- /**
- * Creates a transfer buffer to be used when uploading to or downloading from
- * graphics resources.
- *
- * Download buffers can be particularly expensive to create, so it is good
- * practice to reuse them if data will be downloaded regularly.
- *
- * There are optional properties that can be provided through `props`. These
- * are the supported properties:
- *
- * - `SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING`: a name that can be
- * displayed in debugging tools.
- *
- * \param device a GPU Context.
- * \param createinfo a struct describing the state of the transfer buffer to
- * create.
- * \returns a transfer buffer on success, or NULL on failure; call
- * SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUBuffer
- * \sa SDL_DownloadFromGPUBuffer
- * \sa SDL_UploadToGPUTexture
- * \sa SDL_DownloadFromGPUTexture
- * \sa SDL_ReleaseGPUTransferBuffer
- */
- extern SDL_DECLSPEC SDL_GPUTransferBuffer * SDLCALL SDL_CreateGPUTransferBuffer(
- SDL_GPUDevice *device,
- const SDL_GPUTransferBufferCreateInfo *createinfo);
- #define SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING "SDL.gpu.transferbuffer.create.name"
- /* Debug Naming */
- /**
- * Sets an arbitrary string constant to label a buffer.
- *
- * You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with
- * SDL_CreateGPUBuffer instead of this function to avoid thread safety issues.
- *
- * \param device a GPU Context.
- * \param buffer a buffer to attach the name to.
- * \param text a UTF-8 string constant to mark as the name of the buffer.
- *
- * \threadsafety This function is not thread safe, you must make sure the
- * buffer is not simultaneously used by any other thread.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUBuffer
- */
- extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBufferName(
- SDL_GPUDevice *device,
- SDL_GPUBuffer *buffer,
- const char *text);
- /**
- * Sets an arbitrary string constant to label a texture.
- *
- * You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with
- * SDL_CreateGPUTexture instead of this function to avoid thread safety
- * issues.
- *
- * \param device a GPU Context.
- * \param texture a texture to attach the name to.
- * \param text a UTF-8 string constant to mark as the name of the texture.
- *
- * \threadsafety This function is not thread safe, you must make sure the
- * texture is not simultaneously used by any other thread.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUTexture
- */
- extern SDL_DECLSPEC void SDLCALL SDL_SetGPUTextureName(
- SDL_GPUDevice *device,
- SDL_GPUTexture *texture,
- const char *text);
- /**
- * Inserts an arbitrary string label into the command buffer callstream.
- *
- * Useful for debugging.
- *
- * \param command_buffer a command buffer.
- * \param text a UTF-8 string constant to insert as the label.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_InsertGPUDebugLabel(
- SDL_GPUCommandBuffer *command_buffer,
- const char *text);
- /**
- * Begins a debug group with an arbitary name.
- *
- * Used for denoting groups of calls when viewing the command buffer
- * callstream in a graphics debugging tool.
- *
- * Each call to SDL_PushGPUDebugGroup must have a corresponding call to
- * SDL_PopGPUDebugGroup.
- *
- * On some backends (e.g. Metal), pushing a debug group during a
- * render/blit/compute pass will create a group that is scoped to the native
- * pass rather than the command buffer. For best results, if you push a debug
- * group during a pass, always pop it in the same pass.
- *
- * \param command_buffer a command buffer.
- * \param name a UTF-8 string constant that names the group.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_PopGPUDebugGroup
- */
- extern SDL_DECLSPEC void SDLCALL SDL_PushGPUDebugGroup(
- SDL_GPUCommandBuffer *command_buffer,
- const char *name);
- /**
- * Ends the most-recently pushed debug group.
- *
- * \param command_buffer a command buffer.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_PushGPUDebugGroup
- */
- extern SDL_DECLSPEC void SDLCALL SDL_PopGPUDebugGroup(
- SDL_GPUCommandBuffer *command_buffer);
- /* Disposal */
- /**
- * Frees the given texture as soon as it is safe to do so.
- *
- * You must not reference the texture after calling this function.
- *
- * \param device a GPU context.
- * \param texture a texture to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTexture(
- SDL_GPUDevice *device,
- SDL_GPUTexture *texture);
- /**
- * Frees the given sampler as soon as it is safe to do so.
- *
- * You must not reference the sampler after calling this function.
- *
- * \param device a GPU context.
- * \param sampler a sampler to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUSampler(
- SDL_GPUDevice *device,
- SDL_GPUSampler *sampler);
- /**
- * Frees the given buffer as soon as it is safe to do so.
- *
- * You must not reference the buffer after calling this function.
- *
- * \param device a GPU context.
- * \param buffer a buffer to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUBuffer(
- SDL_GPUDevice *device,
- SDL_GPUBuffer *buffer);
- /**
- * Frees the given transfer buffer as soon as it is safe to do so.
- *
- * You must not reference the transfer buffer after calling this function.
- *
- * \param device a GPU context.
- * \param transfer_buffer a transfer buffer to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUTransferBuffer(
- SDL_GPUDevice *device,
- SDL_GPUTransferBuffer *transfer_buffer);
- /**
- * Frees the given compute pipeline as soon as it is safe to do so.
- *
- * You must not reference the compute pipeline after calling this function.
- *
- * \param device a GPU context.
- * \param compute_pipeline a compute pipeline to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUComputePipeline(
- SDL_GPUDevice *device,
- SDL_GPUComputePipeline *compute_pipeline);
- /**
- * Frees the given shader as soon as it is safe to do so.
- *
- * You must not reference the shader after calling this function.
- *
- * \param device a GPU context.
- * \param shader a shader to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUShader(
- SDL_GPUDevice *device,
- SDL_GPUShader *shader);
- /**
- * Frees the given graphics pipeline as soon as it is safe to do so.
- *
- * You must not reference the graphics pipeline after calling this function.
- *
- * \param device a GPU context.
- * \param graphics_pipeline a graphics pipeline to be destroyed.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUGraphicsPipeline(
- SDL_GPUDevice *device,
- SDL_GPUGraphicsPipeline *graphics_pipeline);
- /**
- * Acquire a command buffer.
- *
- * This command buffer is managed by the implementation and should not be
- * freed by the user. The command buffer may only be used on the thread it was
- * acquired on. The command buffer should be submitted on the thread it was
- * acquired on.
- *
- * It is valid to acquire multiple command buffers on the same thread at once.
- * In fact a common design pattern is to acquire two command buffers per frame
- * where one is dedicated to render and compute passes and the other is
- * dedicated to copy passes and other preparatory work such as generating
- * mipmaps. Interleaving commands between the two command buffers reduces the
- * total amount of passes overall which improves rendering performance.
- *
- * \param device a GPU context.
- * \returns a command buffer, or NULL on failure; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_SubmitGPUCommandBuffer
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- */
- extern SDL_DECLSPEC SDL_GPUCommandBuffer * SDLCALL SDL_AcquireGPUCommandBuffer(
- SDL_GPUDevice *device);
- /* Uniform Data */
- /**
- * Pushes data to a vertex uniform slot on the command buffer.
- *
- * Subsequent draw calls will use this uniform data.
- *
- * The data being pushed must respect std140 layout conventions. In practical
- * terms this means you must ensure that vec3 and vec4 fields are 16-byte
- * aligned.
- *
- * \param command_buffer a command buffer.
- * \param slot_index the vertex uniform slot to push data to.
- * \param data client data to write.
- * \param length the length of the data to write.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_PushGPUVertexUniformData(
- SDL_GPUCommandBuffer *command_buffer,
- Uint32 slot_index,
- const void *data,
- Uint32 length);
- /**
- * Pushes data to a fragment uniform slot on the command buffer.
- *
- * Subsequent draw calls will use this uniform data.
- *
- * The data being pushed must respect std140 layout conventions. In practical
- * terms this means you must ensure that vec3 and vec4 fields are 16-byte
- * aligned.
- *
- * \param command_buffer a command buffer.
- * \param slot_index the fragment uniform slot to push data to.
- * \param data client data to write.
- * \param length the length of the data to write.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_PushGPUFragmentUniformData(
- SDL_GPUCommandBuffer *command_buffer,
- Uint32 slot_index,
- const void *data,
- Uint32 length);
- /**
- * Pushes data to a uniform slot on the command buffer.
- *
- * Subsequent draw calls will use this uniform data.
- *
- * The data being pushed must respect std140 layout conventions. In practical
- * terms this means you must ensure that vec3 and vec4 fields are 16-byte
- * aligned.
- *
- * \param command_buffer a command buffer.
- * \param slot_index the uniform slot to push data to.
- * \param data client data to write.
- * \param length the length of the data to write.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_PushGPUComputeUniformData(
- SDL_GPUCommandBuffer *command_buffer,
- Uint32 slot_index,
- const void *data,
- Uint32 length);
- /* Graphics State */
- /**
- * Begins a render pass on a command buffer.
- *
- * A render pass consists of a set of texture subresources (or depth slices in
- * the 3D texture case) which will be rendered to during the render pass,
- * along with corresponding clear values and load/store operations. All
- * operations related to graphics pipelines must take place inside of a render
- * pass. A default viewport and scissor state are automatically set when this
- * is called. You cannot begin another render pass, or begin a compute pass or
- * copy pass until you have ended the render pass.
- *
- * \param command_buffer a command buffer.
- * \param color_target_infos an array of texture subresources with
- * corresponding clear values and load/store ops.
- * \param num_color_targets the number of color targets in the
- * color_target_infos array.
- * \param depth_stencil_target_info a texture subresource with corresponding
- * clear value and load/store ops, may be
- * NULL.
- * \returns a render pass handle.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_EndGPURenderPass
- */
- extern SDL_DECLSPEC SDL_GPURenderPass * SDLCALL SDL_BeginGPURenderPass(
- SDL_GPUCommandBuffer *command_buffer,
- const SDL_GPUColorTargetInfo *color_target_infos,
- Uint32 num_color_targets,
- const SDL_GPUDepthStencilTargetInfo *depth_stencil_target_info);
- /**
- * Binds a graphics pipeline on a render pass to be used in rendering.
- *
- * A graphics pipeline must be bound before making any draw calls.
- *
- * \param render_pass a render pass handle.
- * \param graphics_pipeline the graphics pipeline to bind.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUGraphicsPipeline(
- SDL_GPURenderPass *render_pass,
- SDL_GPUGraphicsPipeline *graphics_pipeline);
- /**
- * Sets the current viewport state on a command buffer.
- *
- * \param render_pass a render pass handle.
- * \param viewport the viewport to set.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_SetGPUViewport(
- SDL_GPURenderPass *render_pass,
- const SDL_GPUViewport *viewport);
- /**
- * Sets the current scissor state on a command buffer.
- *
- * \param render_pass a render pass handle.
- * \param scissor the scissor area to set.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_SetGPUScissor(
- SDL_GPURenderPass *render_pass,
- const SDL_Rect *scissor);
- /**
- * Sets the current blend constants on a command buffer.
- *
- * \param render_pass a render pass handle.
- * \param blend_constants the blend constant color.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_GPU_BLENDFACTOR_CONSTANT_COLOR
- * \sa SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR
- */
- extern SDL_DECLSPEC void SDLCALL SDL_SetGPUBlendConstants(
- SDL_GPURenderPass *render_pass,
- SDL_FColor blend_constants);
- /**
- * Sets the current stencil reference value on a command buffer.
- *
- * \param render_pass a render pass handle.
- * \param reference the stencil reference value to set.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_SetGPUStencilReference(
- SDL_GPURenderPass *render_pass,
- Uint8 reference);
- /**
- * Binds vertex buffers on a command buffer for use with subsequent draw
- * calls.
- *
- * \param render_pass a render pass handle.
- * \param first_slot the vertex buffer slot to begin binding from.
- * \param bindings an array of SDL_GPUBufferBinding structs containing vertex
- * buffers and offset values.
- * \param num_bindings the number of bindings in the bindings array.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexBuffers(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- const SDL_GPUBufferBinding *bindings,
- Uint32 num_bindings);
- /**
- * Binds an index buffer on a command buffer for use with subsequent draw
- * calls.
- *
- * \param render_pass a render pass handle.
- * \param binding a pointer to a struct containing an index buffer and offset.
- * \param index_element_size whether the index values in the buffer are 16- or
- * 32-bit.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUIndexBuffer(
- SDL_GPURenderPass *render_pass,
- const SDL_GPUBufferBinding *binding,
- SDL_GPUIndexElementSize index_element_size);
- /**
- * Binds texture-sampler pairs for use on the vertex shader.
- *
- * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param render_pass a render pass handle.
- * \param first_slot the vertex sampler slot to begin binding from.
- * \param texture_sampler_bindings an array of texture-sampler binding
- * structs.
- * \param num_bindings the number of texture-sampler pairs to bind from the
- * array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexSamplers(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- const SDL_GPUTextureSamplerBinding *texture_sampler_bindings,
- Uint32 num_bindings);
- /**
- * Binds storage textures for use on the vertex shader.
- *
- * These textures must have been created with
- * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param render_pass a render pass handle.
- * \param first_slot the vertex storage texture slot to begin binding from.
- * \param storage_textures an array of storage textures.
- * \param num_bindings the number of storage texture to bind from the array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageTextures(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- SDL_GPUTexture *const *storage_textures,
- Uint32 num_bindings);
- /**
- * Binds storage buffers for use on the vertex shader.
- *
- * These buffers must have been created with
- * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param render_pass a render pass handle.
- * \param first_slot the vertex storage buffer slot to begin binding from.
- * \param storage_buffers an array of buffers.
- * \param num_bindings the number of buffers to bind from the array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUVertexStorageBuffers(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- SDL_GPUBuffer *const *storage_buffers,
- Uint32 num_bindings);
- /**
- * Binds texture-sampler pairs for use on the fragment shader.
- *
- * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param render_pass a render pass handle.
- * \param first_slot the fragment sampler slot to begin binding from.
- * \param texture_sampler_bindings an array of texture-sampler binding
- * structs.
- * \param num_bindings the number of texture-sampler pairs to bind from the
- * array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentSamplers(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- const SDL_GPUTextureSamplerBinding *texture_sampler_bindings,
- Uint32 num_bindings);
- /**
- * Binds storage textures for use on the fragment shader.
- *
- * These textures must have been created with
- * SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param render_pass a render pass handle.
- * \param first_slot the fragment storage texture slot to begin binding from.
- * \param storage_textures an array of storage textures.
- * \param num_bindings the number of storage textures to bind from the array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageTextures(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- SDL_GPUTexture *const *storage_textures,
- Uint32 num_bindings);
- /**
- * Binds storage buffers for use on the fragment shader.
- *
- * These buffers must have been created with
- * SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param render_pass a render pass handle.
- * \param first_slot the fragment storage buffer slot to begin binding from.
- * \param storage_buffers an array of storage buffers.
- * \param num_bindings the number of storage buffers to bind from the array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUFragmentStorageBuffers(
- SDL_GPURenderPass *render_pass,
- Uint32 first_slot,
- SDL_GPUBuffer *const *storage_buffers,
- Uint32 num_bindings);
- /* Drawing */
- /**
- * Draws data using bound graphics state with an index buffer and instancing
- * enabled.
- *
- * You must not call this function before binding a graphics pipeline.
- *
- * Note that the `first_vertex` and `first_instance` parameters are NOT
- * compatible with built-in vertex/instance ID variables in shaders (for
- * example, SV_VertexID); GPU APIs and shader languages do not define these
- * built-in variables consistently, so if your shader depends on them, the
- * only way to keep behavior consistent and portable is to always pass 0 for
- * the correlating parameter in the draw calls.
- *
- * \param render_pass a render pass handle.
- * \param num_indices the number of indices to draw per instance.
- * \param num_instances the number of instances to draw.
- * \param first_index the starting index within the index buffer.
- * \param vertex_offset value added to vertex index before indexing into the
- * vertex buffer.
- * \param first_instance the ID of the first instance to draw.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitives(
- SDL_GPURenderPass *render_pass,
- Uint32 num_indices,
- Uint32 num_instances,
- Uint32 first_index,
- Sint32 vertex_offset,
- Uint32 first_instance);
- /**
- * Draws data using bound graphics state.
- *
- * You must not call this function before binding a graphics pipeline.
- *
- * Note that the `first_vertex` and `first_instance` parameters are NOT
- * compatible with built-in vertex/instance ID variables in shaders (for
- * example, SV_VertexID); GPU APIs and shader languages do not define these
- * built-in variables consistently, so if your shader depends on them, the
- * only way to keep behavior consistent and portable is to always pass 0 for
- * the correlating parameter in the draw calls.
- *
- * \param render_pass a render pass handle.
- * \param num_vertices the number of vertices to draw.
- * \param num_instances the number of instances that will be drawn.
- * \param first_vertex the index of the first vertex to draw.
- * \param first_instance the ID of the first instance to draw.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitives(
- SDL_GPURenderPass *render_pass,
- Uint32 num_vertices,
- Uint32 num_instances,
- Uint32 first_vertex,
- Uint32 first_instance);
- /**
- * Draws data using bound graphics state and with draw parameters set from a
- * buffer.
- *
- * The buffer must consist of tightly-packed draw parameter sets that each
- * match the layout of SDL_GPUIndirectDrawCommand. You must not call this
- * function before binding a graphics pipeline.
- *
- * \param render_pass a render pass handle.
- * \param buffer a buffer containing draw parameters.
- * \param offset the offset to start reading from the draw buffer.
- * \param draw_count the number of draw parameter sets that should be read
- * from the draw buffer.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUPrimitivesIndirect(
- SDL_GPURenderPass *render_pass,
- SDL_GPUBuffer *buffer,
- Uint32 offset,
- Uint32 draw_count);
- /**
- * Draws data using bound graphics state with an index buffer enabled and with
- * draw parameters set from a buffer.
- *
- * The buffer must consist of tightly-packed draw parameter sets that each
- * match the layout of SDL_GPUIndexedIndirectDrawCommand. You must not call
- * this function before binding a graphics pipeline.
- *
- * \param render_pass a render pass handle.
- * \param buffer a buffer containing draw parameters.
- * \param offset the offset to start reading from the draw buffer.
- * \param draw_count the number of draw parameter sets that should be read
- * from the draw buffer.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DrawGPUIndexedPrimitivesIndirect(
- SDL_GPURenderPass *render_pass,
- SDL_GPUBuffer *buffer,
- Uint32 offset,
- Uint32 draw_count);
- /**
- * Ends the given render pass.
- *
- * All bound graphics state on the render pass command buffer is unset. The
- * render pass handle is now invalid.
- *
- * \param render_pass a render pass handle.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_EndGPURenderPass(
- SDL_GPURenderPass *render_pass);
- /* Compute Pass */
- /**
- * Begins a compute pass on a command buffer.
- *
- * A compute pass is defined by a set of texture subresources and buffers that
- * may be written to by compute pipelines. These textures and buffers must
- * have been created with the COMPUTE_STORAGE_WRITE bit or the
- * COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE bit. If you do not create a texture
- * with COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE, you must not read from the
- * texture in the compute pass. All operations related to compute pipelines
- * must take place inside of a compute pass. You must not begin another
- * compute pass, or a render pass or copy pass before ending the compute pass.
- *
- * A VERY IMPORTANT NOTE - Reads and writes in compute passes are NOT
- * implicitly synchronized. This means you may cause data races by both
- * reading and writing a resource region in a compute pass, or by writing
- * multiple times to a resource region. If your compute work depends on
- * reading the completed output from a previous dispatch, you MUST end the
- * current compute pass and begin a new one before you can safely access the
- * data. Otherwise you will receive unexpected results. Reading and writing a
- * texture in the same compute pass is only supported by specific texture
- * formats. Make sure you check the format support!
- *
- * \param command_buffer a command buffer.
- * \param storage_texture_bindings an array of writeable storage texture
- * binding structs.
- * \param num_storage_texture_bindings the number of storage textures to bind
- * from the array.
- * \param storage_buffer_bindings an array of writeable storage buffer binding
- * structs.
- * \param num_storage_buffer_bindings the number of storage buffers to bind
- * from the array.
- * \returns a compute pass handle.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_EndGPUComputePass
- */
- extern SDL_DECLSPEC SDL_GPUComputePass * SDLCALL SDL_BeginGPUComputePass(
- SDL_GPUCommandBuffer *command_buffer,
- const SDL_GPUStorageTextureReadWriteBinding *storage_texture_bindings,
- Uint32 num_storage_texture_bindings,
- const SDL_GPUStorageBufferReadWriteBinding *storage_buffer_bindings,
- Uint32 num_storage_buffer_bindings);
- /**
- * Binds a compute pipeline on a command buffer for use in compute dispatch.
- *
- * \param compute_pass a compute pass handle.
- * \param compute_pipeline a compute pipeline to bind.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputePipeline(
- SDL_GPUComputePass *compute_pass,
- SDL_GPUComputePipeline *compute_pipeline);
- /**
- * Binds texture-sampler pairs for use on the compute shader.
- *
- * The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param compute_pass a compute pass handle.
- * \param first_slot the compute sampler slot to begin binding from.
- * \param texture_sampler_bindings an array of texture-sampler binding
- * structs.
- * \param num_bindings the number of texture-sampler bindings to bind from the
- * array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeSamplers(
- SDL_GPUComputePass *compute_pass,
- Uint32 first_slot,
- const SDL_GPUTextureSamplerBinding *texture_sampler_bindings,
- Uint32 num_bindings);
- /**
- * Binds storage textures as readonly for use on the compute pipeline.
- *
- * These textures must have been created with
- * SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param compute_pass a compute pass handle.
- * \param first_slot the compute storage texture slot to begin binding from.
- * \param storage_textures an array of storage textures.
- * \param num_bindings the number of storage textures to bind from the array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageTextures(
- SDL_GPUComputePass *compute_pass,
- Uint32 first_slot,
- SDL_GPUTexture *const *storage_textures,
- Uint32 num_bindings);
- /**
- * Binds storage buffers as readonly for use on the compute pipeline.
- *
- * These buffers must have been created with
- * SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ.
- *
- * Be sure your shader is set up according to the requirements documented in
- * SDL_CreateGPUShader().
- *
- * \param compute_pass a compute pass handle.
- * \param first_slot the compute storage buffer slot to begin binding from.
- * \param storage_buffers an array of storage buffer binding structs.
- * \param num_bindings the number of storage buffers to bind from the array.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_CreateGPUShader
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BindGPUComputeStorageBuffers(
- SDL_GPUComputePass *compute_pass,
- Uint32 first_slot,
- SDL_GPUBuffer *const *storage_buffers,
- Uint32 num_bindings);
- /**
- * Dispatches compute work.
- *
- * You must not call this function before binding a compute pipeline.
- *
- * A VERY IMPORTANT NOTE If you dispatch multiple times in a compute pass, and
- * the dispatches write to the same resource region as each other, there is no
- * guarantee of which order the writes will occur. If the write order matters,
- * you MUST end the compute pass and begin another one.
- *
- * \param compute_pass a compute pass handle.
- * \param groupcount_x number of local workgroups to dispatch in the X
- * dimension.
- * \param groupcount_y number of local workgroups to dispatch in the Y
- * dimension.
- * \param groupcount_z number of local workgroups to dispatch in the Z
- * dimension.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUCompute(
- SDL_GPUComputePass *compute_pass,
- Uint32 groupcount_x,
- Uint32 groupcount_y,
- Uint32 groupcount_z);
- /**
- * Dispatches compute work with parameters set from a buffer.
- *
- * The buffer layout should match the layout of
- * SDL_GPUIndirectDispatchCommand. You must not call this function before
- * binding a compute pipeline.
- *
- * A VERY IMPORTANT NOTE If you dispatch multiple times in a compute pass, and
- * the dispatches write to the same resource region as each other, there is no
- * guarantee of which order the writes will occur. If the write order matters,
- * you MUST end the compute pass and begin another one.
- *
- * \param compute_pass a compute pass handle.
- * \param buffer a buffer containing dispatch parameters.
- * \param offset the offset to start reading from the dispatch buffer.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DispatchGPUComputeIndirect(
- SDL_GPUComputePass *compute_pass,
- SDL_GPUBuffer *buffer,
- Uint32 offset);
- /**
- * Ends the current compute pass.
- *
- * All bound compute state on the command buffer is unset. The compute pass
- * handle is now invalid.
- *
- * \param compute_pass a compute pass handle.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_EndGPUComputePass(
- SDL_GPUComputePass *compute_pass);
- /* TransferBuffer Data */
- /**
- * Maps a transfer buffer into application address space.
- *
- * You must unmap the transfer buffer before encoding upload commands. The
- * memory is owned by the graphics driver - do NOT call SDL_free() on the
- * returned pointer.
- *
- * \param device a GPU context.
- * \param transfer_buffer a transfer buffer.
- * \param cycle if true, cycles the transfer buffer if it is already bound.
- * \returns the address of the mapped transfer buffer memory, or NULL on
- * failure; call SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void * SDLCALL SDL_MapGPUTransferBuffer(
- SDL_GPUDevice *device,
- SDL_GPUTransferBuffer *transfer_buffer,
- bool cycle);
- /**
- * Unmaps a previously mapped transfer buffer.
- *
- * \param device a GPU context.
- * \param transfer_buffer a previously mapped transfer buffer.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_UnmapGPUTransferBuffer(
- SDL_GPUDevice *device,
- SDL_GPUTransferBuffer *transfer_buffer);
- /* Copy Pass */
- /**
- * Begins a copy pass on a command buffer.
- *
- * All operations related to copying to or from buffers or textures take place
- * inside a copy pass. You must not begin another copy pass, or a render pass
- * or compute pass before ending the copy pass.
- *
- * \param command_buffer a command buffer.
- * \returns a copy pass handle.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC SDL_GPUCopyPass * SDLCALL SDL_BeginGPUCopyPass(
- SDL_GPUCommandBuffer *command_buffer);
- /**
- * Uploads data from a transfer buffer to a texture.
- *
- * The upload occurs on the GPU timeline. You may assume that the upload has
- * finished in subsequent commands.
- *
- * You must align the data in the transfer buffer to a multiple of the texel
- * size of the texture format.
- *
- * \param copy_pass a copy pass handle.
- * \param source the source transfer buffer with image layout information.
- * \param destination the destination texture region.
- * \param cycle if true, cycles the texture if the texture is bound, otherwise
- * overwrites the data.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUTexture(
- SDL_GPUCopyPass *copy_pass,
- const SDL_GPUTextureTransferInfo *source,
- const SDL_GPUTextureRegion *destination,
- bool cycle);
- /**
- * Uploads data from a transfer buffer to a buffer.
- *
- * The upload occurs on the GPU timeline. You may assume that the upload has
- * finished in subsequent commands.
- *
- * \param copy_pass a copy pass handle.
- * \param source the source transfer buffer with offset.
- * \param destination the destination buffer with offset and size.
- * \param cycle if true, cycles the buffer if it is already bound, otherwise
- * overwrites the data.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_UploadToGPUBuffer(
- SDL_GPUCopyPass *copy_pass,
- const SDL_GPUTransferBufferLocation *source,
- const SDL_GPUBufferRegion *destination,
- bool cycle);
- /**
- * Performs a texture-to-texture copy.
- *
- * This copy occurs on the GPU timeline. You may assume the copy has finished
- * in subsequent commands.
- *
- * \param copy_pass a copy pass handle.
- * \param source a source texture region.
- * \param destination a destination texture region.
- * \param w the width of the region to copy.
- * \param h the height of the region to copy.
- * \param d the depth of the region to copy.
- * \param cycle if true, cycles the destination texture if the destination
- * texture is bound, otherwise overwrites the data.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUTextureToTexture(
- SDL_GPUCopyPass *copy_pass,
- const SDL_GPUTextureLocation *source,
- const SDL_GPUTextureLocation *destination,
- Uint32 w,
- Uint32 h,
- Uint32 d,
- bool cycle);
- /**
- * Performs a buffer-to-buffer copy.
- *
- * This copy occurs on the GPU timeline. You may assume the copy has finished
- * in subsequent commands.
- *
- * \param copy_pass a copy pass handle.
- * \param source the buffer and offset to copy from.
- * \param destination the buffer and offset to copy to.
- * \param size the length of the buffer to copy.
- * \param cycle if true, cycles the destination buffer if it is already bound,
- * otherwise overwrites the data.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_CopyGPUBufferToBuffer(
- SDL_GPUCopyPass *copy_pass,
- const SDL_GPUBufferLocation *source,
- const SDL_GPUBufferLocation *destination,
- Uint32 size,
- bool cycle);
- /**
- * Copies data from a texture to a transfer buffer on the GPU timeline.
- *
- * This data is not guaranteed to be copied until the command buffer fence is
- * signaled.
- *
- * \param copy_pass a copy pass handle.
- * \param source the source texture region.
- * \param destination the destination transfer buffer with image layout
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUTexture(
- SDL_GPUCopyPass *copy_pass,
- const SDL_GPUTextureRegion *source,
- const SDL_GPUTextureTransferInfo *destination);
- /**
- * Copies data from a buffer to a transfer buffer on the GPU timeline.
- *
- * This data is not guaranteed to be copied until the command buffer fence is
- * signaled.
- *
- * \param copy_pass a copy pass handle.
- * \param source the source buffer with offset and size.
- * \param destination the destination transfer buffer with offset.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_DownloadFromGPUBuffer(
- SDL_GPUCopyPass *copy_pass,
- const SDL_GPUBufferRegion *source,
- const SDL_GPUTransferBufferLocation *destination);
- /**
- * Ends the current copy pass.
- *
- * \param copy_pass a copy pass handle.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_EndGPUCopyPass(
- SDL_GPUCopyPass *copy_pass);
- /**
- * Generates mipmaps for the given texture.
- *
- * This function must not be called inside of any pass.
- *
- * \param command_buffer a command_buffer.
- * \param texture a texture with more than 1 mip level.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_GenerateMipmapsForGPUTexture(
- SDL_GPUCommandBuffer *command_buffer,
- SDL_GPUTexture *texture);
- /**
- * Blits from a source texture region to a destination texture region.
- *
- * This function must not be called inside of any pass.
- *
- * \param command_buffer a command buffer.
- * \param info the blit info struct containing the blit parameters.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC void SDLCALL SDL_BlitGPUTexture(
- SDL_GPUCommandBuffer *command_buffer,
- const SDL_GPUBlitInfo *info);
- /* Submission/Presentation */
- /**
- * Determines whether a swapchain composition is supported by the window.
- *
- * The window must be claimed before calling this function.
- *
- * \param device a GPU context.
- * \param window an SDL_Window.
- * \param swapchain_composition the swapchain composition to check.
- * \returns true if supported, false if unsupported.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_ClaimWindowForGPUDevice
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUSwapchainComposition(
- SDL_GPUDevice *device,
- SDL_Window *window,
- SDL_GPUSwapchainComposition swapchain_composition);
- /**
- * Determines whether a presentation mode is supported by the window.
- *
- * The window must be claimed before calling this function.
- *
- * \param device a GPU context.
- * \param window an SDL_Window.
- * \param present_mode the presentation mode to check.
- * \returns true if supported, false if unsupported.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_ClaimWindowForGPUDevice
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_WindowSupportsGPUPresentMode(
- SDL_GPUDevice *device,
- SDL_Window *window,
- SDL_GPUPresentMode present_mode);
- /**
- * Claims a window, creating a swapchain structure for it.
- *
- * This must be called before SDL_AcquireGPUSwapchainTexture is called using
- * the window. You should only call this function from the thread that created
- * the window.
- *
- * The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and
- * SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain
- * parameters, you must call SDL_SetGPUSwapchainParameters after claiming the
- * window.
- *
- * \param device a GPU context.
- * \param window an SDL_Window.
- * \returns true on success, or false on failure; call SDL_GetError() for more
- * information.
- *
- * \threadsafety This function should only be called from the thread that
- * created the window.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- * \sa SDL_ReleaseWindowFromGPUDevice
- * \sa SDL_WindowSupportsGPUPresentMode
- * \sa SDL_WindowSupportsGPUSwapchainComposition
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_ClaimWindowForGPUDevice(
- SDL_GPUDevice *device,
- SDL_Window *window);
- /**
- * Unclaims a window, destroying its swapchain structure.
- *
- * \param device a GPU context.
- * \param window an SDL_Window that has been claimed.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_ClaimWindowForGPUDevice
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseWindowFromGPUDevice(
- SDL_GPUDevice *device,
- SDL_Window *window);
- /**
- * Changes the swapchain parameters for the given claimed window.
- *
- * This function will fail if the requested present mode or swapchain
- * composition are unsupported by the device. Check if the parameters are
- * supported via SDL_WindowSupportsGPUPresentMode /
- * SDL_WindowSupportsGPUSwapchainComposition prior to calling this function.
- *
- * SDL_GPU_PRESENTMODE_VSYNC and SDL_GPU_SWAPCHAINCOMPOSITION_SDR are always
- * supported.
- *
- * \param device a GPU context.
- * \param window an SDL_Window that has been claimed.
- * \param swapchain_composition the desired composition of the swapchain.
- * \param present_mode the desired present mode for the swapchain.
- * \returns true if successful, false on error; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_WindowSupportsGPUPresentMode
- * \sa SDL_WindowSupportsGPUSwapchainComposition
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUSwapchainParameters(
- SDL_GPUDevice *device,
- SDL_Window *window,
- SDL_GPUSwapchainComposition swapchain_composition,
- SDL_GPUPresentMode present_mode);
- /**
- * Configures the maximum allowed number of frames in flight.
- *
- * The default value when the device is created is 2. This means that after
- * you have submitted 2 frames for presentation, if the GPU has not finished
- * working on the first frame, SDL_AcquireGPUSwapchainTexture() will fill the
- * swapchain texture pointer with NULL, and
- * SDL_WaitAndAcquireGPUSwapchainTexture() will block.
- *
- * Higher values increase throughput at the expense of visual latency. Lower
- * values decrease visual latency at the expense of throughput.
- *
- * Note that calling this function will stall and flush the command queue to
- * prevent synchronization issues.
- *
- * The minimum value of allowed frames in flight is 1, and the maximum is 3.
- *
- * \param device a GPU context.
- * \param allowed_frames_in_flight the maximum number of frames that can be
- * pending on the GPU.
- * \returns true if successful, false on error; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_SetGPUAllowedFramesInFlight(
- SDL_GPUDevice *device,
- Uint32 allowed_frames_in_flight);
- /**
- * Obtains the texture format of the swapchain for the given window.
- *
- * Note that this format can change if the swapchain parameters change.
- *
- * \param device a GPU context.
- * \param window an SDL_Window that has been claimed.
- * \returns the texture format of the swapchain.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC SDL_GPUTextureFormat SDLCALL SDL_GetGPUSwapchainTextureFormat(
- SDL_GPUDevice *device,
- SDL_Window *window);
- /**
- * Acquire a texture to use in presentation.
- *
- * When a swapchain texture is acquired on a command buffer, it will
- * automatically be submitted for presentation when the command buffer is
- * submitted. The swapchain texture should only be referenced by the command
- * buffer used to acquire it.
- *
- * This function will fill the swapchain texture handle with NULL if too many
- * frames are in flight. This is not an error.
- *
- * If you use this function, it is possible to create a situation where many
- * command buffers are allocated while the rendering context waits for the GPU
- * to catch up, which will cause memory usage to grow. You should use
- * SDL_WaitAndAcquireGPUSwapchainTexture() unless you know what you are doing
- * with timing.
- *
- * The swapchain texture is managed by the implementation and must not be
- * freed by the user. You MUST NOT call this function from any thread other
- * than the one that created the window.
- *
- * \param command_buffer a command buffer.
- * \param window a window that has been claimed.
- * \param swapchain_texture a pointer filled in with a swapchain texture
- * handle.
- * \param swapchain_texture_width a pointer filled in with the swapchain
- * texture width, may be NULL.
- * \param swapchain_texture_height a pointer filled in with the swapchain
- * texture height, may be NULL.
- * \returns true on success, false on error; call SDL_GetError() for more
- * information.
- *
- * \threadsafety This function should only be called from the thread that
- * created the window.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_ClaimWindowForGPUDevice
- * \sa SDL_SubmitGPUCommandBuffer
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- * \sa SDL_CancelGPUCommandBuffer
- * \sa SDL_GetWindowSizeInPixels
- * \sa SDL_WaitForGPUSwapchain
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- * \sa SDL_SetGPUAllowedFramesInFlight
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_AcquireGPUSwapchainTexture(
- SDL_GPUCommandBuffer *command_buffer,
- SDL_Window *window,
- SDL_GPUTexture **swapchain_texture,
- Uint32 *swapchain_texture_width,
- Uint32 *swapchain_texture_height);
- /**
- * Blocks the thread until a swapchain texture is available to be acquired.
- *
- * \param device a GPU context.
- * \param window a window that has been claimed.
- * \returns true on success, false on failure; call SDL_GetError() for more
- * information.
- *
- * \threadsafety This function should only be called from the thread that
- * created the window.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_AcquireGPUSwapchainTexture
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- * \sa SDL_SetGPUAllowedFramesInFlight
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUSwapchain(
- SDL_GPUDevice *device,
- SDL_Window *window);
- /**
- * Blocks the thread until a swapchain texture is available to be acquired,
- * and then acquires it.
- *
- * When a swapchain texture is acquired on a command buffer, it will
- * automatically be submitted for presentation when the command buffer is
- * submitted. The swapchain texture should only be referenced by the command
- * buffer used to acquire it. It is an error to call
- * SDL_CancelGPUCommandBuffer() after a swapchain texture is acquired.
- *
- * This function can fill the swapchain texture handle with NULL in certain
- * cases, for example if the window is minimized. This is not an error. You
- * should always make sure to check whether the pointer is NULL before
- * actually using it.
- *
- * The swapchain texture is managed by the implementation and must not be
- * freed by the user. You MUST NOT call this function from any thread other
- * than the one that created the window.
- *
- * The swapchain texture is write-only and cannot be used as a sampler or for
- * another reading operation.
- *
- * \param command_buffer a command buffer.
- * \param window a window that has been claimed.
- * \param swapchain_texture a pointer filled in with a swapchain texture
- * handle.
- * \param swapchain_texture_width a pointer filled in with the swapchain
- * texture width, may be NULL.
- * \param swapchain_texture_height a pointer filled in with the swapchain
- * texture height, may be NULL.
- * \returns true on success, false on error; call SDL_GetError() for more
- * information.
- *
- * \threadsafety This function should only be called from the thread that
- * created the window.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_SubmitGPUCommandBuffer
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- * \sa SDL_AcquireGPUSwapchainTexture
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_WaitAndAcquireGPUSwapchainTexture(
- SDL_GPUCommandBuffer *command_buffer,
- SDL_Window *window,
- SDL_GPUTexture **swapchain_texture,
- Uint32 *swapchain_texture_width,
- Uint32 *swapchain_texture_height);
- /**
- * Submits a command buffer so its commands can be processed on the GPU.
- *
- * It is invalid to use the command buffer after this is called.
- *
- * This must be called from the thread the command buffer was acquired on.
- *
- * All commands in the submission are guaranteed to begin executing before any
- * command in a subsequent submission begins executing.
- *
- * \param command_buffer a command buffer.
- * \returns true on success, false on failure; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_AcquireGPUCommandBuffer
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- * \sa SDL_AcquireGPUSwapchainTexture
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_SubmitGPUCommandBuffer(
- SDL_GPUCommandBuffer *command_buffer);
- /**
- * Submits a command buffer so its commands can be processed on the GPU, and
- * acquires a fence associated with the command buffer.
- *
- * You must release this fence when it is no longer needed or it will cause a
- * leak. It is invalid to use the command buffer after this is called.
- *
- * This must be called from the thread the command buffer was acquired on.
- *
- * All commands in the submission are guaranteed to begin executing before any
- * command in a subsequent submission begins executing.
- *
- * \param command_buffer a command buffer.
- * \returns a fence associated with the command buffer, or NULL on failure;
- * call SDL_GetError() for more information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_AcquireGPUCommandBuffer
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- * \sa SDL_AcquireGPUSwapchainTexture
- * \sa SDL_SubmitGPUCommandBuffer
- * \sa SDL_ReleaseGPUFence
- */
- extern SDL_DECLSPEC SDL_GPUFence * SDLCALL SDL_SubmitGPUCommandBufferAndAcquireFence(
- SDL_GPUCommandBuffer *command_buffer);
- /**
- * Cancels a command buffer.
- *
- * None of the enqueued commands are executed.
- *
- * It is an error to call this function after a swapchain texture has been
- * acquired.
- *
- * This must be called from the thread the command buffer was acquired on.
- *
- * You must not reference the command buffer after calling this function.
- *
- * \param command_buffer a command buffer.
- * \returns true on success, false on error; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_WaitAndAcquireGPUSwapchainTexture
- * \sa SDL_AcquireGPUCommandBuffer
- * \sa SDL_AcquireGPUSwapchainTexture
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_CancelGPUCommandBuffer(
- SDL_GPUCommandBuffer *command_buffer);
- /**
- * Blocks the thread until the GPU is completely idle.
- *
- * \param device a GPU context.
- * \returns true on success, false on failure; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_WaitForGPUFences
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUIdle(
- SDL_GPUDevice *device);
- /**
- * Blocks the thread until the given fences are signaled.
- *
- * \param device a GPU context.
- * \param wait_all if 0, wait for any fence to be signaled, if 1, wait for all
- * fences to be signaled.
- * \param fences an array of fences to wait on.
- * \param num_fences the number of fences in the fences array.
- * \returns true on success, false on failure; call SDL_GetError() for more
- * information.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- * \sa SDL_WaitForGPUIdle
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_WaitForGPUFences(
- SDL_GPUDevice *device,
- bool wait_all,
- SDL_GPUFence *const *fences,
- Uint32 num_fences);
- /**
- * Checks the status of a fence.
- *
- * \param device a GPU context.
- * \param fence a fence.
- * \returns true if the fence is signaled, false if it is not.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_QueryGPUFence(
- SDL_GPUDevice *device,
- SDL_GPUFence *fence);
- /**
- * Releases a fence obtained from SDL_SubmitGPUCommandBufferAndAcquireFence.
- *
- * You must not reference the fence after calling this function.
- *
- * \param device a GPU context.
- * \param fence a fence.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_SubmitGPUCommandBufferAndAcquireFence
- */
- extern SDL_DECLSPEC void SDLCALL SDL_ReleaseGPUFence(
- SDL_GPUDevice *device,
- SDL_GPUFence *fence);
- /* Format Info */
- /**
- * Obtains the texel block size for a texture format.
- *
- * \param format the texture format you want to know the texel size of.
- * \returns the texel block size of the texture format.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_UploadToGPUTexture
- */
- extern SDL_DECLSPEC Uint32 SDLCALL SDL_GPUTextureFormatTexelBlockSize(
- SDL_GPUTextureFormat format);
- /**
- * Determines whether a texture format is supported for a given type and
- * usage.
- *
- * \param device a GPU context.
- * \param format the texture format to check.
- * \param type the type of texture (2D, 3D, Cube).
- * \param usage a bitmask of all usage scenarios to check.
- * \returns whether the texture format is supported for this type and usage.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsFormat(
- SDL_GPUDevice *device,
- SDL_GPUTextureFormat format,
- SDL_GPUTextureType type,
- SDL_GPUTextureUsageFlags usage);
- /**
- * Determines if a sample count for a texture format is supported.
- *
- * \param device a GPU context.
- * \param format the texture format to check.
- * \param sample_count the sample count to check.
- * \returns whether the sample count is supported for this texture format.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC bool SDLCALL SDL_GPUTextureSupportsSampleCount(
- SDL_GPUDevice *device,
- SDL_GPUTextureFormat format,
- SDL_GPUSampleCount sample_count);
- /**
- * Calculate the size in bytes of a texture format with dimensions.
- *
- * \param format a texture format.
- * \param width width in pixels.
- * \param height height in pixels.
- * \param depth_or_layer_count depth for 3D textures or layer count otherwise.
- * \returns the size of a texture with this format and dimensions.
- *
- * \since This function is available since SDL 3.2.0.
- */
- extern SDL_DECLSPEC Uint32 SDLCALL SDL_CalculateGPUTextureFormatSize(
- SDL_GPUTextureFormat format,
- Uint32 width,
- Uint32 height,
- Uint32 depth_or_layer_count);
- #ifdef SDL_PLATFORM_GDK
- /**
- * Call this to suspend GPU operation on Xbox when you receive the
- * SDL_EVENT_DID_ENTER_BACKGROUND event.
- *
- * Do NOT call any SDL_GPU functions after calling this function! This must
- * also be called before calling SDL_GDKSuspendComplete.
- *
- * \param device a GPU context.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_AddEventWatch
- */
- extern SDL_DECLSPEC void SDLCALL SDL_GDKSuspendGPU(SDL_GPUDevice *device);
- /**
- * Call this to resume GPU operation on Xbox when you receive the
- * SDL_EVENT_WILL_ENTER_FOREGROUND event.
- *
- * When resuming, this function MUST be called before calling any other
- * SDL_GPU functions.
- *
- * \param device a GPU context.
- *
- * \since This function is available since SDL 3.2.0.
- *
- * \sa SDL_AddEventWatch
- */
- extern SDL_DECLSPEC void SDLCALL SDL_GDKResumeGPU(SDL_GPUDevice *device);
- #endif /* SDL_PLATFORM_GDK */
- #ifdef __cplusplus
- }
- #endif /* __cplusplus */
- #include <SDL3/SDL_close_code.h>
- #endif /* SDL_gpu_h_ */
|