renderer_vk.cpp 228 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706
  1. /*
  2. * Copyright 2011-2020 Branimir Karadzic. All rights reserved.
  3. * License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause
  4. */
  5. #include "bgfx_p.h"
  6. #if BGFX_CONFIG_RENDERER_VULKAN
  7. # include "renderer_vk.h"
  8. #if BX_PLATFORM_OSX
  9. # import <Cocoa/Cocoa.h>
  10. # import <Foundation/Foundation.h>
  11. # import <QuartzCore/QuartzCore.h>
  12. # import <Metal/Metal.h>
  13. #endif // BX_PLATFORM_OSX
  14. namespace bgfx { namespace vk
  15. {
  16. static char s_viewName[BGFX_CONFIG_MAX_VIEWS][BGFX_CONFIG_MAX_VIEW_NAME];
  17. inline void setViewType(ViewId _view, const bx::StringView _str)
  18. {
  19. if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION || BGFX_CONFIG_PROFILER) )
  20. {
  21. bx::memCopy(&s_viewName[_view][3], _str.getPtr(), _str.getLength() );
  22. }
  23. }
  24. struct PrimInfo
  25. {
  26. VkPrimitiveTopology m_topology;
  27. uint32_t m_min;
  28. uint32_t m_div;
  29. uint32_t m_sub;
  30. };
  31. static const PrimInfo s_primInfo[] =
  32. {
  33. { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, 3, 3, 0 },
  34. { VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP, 3, 1, 2 },
  35. { VK_PRIMITIVE_TOPOLOGY_LINE_LIST, 2, 2, 0 },
  36. { VK_PRIMITIVE_TOPOLOGY_LINE_STRIP, 2, 1, 1 },
  37. { VK_PRIMITIVE_TOPOLOGY_POINT_LIST, 1, 1, 0 },
  38. { VK_PRIMITIVE_TOPOLOGY_MAX_ENUM, 0, 0, 0 },
  39. };
  40. BX_STATIC_ASSERT(Topology::Count == BX_COUNTOF(s_primInfo)-1);
  41. static const uint32_t s_checkMsaa[] =
  42. {
  43. 0,
  44. 2,
  45. 4,
  46. 8,
  47. 16,
  48. };
  49. // static DXGI_SAMPLE_DESC s_msaa[] =
  50. // {
  51. // { 1, 0 },
  52. // { 2, 0 },
  53. // { 4, 0 },
  54. // { 8, 0 },
  55. // { 16, 0 },
  56. // };
  57. static const VkBlendFactor s_blendFactor[][2] =
  58. {
  59. { VkBlendFactor(0), VkBlendFactor(0) }, // ignored
  60. { VK_BLEND_FACTOR_ZERO, VK_BLEND_FACTOR_ZERO }, // ZERO
  61. { VK_BLEND_FACTOR_ONE, VK_BLEND_FACTOR_ONE }, // ONE
  62. { VK_BLEND_FACTOR_SRC_COLOR, VK_BLEND_FACTOR_SRC_ALPHA }, // SRC_COLOR
  63. { VK_BLEND_FACTOR_ONE_MINUS_SRC_COLOR, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA }, // INV_SRC_COLOR
  64. { VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_SRC_ALPHA }, // SRC_ALPHA
  65. { VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA }, // INV_SRC_ALPHA
  66. { VK_BLEND_FACTOR_DST_ALPHA, VK_BLEND_FACTOR_DST_ALPHA }, // DST_ALPHA
  67. { VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA, VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA }, // INV_DST_ALPHA
  68. { VK_BLEND_FACTOR_DST_COLOR, VK_BLEND_FACTOR_DST_ALPHA }, // DST_COLOR
  69. { VK_BLEND_FACTOR_ONE_MINUS_DST_COLOR, VK_BLEND_FACTOR_ONE_MINUS_DST_ALPHA }, // INV_DST_COLOR
  70. { VK_BLEND_FACTOR_SRC_ALPHA, VK_BLEND_FACTOR_ONE }, // SRC_ALPHA_SAT
  71. { VK_BLEND_FACTOR_CONSTANT_COLOR, VK_BLEND_FACTOR_CONSTANT_COLOR }, // FACTOR
  72. { VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR, VK_BLEND_FACTOR_ONE_MINUS_CONSTANT_COLOR }, // INV_FACTOR
  73. };
  74. static const VkBlendOp s_blendEquation[] =
  75. {
  76. VK_BLEND_OP_ADD,
  77. VK_BLEND_OP_SUBTRACT,
  78. VK_BLEND_OP_REVERSE_SUBTRACT,
  79. VK_BLEND_OP_MIN,
  80. VK_BLEND_OP_MAX,
  81. };
  82. static const VkCompareOp s_cmpFunc[] =
  83. {
  84. VkCompareOp(0), // ignored
  85. VK_COMPARE_OP_LESS,
  86. VK_COMPARE_OP_LESS_OR_EQUAL,
  87. VK_COMPARE_OP_EQUAL,
  88. VK_COMPARE_OP_GREATER_OR_EQUAL,
  89. VK_COMPARE_OP_GREATER,
  90. VK_COMPARE_OP_NOT_EQUAL,
  91. VK_COMPARE_OP_NEVER,
  92. VK_COMPARE_OP_ALWAYS,
  93. };
  94. static const VkStencilOp s_stencilOp[] =
  95. {
  96. VK_STENCIL_OP_ZERO,
  97. VK_STENCIL_OP_KEEP,
  98. VK_STENCIL_OP_REPLACE,
  99. VK_STENCIL_OP_INCREMENT_AND_WRAP,
  100. VK_STENCIL_OP_INCREMENT_AND_CLAMP,
  101. VK_STENCIL_OP_DECREMENT_AND_WRAP,
  102. VK_STENCIL_OP_DECREMENT_AND_CLAMP,
  103. VK_STENCIL_OP_INVERT,
  104. };
  105. static const VkCullModeFlagBits s_cullMode[] =
  106. {
  107. VK_CULL_MODE_NONE,
  108. VK_CULL_MODE_FRONT_BIT,
  109. VK_CULL_MODE_BACK_BIT,
  110. };
  111. static const VkSamplerAddressMode s_textureAddress[] =
  112. {
  113. VK_SAMPLER_ADDRESS_MODE_REPEAT,
  114. VK_SAMPLER_ADDRESS_MODE_MIRRORED_REPEAT,
  115. VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE,
  116. VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER,
  117. };
  118. #define VK_IMPORT_FUNC(_optional, _func) PFN_##_func _func
  119. #define VK_IMPORT_INSTANCE_FUNC VK_IMPORT_FUNC
  120. #define VK_IMPORT_DEVICE_FUNC VK_IMPORT_FUNC
  121. VK_IMPORT
  122. VK_IMPORT_INSTANCE
  123. VK_IMPORT_DEVICE
  124. #undef VK_IMPORT_DEVICE_FUNC
  125. #undef VK_IMPORT_INSTANCE_FUNC
  126. #undef VK_IMPORT_FUNC
  127. struct TextureFormatInfo
  128. {
  129. VkFormat m_fmt;
  130. VkFormat m_fmtSrv;
  131. VkFormat m_fmtDsv;
  132. VkFormat m_fmtSrgb;
  133. VkComponentMapping m_mapping;
  134. };
  135. static const TextureFormatInfo s_textureFormat[] =
  136. {
  137. { VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_BC1_RGB_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_BC1_RGB_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC1
  138. { VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_BC2_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_BC2_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC2
  139. { VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_BC3_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_BC3_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC3
  140. { VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_BC4_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC4
  141. { VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_BC5_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC5
  142. { VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_BC6H_SFLOAT_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC6H
  143. { VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_BC7_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_BC7_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BC7
  144. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ETC1
  145. { VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ETC2
  146. { VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ETC2A
  147. { VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ETC2A1
  148. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // PTC12
  149. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // PTC14
  150. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // PTC12A
  151. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // PTC14A
  152. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // PTC22
  153. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // PTC24
  154. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ATC
  155. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ATCE
  156. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ATCI
  157. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ASTC4x4
  158. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ASTC5x5
  159. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ASTC6x6
  160. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ASTC8x5
  161. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ASTC8x6
  162. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // ASTC10x5
  163. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // Unknown
  164. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R1
  165. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // A8
  166. { VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R8
  167. { VK_FORMAT_R8_SINT, VK_FORMAT_R8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R8I
  168. { VK_FORMAT_R8_UINT, VK_FORMAT_R8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R8U
  169. { VK_FORMAT_R8_SNORM, VK_FORMAT_R8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R8S
  170. { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R16
  171. { VK_FORMAT_R16_SINT, VK_FORMAT_R16_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R16I
  172. { VK_FORMAT_R16_UNORM, VK_FORMAT_R16_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R16U
  173. { VK_FORMAT_R16_SFLOAT, VK_FORMAT_R16_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R16F
  174. { VK_FORMAT_R16_SNORM, VK_FORMAT_R16_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R16S
  175. { VK_FORMAT_R32_SINT, VK_FORMAT_R32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R32I
  176. { VK_FORMAT_R32_UINT, VK_FORMAT_R32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R32U
  177. { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R32F
  178. { VK_FORMAT_R8G8_UNORM, VK_FORMAT_R8G8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG8
  179. { VK_FORMAT_R8G8_SINT, VK_FORMAT_R8G8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG8I
  180. { VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG8U
  181. { VK_FORMAT_R8G8_SNORM, VK_FORMAT_R8G8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG8S
  182. { VK_FORMAT_R16G16_UNORM, VK_FORMAT_R16G16_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG16
  183. { VK_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG16I
  184. { VK_FORMAT_R16G16_UINT, VK_FORMAT_R16G16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG16U
  185. { VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG16F
  186. { VK_FORMAT_R16G16_SNORM, VK_FORMAT_R16G16_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG16S
  187. { VK_FORMAT_R32G32_SINT, VK_FORMAT_R32G32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG32I
  188. { VK_FORMAT_R32G32_UINT, VK_FORMAT_R32G32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG32U
  189. { VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG32F
  190. { VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_R8G8B8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB8
  191. { VK_FORMAT_R8G8B8_SINT, VK_FORMAT_R8G8B8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB8I
  192. { VK_FORMAT_R8G8B8_UINT, VK_FORMAT_R8G8B8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB8U
  193. { VK_FORMAT_R8G8B8_SNORM, VK_FORMAT_R8G8B8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB8S
  194. { VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_E5B9G9R9_UFLOAT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB9E5F
  195. { VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_B8G8R8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_B8G8R8A8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // BGRA8
  196. { VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_R8G8B8A8_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA8
  197. { VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_R8G8B8A8_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA8I
  198. { VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_R8G8B8A8_SRGB, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA8U
  199. { VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_R8G8B8A8_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA8S
  200. { VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_R16G16B16A16_UNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA16
  201. { VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA16I
  202. { VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_R16G16B16A16_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA16U
  203. { VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA16F
  204. { VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_R16G16B16A16_SNORM, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA16S
  205. { VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_R32G32B32A32_SINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA32I
  206. { VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_R32G32B32A32_UINT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA32U
  207. { VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGBA32F
  208. { VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_B5G6R5_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // R5G6B5
  209. { VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_B4G4R4A4_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_A, VK_COMPONENT_SWIZZLE_B } }, // RGBA4
  210. { VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_A1R5G5B5_UNORM_PACK16, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB5A1
  211. { VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RGB10A2
  212. { VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_B10G11R11_UFLOAT_PACK32, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // RG11B10F
  213. { VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // UnknownDepth
  214. { VK_FORMAT_UNDEFINED, VK_FORMAT_R16_UNORM, VK_FORMAT_D16_UNORM, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D16
  215. { VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D24
  216. { VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D24S8
  217. { VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D32
  218. { VK_FORMAT_UNDEFINED, VK_FORMAT_R32_SFLOAT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D16F
  219. { VK_FORMAT_UNDEFINED, VK_FORMAT_R32_SFLOAT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D24F
  220. { VK_FORMAT_UNDEFINED, VK_FORMAT_R32_SFLOAT, VK_FORMAT_D32_SFLOAT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D32F
  221. { VK_FORMAT_UNDEFINED, VK_FORMAT_X8_D24_UNORM_PACK32, VK_FORMAT_D24_UNORM_S8_UINT, VK_FORMAT_UNDEFINED, { VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY } }, // D0S8
  222. };
  223. BX_STATIC_ASSERT(TextureFormat::Count == BX_COUNTOF(s_textureFormat) );
  224. struct Extension
  225. {
  226. enum Enum
  227. {
  228. EXT_debug_utils,
  229. EXT_debug_report,
  230. EXT_memory_budget,
  231. KHR_get_physical_device_properties2,
  232. Count
  233. };
  234. const char* m_name;
  235. uint32_t m_minVersion;
  236. bool m_instanceExt;
  237. bool m_supported;
  238. bool m_initialize;
  239. };
  240. // Extension registry
  241. //
  242. static Extension s_extension[] =
  243. {
  244. { "VK_EXT_debug_utils", 1, false, false, BGFX_CONFIG_DEBUG_OBJECT_NAME },
  245. { "VK_EXT_debug_report", 1, false, false, BGFX_CONFIG_DEBUG },
  246. { "VK_EXT_memory_budget", 1, false, false, true },
  247. { "VK_KHR_get_physical_device_properties2", 1, false, false, true },
  248. };
  249. BX_STATIC_ASSERT(Extension::Count == BX_COUNTOF(s_extension) );
  250. void updateExtension(const char* _name, uint32_t _version, bool _instanceExt)
  251. {
  252. bx::StringView ext(_name);
  253. bool supported = false;
  254. for (uint32_t ii = 0; ii < Extension::Count; ++ii)
  255. {
  256. Extension& extension = s_extension[ii];
  257. if (!extension.m_supported
  258. && extension.m_initialize)
  259. {
  260. if ( 0 == bx::strCmp(ext, extension.m_name)
  261. && _version >= extension.m_minVersion)
  262. {
  263. extension.m_supported = true;
  264. extension.m_instanceExt = _instanceExt;
  265. supported = true;
  266. break;
  267. }
  268. }
  269. }
  270. BX_TRACE("\tv%-3d %s%s"
  271. , _version
  272. , _name
  273. , supported ? " (supported)" : "", _name
  274. );
  275. BX_UNUSED(supported);
  276. }
  277. static const VkFormat s_attribType[][4][2] =
  278. {
  279. { // Uint8
  280. { VK_FORMAT_R8_UINT, VK_FORMAT_R8_UNORM },
  281. { VK_FORMAT_R8G8_UINT, VK_FORMAT_R8G8_UNORM },
  282. { VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UNORM },
  283. { VK_FORMAT_R8G8B8A8_UINT, VK_FORMAT_R8G8B8A8_UNORM },
  284. },
  285. { // Uint10
  286. { VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32 },
  287. { VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32 },
  288. { VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32 },
  289. { VK_FORMAT_A2R10G10B10_UINT_PACK32, VK_FORMAT_A2R10G10B10_UNORM_PACK32 },
  290. },
  291. { // Int16
  292. { VK_FORMAT_R16_SINT, VK_FORMAT_R16_SNORM },
  293. { VK_FORMAT_R16G16_SINT, VK_FORMAT_R16G16_SNORM },
  294. { VK_FORMAT_R16G16B16_SINT, VK_FORMAT_R16G16B16_SNORM },
  295. { VK_FORMAT_R16G16B16A16_SINT, VK_FORMAT_R16G16B16A16_SNORM },
  296. },
  297. { // Half
  298. { VK_FORMAT_R16_SFLOAT, VK_FORMAT_R16_SFLOAT },
  299. { VK_FORMAT_R16G16_SFLOAT, VK_FORMAT_R16G16_SFLOAT },
  300. { VK_FORMAT_R16G16B16_SFLOAT, VK_FORMAT_R16G16B16_SFLOAT },
  301. { VK_FORMAT_R16G16B16A16_SFLOAT, VK_FORMAT_R16G16B16A16_SFLOAT },
  302. },
  303. { // Float
  304. { VK_FORMAT_R32_SFLOAT, VK_FORMAT_R32_SFLOAT },
  305. { VK_FORMAT_R32G32_SFLOAT, VK_FORMAT_R32G32_SFLOAT },
  306. { VK_FORMAT_R32G32B32_SFLOAT, VK_FORMAT_R32G32B32_SFLOAT },
  307. { VK_FORMAT_R32G32B32A32_SFLOAT, VK_FORMAT_R32G32B32A32_SFLOAT },
  308. },
  309. };
  310. BX_STATIC_ASSERT(AttribType::Count == BX_COUNTOF(s_attribType) );
  311. void fillVertexLayout(const ShaderVK* _vsh, VkPipelineVertexInputStateCreateInfo& _vertexInputState, const VertexLayout& _layout)
  312. {
  313. uint32_t numBindings = _vertexInputState.vertexBindingDescriptionCount;
  314. uint32_t numAttribs = _vertexInputState.vertexAttributeDescriptionCount;
  315. VkVertexInputBindingDescription* inputBinding = const_cast<VkVertexInputBindingDescription*>(_vertexInputState.pVertexBindingDescriptions + numBindings);
  316. VkVertexInputAttributeDescription* inputAttrib = const_cast<VkVertexInputAttributeDescription*>(_vertexInputState.pVertexAttributeDescriptions + numAttribs);
  317. inputBinding->binding = numBindings;
  318. inputBinding->stride = _layout.m_stride;
  319. inputBinding->inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
  320. for (uint32_t attr = 0; attr < Attrib::Count; ++attr)
  321. {
  322. if (UINT16_MAX != _layout.m_attributes[attr])
  323. {
  324. inputAttrib->location = _vsh->m_attrRemap[attr];
  325. inputAttrib->binding = numBindings;
  326. uint8_t num;
  327. AttribType::Enum type;
  328. bool normalized;
  329. bool asInt;
  330. _layout.decode(Attrib::Enum(attr), num, type, normalized, asInt);
  331. inputAttrib->format = s_attribType[type][num-1][normalized];
  332. inputAttrib->offset = _layout.m_offset[attr];
  333. ++inputAttrib;
  334. ++numAttribs;
  335. }
  336. }
  337. _vertexInputState.vertexBindingDescriptionCount = numBindings + 1;
  338. _vertexInputState.vertexAttributeDescriptionCount = numAttribs;
  339. }
  340. void fillInstanceBinding(const ShaderVK* _vsh, VkPipelineVertexInputStateCreateInfo& _vertexInputState, uint32_t _numInstanceData)
  341. {
  342. BX_UNUSED(_vsh);
  343. uint32_t numBindings = _vertexInputState.vertexBindingDescriptionCount;
  344. uint32_t numAttribs = _vertexInputState.vertexAttributeDescriptionCount;
  345. VkVertexInputBindingDescription* inputBinding = const_cast<VkVertexInputBindingDescription*>(_vertexInputState.pVertexBindingDescriptions + numBindings);
  346. VkVertexInputAttributeDescription* inputAttrib = const_cast<VkVertexInputAttributeDescription*>(_vertexInputState.pVertexAttributeDescriptions + numAttribs);
  347. inputBinding->binding = numBindings;
  348. inputBinding->stride = _numInstanceData * 16;
  349. inputBinding->inputRate = VK_VERTEX_INPUT_RATE_INSTANCE;
  350. for (uint32_t inst = 0; inst < _numInstanceData; ++inst)
  351. {
  352. inputAttrib->location = numAttribs;
  353. inputAttrib->binding = numBindings;
  354. inputAttrib->format = VK_FORMAT_R32G32B32A32_SFLOAT;
  355. inputAttrib->offset = inst * 16;
  356. ++numAttribs;
  357. ++inputAttrib;
  358. }
  359. _vertexInputState.vertexBindingDescriptionCount = numBindings + 1;
  360. _vertexInputState.vertexAttributeDescriptionCount = numAttribs;
  361. }
  362. static const char* s_deviceTypeName[] =
  363. {
  364. "Other",
  365. "Integrated GPU",
  366. "Discrete GPU",
  367. "Virtual GPU",
  368. "CPU",
  369. "Unknown?!"
  370. };
  371. const char* getName(VkPhysicalDeviceType _type)
  372. {
  373. return s_deviceTypeName[bx::min<int32_t>(_type, BX_COUNTOF(s_deviceTypeName) )];
  374. }
  375. static const char* s_allocScopeName[] =
  376. {
  377. "vkCommand",
  378. "vkObject",
  379. "vkCache",
  380. "vkDevice",
  381. "vkInstance",
  382. };
  383. BX_STATIC_ASSERT(VK_SYSTEM_ALLOCATION_SCOPE_RANGE_SIZE == BX_COUNTOF(s_allocScopeName) );
  384. static void* VKAPI_PTR allocationFunction(void* _userData, size_t _size, size_t _alignment, VkSystemAllocationScope _allocationScope)
  385. {
  386. BX_UNUSED(_userData, _allocationScope);
  387. return bx::alignedAlloc(g_allocator, _size, _alignment, s_allocScopeName[_allocationScope]);
  388. }
  389. static void* VKAPI_PTR reallocationFunction(void* _userData, void* _original, size_t _size, size_t _alignment, VkSystemAllocationScope _allocationScope)
  390. {
  391. BX_UNUSED(_userData, _allocationScope);
  392. return bx::alignedRealloc(g_allocator, _original, _size, _alignment, s_allocScopeName[_allocationScope]);
  393. }
  394. static void VKAPI_PTR freeFunction(void* _userData, void* _memory)
  395. {
  396. BX_UNUSED(_userData);
  397. if (NULL == _memory)
  398. {
  399. return;
  400. }
  401. bx::alignedFree(g_allocator, _memory, 8);
  402. }
  403. static void VKAPI_PTR internalAllocationNotification(void* _userData, size_t _size, VkInternalAllocationType _allocationType, VkSystemAllocationScope _allocationScope)
  404. {
  405. BX_UNUSED(_userData, _size, _allocationType, _allocationScope);
  406. }
  407. static void VKAPI_PTR internalFreeNotification(void* _userData, size_t _size, VkInternalAllocationType _allocationType, VkSystemAllocationScope _allocationScope)
  408. {
  409. BX_UNUSED(_userData, _size, _allocationType, _allocationScope);
  410. }
  411. static VkAllocationCallbacks s_allocationCb =
  412. {
  413. NULL,
  414. allocationFunction,
  415. reallocationFunction,
  416. freeFunction,
  417. internalAllocationNotification,
  418. internalFreeNotification,
  419. };
  420. VkResult VKAPI_PTR stubSetDebugUtilsObjectNameEXT(VkDevice _device, const VkDebugUtilsObjectNameInfoEXT* _nameInfo)
  421. {
  422. BX_UNUSED(_device, _nameInfo);
  423. return VK_SUCCESS;
  424. }
  425. void VKAPI_PTR stubCmdInsertDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer, const VkDebugUtilsLabelEXT* _labelInfo)
  426. {
  427. BX_UNUSED(_commandBuffer, _labelInfo);
  428. }
  429. void VKAPI_PTR stubCmdBeginDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer, const VkDebugUtilsLabelEXT* _labelInfo)
  430. {
  431. BX_UNUSED(_commandBuffer, _labelInfo);
  432. }
  433. void VKAPI_PTR stubCmdEndDebugUtilsLabelEXT(VkCommandBuffer _commandBuffer)
  434. {
  435. BX_UNUSED(_commandBuffer);
  436. }
  437. static const char* s_debugReportObjectType[] =
  438. {
  439. "Unknown",
  440. "Instance",
  441. "PhysicalDevice",
  442. "Device",
  443. "Queue",
  444. "Semaphore",
  445. "CommandBuffer",
  446. "Fence",
  447. "DeviceMemory",
  448. "Buffer",
  449. "Image",
  450. "Event",
  451. "QueryPool",
  452. "BufferView",
  453. "ImageView",
  454. "ShaderModule",
  455. "PipelineCache",
  456. "PipelineLayout",
  457. "RenderPass",
  458. "Pipeline",
  459. "DescriptorSetLayout",
  460. "Sampler",
  461. "DescriptorPool",
  462. "DescriptorSet",
  463. "Framebuffer",
  464. "CommandPool",
  465. "SurfaceKHR",
  466. "SwapchainKHR",
  467. "DebugReport",
  468. };
  469. VkBool32 VKAPI_PTR debugReportCb(
  470. VkDebugReportFlagsEXT _flags,
  471. VkDebugReportObjectTypeEXT _objectType,
  472. uint64_t _object,
  473. size_t _location,
  474. int32_t _messageCode,
  475. const char* _layerPrefix,
  476. const char* _message,
  477. void* _userData
  478. )
  479. {
  480. BX_UNUSED(_flags
  481. , _objectType
  482. , _object
  483. , _location
  484. , _messageCode
  485. , _layerPrefix
  486. , _message
  487. , _userData
  488. , s_debugReportObjectType
  489. );
  490. if (!bx::strFind(_message, "PointSizeMissing").isEmpty()
  491. || !bx::strFind(_message, "SwapchainTooManyImages").isEmpty()
  492. || !bx::strFind(_message, "SwapchainImageNotAcquired").isEmpty())
  493. {
  494. return VK_FALSE;
  495. }
  496. BX_TRACE("%c%c%c%c%c %19s, %s, %d: %s"
  497. , 0 != (_flags & VK_DEBUG_REPORT_INFORMATION_BIT_EXT ) ? 'I' : '-'
  498. , 0 != (_flags & VK_DEBUG_REPORT_WARNING_BIT_EXT ) ? 'W' : '-'
  499. , 0 != (_flags & VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT) ? 'P' : '-'
  500. , 0 != (_flags & VK_DEBUG_REPORT_ERROR_BIT_EXT ) ? 'E' : '-'
  501. , 0 != (_flags & VK_DEBUG_REPORT_DEBUG_BIT_EXT ) ? 'D' : '-'
  502. , s_debugReportObjectType[_objectType]
  503. , _layerPrefix
  504. , _messageCode
  505. , _message
  506. );
  507. return VK_TRUE;
  508. }
  509. VkResult enumerateLayerProperties(VkPhysicalDevice _physicalDevice, uint32_t* _propertyCount, VkLayerProperties* _properties)
  510. {
  511. return (VK_NULL_HANDLE == _physicalDevice)
  512. ? vkEnumerateInstanceLayerProperties(_propertyCount, _properties)
  513. : vkEnumerateDeviceLayerProperties(_physicalDevice, _propertyCount, _properties)
  514. ;
  515. }
  516. VkResult enumerateExtensionProperties(VkPhysicalDevice _physicalDevice, const char* _layerName, uint32_t* _propertyCount, VkExtensionProperties* _properties)
  517. {
  518. return (VK_NULL_HANDLE == _physicalDevice)
  519. ? vkEnumerateInstanceExtensionProperties(_layerName, _propertyCount, _properties)
  520. : vkEnumerateDeviceExtensionProperties(_physicalDevice, _layerName, _propertyCount, _properties)
  521. ;
  522. }
  523. void dumpExtensions(VkPhysicalDevice _physicalDevice = VK_NULL_HANDLE)
  524. {
  525. { // Global extensions.
  526. uint32_t numExtensionProperties;
  527. VkResult result = enumerateExtensionProperties(_physicalDevice
  528. , NULL
  529. , &numExtensionProperties
  530. , NULL
  531. );
  532. if (VK_SUCCESS == result
  533. && 0 < numExtensionProperties)
  534. {
  535. VkExtensionProperties extensionProperties[64];
  536. numExtensionProperties = bx::min<uint32_t>(numExtensionProperties, BX_COUNTOF(extensionProperties) );
  537. result = enumerateExtensionProperties(_physicalDevice
  538. , NULL
  539. , &numExtensionProperties
  540. , extensionProperties
  541. );
  542. BX_TRACE("Global extensions (%d):"
  543. , numExtensionProperties
  544. );
  545. for (uint32_t extension = 0; extension < numExtensionProperties; ++extension)
  546. {
  547. updateExtension(
  548. extensionProperties[extension].extensionName
  549. , extensionProperties[extension].specVersion
  550. , VK_NULL_HANDLE == _physicalDevice
  551. );
  552. }
  553. }
  554. }
  555. // Layer extensions.
  556. uint32_t numLayerProperties;
  557. VkResult result = enumerateLayerProperties(_physicalDevice, &numLayerProperties, NULL);
  558. if (VK_SUCCESS == result
  559. && 0 < numLayerProperties)
  560. {
  561. VkLayerProperties layerProperties[64];
  562. numLayerProperties = bx::min<uint32_t>(numLayerProperties, BX_COUNTOF(layerProperties) );
  563. result = enumerateLayerProperties(_physicalDevice, &numLayerProperties, layerProperties);
  564. char indent = VK_NULL_HANDLE == _physicalDevice ? '\0' : '\t';
  565. BX_UNUSED(indent);
  566. BX_TRACE("%cLayer extensions (%d):"
  567. , indent
  568. , numLayerProperties
  569. );
  570. for (uint32_t layer = 0; layer < numLayerProperties; ++layer)
  571. {
  572. BX_TRACE("%c\t%s (s: 0x%08x, i: 0x%08x), %s"
  573. , indent
  574. , layerProperties[layer].layerName
  575. , layerProperties[layer].specVersion
  576. , layerProperties[layer].implementationVersion
  577. , layerProperties[layer].description
  578. );
  579. uint32_t numExtensionProperties;
  580. result = enumerateExtensionProperties(_physicalDevice
  581. , layerProperties[layer].layerName
  582. , &numExtensionProperties
  583. , NULL
  584. );
  585. if (VK_SUCCESS == result
  586. && 0 < numExtensionProperties)
  587. {
  588. VkExtensionProperties extensionProperties[64];
  589. numExtensionProperties = bx::min<uint32_t>(numExtensionProperties, BX_COUNTOF(extensionProperties) );
  590. result = enumerateExtensionProperties(_physicalDevice
  591. , layerProperties[layer].layerName
  592. , &numExtensionProperties
  593. , extensionProperties
  594. );
  595. for (uint32_t extension = 0; extension < numExtensionProperties; ++extension)
  596. {
  597. BX_TRACE("%c\t\t%s (s: 0x%08x)"
  598. , indent
  599. , extensionProperties[extension].extensionName
  600. , extensionProperties[extension].specVersion
  601. );
  602. }
  603. }
  604. }
  605. }
  606. }
  607. const char* getName(VkResult _result)
  608. {
  609. switch (_result)
  610. {
  611. #define VKENUM(_ty) case _ty: return #_ty
  612. VKENUM(VK_SUCCESS);
  613. VKENUM(VK_NOT_READY);
  614. VKENUM(VK_TIMEOUT);
  615. VKENUM(VK_EVENT_SET);
  616. VKENUM(VK_EVENT_RESET);
  617. VKENUM(VK_INCOMPLETE);
  618. VKENUM(VK_ERROR_OUT_OF_HOST_MEMORY);
  619. VKENUM(VK_ERROR_OUT_OF_DEVICE_MEMORY);
  620. VKENUM(VK_ERROR_INITIALIZATION_FAILED);
  621. VKENUM(VK_ERROR_DEVICE_LOST);
  622. VKENUM(VK_ERROR_MEMORY_MAP_FAILED);
  623. VKENUM(VK_ERROR_LAYER_NOT_PRESENT);
  624. VKENUM(VK_ERROR_EXTENSION_NOT_PRESENT);
  625. VKENUM(VK_ERROR_FEATURE_NOT_PRESENT);
  626. VKENUM(VK_ERROR_INCOMPATIBLE_DRIVER);
  627. VKENUM(VK_ERROR_TOO_MANY_OBJECTS);
  628. VKENUM(VK_ERROR_FORMAT_NOT_SUPPORTED);
  629. VKENUM(VK_ERROR_SURFACE_LOST_KHR);
  630. VKENUM(VK_ERROR_NATIVE_WINDOW_IN_USE_KHR);
  631. VKENUM(VK_SUBOPTIMAL_KHR);
  632. VKENUM(VK_ERROR_OUT_OF_DATE_KHR);
  633. VKENUM(VK_ERROR_INCOMPATIBLE_DISPLAY_KHR);
  634. VKENUM(VK_ERROR_VALIDATION_FAILED_EXT);
  635. #undef VKENUM
  636. default: break;
  637. }
  638. BX_WARN(false, "Unknown VkResult? %x", _result);
  639. return "<VkResult?>";
  640. }
  641. template<typename Ty>
  642. VkObjectType getType();
  643. template<> VkObjectType getType<VkBuffer >() { return VK_OBJECT_TYPE_BUFFER; }
  644. template<> VkObjectType getType<VkShaderModule>() { return VK_OBJECT_TYPE_SHADER_MODULE; }
  645. template<typename Ty>
  646. static BX_NO_INLINE void setDebugObjectName(VkDevice _device, Ty _object, const char* _format, ...)
  647. {
  648. if (BX_ENABLED(BGFX_CONFIG_DEBUG_OBJECT_NAME) && s_extension[Extension::EXT_debug_utils].m_supported)
  649. {
  650. char temp[2048];
  651. va_list argList;
  652. va_start(argList, _format);
  653. int32_t size = bx::min<int32_t>(sizeof(temp)-1, bx::vsnprintf(temp, sizeof(temp), _format, argList) );
  654. va_end(argList);
  655. temp[size] = '\0';
  656. VkDebugUtilsObjectNameInfoEXT ni;
  657. ni.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
  658. ni.pNext = NULL;
  659. ni.objectType = getType<Ty>();
  660. ni.objectHandle = uint64_t(_object.vk);
  661. ni.pObjectName = temp;
  662. VK_CHECK(vkSetDebugUtilsObjectNameEXT(_device, &ni) );
  663. }
  664. }
  665. void setImageMemoryBarrier(VkCommandBuffer _commandBuffer, VkImage _image, VkImageAspectFlags _aspectMask, VkImageLayout _oldLayout, VkImageLayout _newLayout, uint32_t _levelCount, uint32_t _layerCount)
  666. {
  667. BX_CHECK(true
  668. && _newLayout != VK_IMAGE_LAYOUT_UNDEFINED
  669. && _newLayout != VK_IMAGE_LAYOUT_PREINITIALIZED
  670. , "_newLayout cannot use VK_IMAGE_LAYOUT_UNDEFINED or VK_IMAGE_LAYOUT_PREINITIALIZED."
  671. );
  672. VkAccessFlags srcAccessMask = 0;
  673. VkAccessFlags dstAccessMask = 0;
  674. switch (_oldLayout)
  675. {
  676. case VK_IMAGE_LAYOUT_UNDEFINED:
  677. // srcAccessMask |= VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
  678. break;
  679. case VK_IMAGE_LAYOUT_GENERAL:
  680. break;
  681. case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
  682. srcAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
  683. break;
  684. case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
  685. srcAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
  686. break;
  687. case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
  688. break;
  689. case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
  690. srcAccessMask |= VK_ACCESS_SHADER_READ_BIT;
  691. break;
  692. case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
  693. srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT;
  694. break;
  695. case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
  696. break;
  697. case VK_IMAGE_LAYOUT_PREINITIALIZED:
  698. srcAccessMask |= VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
  699. break;
  700. case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
  701. srcAccessMask |= VK_ACCESS_MEMORY_READ_BIT;
  702. break;
  703. default:
  704. break;
  705. }
  706. switch (_newLayout)
  707. {
  708. case VK_IMAGE_LAYOUT_UNDEFINED:
  709. break;
  710. case VK_IMAGE_LAYOUT_GENERAL:
  711. break;
  712. case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
  713. dstAccessMask |= VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
  714. break;
  715. case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
  716. dstAccessMask |= VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
  717. // aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
  718. break;
  719. case VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL:
  720. break;
  721. case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
  722. dstAccessMask |= VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
  723. break;
  724. case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
  725. dstAccessMask |= VK_ACCESS_SHADER_READ_BIT;
  726. break;
  727. case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
  728. dstAccessMask |= VK_ACCESS_TRANSFER_READ_BIT;
  729. break;
  730. case VK_IMAGE_LAYOUT_PREINITIALIZED:
  731. break;
  732. case VK_IMAGE_LAYOUT_PRESENT_SRC_KHR:
  733. dstAccessMask |= VK_ACCESS_MEMORY_READ_BIT;
  734. break;
  735. default:
  736. break;
  737. }
  738. VkImageMemoryBarrier imb;
  739. imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
  740. imb.pNext = NULL;
  741. imb.srcAccessMask = srcAccessMask;
  742. imb.dstAccessMask = dstAccessMask;
  743. imb.oldLayout = _oldLayout;
  744. imb.newLayout = _newLayout;
  745. imb.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
  746. imb.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
  747. imb.image = _image;
  748. imb.subresourceRange.aspectMask = _aspectMask;
  749. imb.subresourceRange.baseMipLevel = 0;
  750. imb.subresourceRange.levelCount = _levelCount;
  751. imb.subresourceRange.baseArrayLayer = 0;
  752. imb.subresourceRange.layerCount = _layerCount;
  753. vkCmdPipelineBarrier(_commandBuffer
  754. , VK_PIPELINE_STAGE_ALL_COMMANDS_BIT
  755. , VK_PIPELINE_STAGE_ALL_COMMANDS_BIT
  756. , 0
  757. , 0
  758. , NULL
  759. , 0
  760. , NULL
  761. , 1
  762. , &imb
  763. );
  764. }
  765. struct RendererContextVK : public RendererContextI
  766. {
  767. RendererContextVK()
  768. : m_allocatorCb(NULL)
  769. , m_renderDocDll(NULL)
  770. , m_vulkan1Dll(NULL)
  771. , m_maxAnisotropy(1)
  772. , m_depthClamp(false)
  773. , m_wireframe(false)
  774. {
  775. }
  776. ~RendererContextVK()
  777. {
  778. }
  779. VkResult createSwapchain()
  780. {
  781. VkResult result = VK_SUCCESS;
  782. result = vkCreateSwapchainKHR(m_device, &m_sci, m_allocatorCb, &m_swapchain);
  783. if (VK_SUCCESS != result)
  784. {
  785. BX_TRACE("Create swapchain error: vkCreateSwapchainKHR failed %d: %s.", result, getName(result));
  786. return result;
  787. }
  788. result = vkGetSwapchainImagesKHR(m_device, m_swapchain, &m_numSwapchainImages, NULL);
  789. if (VK_SUCCESS != result)
  790. {
  791. BX_TRACE("Create swapchain error: vkGetSwapchainImagesKHR failed %d: %s.", result, getName(result));
  792. return result;
  793. }
  794. if (m_numSwapchainImages < m_sci.minImageCount)
  795. {
  796. BX_TRACE("Create swapchain error: vkGetSwapchainImagesKHR: numSwapchainImages %d < minImageCount %d."
  797. , m_numSwapchainImages
  798. , m_sci.minImageCount
  799. );
  800. return VK_ERROR_INITIALIZATION_FAILED;
  801. }
  802. if (m_numSwapchainImages > BX_COUNTOF(m_backBufferColorImage))
  803. {
  804. BX_TRACE("Create swapchain error: vkGetSwapchainImagesKHR: numSwapchainImages %d > countof(m_backBufferColorImage) %d."
  805. , m_numSwapchainImages
  806. , BX_COUNTOF(m_backBufferColorImage)
  807. );
  808. return VK_ERROR_INITIALIZATION_FAILED;
  809. }
  810. result = vkGetSwapchainImagesKHR(m_device, m_swapchain, &m_numSwapchainImages, &m_backBufferColorImage[0]);
  811. if (VK_SUCCESS != result && VK_INCOMPLETE != result)
  812. {
  813. BX_TRACE("Create swapchain error: vkGetSwapchainImagesKHR failed %d: %s.", result, getName(result));
  814. return result;
  815. }
  816. VkImageCreateInfo ici;
  817. ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
  818. ici.pNext = NULL;
  819. ici.flags = 0;
  820. ici.imageType = VK_IMAGE_TYPE_2D;
  821. ici.format = m_backBufferDepthStencilFormat;
  822. ici.extent.width = m_sci.imageExtent.width;
  823. ici.extent.height = m_sci.imageExtent.height;
  824. ici.extent.depth = 1;
  825. ici.mipLevels = 1;
  826. ici.arrayLayers = 1;
  827. ici.samples = VK_SAMPLE_COUNT_1_BIT;
  828. ici.tiling = VK_IMAGE_TILING_OPTIMAL;
  829. ici.usage = 0
  830. | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
  831. | VK_IMAGE_USAGE_TRANSFER_SRC_BIT
  832. ;
  833. ici.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  834. ici.queueFamilyIndexCount = 0; //m_sci.queueFamilyIndexCount;
  835. ici.pQueueFamilyIndices = NULL; //m_sci.pQueueFamilyIndices;
  836. ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  837. result = vkCreateImage(m_device, &ici, m_allocatorCb, &m_backBufferDepthStencilImage);
  838. if (VK_SUCCESS != result)
  839. {
  840. BX_TRACE("Create swapchain error: vkCreateImage failed %d: %s.", result, getName(result));
  841. return result;
  842. }
  843. VkMemoryRequirements mr;
  844. vkGetImageMemoryRequirements(m_device, m_backBufferDepthStencilImage, &mr);
  845. result = allocateMemory(&mr, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_backBufferDepthStencilMemory);
  846. if (VK_SUCCESS != result)
  847. {
  848. BX_TRACE("Create swapchain error: vkAllocateMemory failed %d: %s.", result, getName(result));
  849. return result;
  850. }
  851. result = vkBindImageMemory(m_device, m_backBufferDepthStencilImage, m_backBufferDepthStencilMemory, 0);
  852. if (VK_SUCCESS != result)
  853. {
  854. BX_TRACE("Create swapchain error: vkBindImageMemory failed %d: %s.", result, getName(result));
  855. return result;
  856. }
  857. VkImageViewCreateInfo ivci;
  858. ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  859. ivci.pNext = NULL;
  860. ivci.flags = 0;
  861. ivci.image = m_backBufferDepthStencilImage;
  862. ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
  863. ivci.format = m_backBufferDepthStencilFormat;
  864. ivci.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
  865. ivci.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
  866. ivci.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
  867. ivci.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
  868. ivci.subresourceRange.aspectMask = 0
  869. | VK_IMAGE_ASPECT_DEPTH_BIT
  870. | VK_IMAGE_ASPECT_STENCIL_BIT
  871. ;
  872. ivci.subresourceRange.baseMipLevel = 0;
  873. ivci.subresourceRange.levelCount = 1;
  874. ivci.subresourceRange.baseArrayLayer = 0;
  875. ivci.subresourceRange.layerCount = 1;
  876. result = vkCreateImageView(m_device, &ivci, m_allocatorCb, &m_backBufferDepthStencilImageView);
  877. if (VK_SUCCESS != result)
  878. {
  879. BX_TRACE("Create swapchain error: vkCreateImageView failed %d: %s.", result, getName(result));
  880. return result;
  881. }
  882. for (uint32_t ii = 0; ii < m_numSwapchainImages; ++ii)
  883. {
  884. ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  885. ivci.pNext = NULL;
  886. ivci.flags = 0;
  887. ivci.image = m_backBufferColorImage[ii];
  888. ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
  889. ivci.format = m_sci.imageFormat;
  890. ivci.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
  891. ivci.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
  892. ivci.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
  893. ivci.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
  894. ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
  895. ivci.subresourceRange.baseMipLevel = 0;
  896. ivci.subresourceRange.levelCount = 1;
  897. ivci.subresourceRange.baseArrayLayer = 0;
  898. ivci.subresourceRange.layerCount = 1;
  899. result = vkCreateImageView(m_device, &ivci, m_allocatorCb, &m_backBufferColorImageView[ii]);
  900. if (VK_SUCCESS != result)
  901. {
  902. BX_TRACE("Create swapchain error: vkCreateImageView failed %d: %s.", result, getName(result));
  903. return result;
  904. }
  905. m_backBufferColorImageLayout[ii] = VK_IMAGE_LAYOUT_UNDEFINED;
  906. }
  907. m_needToRefreshSwapchain = false;
  908. return result;
  909. }
  910. void releaseSwapchain()
  911. {
  912. VK_CHECK(vkDeviceWaitIdle(m_device) );
  913. vkFreeMemory(m_device, m_backBufferDepthStencilMemory, m_allocatorCb);
  914. vkDestroy(m_backBufferDepthStencilImageView);
  915. vkDestroy(m_backBufferDepthStencilImage);
  916. for (uint32_t ii = 0; ii < BX_COUNTOF(m_backBufferColorImageView); ++ii)
  917. {
  918. vkDestroy(m_backBufferColorImageView[ii]);
  919. m_backBufferColorImageLayout[ii] = VK_IMAGE_LAYOUT_UNDEFINED;
  920. }
  921. vkDestroy(m_swapchain);
  922. }
  923. VkResult createSwapchainFramebuffer()
  924. {
  925. VkResult result = VK_SUCCESS;
  926. for (uint32_t ii = 0; ii < m_numSwapchainImages; ++ii)
  927. {
  928. ::VkImageView attachments[] =
  929. {
  930. m_backBufferColorImageView[ii],
  931. m_backBufferDepthStencilImageView,
  932. };
  933. VkFramebufferCreateInfo fci;
  934. fci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
  935. fci.pNext = NULL;
  936. fci.flags = 0;
  937. fci.renderPass = m_renderPass;
  938. fci.attachmentCount = BX_COUNTOF(attachments);
  939. fci.pAttachments = attachments;
  940. fci.width = m_sci.imageExtent.width;
  941. fci.height = m_sci.imageExtent.height;
  942. fci.layers = 1;
  943. result = vkCreateFramebuffer(m_device, &fci, m_allocatorCb, &m_backBufferColor[ii]);
  944. if (VK_SUCCESS != result)
  945. {
  946. return result;
  947. }
  948. }
  949. return result;
  950. }
  951. void releaseSwapchainFramebuffer()
  952. {
  953. for (uint32_t ii = 0; ii < BX_COUNTOF(m_backBufferColorImageView); ++ii)
  954. {
  955. vkDestroy(m_backBufferColor[ii]);
  956. }
  957. }
  958. VkResult createSwapchainRenderPass()
  959. {
  960. VkAttachmentDescription ad[2];
  961. ad[0].flags = 0;
  962. ad[0].format = m_sci.imageFormat;
  963. ad[0].samples = VK_SAMPLE_COUNT_1_BIT;
  964. ad[0].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
  965. ad[0].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  966. ad[0].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
  967. ad[0].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  968. ad[0].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  969. ad[0].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  970. ad[1].flags = 0;
  971. ad[1].format = m_backBufferDepthStencilFormat;
  972. ad[1].samples = VK_SAMPLE_COUNT_1_BIT;
  973. ad[1].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
  974. ad[1].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  975. ad[1].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
  976. ad[1].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
  977. ad[1].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  978. ad[1].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  979. VkAttachmentReference colorAr[1];
  980. colorAr[0].attachment = 0;
  981. colorAr[0].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  982. VkAttachmentReference resolveAr[1];
  983. resolveAr[0].attachment = VK_ATTACHMENT_UNUSED;
  984. resolveAr[0].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  985. VkAttachmentReference depthAr[1];
  986. depthAr[0].attachment = 1;
  987. depthAr[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  988. VkSubpassDescription sd[1];
  989. sd[0].flags = 0;
  990. sd[0].pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
  991. sd[0].inputAttachmentCount = 0;
  992. sd[0].pInputAttachments = NULL;
  993. sd[0].colorAttachmentCount = BX_COUNTOF(colorAr);
  994. sd[0].pColorAttachments = colorAr;
  995. sd[0].pResolveAttachments = resolveAr;
  996. sd[0].pDepthStencilAttachment = depthAr;
  997. sd[0].preserveAttachmentCount = 0;
  998. sd[0].pPreserveAttachments = NULL;
  999. VkRenderPassCreateInfo rpi;
  1000. rpi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
  1001. rpi.pNext = NULL;
  1002. rpi.flags = 0;
  1003. rpi.attachmentCount = BX_COUNTOF(ad);
  1004. rpi.pAttachments = ad;
  1005. rpi.subpassCount = BX_COUNTOF(sd);
  1006. rpi.pSubpasses = sd;
  1007. rpi.dependencyCount = 0;
  1008. rpi.pDependencies = NULL;
  1009. return vkCreateRenderPass(m_device, &rpi, m_allocatorCb, &m_renderPass);
  1010. }
  1011. void releaseSwapchainRenderPass()
  1012. {
  1013. vkDestroy(m_renderPass);
  1014. }
  1015. void initSwapchainImageLayout()
  1016. {
  1017. VkCommandBuffer commandBuffer = beginNewCommand();
  1018. setImageMemoryBarrier(
  1019. commandBuffer
  1020. , m_backBufferDepthStencilImage
  1021. , VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT
  1022. , VK_IMAGE_LAYOUT_UNDEFINED
  1023. , VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL
  1024. , 1
  1025. , 1
  1026. );
  1027. m_backBufferColorIdx = 0;
  1028. submitCommandAndWait(commandBuffer);
  1029. }
  1030. bool init(const Init& _init)
  1031. {
  1032. BX_UNUSED(s_checkMsaa, s_textureAddress);
  1033. struct ErrorState
  1034. {
  1035. enum Enum
  1036. {
  1037. Default,
  1038. LoadedVulkan1,
  1039. InstanceCreated,
  1040. DeviceCreated,
  1041. SurfaceCreated,
  1042. SwapchainCreated,
  1043. RenderPassCreated,
  1044. FrameBufferCreated,
  1045. CommandBuffersCreated,
  1046. DescriptorCreated,
  1047. };
  1048. };
  1049. ErrorState::Enum errorState = ErrorState::Default;
  1050. m_fbh.idx = kInvalidHandle;
  1051. bx::memSet(m_uniforms, 0, sizeof(m_uniforms) );
  1052. bx::memSet(&m_resolution, 0, sizeof(m_resolution) );
  1053. bool imported = true;
  1054. VkResult result;
  1055. m_qfiGraphics = UINT32_MAX;
  1056. m_qfiCompute = UINT32_MAX;
  1057. if (_init.debug
  1058. || _init.profile)
  1059. {
  1060. m_renderDocDll = loadRenderDoc();
  1061. }
  1062. m_vulkan1Dll = bx::dlopen(
  1063. #if BX_PLATFORM_WINDOWS
  1064. "vulkan-1.dll"
  1065. #elif BX_PLATFORM_ANDROID
  1066. "libvulkan.so"
  1067. #elif BX_PLATFORM_OSX
  1068. "libvulkan.dylib"
  1069. #else
  1070. "libvulkan.so.1"
  1071. #endif // BX_PLATFORM_*
  1072. );
  1073. if (NULL == m_vulkan1Dll)
  1074. {
  1075. BX_TRACE("Init error: Failed to load vulkan dynamic library.");
  1076. goto error;
  1077. }
  1078. errorState = ErrorState::LoadedVulkan1;
  1079. BX_TRACE("Shared library functions:");
  1080. #define VK_IMPORT_FUNC(_optional, _func) \
  1081. _func = (PFN_##_func)bx::dlsym(m_vulkan1Dll, #_func); \
  1082. BX_TRACE("\t%p " #_func, _func); \
  1083. imported &= _optional || NULL != _func
  1084. VK_IMPORT
  1085. #undef VK_IMPORT_FUNC
  1086. if (!imported)
  1087. {
  1088. BX_TRACE("Init error: Failed to load shared library functions.");
  1089. goto error;
  1090. }
  1091. {
  1092. dumpExtensions();
  1093. VkApplicationInfo appInfo;
  1094. appInfo.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
  1095. appInfo.pNext = NULL;
  1096. appInfo.pApplicationName = "bgfx";
  1097. appInfo.applicationVersion = BGFX_API_VERSION;
  1098. appInfo.pEngineName = "bgfx";
  1099. appInfo.engineVersion = BGFX_API_VERSION;
  1100. appInfo.apiVersion = VK_MAKE_VERSION(1, 0, 0); //VK_HEADER_VERSION);
  1101. const char* enabledLayerNames[] =
  1102. {
  1103. #if BGFX_CONFIG_DEBUG
  1104. "VK_LAYER_KHRONOS_validation",
  1105. #endif // BGFX_CONFIG_DEBUG
  1106. /*not used*/ ""
  1107. };
  1108. const char* fallbackLayerNames[] =
  1109. {
  1110. #if BGFX_CONFIG_DEBUG
  1111. "VK_LAYER_LUNARG_standard_validation", // deprecated
  1112. #endif // BGFX_CONFIG_DEBUG
  1113. ""
  1114. };
  1115. uint32_t numEnabledExtensions = 2;
  1116. const char* enabledExtension[Extension::Count + 2] =
  1117. {
  1118. VK_KHR_SURFACE_EXTENSION_NAME,
  1119. KHR_SURFACE_EXTENSION_NAME,
  1120. };
  1121. for (uint32_t ii = 0; ii < Extension::Count; ++ii)
  1122. {
  1123. const Extension& extension = s_extension[ii];
  1124. if (extension.m_supported
  1125. && extension.m_initialize
  1126. && extension.m_instanceExt)
  1127. {
  1128. enabledExtension[numEnabledExtensions++] = extension.m_name;
  1129. BX_TRACE("%d: %s", numEnabledExtensions, extension.m_name);
  1130. }
  1131. }
  1132. VkInstanceCreateInfo ici;
  1133. ici.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
  1134. ici.pNext = NULL;
  1135. ici.flags = 0;
  1136. ici.pApplicationInfo = &appInfo;
  1137. ici.enabledLayerCount = BX_COUNTOF(enabledLayerNames) - 1;
  1138. ici.ppEnabledLayerNames = enabledLayerNames;
  1139. ici.enabledExtensionCount = numEnabledExtensions;
  1140. ici.ppEnabledExtensionNames = enabledExtension;
  1141. if (BX_ENABLED(BGFX_CONFIG_DEBUG) )
  1142. {
  1143. m_allocatorCb = &s_allocationCb;
  1144. BX_UNUSED(s_allocationCb);
  1145. }
  1146. do
  1147. {
  1148. result = vkCreateInstance(&ici
  1149. , m_allocatorCb
  1150. , &m_instance
  1151. );
  1152. ici.enabledLayerCount = ici.ppEnabledLayerNames != fallbackLayerNames ? BX_COUNTOF(fallbackLayerNames) - 1 : 0;
  1153. ici.ppEnabledLayerNames = ici.ppEnabledLayerNames != fallbackLayerNames ? fallbackLayerNames : NULL;
  1154. }
  1155. while (result == VK_ERROR_LAYER_NOT_PRESENT);
  1156. }
  1157. if (VK_SUCCESS != result)
  1158. {
  1159. BX_TRACE("Init error: vkCreateInstance failed %d: %s.", result, getName(result) );
  1160. goto error;
  1161. }
  1162. errorState = ErrorState::InstanceCreated;
  1163. BX_TRACE("Instance functions:");
  1164. #define VK_IMPORT_INSTANCE_FUNC(_optional, _func) \
  1165. _func = (PFN_##_func)vkGetInstanceProcAddr(m_instance, #_func); \
  1166. BX_TRACE("\t%p " #_func, _func); \
  1167. imported &= _optional || NULL != _func
  1168. VK_IMPORT_INSTANCE
  1169. #undef VK_IMPORT_INSTANCE_FUNC
  1170. if (!imported)
  1171. {
  1172. BX_TRACE("Init error: Failed to load instance functions.");
  1173. goto error;
  1174. }
  1175. m_debugReportCallback = VK_NULL_HANDLE;
  1176. if (s_extension[Extension::EXT_debug_report].m_supported)
  1177. {
  1178. VkDebugReportCallbackCreateInfoEXT drcb;
  1179. drcb.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT;
  1180. drcb.pNext = NULL;
  1181. drcb.pfnCallback = debugReportCb;
  1182. drcb.pUserData = NULL;
  1183. drcb.flags = 0
  1184. | VK_DEBUG_REPORT_ERROR_BIT_EXT
  1185. | VK_DEBUG_REPORT_WARNING_BIT_EXT
  1186. ;
  1187. result = vkCreateDebugReportCallbackEXT(m_instance
  1188. , &drcb
  1189. , m_allocatorCb
  1190. , &m_debugReportCallback
  1191. );
  1192. BX_WARN(VK_SUCCESS == result, "vkCreateDebugReportCallbackEXT failed %d: %s.", result, getName(result) );
  1193. }
  1194. {
  1195. BX_TRACE("---");
  1196. uint32_t numPhysicalDevices;
  1197. result = vkEnumeratePhysicalDevices(m_instance
  1198. , &numPhysicalDevices
  1199. , NULL
  1200. );
  1201. if (VK_SUCCESS != result)
  1202. {
  1203. BX_TRACE("Init error: vkEnumeratePhysicalDevices failed %d: %s.", result, getName(result) );
  1204. goto error;
  1205. }
  1206. VkPhysicalDevice physicalDevices[4];
  1207. numPhysicalDevices = bx::min<uint32_t>(numPhysicalDevices, BX_COUNTOF(physicalDevices) );
  1208. result = vkEnumeratePhysicalDevices(m_instance
  1209. , &numPhysicalDevices
  1210. , physicalDevices
  1211. );
  1212. if (VK_SUCCESS != result)
  1213. {
  1214. BX_TRACE("Init error: vkEnumeratePhysicalDevices failed %d: %s.", result, getName(result) );
  1215. goto error;
  1216. }
  1217. m_physicalDevice = VK_NULL_HANDLE;
  1218. for (uint32_t ii = 0; ii < numPhysicalDevices; ++ii)
  1219. {
  1220. VkPhysicalDeviceProperties pdp;
  1221. vkGetPhysicalDeviceProperties(physicalDevices[ii], &pdp);
  1222. BX_TRACE("Physical device %d:", ii);
  1223. BX_TRACE("\t Name: %s", pdp.deviceName);
  1224. BX_TRACE("\t API version: %x", pdp.apiVersion);
  1225. BX_TRACE("\tDriver version: %x", pdp.driverVersion);
  1226. BX_TRACE("\t VendorId: %x", pdp.vendorID);
  1227. BX_TRACE("\t DeviceId: %x", pdp.deviceID);
  1228. BX_TRACE("\t Type: %d", pdp.deviceType);
  1229. g_caps.gpu[ii].vendorId = uint16_t(pdp.vendorID);
  1230. g_caps.gpu[ii].deviceId = uint16_t(pdp.deviceID);
  1231. ++g_caps.numGPUs;
  1232. if ( (BGFX_PCI_ID_NONE != g_caps.vendorId || 0 != g_caps.deviceId)
  1233. && (BGFX_PCI_ID_NONE == g_caps.vendorId || pdp.vendorID == g_caps.vendorId)
  1234. && (0 == g_caps.deviceId || pdp.deviceID == g_caps.deviceId) )
  1235. {
  1236. m_physicalDevice = physicalDevices[ii];
  1237. }
  1238. VkPhysicalDeviceMemoryProperties pdmp;
  1239. vkGetPhysicalDeviceMemoryProperties(physicalDevices[ii], &pdmp);
  1240. BX_TRACE("\tMemory type count: %d", pdmp.memoryTypeCount);
  1241. for (uint32_t jj = 0; jj < pdmp.memoryTypeCount; ++jj)
  1242. {
  1243. BX_TRACE("\t%3d: flags 0x%08x, index %d"
  1244. , jj
  1245. , pdmp.memoryTypes[jj].propertyFlags
  1246. , pdmp.memoryTypes[jj].heapIndex
  1247. );
  1248. }
  1249. BX_TRACE("\tMemory heap count: %d", pdmp.memoryHeapCount);
  1250. for (uint32_t jj = 0; jj < pdmp.memoryHeapCount; ++jj)
  1251. {
  1252. char size[16];
  1253. bx::prettify(size, BX_COUNTOF(size), pdmp.memoryHeaps[jj].size);
  1254. BX_TRACE("\t%3d: flags 0x%08x, size %10s"
  1255. , jj
  1256. , pdmp.memoryHeaps[jj].flags
  1257. , size
  1258. );
  1259. }
  1260. dumpExtensions(physicalDevices[ii]);
  1261. }
  1262. if (VK_NULL_HANDLE == m_physicalDevice)
  1263. {
  1264. m_physicalDevice = physicalDevices[0];
  1265. }
  1266. vkGetPhysicalDeviceProperties(m_physicalDevice, &m_deviceProperties);
  1267. g_caps.vendorId = uint16_t(m_deviceProperties.vendorID);
  1268. g_caps.deviceId = uint16_t(m_deviceProperties.deviceID);
  1269. g_caps.supported |= ( 0
  1270. | BGFX_CAPS_ALPHA_TO_COVERAGE
  1271. | BGFX_CAPS_BLEND_INDEPENDENT
  1272. | BGFX_CAPS_COMPUTE
  1273. | BGFX_CAPS_DRAW_INDIRECT
  1274. | BGFX_CAPS_FRAGMENT_DEPTH
  1275. | BGFX_CAPS_INDEX32
  1276. | BGFX_CAPS_INSTANCING
  1277. | BGFX_CAPS_TEXTURE_3D
  1278. | BGFX_CAPS_TEXTURE_BLIT
  1279. | BGFX_CAPS_TEXTURE_COMPARE_ALL
  1280. | BGFX_CAPS_VERTEX_ATTRIB_HALF
  1281. | BGFX_CAPS_VERTEX_ATTRIB_UINT10
  1282. | BGFX_CAPS_VERTEX_ID
  1283. );
  1284. g_caps.limits.maxTextureSize = m_deviceProperties.limits.maxImageDimension2D;
  1285. g_caps.limits.maxFBAttachments = bx::min(uint8_t(m_deviceProperties.limits.maxFragmentOutputAttachments), uint8_t(BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) );
  1286. g_caps.limits.maxComputeBindings = BGFX_MAX_COMPUTE_BINDINGS;
  1287. g_caps.limits.maxVertexStreams = BGFX_CONFIG_MAX_VERTEX_STREAMS;
  1288. vkGetPhysicalDeviceFeatures(m_physicalDevice, &m_deviceFeatures);
  1289. m_deviceFeatures.robustBufferAccess = VK_FALSE;
  1290. {
  1291. struct ImageTest
  1292. {
  1293. VkImageType type;
  1294. VkImageUsageFlags usage;
  1295. VkImageCreateFlags flags;
  1296. uint32_t formatCaps[2];
  1297. };
  1298. const ImageTest imageTest[] =
  1299. {
  1300. { VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT, 0, { BGFX_CAPS_FORMAT_TEXTURE_2D, BGFX_CAPS_FORMAT_TEXTURE_2D_SRGB } },
  1301. { VK_IMAGE_TYPE_3D, VK_IMAGE_USAGE_SAMPLED_BIT, 0, { BGFX_CAPS_FORMAT_TEXTURE_3D, BGFX_CAPS_FORMAT_TEXTURE_3D_SRGB } },
  1302. { VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT, { BGFX_CAPS_FORMAT_TEXTURE_CUBE, BGFX_CAPS_FORMAT_TEXTURE_CUBE_SRGB } },
  1303. { VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, { BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER, BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER } },
  1304. { VK_IMAGE_TYPE_2D, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, { BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER, BGFX_CAPS_FORMAT_TEXTURE_FRAMEBUFFER } },
  1305. };
  1306. for (uint32_t ii = 0; ii < TextureFormat::Count; ++ii)
  1307. {
  1308. uint16_t support = BGFX_CAPS_FORMAT_TEXTURE_NONE;
  1309. const bool depth = bimg::isDepth(bimg::TextureFormat::Enum(ii) );
  1310. VkFormat fmt = depth
  1311. ? s_textureFormat[ii].m_fmtDsv
  1312. : s_textureFormat[ii].m_fmt
  1313. ;
  1314. for (uint32_t jj = 0, num = depth ? 1 : 2; jj < num; ++jj)
  1315. {
  1316. if (VK_FORMAT_UNDEFINED != fmt)
  1317. {
  1318. for (uint32_t test = 0; test < BX_COUNTOF(imageTest); ++test)
  1319. {
  1320. const ImageTest& it = imageTest[test];
  1321. VkImageFormatProperties ifp;
  1322. result = vkGetPhysicalDeviceImageFormatProperties(m_physicalDevice
  1323. , fmt
  1324. , it.type
  1325. , VK_IMAGE_TILING_OPTIMAL
  1326. , it.usage
  1327. , it.flags
  1328. , &ifp
  1329. );
  1330. if (VK_SUCCESS == result)
  1331. {
  1332. support |= it.formatCaps[jj];
  1333. if (VK_SAMPLE_COUNT_1_BIT < ifp.sampleCounts)
  1334. {
  1335. support |= BGFX_CAPS_FORMAT_TEXTURE_MSAA;
  1336. }
  1337. }
  1338. }
  1339. }
  1340. fmt = s_textureFormat[ii].m_fmtSrgb;
  1341. }
  1342. g_caps.formats[ii] = support;
  1343. }
  1344. }
  1345. vkGetPhysicalDeviceMemoryProperties(m_physicalDevice, &m_memoryProperties);
  1346. }
  1347. {
  1348. BX_TRACE("---");
  1349. uint32_t queueFamilyPropertyCount = 0;
  1350. vkGetPhysicalDeviceQueueFamilyProperties(m_physicalDevice
  1351. , &queueFamilyPropertyCount
  1352. , NULL
  1353. );
  1354. VkQueueFamilyProperties queueFamilyPropertices[10];
  1355. queueFamilyPropertyCount = bx::min<uint32_t>(queueFamilyPropertyCount, BX_COUNTOF(queueFamilyPropertices) );
  1356. vkGetPhysicalDeviceQueueFamilyProperties(m_physicalDevice
  1357. , &queueFamilyPropertyCount
  1358. , queueFamilyPropertices
  1359. );
  1360. for (uint32_t ii = 0; ii < queueFamilyPropertyCount; ++ii)
  1361. {
  1362. const VkQueueFamilyProperties& qfp = queueFamilyPropertices[ii];
  1363. BX_UNUSED(qfp);
  1364. BX_TRACE("Queue family property %d:", ii);
  1365. BX_TRACE("\t Queue flags: 0x%08x", qfp.queueFlags);
  1366. BX_TRACE("\t Queue count: %d", qfp.queueCount);
  1367. BX_TRACE("\tTS valid bits: 0x%08x", qfp.timestampValidBits);
  1368. BX_TRACE("\t Min image: %d x %d x %d"
  1369. , qfp.minImageTransferGranularity.width
  1370. , qfp.minImageTransferGranularity.height
  1371. , qfp.minImageTransferGranularity.depth
  1372. );
  1373. }
  1374. for (uint32_t ii = 0; ii < queueFamilyPropertyCount; ++ii)
  1375. {
  1376. const VkQueueFamilyProperties& qfp = queueFamilyPropertices[ii];
  1377. if (UINT32_MAX == m_qfiGraphics
  1378. && VK_QUEUE_GRAPHICS_BIT & qfp.queueFlags)
  1379. {
  1380. m_qfiGraphics = ii;
  1381. }
  1382. if (UINT32_MAX == m_qfiCompute
  1383. && VK_QUEUE_COMPUTE_BIT & qfp.queueFlags)
  1384. {
  1385. m_qfiCompute = ii;
  1386. }
  1387. if (UINT32_MAX != m_qfiGraphics
  1388. && UINT32_MAX != m_qfiCompute)
  1389. {
  1390. break;
  1391. }
  1392. }
  1393. if (UINT32_MAX == m_qfiGraphics)
  1394. {
  1395. BX_TRACE("Init error: Unable to find graphics queue.");
  1396. goto error;
  1397. }
  1398. }
  1399. if (m_qfiCompute != UINT32_MAX)
  1400. {
  1401. g_caps.supported |= BGFX_CAPS_COMPUTE;
  1402. }
  1403. {
  1404. uint32_t numEnabledExtensions = 1;
  1405. const char* enabledExtension[Extension::Count + 1] =
  1406. {
  1407. VK_KHR_SWAPCHAIN_EXTENSION_NAME,
  1408. };
  1409. for (uint32_t ii = 0; ii < Extension::Count; ++ii)
  1410. {
  1411. const Extension& extension = s_extension[ii];
  1412. if (extension.m_supported
  1413. && extension.m_initialize
  1414. && !extension.m_instanceExt)
  1415. {
  1416. enabledExtension[numEnabledExtensions++] = extension.m_name;
  1417. BX_TRACE("%d: %s", numEnabledExtensions, extension.m_name);
  1418. }
  1419. }
  1420. float queuePriorities[1] = { 0.0f };
  1421. VkDeviceQueueCreateInfo dcqi;
  1422. dcqi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
  1423. dcqi.pNext = NULL;
  1424. dcqi.flags = 0;
  1425. dcqi.queueFamilyIndex = m_qfiGraphics;
  1426. dcqi.queueCount = 1;
  1427. dcqi.pQueuePriorities = queuePriorities;
  1428. VkDeviceCreateInfo dci;
  1429. dci.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
  1430. dci.pNext = NULL;
  1431. dci.flags = 0;
  1432. dci.queueCreateInfoCount = 1;
  1433. dci.pQueueCreateInfos = &dcqi;
  1434. dci.enabledLayerCount = 0;
  1435. dci.ppEnabledLayerNames = NULL;
  1436. dci.enabledExtensionCount = numEnabledExtensions;
  1437. dci.ppEnabledExtensionNames = enabledExtension;
  1438. dci.pEnabledFeatures = &m_deviceFeatures;
  1439. result = vkCreateDevice(
  1440. m_physicalDevice
  1441. , &dci
  1442. , m_allocatorCb
  1443. , &m_device
  1444. );
  1445. if (VK_SUCCESS != result)
  1446. {
  1447. BX_TRACE("Init error: vkCreateDevice failed %d: %s.", result, getName(result) );
  1448. goto error;
  1449. }
  1450. }
  1451. errorState = ErrorState::DeviceCreated;
  1452. BX_TRACE("Device functions:");
  1453. #define VK_IMPORT_DEVICE_FUNC(_optional, _func) \
  1454. _func = (PFN_##_func)vkGetDeviceProcAddr(m_device, #_func); \
  1455. BX_TRACE("\t%p " #_func, _func); \
  1456. imported &= _optional || NULL != _func
  1457. VK_IMPORT_DEVICE
  1458. #undef VK_IMPORT_DEVICE_FUNC
  1459. if (!imported)
  1460. {
  1461. BX_TRACE("Init error: Failed to load device functions.");
  1462. goto error;
  1463. }
  1464. vkGetDeviceQueue(m_device, m_qfiGraphics, 0, &m_queueGraphics);
  1465. vkGetDeviceQueue(m_device, m_qfiCompute, 0, &m_queueCompute);
  1466. #if BX_PLATFORM_WINDOWS
  1467. {
  1468. VkWin32SurfaceCreateInfoKHR sci;
  1469. sci.sType = VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR;
  1470. sci.pNext = NULL;
  1471. sci.flags = 0;
  1472. sci.hinstance = (HINSTANCE)GetModuleHandle(NULL);
  1473. sci.hwnd = (HWND)g_platformData.nwh;
  1474. result = vkCreateWin32SurfaceKHR(m_instance, &sci, m_allocatorCb, &m_surface);
  1475. }
  1476. #elif BX_PLATFORM_ANDROID
  1477. {
  1478. VkAndroidSurfaceCreateInfoKHR sci;
  1479. sci.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
  1480. sci.pNext = NULL;
  1481. sci.flags = 0;
  1482. sci.window = (ANativeWindow*)g_platformData.nwh;
  1483. result = vkCreateAndroidSurfaceKHR(m_instance, &sci, m_allocatorCb, &m_surface);
  1484. }
  1485. #elif BX_PLATFORM_LINUX
  1486. {
  1487. if (NULL != vkCreateXlibSurfaceKHR)
  1488. {
  1489. VkXlibSurfaceCreateInfoKHR sci;
  1490. sci.sType = VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR;
  1491. sci.pNext = NULL;
  1492. sci.flags = 0;
  1493. sci.dpy = (Display*)g_platformData.ndt;
  1494. sci.window = (Window)g_platformData.nwh;
  1495. result = vkCreateXlibSurfaceKHR(m_instance, &sci, m_allocatorCb, &m_surface);
  1496. }
  1497. else
  1498. {
  1499. result = VK_RESULT_MAX_ENUM;
  1500. }
  1501. if (VK_SUCCESS != result)
  1502. {
  1503. void* xcbdll = bx::dlopen("libX11-xcb.so.1");
  1504. if (NULL != xcbdll)
  1505. {
  1506. typedef xcb_connection_t* (*PFN_XGETXCBCONNECTION)(Display*);
  1507. PFN_XGETXCBCONNECTION XGetXCBConnection = (PFN_XGETXCBCONNECTION)bx::dlsym(xcbdll, "XGetXCBConnection");
  1508. VkXcbSurfaceCreateInfoKHR sci;
  1509. sci.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
  1510. sci.pNext = NULL;
  1511. sci.flags = 0;
  1512. sci.connection = XGetXCBConnection( (Display*)g_platformData.ndt);
  1513. union { void* ptr; xcb_window_t window; } cast = { g_platformData.nwh };
  1514. sci.window = cast.window;
  1515. result = vkCreateXcbSurfaceKHR(m_instance, &sci, m_allocatorCb, &m_surface);
  1516. bx::dlclose(xcbdll);
  1517. }
  1518. }
  1519. }
  1520. #elif BX_PLATFORM_OSX
  1521. {
  1522. if (NULL != vkCreateMacOSSurfaceMVK)
  1523. {
  1524. NSWindow* window = (NSWindow*)(g_platformData.nwh);
  1525. NSView* contentView = (NSView*)window.contentView;
  1526. CAMetalLayer* layer = [CAMetalLayer layer];
  1527. if (_init.resolution.reset & BGFX_RESET_HIDPI)
  1528. layer.contentsScale = [window backingScaleFactor];
  1529. [contentView setWantsLayer : YES] ;
  1530. [contentView setLayer : layer] ;
  1531. VkMacOSSurfaceCreateInfoMVK sci;
  1532. sci.sType = VK_STRUCTURE_TYPE_MACOS_SURFACE_CREATE_INFO_MVK;
  1533. sci.pNext = NULL;
  1534. sci.flags = 0;
  1535. sci.pView = (__bridge void*)layer;
  1536. result = vkCreateMacOSSurfaceMVK(m_instance, &sci, m_allocatorCb, &m_surface);
  1537. }
  1538. }
  1539. #else
  1540. # error "Figure out KHR surface..."
  1541. #endif // BX_PLATFORM_
  1542. if (VK_SUCCESS != result)
  1543. {
  1544. BX_TRACE("Init error: vkCreateSurfaceKHR failed %d: %s.", result, getName(result) );
  1545. goto error;
  1546. }
  1547. errorState = ErrorState::SurfaceCreated;
  1548. {
  1549. VkBool32 surfaceSupported;
  1550. result = vkGetPhysicalDeviceSurfaceSupportKHR(m_physicalDevice, m_qfiGraphics, m_surface, &surfaceSupported);
  1551. if (VK_SUCCESS != result)
  1552. {
  1553. BX_TRACE("Init error: vkGetPhysicalDeviceSurfaceSupportKHR failed %d: %s.", result, getName(result) );
  1554. goto error;
  1555. }
  1556. VkSurfaceCapabilitiesKHR surfaceCapabilities;
  1557. result = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(m_physicalDevice, m_surface, &surfaceCapabilities);
  1558. if (VK_SUCCESS != result)
  1559. {
  1560. BX_TRACE("Init error: vkGetPhysicalDeviceSurfaceCapabilitiesKHR failed %d: %s.", result, getName(result) );
  1561. goto error;
  1562. }
  1563. uint32_t width = bx::clamp<uint32_t>(
  1564. _init.resolution.width
  1565. , surfaceCapabilities.minImageExtent.width
  1566. , surfaceCapabilities.maxImageExtent.width
  1567. );
  1568. uint32_t height = bx::clamp<uint32_t>(
  1569. _init.resolution.height
  1570. , surfaceCapabilities.minImageExtent.height
  1571. , surfaceCapabilities.maxImageExtent.height
  1572. );
  1573. uint32_t numSurfaceFormats;
  1574. result = vkGetPhysicalDeviceSurfaceFormatsKHR(m_physicalDevice, m_surface, &numSurfaceFormats, NULL);
  1575. if (VK_SUCCESS != result)
  1576. {
  1577. BX_TRACE("Init error: vkGetPhysicalDeviceSurfaceFormatsKHR failed %d: %s.", result, getName(result) );
  1578. goto error;
  1579. }
  1580. VkSurfaceFormatKHR surfaceFormats[10];
  1581. numSurfaceFormats = bx::min<uint32_t>(numSurfaceFormats, BX_COUNTOF(surfaceFormats) );
  1582. vkGetPhysicalDeviceSurfaceFormatsKHR(m_physicalDevice, m_surface, &numSurfaceFormats, surfaceFormats);
  1583. // find the best match...
  1584. VkFormat preferredSurfaceFormat[2] =
  1585. {
  1586. VK_FORMAT_R8G8B8A8_UNORM,
  1587. VK_FORMAT_B8G8R8A8_UNORM
  1588. };
  1589. VkFormat preferredSurfaceFormatSrgb[2] =
  1590. {
  1591. VK_FORMAT_R8G8B8A8_SRGB,
  1592. VK_FORMAT_B8G8R8A8_SRGB
  1593. };
  1594. VkColorSpaceKHR preferredColorSpace = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR;
  1595. uint32_t surfaceFormatIdx = numSurfaceFormats;
  1596. uint32_t surfaceFormatSrgbIdx = numSurfaceFormats;
  1597. for (uint32_t ii = 0; ii < numSurfaceFormats; ii++)
  1598. {
  1599. BX_TRACE("Supported surface format: %d", surfaceFormats[ii].format);
  1600. if (preferredColorSpace == surfaceFormats[ii].colorSpace)
  1601. {
  1602. for (uint32_t jj = 0; jj < BX_COUNTOF(preferredSurfaceFormat); jj++)
  1603. {
  1604. if (preferredSurfaceFormat[jj] == surfaceFormats[ii].format)
  1605. {
  1606. BX_TRACE("Preferred surface format found: %d", surfaceFormats[ii].format);
  1607. surfaceFormatIdx = ii;
  1608. break;
  1609. }
  1610. }
  1611. for (uint32_t jj = 0; jj < BX_COUNTOF(preferredSurfaceFormatSrgb); jj++)
  1612. {
  1613. if (preferredSurfaceFormatSrgb[jj] == surfaceFormats[ii].format)
  1614. {
  1615. BX_TRACE("Preferred sRGB surface format found: %d", surfaceFormats[ii].format);
  1616. surfaceFormatSrgbIdx = ii;
  1617. break;
  1618. }
  1619. }
  1620. if (surfaceFormatIdx < numSurfaceFormats && surfaceFormatSrgbIdx < numSurfaceFormats)
  1621. { // found
  1622. break;
  1623. }
  1624. }
  1625. }
  1626. BX_CHECK(surfaceFormatIdx < numSurfaceFormats, "Cannot find preferred surface format from supported surface formats");
  1627. BX_WARN(surfaceFormatSrgbIdx < numSurfaceFormats, "Cannot find preferred sRGB surface format from supported surface formats");
  1628. m_backBufferColorFormat = surfaceFormats[surfaceFormatIdx];
  1629. m_backBufferColorFormatSrgb = surfaceFormatSrgbIdx < numSurfaceFormats ? surfaceFormats[surfaceFormatSrgbIdx] : m_backBufferColorFormat;
  1630. uint32_t numPresentModes;
  1631. result = vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, NULL);
  1632. if (VK_SUCCESS != result)
  1633. {
  1634. BX_TRACE("Init error: vkGetPhysicalDeviceSurfacePresentModesKHR failed %d: %s.", result, getName(result) );
  1635. goto error;
  1636. }
  1637. VkPresentModeKHR presentModes[10];
  1638. numPresentModes = bx::min<uint32_t>(numPresentModes, BX_COUNTOF(presentModes) );
  1639. vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, presentModes);
  1640. // find the best match...
  1641. uint32_t presentModeIdx = numPresentModes;
  1642. VkPresentModeKHR preferredPresentMode[] =
  1643. {
  1644. VK_PRESENT_MODE_FIFO_KHR,
  1645. VK_PRESENT_MODE_FIFO_RELAXED_KHR,
  1646. VK_PRESENT_MODE_MAILBOX_KHR,
  1647. VK_PRESENT_MODE_IMMEDIATE_KHR,
  1648. };
  1649. for (uint32_t ii = 0; ii < BX_COUNTOF(preferredPresentMode); ++ii)
  1650. {
  1651. for (uint32_t jj = 0; jj < numPresentModes; ++jj)
  1652. {
  1653. if (presentModes[jj] == preferredPresentMode[ii])
  1654. {
  1655. presentModeIdx = jj;
  1656. BX_TRACE("present mode: %d", (int)preferredPresentMode[ii]);
  1657. break;
  1658. }
  1659. }
  1660. if (presentModeIdx < numPresentModes)
  1661. {
  1662. break;
  1663. }
  1664. }
  1665. if (presentModeIdx == numPresentModes)
  1666. {
  1667. presentModeIdx = 0;
  1668. }
  1669. m_backBufferDepthStencilFormat = 0 != (g_caps.formats[TextureFormat::D24S8] & BGFX_CAPS_FORMAT_TEXTURE_2D)
  1670. ? VK_FORMAT_D24_UNORM_S8_UINT
  1671. : VK_FORMAT_D32_SFLOAT_S8_UINT
  1672. ;
  1673. VkCompositeAlphaFlagBitsKHR compositeAlpha = (VkCompositeAlphaFlagBitsKHR)0;
  1674. if (surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR)
  1675. {
  1676. compositeAlpha = VK_COMPOSITE_ALPHA_INHERIT_BIT_KHR;
  1677. }
  1678. else if (surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR)
  1679. {
  1680. compositeAlpha = VK_COMPOSITE_ALPHA_PRE_MULTIPLIED_BIT_KHR;
  1681. }
  1682. else if (surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR)
  1683. {
  1684. compositeAlpha = VK_COMPOSITE_ALPHA_POST_MULTIPLIED_BIT_KHR;
  1685. }
  1686. else if (surfaceCapabilities.supportedCompositeAlpha & VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR)
  1687. {
  1688. compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
  1689. }
  1690. m_sci.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
  1691. m_sci.pNext = NULL;
  1692. m_sci.flags = 0;
  1693. m_sci.surface = m_surface;
  1694. m_sci.minImageCount = surfaceCapabilities.minImageCount;
  1695. m_sci.imageFormat = m_backBufferColorFormat.format;
  1696. m_sci.imageColorSpace = m_backBufferColorFormat.colorSpace;
  1697. m_sci.imageExtent.width = width;
  1698. m_sci.imageExtent.height = height;
  1699. m_sci.imageArrayLayers = 1;
  1700. m_sci.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
  1701. m_sci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
  1702. m_sci.queueFamilyIndexCount = 0;
  1703. m_sci.pQueueFamilyIndices = NULL;
  1704. m_sci.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
  1705. m_sci.compositeAlpha = compositeAlpha;
  1706. m_sci.presentMode = presentModes[presentModeIdx];
  1707. m_sci.clipped = VK_TRUE;
  1708. m_sci.oldSwapchain = VK_NULL_HANDLE;
  1709. for (uint32_t ii = 0; ii < BX_COUNTOF(m_backBufferColorImageView); ++ii)
  1710. {
  1711. m_backBufferColorImageView[ii] = VK_NULL_HANDLE;
  1712. m_backBufferColorImage[ii] = VK_NULL_HANDLE;
  1713. m_backBufferColor[ii] = VK_NULL_HANDLE;
  1714. m_presentDone[ii] = VK_NULL_HANDLE;
  1715. }
  1716. result = createSwapchain();
  1717. if (VK_SUCCESS != result)
  1718. {
  1719. BX_TRACE("Init error: creating swapchain and image view failed %d: %s", result, getName(result));
  1720. goto error;
  1721. }
  1722. VkSemaphoreCreateInfo sci;
  1723. sci.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
  1724. sci.pNext = NULL;
  1725. sci.flags = 0;
  1726. for (uint32_t ii = 0; ii < m_numSwapchainImages; ++ii)
  1727. {
  1728. result = vkCreateSemaphore(m_device, &sci, m_allocatorCb, &m_presentDone[ii]);
  1729. if (VK_SUCCESS != result)
  1730. {
  1731. BX_TRACE("Init error: vkCreateSemaphore failed %d: %s.", result, getName(result) );
  1732. goto error;
  1733. }
  1734. }
  1735. }
  1736. errorState = ErrorState::SwapchainCreated;
  1737. {
  1738. result = createSwapchainRenderPass();
  1739. if (VK_SUCCESS != result)
  1740. {
  1741. BX_TRACE("Init error: vkCreateRenderPass failed %d: %s.", result, getName(result));
  1742. goto error;
  1743. }
  1744. }
  1745. errorState = ErrorState::RenderPassCreated;
  1746. // framebuffer creation
  1747. result = createSwapchainFramebuffer();
  1748. if (VK_SUCCESS != result)
  1749. {
  1750. BX_TRACE("Init error: vkCreateFramebuffer failed %d: %s.", result, getName(result));
  1751. goto error;
  1752. }
  1753. errorState = ErrorState::FrameBufferCreated;
  1754. {
  1755. VkFenceCreateInfo fci;
  1756. fci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
  1757. fci.pNext = NULL;
  1758. fci.flags = 0;
  1759. result = vkCreateFence(m_device, &fci, m_allocatorCb, &m_fence);
  1760. if (VK_SUCCESS != result)
  1761. {
  1762. BX_TRACE("Init error: vkCreateFence failed %d: %s.", result, getName(result) );
  1763. goto error;
  1764. }
  1765. VkCommandPoolCreateInfo cpci;
  1766. cpci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
  1767. cpci.pNext = NULL;
  1768. cpci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
  1769. cpci.queueFamilyIndex = m_qfiGraphics;
  1770. result = vkCreateCommandPool(m_device, &cpci, m_allocatorCb, &m_commandPool);
  1771. if (VK_SUCCESS != result)
  1772. {
  1773. vkDestroy(m_fence);
  1774. BX_TRACE("Init error: vkCreateCommandPool failed %d: %s.", result, getName(result) );
  1775. goto error;
  1776. }
  1777. VkCommandBufferAllocateInfo cbai;
  1778. cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
  1779. cbai.pNext = NULL;
  1780. cbai.commandPool = m_commandPool;
  1781. cbai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
  1782. cbai.commandBufferCount = BX_COUNTOF(m_commandBuffers);
  1783. result = vkAllocateCommandBuffers(m_device, &cbai, m_commandBuffers);
  1784. if (VK_SUCCESS != result)
  1785. {
  1786. vkDestroy(m_commandPool);
  1787. vkDestroy(m_fence);
  1788. BX_TRACE("Init error: vkAllocateCommandBuffers failed %d: %s.", result, getName(result) );
  1789. goto error;
  1790. }
  1791. initSwapchainImageLayout();
  1792. // kick();
  1793. // finishAll();
  1794. VK_CHECK(vkResetCommandPool(m_device, m_commandPool, 0) );
  1795. }
  1796. errorState = ErrorState::CommandBuffersCreated;
  1797. {
  1798. VkDescriptorPoolSize dps[] =
  1799. {
  1800. // { VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, (10 * BGFX_CONFIG_MAX_TEXTURE_SAMPLERS) << 10 },
  1801. { VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, (10 * BGFX_CONFIG_MAX_TEXTURE_SAMPLERS) << 10 },
  1802. { VK_DESCRIPTOR_TYPE_SAMPLER, (10 * BGFX_CONFIG_MAX_TEXTURE_SAMPLERS) << 10 },
  1803. { VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, 10<<10 },
  1804. { VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS << 10 },
  1805. { VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS << 10 },
  1806. };
  1807. // VkDescriptorSetLayoutBinding dslb[] =
  1808. // {
  1809. // // { DslBinding::CombinedImageSampler, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, VK_SHADER_STAGE_ALL, NULL },
  1810. // { DslBinding::VertexUniformBuffer, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_ALL, NULL },
  1811. // { DslBinding::FragmentUniformBuffer, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, NULL },
  1812. // // { DslBinding::StorageBuffer, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, BGFX_CONFIG_MAX_TEXTURE_SAMPLERS, VK_SHADER_STAGE_ALL, NULL },
  1813. // };
  1814. VkDescriptorPoolCreateInfo dpci;
  1815. dpci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
  1816. dpci.pNext = NULL;
  1817. dpci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
  1818. dpci.maxSets = 10<<10;
  1819. dpci.poolSizeCount = BX_COUNTOF(dps);
  1820. dpci.pPoolSizes = dps;
  1821. result = vkCreateDescriptorPool(m_device, &dpci, m_allocatorCb, &m_descriptorPool);
  1822. if (VK_SUCCESS != result)
  1823. {
  1824. BX_TRACE("Init error: vkCreateDescriptorPool failed %d: %s.", result, getName(result) );
  1825. goto error;
  1826. }
  1827. // VkDescriptorSetLayoutCreateInfo dsl;
  1828. // dsl.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
  1829. // dsl.pNext = NULL;
  1830. // dsl.flags = 0;
  1831. // dsl.bindingCount = BX_COUNTOF(dslb);
  1832. // dsl.pBindings = dslb;
  1833. // result = vkCreateDescriptorSetLayout(m_device, &dsl, m_allocatorCb, &m_descriptorSetLayout);
  1834. //
  1835. // if (VK_SUCCESS != result)
  1836. // {
  1837. // BX_TRACE("Init error: vkCreateDescriptorSetLayout failed %d: %s.", result, getName(result) );
  1838. // goto error;
  1839. // }
  1840. //
  1841. // VkPipelineLayoutCreateInfo pl;
  1842. // pl.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
  1843. // pl.pNext = NULL;
  1844. // pl.flags = 0;
  1845. // pl.setLayoutCount = 1;
  1846. // pl.pSetLayouts = &m_descriptorSetLayout;
  1847. // pl.pushConstantRangeCount = 0;
  1848. // pl.pPushConstantRanges = NULL;
  1849. // result = vkCreatePipelineLayout(m_device, &pl, m_allocatorCb, &m_pipelineLayout);
  1850. //
  1851. // if (VK_SUCCESS != result)
  1852. // {
  1853. // BX_TRACE("Init error: vkCreatePipelineLayout failed %d: %s.", result, getName(result) );
  1854. // goto error;
  1855. // }
  1856. VkPipelineCacheCreateInfo pcci;
  1857. pcci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
  1858. pcci.pNext = NULL;
  1859. pcci.flags = 0;
  1860. pcci.initialDataSize = 0;
  1861. pcci.pInitialData = NULL;
  1862. result = vkCreatePipelineCache(m_device, &pcci, m_allocatorCb, &m_pipelineCache);
  1863. if (VK_SUCCESS != result)
  1864. {
  1865. BX_TRACE("Init error: vkCreatePipelineCache failed %d: %s.", result, getName(result) );
  1866. goto error;
  1867. }
  1868. }
  1869. {
  1870. const uint32_t align = uint32_t(m_deviceProperties.limits.nonCoherentAtomSize);
  1871. const uint32_t size = bx::strideAlign(BGFX_CONFIG_MAX_DRAW_CALLS * 128, align);
  1872. for (uint32_t ii = 0; ii < BX_COUNTOF(m_scratchBuffer); ++ii)
  1873. {
  1874. BX_TRACE("Create scratch buffer %d", ii);
  1875. m_scratchBuffer[ii].create(size, 1024);
  1876. }
  1877. }
  1878. errorState = ErrorState::DescriptorCreated;
  1879. if (NULL == vkSetDebugUtilsObjectNameEXT)
  1880. {
  1881. vkSetDebugUtilsObjectNameEXT = stubSetDebugUtilsObjectNameEXT;
  1882. }
  1883. if (NULL == vkCmdBeginDebugUtilsLabelEXT
  1884. || NULL == vkCmdEndDebugUtilsLabelEXT)
  1885. {
  1886. vkCmdBeginDebugUtilsLabelEXT = stubCmdBeginDebugUtilsLabelEXT;
  1887. vkCmdEndDebugUtilsLabelEXT = stubCmdEndDebugUtilsLabelEXT;
  1888. }
  1889. if (NULL == vkCmdInsertDebugUtilsLabelEXT)
  1890. {
  1891. vkCmdInsertDebugUtilsLabelEXT = stubCmdInsertDebugUtilsLabelEXT;
  1892. }
  1893. // Init reserved part of view name.
  1894. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_VIEWS; ++ii)
  1895. {
  1896. bx::snprintf(s_viewName[ii], BGFX_CONFIG_MAX_VIEW_NAME_RESERVED+1, "%3d ", ii);
  1897. }
  1898. g_internalData.context = m_device;
  1899. return true;
  1900. error:
  1901. BX_TRACE("errorState %d", errorState);
  1902. switch (errorState)
  1903. {
  1904. case ErrorState::DescriptorCreated:
  1905. vkDestroy(m_pipelineCache);
  1906. // vkDestroy(m_pipelineLayout);
  1907. // vkDestroy(m_descriptorSetLayout);
  1908. vkDestroy(m_descriptorPool);
  1909. BX_FALLTHROUGH;
  1910. case ErrorState::CommandBuffersCreated:
  1911. vkFreeCommandBuffers(m_device, m_commandPool, BX_COUNTOF(m_commandBuffers), m_commandBuffers);
  1912. vkDestroy(m_commandPool);
  1913. vkDestroy(m_fence);
  1914. BX_FALLTHROUGH;
  1915. case ErrorState::FrameBufferCreated:
  1916. releaseSwapchainFramebuffer();
  1917. BX_FALLTHROUGH;
  1918. case ErrorState::RenderPassCreated:
  1919. releaseSwapchainRenderPass();
  1920. BX_FALLTHROUGH;
  1921. case ErrorState::SwapchainCreated:
  1922. for (uint32_t ii = 0; ii < BX_COUNTOF(m_backBufferColorImageView); ++ii)
  1923. {
  1924. vkDestroy(m_presentDone[ii]);
  1925. }
  1926. releaseSwapchain();
  1927. BX_FALLTHROUGH;
  1928. case ErrorState::SurfaceCreated:
  1929. vkDestroySurfaceKHR(m_instance, m_surface, m_allocatorCb);
  1930. BX_FALLTHROUGH;
  1931. case ErrorState::DeviceCreated:
  1932. vkDestroyDevice(m_device, m_allocatorCb);
  1933. BX_FALLTHROUGH;
  1934. case ErrorState::InstanceCreated:
  1935. if (VK_NULL_HANDLE != m_debugReportCallback)
  1936. {
  1937. vkDestroyDebugReportCallbackEXT(m_instance, m_debugReportCallback, m_allocatorCb);
  1938. }
  1939. vkDestroyInstance(m_instance, m_allocatorCb);
  1940. BX_FALLTHROUGH;
  1941. case ErrorState::LoadedVulkan1:
  1942. bx::dlclose(m_vulkan1Dll);
  1943. m_vulkan1Dll = NULL;
  1944. m_allocatorCb = NULL;
  1945. unloadRenderDoc(m_renderDocDll);
  1946. BX_FALLTHROUGH;
  1947. case ErrorState::Default:
  1948. break;
  1949. };
  1950. BX_CHECK(false, "Failed to initialize Vulkan.");
  1951. return false;
  1952. }
  1953. void shutdown()
  1954. {
  1955. VK_CHECK(vkQueueWaitIdle(m_queueGraphics) );
  1956. VK_CHECK(vkDeviceWaitIdle(m_device) );
  1957. m_pipelineStateCache.invalidate();
  1958. m_descriptorSetLayoutCache.invalidate();
  1959. m_renderPassCache.invalidate();
  1960. m_samplerCache.invalidate();
  1961. for (uint32_t ii = 0; ii < BX_COUNTOF(m_scratchBuffer); ++ii)
  1962. {
  1963. m_scratchBuffer[ii].destroy();
  1964. }
  1965. for (uint32_t ii = 0; ii < BX_COUNTOF(m_frameBuffers); ++ii)
  1966. {
  1967. m_frameBuffers[ii].destroy();
  1968. }
  1969. for (uint32_t ii = 0; ii < BX_COUNTOF(m_indexBuffers); ++ii)
  1970. {
  1971. m_indexBuffers[ii].destroy();
  1972. }
  1973. for (uint32_t ii = 0; ii < BX_COUNTOF(m_vertexBuffers); ++ii)
  1974. {
  1975. m_vertexBuffers[ii].destroy();
  1976. }
  1977. for (uint32_t ii = 0; ii < BX_COUNTOF(m_shaders); ++ii)
  1978. {
  1979. m_shaders[ii].destroy();
  1980. }
  1981. for (uint32_t ii = 0; ii < BX_COUNTOF(m_textures); ++ii)
  1982. {
  1983. m_textures[ii].destroy();
  1984. }
  1985. vkDestroy(m_pipelineCache);
  1986. // vkDestroy(m_pipelineLayout);
  1987. // vkDestroy(m_descriptorSetLayout);
  1988. vkDestroy(m_descriptorPool);
  1989. vkFreeCommandBuffers(m_device, m_commandPool, BX_COUNTOF(m_commandBuffers), m_commandBuffers);
  1990. vkDestroy(m_commandPool);
  1991. vkDestroy(m_fence);
  1992. for (uint32_t ii = 0; ii < BX_COUNTOF(m_backBufferColorImageView); ++ii)
  1993. {
  1994. vkDestroy(m_presentDone[ii]);
  1995. }
  1996. releaseSwapchainFramebuffer();
  1997. releaseSwapchain();
  1998. vkDestroySurfaceKHR(m_instance, m_surface, m_allocatorCb);
  1999. vkDestroy(m_renderPass);
  2000. vkDestroyDevice(m_device, m_allocatorCb);
  2001. if (VK_NULL_HANDLE != m_debugReportCallback)
  2002. {
  2003. vkDestroyDebugReportCallbackEXT(m_instance, m_debugReportCallback, m_allocatorCb);
  2004. }
  2005. vkDestroyInstance(m_instance, m_allocatorCb);
  2006. bx::dlclose(m_vulkan1Dll);
  2007. m_vulkan1Dll = NULL;
  2008. m_allocatorCb = NULL;
  2009. unloadRenderDoc(m_renderDocDll);
  2010. }
  2011. RendererType::Enum getRendererType() const override
  2012. {
  2013. return RendererType::Vulkan;
  2014. }
  2015. const char* getRendererName() const override
  2016. {
  2017. return BGFX_RENDERER_VULKAN_NAME;
  2018. }
  2019. bool isDeviceRemoved() override
  2020. {
  2021. return false;
  2022. }
  2023. void flip() override
  2024. {
  2025. if (VK_NULL_HANDLE != m_swapchain)
  2026. {
  2027. VkPresentInfoKHR pi;
  2028. pi.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
  2029. pi.pNext = NULL;
  2030. pi.waitSemaphoreCount = 0;
  2031. pi.pWaitSemaphores = NULL;
  2032. pi.swapchainCount = 1;
  2033. pi.pSwapchains = &m_swapchain;
  2034. pi.pImageIndices = &m_backBufferColorIdx;
  2035. pi.pResults = NULL;
  2036. VkResult result = vkQueuePresentKHR(m_queueGraphics, &pi);
  2037. if (VK_ERROR_OUT_OF_DATE_KHR == result
  2038. || VK_SUBOPTIMAL_KHR == result)
  2039. {
  2040. m_needToRefreshSwapchain = true;
  2041. }
  2042. }
  2043. }
  2044. void createIndexBuffer(IndexBufferHandle _handle, const Memory* _mem, uint16_t _flags) override
  2045. {
  2046. m_indexBuffers[_handle.idx].create(_mem->size, _mem->data, _flags, false);
  2047. }
  2048. void destroyIndexBuffer(IndexBufferHandle _handle) override
  2049. {
  2050. m_indexBuffers[_handle.idx].destroy();
  2051. }
  2052. void createVertexLayout(VertexLayoutHandle _handle, const VertexLayout& _layout) override
  2053. {
  2054. VertexLayout& layout = m_vertexLayouts[_handle.idx];
  2055. bx::memCopy(&layout, &_layout, sizeof(VertexLayout) );
  2056. dump(layout);
  2057. }
  2058. void destroyVertexLayout(VertexLayoutHandle /*_handle*/) override
  2059. {
  2060. }
  2061. void createVertexBuffer(VertexBufferHandle _handle, const Memory* _mem, VertexLayoutHandle _layoutHandle, uint16_t _flags) override
  2062. {
  2063. m_vertexBuffers[_handle.idx].create(_mem->size, _mem->data, _layoutHandle, _flags);
  2064. }
  2065. void destroyVertexBuffer(VertexBufferHandle _handle) override
  2066. {
  2067. m_vertexBuffers[_handle.idx].destroy();
  2068. }
  2069. void createDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _size, uint16_t _flags) override
  2070. {
  2071. m_indexBuffers[_handle.idx].create(_size, NULL, _flags, false);
  2072. }
  2073. void updateDynamicIndexBuffer(IndexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) override
  2074. {
  2075. // BX_UNUSED(_handle, _offset, _size, _mem);
  2076. m_indexBuffers[_handle.idx].update(/*m_commandBuffer*/NULL, _offset, bx::min<uint32_t>(_size, _mem->size), _mem->data);
  2077. }
  2078. void destroyDynamicIndexBuffer(IndexBufferHandle _handle) override
  2079. {
  2080. m_indexBuffers[_handle.idx].destroy();
  2081. }
  2082. void createDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _size, uint16_t _flags) override
  2083. {
  2084. VertexLayoutHandle layoutHandle = BGFX_INVALID_HANDLE;
  2085. m_vertexBuffers[_handle.idx].create(_size, NULL, layoutHandle, _flags);
  2086. }
  2087. void updateDynamicVertexBuffer(VertexBufferHandle _handle, uint32_t _offset, uint32_t _size, const Memory* _mem) override
  2088. {
  2089. // BX_UNUSED(_handle, _offset, _size, _mem);
  2090. m_vertexBuffers[_handle.idx].update(/*m_commandBuffer*/NULL, _offset, bx::min<uint32_t>(_size, _mem->size), _mem->data);
  2091. }
  2092. void destroyDynamicVertexBuffer(VertexBufferHandle _handle) override
  2093. {
  2094. m_vertexBuffers[_handle.idx].destroy();
  2095. }
  2096. void createShader(ShaderHandle _handle, const Memory* _mem) override
  2097. {
  2098. m_shaders[_handle.idx].create(_mem);
  2099. }
  2100. void destroyShader(ShaderHandle _handle) override
  2101. {
  2102. m_shaders[_handle.idx].destroy();
  2103. }
  2104. void createProgram(ProgramHandle _handle, ShaderHandle _vsh, ShaderHandle _fsh) override
  2105. {
  2106. m_program[_handle.idx].create(&m_shaders[_vsh.idx], isValid(_fsh) ? &m_shaders[_fsh.idx] : NULL);
  2107. }
  2108. void destroyProgram(ProgramHandle _handle) override
  2109. {
  2110. m_program[_handle.idx].destroy();
  2111. }
  2112. void* createTexture(TextureHandle _handle, const Memory* _mem, uint64_t _flags, uint8_t _skip) override
  2113. {
  2114. return m_textures[_handle.idx].create(_mem, _flags, _skip);
  2115. }
  2116. void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) override
  2117. {
  2118. }
  2119. void updateTexture(TextureHandle _handle, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem) override
  2120. {
  2121. m_textures[_handle.idx].update(m_commandPool, _side, _mip, _rect, _z, _depth, _pitch, _mem);
  2122. }
  2123. void updateTextureEnd() override
  2124. {
  2125. }
  2126. void readTexture(TextureHandle /*_handle*/, void* /*_data*/, uint8_t /*_mip*/) override
  2127. {
  2128. }
  2129. void resizeTexture(TextureHandle /*_handle*/, uint16_t /*_width*/, uint16_t /*_height*/, uint8_t /*_numMips*/, uint16_t /*_numLayers*/) override
  2130. {
  2131. }
  2132. void overrideInternal(TextureHandle /*_handle*/, uintptr_t /*_ptr*/) override
  2133. {
  2134. }
  2135. uintptr_t getInternal(TextureHandle /*_handle*/) override
  2136. {
  2137. return 0;
  2138. }
  2139. void destroyTexture(TextureHandle _handle) override
  2140. {
  2141. m_textures[_handle.idx].destroy();
  2142. }
  2143. void createFrameBuffer(FrameBufferHandle _handle, uint8_t _num, const Attachment* _attachment) override
  2144. {
  2145. m_frameBuffers[_handle.idx].create(_num, _attachment);
  2146. }
  2147. void createFrameBuffer(FrameBufferHandle /*_handle*/, void* /*_nwh*/, uint32_t /*_width*/, uint32_t /*_height*/, TextureFormat::Enum /*_format*/, TextureFormat::Enum /*_depthFormat*/) override
  2148. {
  2149. }
  2150. void destroyFrameBuffer(FrameBufferHandle _handle) override
  2151. {
  2152. m_frameBuffers[_handle.idx].destroy();
  2153. }
  2154. void createUniform(UniformHandle _handle, UniformType::Enum _type, uint16_t _num, const char* _name) override
  2155. {
  2156. if (NULL != m_uniforms[_handle.idx])
  2157. {
  2158. BX_FREE(g_allocator, m_uniforms[_handle.idx]);
  2159. }
  2160. const uint32_t size = bx::alignUp(g_uniformTypeSize[_type] * _num, 16);
  2161. void* data = BX_ALLOC(g_allocator, size);
  2162. bx::memSet(data, 0, size);
  2163. m_uniforms[_handle.idx] = data;
  2164. m_uniformReg.add(_handle, _name);
  2165. }
  2166. void destroyUniform(UniformHandle _handle) override
  2167. {
  2168. BX_FREE(g_allocator, m_uniforms[_handle.idx]);
  2169. m_uniforms[_handle.idx] = NULL;
  2170. }
  2171. void requestScreenShot(FrameBufferHandle /*_handle*/, const char* /*_filePath*/) override
  2172. {
  2173. }
  2174. void updateViewName(ViewId _id, const char* _name) override
  2175. {
  2176. bx::strCopy(&s_viewName[_id][BGFX_CONFIG_MAX_VIEW_NAME_RESERVED]
  2177. , BX_COUNTOF(s_viewName[0]) - BGFX_CONFIG_MAX_VIEW_NAME_RESERVED
  2178. , _name
  2179. );
  2180. }
  2181. void updateUniform(uint16_t _loc, const void* _data, uint32_t _size) override
  2182. {
  2183. bx::memCopy(m_uniforms[_loc], _data, _size);
  2184. }
  2185. void invalidateOcclusionQuery(OcclusionQueryHandle _handle) override
  2186. {
  2187. BX_UNUSED(_handle);
  2188. }
  2189. void setMarker(const char* _marker, uint16_t _len) override
  2190. {
  2191. if (BX_ENABLED(BGFX_CONFIG_DEBUG_ANNOTATION) )
  2192. {
  2193. BX_UNUSED(_len);
  2194. VkDebugUtilsLabelEXT dul;
  2195. dul.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_LABEL_EXT;
  2196. dul.pNext = NULL;
  2197. dul.pLabelName = _marker;
  2198. dul.color[0] = 1.0f;
  2199. dul.color[1] = 0.0f;
  2200. dul.color[2] = 0.0f;
  2201. dul.color[3] = 1.0f;
  2202. vkCmdInsertDebugUtilsLabelEXT(m_commandBuffer, &dul);
  2203. }
  2204. }
  2205. virtual void setName(Handle _handle, const char* _name, uint16_t _len) override
  2206. {
  2207. switch (_handle.type)
  2208. {
  2209. case Handle::IndexBuffer:
  2210. setDebugObjectName(m_device, m_indexBuffers[_handle.idx].m_buffer, "%.*s", _len, _name);
  2211. break;
  2212. case Handle::Shader:
  2213. setDebugObjectName(m_device, m_shaders[_handle.idx].m_module, "%.*s", _len, _name);
  2214. break;
  2215. case Handle::Texture:
  2216. // setDebugObjectName(m_device, m_textures[_handle.idx].m_ptr, "%.*s", _len, _name);
  2217. break;
  2218. case Handle::VertexBuffer:
  2219. setDebugObjectName(m_device, m_vertexBuffers[_handle.idx].m_buffer, "%.*s", _len, _name);
  2220. break;
  2221. default:
  2222. BX_CHECK(false, "Invalid handle type?! %d", _handle.type);
  2223. break;
  2224. }
  2225. }
  2226. void submitBlit(BlitState& _bs, uint16_t _view);
  2227. void submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter) override;
  2228. void blitSetup(TextVideoMemBlitter& _blitter) override
  2229. {
  2230. const uint32_t width = m_sci.imageExtent.width;
  2231. const uint32_t height = m_sci.imageExtent.height;
  2232. setFrameBuffer(BGFX_INVALID_HANDLE, false);
  2233. VkViewport vp;
  2234. vp.x = 0;
  2235. vp.y = 0;
  2236. vp.width = (float)width;
  2237. vp.height = (float)height;
  2238. vp.minDepth = 0.0f;
  2239. vp.maxDepth = 1.0f;
  2240. vkCmdSetViewport(m_commandBuffer, 0, 1, &vp);
  2241. VkRect2D rc;
  2242. rc.offset.x = 0;
  2243. rc.offset.y = 0;
  2244. rc.extent.width = width;
  2245. rc.extent.height = height;
  2246. vkCmdSetScissor(m_commandBuffer, 0, 1, &rc);
  2247. const uint64_t state = 0
  2248. | BGFX_STATE_WRITE_RGB
  2249. | BGFX_STATE_WRITE_A
  2250. | BGFX_STATE_DEPTH_TEST_ALWAYS
  2251. ;
  2252. const VertexLayout* layout = &m_vertexLayouts[_blitter.m_vb->layoutHandle.idx];
  2253. VkPipeline pso = getPipeline(state
  2254. , packStencil(BGFX_STENCIL_DEFAULT, BGFX_STENCIL_DEFAULT)
  2255. , 1
  2256. , &layout
  2257. , _blitter.m_program
  2258. , 0
  2259. );
  2260. vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pso);
  2261. ProgramVK& program = m_program[_blitter.m_program.idx];
  2262. float proj[16];
  2263. bx::mtxOrtho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f, 0.0f, false);
  2264. PredefinedUniform& predefined = m_program[_blitter.m_program.idx].m_predefined[0];
  2265. uint8_t flags = predefined.m_type;
  2266. setShaderUniform(flags, predefined.m_loc, proj, 4);
  2267. UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
  2268. if (NULL != vcb)
  2269. {
  2270. commit(*vcb);
  2271. }
  2272. ScratchBufferVK& scratchBuffer = m_scratchBuffer[m_backBufferColorIdx];
  2273. VkDescriptorSetLayout dsl = m_descriptorSetLayoutCache.find(program.m_descriptorSetLayoutHash);
  2274. VkDescriptorSetAllocateInfo dsai;
  2275. dsai.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
  2276. dsai.pNext = NULL;
  2277. dsai.descriptorPool = m_descriptorPool;
  2278. dsai.descriptorSetCount = 1;
  2279. dsai.pSetLayouts = &dsl;
  2280. vkAllocateDescriptorSets(m_device, &dsai, &scratchBuffer.m_descriptorSet[scratchBuffer.m_currentDs]);
  2281. const uint32_t align = uint32_t(m_deviceProperties.limits.minUniformBufferOffsetAlignment);
  2282. TextureVK& texture = m_textures[_blitter.m_texture.idx];
  2283. uint32_t samplerFlags = (uint32_t)(texture.m_flags & BGFX_SAMPLER_BITS_MASK);
  2284. VkSampler sampler = getSampler(samplerFlags, 1);
  2285. const uint32_t size = bx::strideAlign(program.m_vsh->m_size, align);
  2286. uint32_t bufferOffset = scratchBuffer.m_pos;
  2287. VkDescriptorBufferInfo bufferInfo;
  2288. bufferInfo.buffer = scratchBuffer.m_buffer;
  2289. bufferInfo.offset = 0;
  2290. bufferInfo.range = size;
  2291. bx::memCopy(&scratchBuffer.m_data[scratchBuffer.m_pos], m_vsScratch, program.m_vsh->m_size);
  2292. scratchBuffer.m_pos += size;
  2293. VkWriteDescriptorSet wds[3];
  2294. wds[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  2295. wds[0].pNext = NULL;
  2296. wds[0].dstSet = scratchBuffer.m_descriptorSet[scratchBuffer.m_currentDs];
  2297. wds[0].dstBinding = program.m_vsh->m_uniformBinding;
  2298. wds[0].dstArrayElement = 0;
  2299. wds[0].descriptorCount = 1;
  2300. wds[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
  2301. wds[0].pImageInfo = NULL;
  2302. wds[0].pBufferInfo = &bufferInfo;
  2303. wds[0].pTexelBufferView = NULL;
  2304. VkDescriptorImageInfo imageInfo;
  2305. imageInfo.imageLayout = texture.m_currentImageLayout;
  2306. imageInfo.imageView = texture.m_textureImageView;
  2307. imageInfo.sampler = sampler;
  2308. wds[1].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  2309. wds[1].pNext = NULL;
  2310. wds[1].dstSet = scratchBuffer.m_descriptorSet[scratchBuffer.m_currentDs];
  2311. wds[1].dstBinding = program.m_fsh->m_bindInfo[0].binding;
  2312. wds[1].dstArrayElement = 0;
  2313. wds[1].descriptorCount = 1;
  2314. wds[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
  2315. wds[1].pImageInfo = &imageInfo;
  2316. wds[1].pBufferInfo = NULL;
  2317. wds[1].pTexelBufferView = NULL;
  2318. wds[2].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  2319. wds[2].pNext = NULL;
  2320. wds[2].dstSet = scratchBuffer.m_descriptorSet[scratchBuffer.m_currentDs];
  2321. wds[2].dstBinding = program.m_fsh->m_bindInfo[0].samplerBinding;
  2322. wds[2].dstArrayElement = 0;
  2323. wds[2].descriptorCount = 1;
  2324. wds[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
  2325. wds[2].pImageInfo = &imageInfo;
  2326. wds[2].pBufferInfo = NULL;
  2327. wds[2].pTexelBufferView = NULL;
  2328. m_vsChanges = 0;
  2329. m_fsChanges = 0;
  2330. vkUpdateDescriptorSets(m_device, 3, wds, 0, NULL);
  2331. vkCmdBindDescriptorSets(
  2332. m_commandBuffer
  2333. , VK_PIPELINE_BIND_POINT_GRAPHICS
  2334. , program.m_pipelineLayout
  2335. , 0
  2336. , 1
  2337. , &scratchBuffer.m_descriptorSet[scratchBuffer.m_currentDs]
  2338. , 1
  2339. , &bufferOffset
  2340. );
  2341. scratchBuffer.m_currentDs++;
  2342. VertexBufferVK& vb = m_vertexBuffers[_blitter.m_vb->handle.idx];
  2343. VkDeviceSize offset = 0;
  2344. vkCmdBindVertexBuffers(m_commandBuffer
  2345. , 0
  2346. , 1
  2347. , &vb.m_buffer
  2348. , &offset
  2349. );
  2350. BufferVK& ib = m_indexBuffers[_blitter.m_ib->handle.idx];
  2351. vkCmdBindIndexBuffer(m_commandBuffer
  2352. , ib.m_buffer
  2353. , 0
  2354. , VK_INDEX_TYPE_UINT16
  2355. );
  2356. }
  2357. void blitRender(TextVideoMemBlitter& _blitter, uint32_t _numIndices) override
  2358. {
  2359. const uint32_t numVertices = _numIndices*4/6;
  2360. if (0 < numVertices)
  2361. {
  2362. m_indexBuffers[_blitter.m_ib->handle.idx].update(m_commandBuffer, 0, _numIndices*2, _blitter.m_ib->data);
  2363. m_vertexBuffers[_blitter.m_vb->handle.idx].update(m_commandBuffer, 0, numVertices*_blitter.m_layout.m_stride, _blitter.m_vb->data, true);
  2364. vkCmdDrawIndexed(m_commandBuffer
  2365. , _numIndices
  2366. , 1
  2367. , 0
  2368. , 0
  2369. , 0
  2370. );
  2371. }
  2372. }
  2373. void updateResolution(const Resolution& _resolution)
  2374. {
  2375. if (!!(_resolution.reset & BGFX_RESET_MAXANISOTROPY) )
  2376. {
  2377. m_maxAnisotropy = UINT32_MAX;
  2378. }
  2379. else
  2380. {
  2381. m_maxAnisotropy = 1;
  2382. }
  2383. bool depthClamp = !!(_resolution.reset & BGFX_RESET_DEPTH_CLAMP);
  2384. if (m_depthClamp != depthClamp)
  2385. {
  2386. m_depthClamp = depthClamp;
  2387. m_pipelineStateCache.invalidate();
  2388. }
  2389. uint32_t flags = _resolution.reset & ~(BGFX_RESET_MAXANISOTROPY | BGFX_RESET_DEPTH_CLAMP);
  2390. if (m_resolution.width != _resolution.width
  2391. || m_resolution.height != _resolution.height
  2392. || m_resolution.reset != flags)
  2393. {
  2394. flags &= ~BGFX_RESET_INTERNAL_FORCE;
  2395. bool resize = (m_resolution.reset & BGFX_RESET_MSAA_MASK) == (_resolution.reset & BGFX_RESET_MSAA_MASK);
  2396. bool formatChanged = (m_resolution.reset & BGFX_RESET_SRGB_BACKBUFFER) == (_resolution.reset & BGFX_RESET_SRGB_BACKBUFFER);
  2397. m_resolution = _resolution;
  2398. m_resolution.reset = flags;
  2399. m_textVideoMem.resize(false, _resolution.width, _resolution.height);
  2400. m_textVideoMem.clear();
  2401. if (resize || formatChanged || m_needToRefreshSwapchain)
  2402. {
  2403. VK_CHECK(vkDeviceWaitIdle(m_device) );
  2404. releaseSwapchainFramebuffer();
  2405. releaseSwapchainRenderPass();
  2406. releaseSwapchain();
  2407. VkSurfaceFormatKHR surfaceFormat = (m_resolution.reset & BGFX_RESET_SRGB_BACKBUFFER)
  2408. ? m_backBufferColorFormatSrgb
  2409. : m_backBufferColorFormat
  2410. ;
  2411. m_sci.imageFormat = surfaceFormat.format;
  2412. m_sci.imageColorSpace = surfaceFormat.colorSpace;
  2413. uint32_t numPresentModes(10);
  2414. VkPresentModeKHR presentModes[10];
  2415. vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, presentModes);
  2416. uint32_t presentModeIdx = numPresentModes;
  2417. static const VkPresentModeKHR preferredPresentMode[] =
  2418. {
  2419. VK_PRESENT_MODE_FIFO_KHR,
  2420. VK_PRESENT_MODE_FIFO_RELAXED_KHR,
  2421. VK_PRESENT_MODE_MAILBOX_KHR,
  2422. VK_PRESENT_MODE_IMMEDIATE_KHR,
  2423. };
  2424. static const bool hasVsync[] = { true, true, true, false };
  2425. BX_STATIC_ASSERT(BX_COUNTOF(preferredPresentMode) == BX_COUNTOF(hasVsync) );
  2426. const bool vsync = !!(flags & BGFX_RESET_VSYNC);
  2427. for (uint32_t ii = 0; ii < BX_COUNTOF(preferredPresentMode); ++ii)
  2428. {
  2429. for (uint32_t jj = 0; jj < numPresentModes; ++jj)
  2430. {
  2431. if (presentModes[jj] == preferredPresentMode[ii]
  2432. && vsync == hasVsync[ii])
  2433. {
  2434. presentModeIdx = jj;
  2435. BX_TRACE("present mode: %d", preferredPresentMode[ii]);
  2436. break;
  2437. }
  2438. }
  2439. if (presentModeIdx < numPresentModes)
  2440. {
  2441. break;
  2442. }
  2443. }
  2444. if (presentModeIdx == numPresentModes)
  2445. {
  2446. presentModeIdx = 0;
  2447. }
  2448. m_sci.presentMode = presentModes[presentModeIdx];
  2449. VkSurfaceCapabilitiesKHR surfaceCapabilities;
  2450. VK_CHECK(vkGetPhysicalDeviceSurfaceCapabilitiesKHR(m_physicalDevice, m_surface, &surfaceCapabilities) );
  2451. m_sci.imageExtent.width = bx::clamp<uint32_t>(m_resolution.width
  2452. , surfaceCapabilities.minImageExtent.width
  2453. , surfaceCapabilities.maxImageExtent.width
  2454. );
  2455. m_sci.imageExtent.height = bx::clamp<uint32_t>(m_resolution.height
  2456. , surfaceCapabilities.minImageExtent.height
  2457. , surfaceCapabilities.maxImageExtent.height
  2458. );
  2459. VK_CHECK(createSwapchain() );
  2460. VK_CHECK(createSwapchainRenderPass() );
  2461. VK_CHECK(createSwapchainFramebuffer() );
  2462. initSwapchainImageLayout();
  2463. BX_TRACE("refreshed swapchain: %d x %d", m_sci.imageExtent.width, m_sci.imageExtent.height);
  2464. }
  2465. #if 1
  2466. BX_UNUSED(resize);
  2467. #else
  2468. m_scd.BufferDesc.Width = _resolution.m_width;
  2469. m_scd.BufferDesc.Height = _resolution.m_height;
  2470. preReset();
  2471. if (resize)
  2472. {
  2473. uint32_t nodeMask[] = { 1, 1, 1, 1 };
  2474. BX_STATIC_ASSERT(BX_COUNTOF(m_backBufferColor) == BX_COUNTOF(nodeMask) );
  2475. IUnknown* presentQueue[] ={ m_cmd.m_commandQueue, m_cmd.m_commandQueue, m_cmd.m_commandQueue, m_cmd.m_commandQueue };
  2476. BX_STATIC_ASSERT(BX_COUNTOF(m_backBufferColor) == BX_COUNTOF(presentQueue) );
  2477. DX_CHECK(m_swapChain->ResizeBuffers1(m_scd.BufferCount
  2478. , m_scd.BufferDesc.Width
  2479. , m_scd.BufferDesc.Height
  2480. , m_scd.BufferDesc.Format
  2481. , m_scd.Flags
  2482. , nodeMask
  2483. , presentQueue
  2484. ) );
  2485. }
  2486. else
  2487. {
  2488. updateMsaa();
  2489. m_scd.SampleDesc = s_msaa[(m_resolution.m_flags&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT];
  2490. DX_RELEASE(m_swapChain, 0);
  2491. HRESULT hr;
  2492. hr = m_factory->CreateSwapChain(m_cmd.m_commandQueue
  2493. , &m_scd
  2494. , reinterpret_cast<IDXGISwapChain**>(&m_swapChain)
  2495. );
  2496. BGFX_FATAL(SUCCEEDED(hr), bgfx::Fatal::UnableToInitialize, "Failed to create swap chain.");
  2497. }
  2498. postReset();
  2499. #endif // 0
  2500. }
  2501. }
  2502. void setShaderUniform(uint8_t _flags, uint32_t _regIndex, const void* _val, uint32_t _numRegs)
  2503. {
  2504. BX_UNUSED(_flags, _regIndex, _val, _numRegs);
  2505. if (_flags&BGFX_UNIFORM_FRAGMENTBIT)
  2506. {
  2507. bx::memCopy(&m_fsScratch[_regIndex], _val, _numRegs*16);
  2508. m_fsChanges += _numRegs;
  2509. }
  2510. else
  2511. {
  2512. bx::memCopy(&m_vsScratch[_regIndex], _val, _numRegs*16);
  2513. m_vsChanges += _numRegs;
  2514. }
  2515. }
  2516. void setShaderUniform4f(uint8_t _flags, uint32_t _regIndex, const void* _val, uint32_t _numRegs)
  2517. {
  2518. setShaderUniform(_flags, _regIndex, _val, _numRegs);
  2519. }
  2520. void setShaderUniform4x4f(uint8_t _flags, uint32_t _regIndex, const void* _val, uint32_t _numRegs)
  2521. {
  2522. setShaderUniform(_flags, _regIndex, _val, _numRegs);
  2523. }
  2524. // void commitShaderUniforms(VkCommandBuffer _commandBuffer, ProgramHandle _program)
  2525. // {
  2526. // ProgramVK& program = m_program[_program.idx];
  2527. //
  2528. // const uint32_t align = uint32_t(m_deviceProperties.limits.minUniformBufferOffsetAlignment);
  2529. // const uint32_t vsize = bx::strideAlign(program.m_vsh->m_size, align);
  2530. // const uint32_t fsize = bx::strideAlign( (NULL != program.m_fsh ? program.m_fsh->m_size : 0), align);
  2531. // const uint32_t total = vsize + fsize;
  2532. //
  2533. // if (0 < total)
  2534. // {
  2535. // ScratchBufferVK& sb = m_scratchBuffer[m_backBufferColorIdx];
  2536. //
  2537. // uint8_t* data = (uint8_t*)sb.allocUbv(vsize, fsize);
  2538. //
  2539. // bx::memCopy(data, m_vsScratch, program.m_vsh->m_size);
  2540. // data += vsize;
  2541. //
  2542. // if (0 != fsize)
  2543. // {
  2544. // bx::memCopy(data, m_fsScratch, program.m_fsh->m_size);
  2545. // }
  2546. //
  2547. // vkCmdBindDescriptorSets(_commandBuffer
  2548. // , VK_PIPELINE_BIND_POINT_GRAPHICS
  2549. // , m_pipelineLayout
  2550. // , program.m_pipelineLayout
  2551. // , 0
  2552. // , 1
  2553. // , &sb.m_descriptorSet[sb.m_currentDs - 1]
  2554. // , 0
  2555. // , NULL
  2556. // );
  2557. // }
  2558. //
  2559. // m_vsChanges = 0;
  2560. // m_fsChanges = 0;
  2561. // }
  2562. void setFrameBuffer(FrameBufferHandle _fbh, bool _msaa = true)
  2563. {
  2564. BX_UNUSED(_msaa);
  2565. if (isValid(m_fbh)
  2566. && m_fbh.idx != _fbh.idx)
  2567. {
  2568. const FrameBufferVK& frameBuffer = m_frameBuffers[m_fbh.idx];
  2569. BX_UNUSED(frameBuffer);
  2570. for (uint8_t ii = 0, num = frameBuffer.m_num; ii < num; ++ii)
  2571. {
  2572. TextureVK& texture = m_textures[frameBuffer.m_texture[ii].idx];
  2573. texture.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
  2574. }
  2575. if (isValid(frameBuffer.m_depth) )
  2576. {
  2577. TextureVK& texture = m_textures[frameBuffer.m_depth.idx];
  2578. const bool writeOnly = 0 != (texture.m_flags&BGFX_TEXTURE_RT_WRITE_ONLY);
  2579. if (!writeOnly)
  2580. {
  2581. texture.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
  2582. }
  2583. }
  2584. }
  2585. if (!isValid(_fbh) )
  2586. {
  2587. // m_rtvHandle = m_rtvDescriptorHeap->GetCPUDescriptorHandleForHeapStart();
  2588. // uint32_t rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
  2589. // m_rtvHandle.ptr += m_backBufferColorIdx * rtvDescriptorSize;
  2590. // m_dsvHandle = m_dsvDescriptorHeap->GetCPUDescriptorHandleForHeapStart();
  2591. //
  2592. // m_currentColor = &m_rtvHandle;
  2593. // m_currentDepthStencil = &m_dsvHandle;
  2594. // m_commandList->OMSetRenderTargets(1, m_currentColor, true, m_currentDepthStencil);
  2595. }
  2596. else
  2597. {
  2598. const FrameBufferVK& frameBuffer = m_frameBuffers[_fbh.idx];
  2599. BX_UNUSED(frameBuffer);
  2600. if (0 < frameBuffer.m_num)
  2601. {
  2602. // D3D12_CPU_DESCRIPTOR_HANDLE rtvDescriptor = m_rtvDescriptorHeap->GetCPUDescriptorHandleForHeapStart();
  2603. // uint32_t rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
  2604. // m_rtvHandle.ptr = rtvDescriptor.ptr + (BX_COUNTOF(m_backBufferColor) + _fbh.idx * BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS) * rtvDescriptorSize;
  2605. // m_currentColor = &m_rtvHandle;
  2606. }
  2607. else
  2608. {
  2609. // m_currentColor = NULL;
  2610. }
  2611. if (isValid(frameBuffer.m_depth) )
  2612. {
  2613. // D3D12_CPU_DESCRIPTOR_HANDLE dsvDescriptor = m_dsvDescriptorHeap->GetCPUDescriptorHandleForHeapStart();
  2614. // uint32_t dsvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_DSV);
  2615. // m_dsvHandle.ptr = dsvDescriptor.ptr + (1 + _fbh.idx) * dsvDescriptorSize;
  2616. // m_currentDepthStencil = &m_dsvHandle;
  2617. }
  2618. else
  2619. {
  2620. // m_currentDepthStencil = NULL;
  2621. }
  2622. for (uint8_t ii = 0, num = frameBuffer.m_num; ii < num; ++ii)
  2623. {
  2624. TextureVK& texture = m_textures[frameBuffer.m_texture[ii].idx];
  2625. texture.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
  2626. }
  2627. if (isValid(frameBuffer.m_depth) )
  2628. {
  2629. TextureVK& texture = m_textures[frameBuffer.m_depth.idx];
  2630. texture.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
  2631. }
  2632. // m_commandList->OMSetRenderTargets(frameBuffer.m_num
  2633. // , m_currentColor
  2634. // , true
  2635. // , m_currentDepthStencil
  2636. // );
  2637. }
  2638. m_fbh = _fbh;
  2639. // m_rtMsaa = _msaa;
  2640. }
  2641. void setBlendState(VkPipelineColorBlendStateCreateInfo& _desc, uint64_t _state, uint32_t _rgba = 0)
  2642. {
  2643. VkPipelineColorBlendAttachmentState* bas = const_cast<VkPipelineColorBlendAttachmentState*>(_desc.pAttachments);
  2644. uint8_t writeMask = 0;
  2645. writeMask |= (_state & BGFX_STATE_WRITE_R) ? VK_COLOR_COMPONENT_R_BIT : 0;
  2646. writeMask |= (_state & BGFX_STATE_WRITE_G) ? VK_COLOR_COMPONENT_G_BIT : 0;
  2647. writeMask |= (_state & BGFX_STATE_WRITE_B) ? VK_COLOR_COMPONENT_B_BIT : 0;
  2648. writeMask |= (_state & BGFX_STATE_WRITE_A) ? VK_COLOR_COMPONENT_A_BIT : 0;
  2649. bas->blendEnable = !!(BGFX_STATE_BLEND_MASK & _state);
  2650. {
  2651. const uint32_t blend = uint32_t( (_state & BGFX_STATE_BLEND_MASK ) >> BGFX_STATE_BLEND_SHIFT);
  2652. const uint32_t equation = uint32_t( (_state & BGFX_STATE_BLEND_EQUATION_MASK) >> BGFX_STATE_BLEND_EQUATION_SHIFT);
  2653. const uint32_t srcRGB = (blend ) & 0xf;
  2654. const uint32_t dstRGB = (blend >> 4) & 0xf;
  2655. const uint32_t srcA = (blend >> 8) & 0xf;
  2656. const uint32_t dstA = (blend >> 12) & 0xf;
  2657. const uint32_t equRGB = (equation ) & 0x7;
  2658. const uint32_t equA = (equation >> 3) & 0x7;
  2659. bas->srcColorBlendFactor = s_blendFactor[srcRGB][0];
  2660. bas->dstColorBlendFactor = s_blendFactor[dstRGB][0];
  2661. bas->colorBlendOp = s_blendEquation[equRGB];
  2662. bas->srcAlphaBlendFactor = s_blendFactor[srcA][1];
  2663. bas->dstAlphaBlendFactor = s_blendFactor[dstA][1];
  2664. bas->alphaBlendOp = s_blendEquation[equA];
  2665. bas->colorWriteMask = writeMask;
  2666. }
  2667. uint32_t numAttachments = 1;
  2668. if (isValid(m_fbh) )
  2669. {
  2670. const FrameBufferVK& frameBuffer = m_frameBuffers[m_fbh.idx];
  2671. numAttachments = frameBuffer.m_num;
  2672. }
  2673. if (!!(BGFX_STATE_BLEND_INDEPENDENT & _state) && m_deviceFeatures.independentBlend )
  2674. {
  2675. for (uint32_t ii = 1, rgba = _rgba; ii < numAttachments; ++ii, rgba >>= 11)
  2676. {
  2677. ++bas;
  2678. bas->blendEnable = 0 != (rgba & 0x7ff);
  2679. const uint32_t src = (rgba ) & 0xf;
  2680. const uint32_t dst = (rgba >> 4) & 0xf;
  2681. const uint32_t equation = (rgba >> 8) & 0x7;
  2682. bas->srcColorBlendFactor = s_blendFactor[src][0];
  2683. bas->dstColorBlendFactor = s_blendFactor[dst][0];
  2684. bas->colorBlendOp = s_blendEquation[equation];
  2685. bas->srcAlphaBlendFactor = s_blendFactor[src][1];
  2686. bas->dstAlphaBlendFactor = s_blendFactor[dst][1];
  2687. bas->alphaBlendOp = s_blendEquation[equation];
  2688. bas->colorWriteMask = writeMask;
  2689. }
  2690. }
  2691. else
  2692. {
  2693. for (uint32_t ii = 1; ii < numAttachments; ++ii)
  2694. {
  2695. bx::memCopy(&bas[ii], bas, sizeof(VkPipelineColorBlendAttachmentState) );
  2696. }
  2697. }
  2698. _desc.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
  2699. _desc.pNext = NULL;
  2700. _desc.flags = 0;
  2701. _desc.logicOpEnable = VK_FALSE;
  2702. _desc.logicOp = VK_LOGIC_OP_CLEAR;
  2703. _desc.attachmentCount = numAttachments;
  2704. _desc.blendConstants[0] = 0.0f;
  2705. _desc.blendConstants[1] = 0.0f;
  2706. _desc.blendConstants[2] = 0.0f;
  2707. _desc.blendConstants[3] = 0.0f;
  2708. }
  2709. void setRasterizerState(VkPipelineRasterizationStateCreateInfo& _desc, uint64_t _state, bool _wireframe = false)
  2710. {
  2711. const uint32_t cull = (_state&BGFX_STATE_CULL_MASK) >> BGFX_STATE_CULL_SHIFT;
  2712. _desc.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
  2713. _desc.pNext = NULL;
  2714. _desc.flags = 0;
  2715. _desc.depthClampEnable = m_depthClamp;
  2716. _desc.rasterizerDiscardEnable = VK_FALSE;
  2717. _desc.polygonMode = _wireframe
  2718. ? VK_POLYGON_MODE_LINE
  2719. : VK_POLYGON_MODE_FILL
  2720. ;
  2721. _desc.cullMode = s_cullMode[cull];
  2722. _desc.frontFace = (_state&BGFX_STATE_FRONT_CCW) ? VK_FRONT_FACE_COUNTER_CLOCKWISE : VK_FRONT_FACE_CLOCKWISE;
  2723. _desc.depthBiasEnable = VK_FALSE;
  2724. _desc.depthBiasConstantFactor = 0.0f;
  2725. _desc.depthBiasClamp = 0.0f;
  2726. _desc.depthBiasSlopeFactor = 0.0f;
  2727. _desc.lineWidth = 1.0f;
  2728. }
  2729. void setDepthStencilState(VkPipelineDepthStencilStateCreateInfo& _desc, uint64_t _state, uint64_t _stencil = 0)
  2730. {
  2731. const uint32_t fstencil = unpackStencil(0, _stencil);
  2732. uint32_t func = (_state&BGFX_STATE_DEPTH_TEST_MASK)>>BGFX_STATE_DEPTH_TEST_SHIFT;
  2733. _desc.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
  2734. _desc.pNext = NULL;
  2735. _desc.flags = 0;
  2736. _desc.depthTestEnable = 0 != func;
  2737. _desc.depthWriteEnable = !!(BGFX_STATE_WRITE_Z & _state);
  2738. _desc.depthCompareOp = s_cmpFunc[func];
  2739. _desc.depthBoundsTestEnable = VK_FALSE;
  2740. _desc.stencilTestEnable = 0 != _stencil;
  2741. uint32_t bstencil = unpackStencil(1, _stencil);
  2742. uint32_t frontAndBack = bstencil != BGFX_STENCIL_NONE && bstencil != fstencil;
  2743. bstencil = frontAndBack ? bstencil : fstencil;
  2744. _desc.front.failOp = s_stencilOp[(fstencil & BGFX_STENCIL_OP_FAIL_S_MASK) >> BGFX_STENCIL_OP_FAIL_S_SHIFT];
  2745. _desc.front.passOp = s_stencilOp[(fstencil & BGFX_STENCIL_OP_PASS_Z_MASK) >> BGFX_STENCIL_OP_PASS_Z_SHIFT];
  2746. _desc.front.depthFailOp = s_stencilOp[(fstencil & BGFX_STENCIL_OP_FAIL_Z_MASK) >> BGFX_STENCIL_OP_FAIL_Z_SHIFT];
  2747. _desc.front.compareOp = s_cmpFunc[(fstencil & BGFX_STENCIL_TEST_MASK) >> BGFX_STENCIL_TEST_SHIFT];
  2748. _desc.front.compareMask = UINT32_MAX;
  2749. _desc.front.writeMask = UINT32_MAX;
  2750. _desc.front.reference = 0;
  2751. _desc.back.failOp = s_stencilOp[(bstencil & BGFX_STENCIL_OP_FAIL_S_MASK) >> BGFX_STENCIL_OP_FAIL_S_SHIFT];
  2752. _desc.back.passOp = s_stencilOp[(bstencil & BGFX_STENCIL_OP_PASS_Z_MASK) >> BGFX_STENCIL_OP_PASS_Z_SHIFT];
  2753. _desc.back.depthFailOp = s_stencilOp[(bstencil & BGFX_STENCIL_OP_FAIL_Z_MASK) >> BGFX_STENCIL_OP_FAIL_Z_SHIFT];
  2754. _desc.back.compareOp = s_cmpFunc[(bstencil&BGFX_STENCIL_TEST_MASK) >> BGFX_STENCIL_TEST_SHIFT];
  2755. _desc.back.compareMask = UINT32_MAX;
  2756. _desc.back.writeMask = UINT32_MAX;
  2757. _desc.back.reference = 0;
  2758. _desc.minDepthBounds = 0.0f;
  2759. _desc.maxDepthBounds = 1.0f;
  2760. }
  2761. void setInputLayout(VkPipelineVertexInputStateCreateInfo& _vertexInputState, uint8_t _numStream, const VertexLayout** _layout, const ProgramVK& _program, uint8_t _numInstanceData)
  2762. {
  2763. _vertexInputState.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
  2764. _vertexInputState.pNext = NULL;
  2765. _vertexInputState.flags = 0;
  2766. _vertexInputState.vertexBindingDescriptionCount = 0;
  2767. _vertexInputState.vertexAttributeDescriptionCount = 0;
  2768. uint16_t unsettedAttr[Attrib::Count];
  2769. bx::memCopy(unsettedAttr, _program.m_vsh->m_attrMask, sizeof(uint16_t) * Attrib::Count);
  2770. for (uint8_t stream = 0; stream < _numStream; ++stream)
  2771. {
  2772. VertexLayout layout;
  2773. bx::memCopy(&layout, _layout[stream], sizeof(VertexLayout) );
  2774. const uint16_t* attrMask = _program.m_vsh->m_attrMask;
  2775. for (uint32_t ii = 0; ii < Attrib::Count; ++ii)
  2776. {
  2777. uint16_t mask = attrMask[ii];
  2778. uint16_t attr = (layout.m_attributes[ii] & mask);
  2779. layout.m_attributes[ii] = attr == 0 || attr == UINT16_MAX ? UINT16_MAX : attr;
  2780. if (unsettedAttr[ii] && attr != UINT16_MAX)
  2781. {
  2782. unsettedAttr[ii] = 0;
  2783. }
  2784. }
  2785. fillVertexLayout(_program.m_vsh, _vertexInputState, layout);
  2786. }
  2787. for (uint32_t ii = 0; ii < Attrib::Count; ++ii)
  2788. {
  2789. if (0 < unsettedAttr[ii])
  2790. {
  2791. uint32_t numAttribs = _vertexInputState.vertexAttributeDescriptionCount;
  2792. VkVertexInputAttributeDescription* inputAttrib = const_cast<VkVertexInputAttributeDescription*>(_vertexInputState.pVertexAttributeDescriptions + numAttribs);
  2793. inputAttrib->location = _program.m_vsh->m_attrRemap[ii];
  2794. inputAttrib->binding = 0;
  2795. inputAttrib->format = VK_FORMAT_R32G32B32_SFLOAT;
  2796. inputAttrib->offset = 0;
  2797. _vertexInputState.vertexAttributeDescriptionCount++;
  2798. }
  2799. }
  2800. if (0 < _numInstanceData)
  2801. {
  2802. fillInstanceBinding(_program.m_vsh, _vertexInputState, _numInstanceData);
  2803. }
  2804. }
  2805. uint32_t getRenderPassHashkey(uint8_t _num, const Attachment* attachments)
  2806. {
  2807. if (_num == 0)
  2808. return 0;
  2809. bx::HashMurmur2A hash;
  2810. hash.begin(0);
  2811. for (uint8_t ii = 0; ii < _num; ++ii)
  2812. {
  2813. hash.add(attachments[ii].access);
  2814. hash.add(attachments[ii].layer);
  2815. hash.add(attachments[ii].mip);
  2816. hash.add(attachments[ii].resolve);
  2817. TextureVK& texture = m_textures[attachments[ii].handle.idx];
  2818. hash.add(texture.m_textureFormat);
  2819. }
  2820. return hash.end();
  2821. }
  2822. VkRenderPass getRenderPass(uint8_t _num, const Attachment* _attachments)
  2823. {
  2824. VkRenderPass renderPass = VK_NULL_HANDLE;
  2825. uint32_t hashKey = getRenderPassHashkey(_num, _attachments);
  2826. renderPass = (VkRenderPass)m_renderPassCache.find(hashKey);
  2827. if (renderPass != VK_NULL_HANDLE)
  2828. return renderPass;
  2829. // cache missed
  2830. VkAttachmentDescription ad[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  2831. VkAttachmentReference colorAr[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  2832. VkAttachmentReference resolveAr[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  2833. VkAttachmentReference depthAr;
  2834. uint32_t numColorAr = 0;
  2835. depthAr.attachment = VK_ATTACHMENT_UNUSED;
  2836. depthAr.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  2837. for (uint8_t ii = 0; ii < _num; ++ii)
  2838. {
  2839. TextureVK& texture = m_textures[_attachments[ii].handle.idx];
  2840. ad[ii].flags = 0;
  2841. ad[ii].format = texture.m_vkTextureFormat;
  2842. ad[ii].samples = VK_SAMPLE_COUNT_1_BIT;
  2843. if (texture.m_vkTextureAspect & VK_IMAGE_ASPECT_COLOR_BIT)
  2844. {
  2845. ad[ii].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
  2846. ad[ii].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  2847. ad[ii].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
  2848. ad[ii].stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
  2849. ad[ii].initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  2850. ad[ii].finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  2851. colorAr[numColorAr].layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  2852. colorAr[numColorAr].attachment = ii;
  2853. numColorAr++;
  2854. }
  2855. else if (texture.m_vkTextureAspect & VK_IMAGE_ASPECT_DEPTH_BIT)
  2856. {
  2857. ad[ii].loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
  2858. ad[ii].storeOp = VK_ATTACHMENT_STORE_OP_STORE;
  2859. ad[ii].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
  2860. ad[ii].stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
  2861. ad[ii].initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  2862. ad[ii].finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  2863. depthAr.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
  2864. depthAr.attachment = ii;
  2865. }
  2866. resolveAr[ii].attachment = VK_ATTACHMENT_UNUSED;
  2867. resolveAr[ii].layout = ad[ii].initialLayout;
  2868. }
  2869. VkSubpassDescription sd[1];
  2870. sd[0].flags = 0;
  2871. sd[0].pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
  2872. sd[0].inputAttachmentCount = 0;
  2873. sd[0].pInputAttachments = NULL;
  2874. sd[0].colorAttachmentCount = numColorAr;
  2875. sd[0].pColorAttachments = colorAr;
  2876. sd[0].pResolveAttachments = resolveAr;
  2877. sd[0].pDepthStencilAttachment = &depthAr;
  2878. sd[0].preserveAttachmentCount = 0;
  2879. sd[0].pPreserveAttachments = NULL;
  2880. VkRenderPassCreateInfo rpi;
  2881. rpi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
  2882. rpi.pNext = NULL;
  2883. rpi.flags = 0;
  2884. rpi.attachmentCount = _num;
  2885. rpi.pAttachments = ad;
  2886. rpi.subpassCount = BX_COUNTOF(sd);
  2887. rpi.pSubpasses = sd;
  2888. rpi.dependencyCount = 0;
  2889. rpi.pDependencies = NULL;
  2890. VK_CHECK( vkCreateRenderPass(m_device, &rpi, m_allocatorCb, &renderPass) );
  2891. m_renderPassCache.add(hashKey, renderPass);
  2892. return renderPass;
  2893. }
  2894. VkSampler getSampler(uint32_t _samplerFlags, uint32_t _mipLevels)
  2895. {
  2896. bx::HashMurmur2A hash;
  2897. hash.begin();
  2898. hash.add(_samplerFlags);
  2899. hash.add(_mipLevels);
  2900. uint32_t hashKey = hash.end();
  2901. VkSampler sampler = m_samplerCache.find(hashKey);
  2902. if (sampler != VK_NULL_HANDLE)
  2903. {
  2904. return sampler;
  2905. }
  2906. const uint32_t cmpFunc = (_samplerFlags&BGFX_SAMPLER_COMPARE_MASK)>>BGFX_SAMPLER_COMPARE_SHIFT;
  2907. VkSamplerCreateInfo sci;
  2908. sci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
  2909. sci.pNext = NULL;
  2910. sci.flags = 0;
  2911. sci.magFilter = VK_FILTER_LINEAR;
  2912. sci.minFilter = VK_FILTER_LINEAR;
  2913. sci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_LINEAR;
  2914. sci.addressModeU = s_textureAddress[(_samplerFlags&BGFX_SAMPLER_U_MASK)>>BGFX_SAMPLER_U_SHIFT];
  2915. sci.addressModeV = s_textureAddress[(_samplerFlags&BGFX_SAMPLER_V_MASK)>>BGFX_SAMPLER_V_SHIFT];
  2916. sci.addressModeW = s_textureAddress[(_samplerFlags&BGFX_SAMPLER_W_MASK)>>BGFX_SAMPLER_W_SHIFT];
  2917. sci.mipLodBias = 0.0f;
  2918. sci.anisotropyEnable = VK_FALSE;
  2919. sci.maxAnisotropy = 4.0f;
  2920. sci.compareEnable = 0 != cmpFunc;
  2921. sci.compareOp = s_cmpFunc[cmpFunc];
  2922. sci.minLod = 0.0f;
  2923. sci.maxLod = (float)_mipLevels;
  2924. sci.borderColor = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
  2925. sci.unnormalizedCoordinates = VK_FALSE;
  2926. switch (_samplerFlags & BGFX_SAMPLER_MAG_MASK)
  2927. {
  2928. case BGFX_SAMPLER_MAG_POINT: sci.magFilter = VK_FILTER_NEAREST; break;
  2929. case BGFX_SAMPLER_MAG_ANISOTROPIC: sci.anisotropyEnable = VK_TRUE; break;
  2930. }
  2931. switch (_samplerFlags & BGFX_SAMPLER_MIN_MASK)
  2932. {
  2933. case BGFX_SAMPLER_MIN_POINT: sci.minFilter = VK_FILTER_NEAREST; break;
  2934. case BGFX_SAMPLER_MIN_ANISOTROPIC: sci.anisotropyEnable = VK_TRUE; break;
  2935. }
  2936. uint32_t borderColor = ((_samplerFlags & BGFX_SAMPLER_BORDER_COLOR_MASK) >> BGFX_SAMPLER_BORDER_COLOR_SHIFT);
  2937. if (borderColor > 0)
  2938. {
  2939. sci.borderColor = VK_BORDER_COLOR_INT_OPAQUE_WHITE;
  2940. }
  2941. VK_CHECK(vkCreateSampler(m_device, &sci, m_allocatorCb, &sampler));
  2942. m_samplerCache.add(hashKey, sampler);
  2943. return sampler;
  2944. }
  2945. VkPipeline getPipeline(ProgramHandle _program)
  2946. {
  2947. ProgramVK& program = m_program[_program.idx];
  2948. bx::HashMurmur2A murmur;
  2949. murmur.begin();
  2950. murmur.add(program.m_vsh->m_hash);
  2951. const uint32_t hash = murmur.end();
  2952. VkPipeline pipeline = m_pipelineStateCache.find(hash);
  2953. if (VK_NULL_HANDLE != pipeline)
  2954. {
  2955. return pipeline;
  2956. }
  2957. VkComputePipelineCreateInfo cpci;
  2958. cpci.sType = VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO;
  2959. cpci.pNext = NULL;
  2960. cpci.flags = 0;
  2961. cpci.stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  2962. cpci.stage.pNext = NULL;
  2963. cpci.stage.flags = 0;
  2964. cpci.stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
  2965. cpci.stage.module = program.m_vsh->m_module;
  2966. cpci.stage.pName = "main";
  2967. cpci.stage.pSpecializationInfo = NULL;
  2968. cpci.layout = program.m_pipelineLayout;
  2969. cpci.basePipelineHandle = VK_NULL_HANDLE;
  2970. cpci.basePipelineIndex = 0;
  2971. VK_CHECK( vkCreateComputePipelines(m_device, m_pipelineCache, 1, &cpci, m_allocatorCb, &pipeline) );
  2972. m_pipelineStateCache.add(hash, pipeline);
  2973. return pipeline;
  2974. }
  2975. VkPipeline getPipeline(uint64_t _state, uint64_t _stencil, uint8_t _numStreams, const VertexLayout** _layouts, ProgramHandle _program, uint8_t _numInstanceData)
  2976. {
  2977. ProgramVK& program = m_program[_program.idx];
  2978. _state &= 0
  2979. | BGFX_STATE_WRITE_RGB
  2980. | BGFX_STATE_WRITE_A
  2981. | BGFX_STATE_WRITE_Z
  2982. | BGFX_STATE_DEPTH_TEST_MASK
  2983. | BGFX_STATE_BLEND_MASK
  2984. | BGFX_STATE_BLEND_EQUATION_MASK
  2985. | BGFX_STATE_BLEND_INDEPENDENT
  2986. | BGFX_STATE_BLEND_ALPHA_TO_COVERAGE
  2987. | BGFX_STATE_CULL_MASK
  2988. | BGFX_STATE_MSAA
  2989. | BGFX_STATE_LINEAA
  2990. | BGFX_STATE_CONSERVATIVE_RASTER
  2991. | BGFX_STATE_PT_MASK
  2992. ;
  2993. _stencil &= packStencil(~BGFX_STENCIL_FUNC_REF_MASK, ~BGFX_STENCIL_FUNC_REF_MASK);
  2994. VertexLayout layout;
  2995. if (0 < _numStreams)
  2996. {
  2997. bx::memCopy(&layout, _layouts[0], sizeof(VertexLayout) );
  2998. const uint16_t* attrMask = program.m_vsh->m_attrMask;
  2999. for (uint32_t ii = 0; ii < Attrib::Count; ++ii)
  3000. {
  3001. uint16_t mask = attrMask[ii];
  3002. uint16_t attr = (layout.m_attributes[ii] & mask);
  3003. layout.m_attributes[ii] = attr == 0 ? UINT16_MAX : attr == UINT16_MAX ? 0 : attr;
  3004. }
  3005. }
  3006. bx::HashMurmur2A murmur;
  3007. murmur.begin();
  3008. murmur.add(_state);
  3009. murmur.add(_stencil);
  3010. murmur.add(program.m_vsh->m_hash);
  3011. murmur.add(program.m_vsh->m_attrMask, sizeof(program.m_vsh->m_attrMask) );
  3012. murmur.add(program.m_fsh->m_hash);
  3013. for (uint8_t ii = 0; ii < _numStreams; ++ii)
  3014. {
  3015. murmur.add(_layouts[ii]->m_hash);
  3016. }
  3017. murmur.add(layout.m_attributes, sizeof(layout.m_attributes) );
  3018. murmur.add(m_fbh.idx);
  3019. murmur.add(_numInstanceData);
  3020. const uint32_t hash = murmur.end();
  3021. VkPipeline pipeline = m_pipelineStateCache.find(hash);
  3022. if (VK_NULL_HANDLE != pipeline)
  3023. {
  3024. return pipeline;
  3025. }
  3026. VkPipelineColorBlendAttachmentState blendAttachmentState[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  3027. VkPipelineColorBlendStateCreateInfo colorBlendState;
  3028. colorBlendState.pAttachments = blendAttachmentState;
  3029. setBlendState(colorBlendState, _state);
  3030. VkPipelineInputAssemblyStateCreateInfo inputAssemblyState;
  3031. inputAssemblyState.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
  3032. inputAssemblyState.pNext = NULL;
  3033. inputAssemblyState.flags = 0;
  3034. inputAssemblyState.topology = s_primInfo[(_state&BGFX_STATE_PT_MASK) >> BGFX_STATE_PT_SHIFT].m_topology;
  3035. inputAssemblyState.primitiveRestartEnable = VK_FALSE;
  3036. VkPipelineRasterizationStateCreateInfo rasterizationState;
  3037. setRasterizerState(rasterizationState, _state);
  3038. VkPipelineDepthStencilStateCreateInfo depthStencilState;
  3039. setDepthStencilState(depthStencilState, _state, _stencil);
  3040. VkVertexInputBindingDescription inputBinding[Attrib::Count + 1 + BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
  3041. VkVertexInputAttributeDescription inputAttrib[Attrib::Count + 1 + BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
  3042. VkPipelineVertexInputStateCreateInfo vertexInputState;
  3043. vertexInputState.pVertexBindingDescriptions = inputBinding;
  3044. vertexInputState.pVertexAttributeDescriptions = inputAttrib;
  3045. setInputLayout(vertexInputState, _numStreams, _layouts, program, _numInstanceData);
  3046. const VkDynamicState dynamicStates[] =
  3047. {
  3048. VK_DYNAMIC_STATE_VIEWPORT,
  3049. VK_DYNAMIC_STATE_SCISSOR,
  3050. VK_DYNAMIC_STATE_BLEND_CONSTANTS,
  3051. VK_DYNAMIC_STATE_STENCIL_REFERENCE,
  3052. };
  3053. VkPipelineDynamicStateCreateInfo dynamicState;
  3054. dynamicState.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
  3055. dynamicState.pNext = NULL;
  3056. dynamicState.flags = 0;
  3057. dynamicState.dynamicStateCount = BX_COUNTOF(dynamicStates);
  3058. dynamicState.pDynamicStates = dynamicStates;
  3059. VkPipelineShaderStageCreateInfo shaderStages[2];
  3060. shaderStages[0].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  3061. shaderStages[0].pNext = NULL;
  3062. shaderStages[0].flags = 0;
  3063. shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
  3064. shaderStages[0].module = program.m_vsh->m_module;
  3065. shaderStages[0].pName = "main";
  3066. shaderStages[0].pSpecializationInfo = NULL;
  3067. shaderStages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
  3068. shaderStages[1].pNext = NULL;
  3069. shaderStages[1].flags = 0;
  3070. shaderStages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT;
  3071. shaderStages[1].module = program.m_fsh->m_module;
  3072. shaderStages[1].pName = "main";
  3073. shaderStages[1].pSpecializationInfo = NULL;
  3074. VkPipelineViewportStateCreateInfo viewportState;
  3075. viewportState.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
  3076. viewportState.pNext = NULL;
  3077. viewportState.flags = 0;
  3078. viewportState.viewportCount = 1;
  3079. viewportState.pViewports = NULL;
  3080. viewportState.scissorCount = 1;
  3081. viewportState.pScissors = NULL;
  3082. VkPipelineMultisampleStateCreateInfo multisampleState;
  3083. multisampleState.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
  3084. multisampleState.pNext = NULL;
  3085. multisampleState.flags = 0;
  3086. multisampleState.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
  3087. multisampleState.sampleShadingEnable = VK_FALSE;
  3088. multisampleState.minSampleShading = !!(BGFX_STATE_CONSERVATIVE_RASTER & _state) ? 1.0f : 0.0f;
  3089. multisampleState.pSampleMask = NULL;
  3090. multisampleState.alphaToCoverageEnable = !!(BGFX_STATE_BLEND_ALPHA_TO_COVERAGE & _state);
  3091. multisampleState.alphaToOneEnable = VK_FALSE;
  3092. VkGraphicsPipelineCreateInfo graphicsPipeline;
  3093. graphicsPipeline.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
  3094. graphicsPipeline.pNext = NULL;
  3095. graphicsPipeline.flags = 0;
  3096. graphicsPipeline.stageCount = BX_COUNTOF(shaderStages);
  3097. graphicsPipeline.pStages = shaderStages;
  3098. graphicsPipeline.pVertexInputState = &vertexInputState;
  3099. graphicsPipeline.pInputAssemblyState = &inputAssemblyState;
  3100. graphicsPipeline.pTessellationState = NULL;
  3101. graphicsPipeline.pViewportState = &viewportState;
  3102. graphicsPipeline.pRasterizationState = &rasterizationState;
  3103. graphicsPipeline.pMultisampleState = &multisampleState;
  3104. graphicsPipeline.pDepthStencilState = &depthStencilState;
  3105. graphicsPipeline.pColorBlendState = &colorBlendState;
  3106. graphicsPipeline.pDynamicState = &dynamicState;
  3107. // graphicsPipeline.layout = m_pipelineLayout;
  3108. graphicsPipeline.layout = program.m_pipelineLayout;
  3109. graphicsPipeline.renderPass = isValid(m_fbh) ? m_frameBuffers[m_fbh.idx].m_renderPass : m_renderPass;
  3110. graphicsPipeline.subpass = 0;
  3111. graphicsPipeline.basePipelineHandle = VK_NULL_HANDLE;
  3112. graphicsPipeline.basePipelineIndex = 0;
  3113. uint32_t length = g_callback->cacheReadSize(hash);
  3114. bool cached = length > 0;
  3115. void* cachedData = NULL;
  3116. VkPipelineCacheCreateInfo pcci;
  3117. pcci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
  3118. pcci.pNext = NULL;
  3119. pcci.flags = 0;
  3120. pcci.initialDataSize = 0;
  3121. pcci.pInitialData = NULL;
  3122. if (cached)
  3123. {
  3124. cachedData = BX_ALLOC(g_allocator, length);
  3125. if (g_callback->cacheRead(hash, cachedData, length) )
  3126. {
  3127. BX_TRACE("Loading cached pipeline state (size %d).", length);
  3128. bx::MemoryReader reader(cachedData, length);
  3129. pcci.initialDataSize = (size_t)reader.remaining();
  3130. pcci.pInitialData = reader.getDataPtr();
  3131. }
  3132. }
  3133. VkPipelineCache cache;
  3134. VK_CHECK(vkCreatePipelineCache(m_device, &pcci, m_allocatorCb, &cache) );
  3135. VK_CHECK(vkCreateGraphicsPipelines(m_device
  3136. , cache
  3137. , 1
  3138. , &graphicsPipeline
  3139. , m_allocatorCb
  3140. , &pipeline
  3141. ) );
  3142. m_pipelineStateCache.add(hash, pipeline);
  3143. size_t dataSize;
  3144. VK_CHECK(vkGetPipelineCacheData(m_device, cache, &dataSize, NULL) );
  3145. if (0 < dataSize)
  3146. {
  3147. if (length < dataSize)
  3148. {
  3149. cachedData = BX_REALLOC(g_allocator, cachedData, dataSize);
  3150. }
  3151. VK_CHECK(vkGetPipelineCacheData(m_device, cache, &dataSize, cachedData) );
  3152. g_callback->cacheWrite(hash, cachedData, (uint32_t)dataSize);
  3153. }
  3154. VK_CHECK(vkMergePipelineCaches(m_device, m_pipelineCache, 1, &cache) );
  3155. vkDestroy(cache);
  3156. if (NULL != cachedData)
  3157. {
  3158. BX_FREE(g_allocator, cachedData);
  3159. }
  3160. return pipeline;
  3161. }
  3162. void allocDescriptorSet(const ProgramVK& program, const RenderBind& renderBind, ScratchBufferVK& scratchBuffer)
  3163. {
  3164. VkDescriptorSetLayout dsl = m_descriptorSetLayoutCache.find(program.m_descriptorSetLayoutHash);
  3165. VkDescriptorSetAllocateInfo dsai;
  3166. dsai.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
  3167. dsai.pNext = NULL;
  3168. dsai.descriptorPool = m_descriptorPool;
  3169. dsai.descriptorSetCount = 1;
  3170. dsai.pSetLayouts = &dsl;
  3171. VkDescriptorSet& descriptorSet = scratchBuffer.m_descriptorSet[scratchBuffer.m_currentDs];
  3172. vkAllocateDescriptorSets(m_device, &dsai, &descriptorSet);
  3173. scratchBuffer.m_currentDs++;
  3174. VkDescriptorImageInfo imageInfo[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
  3175. VkDescriptorBufferInfo bufferInfo[BGFX_CONFIG_MAX_TEXTURE_SAMPLERS];
  3176. const int MAX_DESCRIPTOR_SETS = 2 * BGFX_CONFIG_MAX_TEXTURE_SAMPLERS + 2;
  3177. VkWriteDescriptorSet wds[MAX_DESCRIPTOR_SETS];
  3178. bx::memSet(wds, 0, sizeof(wds));
  3179. uint32_t wdsCount = 0;
  3180. uint32_t bufferCount = 0;
  3181. uint32_t imageCount = 0;
  3182. for (uint32_t stage = 0; stage < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++stage)
  3183. {
  3184. const Binding& bind = renderBind.m_bind[stage];
  3185. if (kInvalidHandle != bind.m_idx)
  3186. {
  3187. const ShaderVK::BindInfo* bindInfo = NULL;
  3188. if (isValid(program.m_vsh->m_bindInfo[stage].uniformHandle))
  3189. {
  3190. bindInfo = &(program.m_vsh->m_bindInfo[stage]);
  3191. }
  3192. else if (NULL != program.m_fsh && isValid(program.m_fsh->m_bindInfo[stage].uniformHandle))
  3193. {
  3194. bindInfo = &(program.m_fsh->m_bindInfo[stage]);
  3195. }
  3196. if (NULL == bindInfo)
  3197. {
  3198. continue;
  3199. }
  3200. if (ShaderVK::BindType::Storage == bindInfo->type)
  3201. {
  3202. VkDescriptorType descriptorType = (VkDescriptorType)bindInfo->samplerBinding;
  3203. wds[wdsCount].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  3204. wds[wdsCount].pNext = NULL;
  3205. wds[wdsCount].dstSet = descriptorSet;
  3206. wds[wdsCount].dstBinding = bindInfo->binding;
  3207. wds[wdsCount].dstArrayElement = 0;
  3208. wds[wdsCount].descriptorCount = 1;
  3209. wds[wdsCount].descriptorType = descriptorType;
  3210. wds[wdsCount].pImageInfo = NULL;
  3211. wds[wdsCount].pBufferInfo = NULL;
  3212. wds[wdsCount].pTexelBufferView = NULL;
  3213. if (VK_DESCRIPTOR_TYPE_STORAGE_BUFFER == descriptorType)
  3214. {
  3215. BufferVK& sb = bind.m_type == Binding::VertexBuffer ? m_vertexBuffers[bind.m_idx] : m_indexBuffers[bind.m_idx];
  3216. bufferInfo[bufferCount].buffer = sb.m_buffer;
  3217. bufferInfo[bufferCount].offset = 0;
  3218. bufferInfo[bufferCount].range = sb.m_size;
  3219. wds[wdsCount].pBufferInfo = &bufferInfo[bufferCount];
  3220. ++bufferCount;
  3221. }
  3222. else if (VK_DESCRIPTOR_TYPE_STORAGE_IMAGE == descriptorType)
  3223. {
  3224. TextureVK& texture = m_textures[bind.m_idx];
  3225. VkSampler sampler = getSampler(
  3226. (0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & bind.m_samplerFlags)
  3227. ? bind.m_samplerFlags
  3228. : (uint32_t)texture.m_flags
  3229. ) & (BGFX_SAMPLER_BITS_MASK | BGFX_SAMPLER_BORDER_COLOR_MASK)
  3230. , (uint32_t)texture.m_numMips);
  3231. if (VK_IMAGE_LAYOUT_GENERAL != texture.m_currentImageLayout
  3232. && VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL != texture.m_currentImageLayout)
  3233. {
  3234. texture.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
  3235. }
  3236. imageInfo[imageCount].imageLayout = texture.m_currentImageLayout;
  3237. imageInfo[imageCount].imageView = VK_NULL_HANDLE != texture.m_textureImageStorageView
  3238. ? texture.m_textureImageStorageView
  3239. : texture.m_textureImageView
  3240. ;
  3241. imageInfo[imageCount].sampler = sampler;
  3242. wds[wdsCount].pImageInfo = &imageInfo[imageCount];
  3243. ++imageCount;
  3244. }
  3245. ++wdsCount;
  3246. }
  3247. else if (ShaderVK::BindType::Sampler == bindInfo->type)
  3248. {
  3249. TextureVK& texture = m_textures[bind.m_idx];
  3250. VkSampler sampler = getSampler(
  3251. (0 == (BGFX_SAMPLER_INTERNAL_DEFAULT & bind.m_samplerFlags)
  3252. ? bind.m_samplerFlags
  3253. : (uint32_t)texture.m_flags
  3254. ) & (BGFX_SAMPLER_BITS_MASK | BGFX_SAMPLER_BORDER_COLOR_MASK)
  3255. , (uint32_t)texture.m_numMips);
  3256. if (VK_IMAGE_LAYOUT_GENERAL != texture.m_currentImageLayout
  3257. && VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL != texture.m_currentImageLayout)
  3258. {
  3259. texture.setImageMemoryBarrier(m_commandBuffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
  3260. }
  3261. imageInfo[imageCount].imageLayout = texture.m_currentImageLayout;
  3262. imageInfo[imageCount].imageView = VK_NULL_HANDLE != texture.m_textureImageDepthView
  3263. ? texture.m_textureImageDepthView
  3264. : texture.m_textureImageView
  3265. ;
  3266. imageInfo[imageCount].sampler = sampler;
  3267. wds[wdsCount].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  3268. wds[wdsCount].pNext = NULL;
  3269. wds[wdsCount].dstSet = descriptorSet;
  3270. wds[wdsCount].dstBinding = bindInfo->binding;
  3271. wds[wdsCount].dstArrayElement = 0;
  3272. wds[wdsCount].descriptorCount = 1;
  3273. wds[wdsCount].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
  3274. wds[wdsCount].pImageInfo = &imageInfo[imageCount];
  3275. wds[wdsCount].pBufferInfo = NULL;
  3276. wds[wdsCount].pTexelBufferView = NULL;
  3277. ++wdsCount;
  3278. wds[wdsCount].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  3279. wds[wdsCount].pNext = NULL;
  3280. wds[wdsCount].dstSet = descriptorSet;
  3281. wds[wdsCount].dstBinding = bindInfo->samplerBinding;
  3282. wds[wdsCount].dstArrayElement = 0;
  3283. wds[wdsCount].descriptorCount = 1;
  3284. wds[wdsCount].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
  3285. wds[wdsCount].pImageInfo = &imageInfo[imageCount];
  3286. wds[wdsCount].pBufferInfo = NULL;
  3287. wds[wdsCount].pTexelBufferView = NULL;
  3288. ++wdsCount;
  3289. ++imageCount;
  3290. }
  3291. }
  3292. }
  3293. const uint32_t align = uint32_t(m_deviceProperties.limits.minUniformBufferOffsetAlignment);
  3294. const uint32_t vsize = bx::strideAlign(program.m_vsh->m_size, align);
  3295. const uint32_t fsize = bx::strideAlign((NULL != program.m_fsh ? program.m_fsh->m_size : 0), align);
  3296. const uint32_t total = vsize + fsize;
  3297. if (0 < total)
  3298. {
  3299. uint32_t vsUniformBinding = program.m_vsh->m_uniformBinding;
  3300. uint32_t fsUniformBinding = program.m_fsh ? program.m_fsh->m_uniformBinding : 0;
  3301. if (vsize > 0)
  3302. {
  3303. bufferInfo[bufferCount].buffer = scratchBuffer.m_buffer;
  3304. bufferInfo[bufferCount].offset = 0;
  3305. bufferInfo[bufferCount].range = vsize;
  3306. wds[wdsCount].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  3307. wds[wdsCount].pNext = NULL;
  3308. wds[wdsCount].dstSet = descriptorSet;
  3309. wds[wdsCount].dstBinding = vsUniformBinding;
  3310. wds[wdsCount].dstArrayElement = 0;
  3311. wds[wdsCount].descriptorCount = 1;
  3312. wds[wdsCount].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
  3313. wds[wdsCount].pImageInfo = NULL;
  3314. wds[wdsCount].pBufferInfo = &bufferInfo[bufferCount];
  3315. wds[wdsCount].pTexelBufferView = NULL;
  3316. ++wdsCount;
  3317. ++bufferCount;
  3318. }
  3319. if (fsize > 0)
  3320. {
  3321. bufferInfo[bufferCount].buffer = scratchBuffer.m_buffer;
  3322. bufferInfo[bufferCount].offset = 0;
  3323. bufferInfo[bufferCount].range = fsize;
  3324. wds[wdsCount].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
  3325. wds[wdsCount].pNext = NULL;
  3326. wds[wdsCount].dstSet = descriptorSet;
  3327. wds[wdsCount].dstBinding = fsUniformBinding;
  3328. wds[wdsCount].dstArrayElement = 0;
  3329. wds[wdsCount].descriptorCount = 1;
  3330. wds[wdsCount].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
  3331. wds[wdsCount].pImageInfo = NULL;
  3332. wds[wdsCount].pBufferInfo = &bufferInfo[bufferCount];
  3333. wds[wdsCount].pTexelBufferView = NULL;
  3334. ++wdsCount;
  3335. ++bufferCount;
  3336. }
  3337. }
  3338. vkUpdateDescriptorSets(m_device, wdsCount, wds, 0, NULL);
  3339. }
  3340. void commit(UniformBuffer& _uniformBuffer)
  3341. {
  3342. _uniformBuffer.reset();
  3343. for (;;)
  3344. {
  3345. uint32_t opcode = _uniformBuffer.read();
  3346. if (UniformType::End == opcode)
  3347. {
  3348. break;
  3349. }
  3350. UniformType::Enum type;
  3351. uint16_t loc;
  3352. uint16_t num;
  3353. uint16_t copy;
  3354. UniformBuffer::decodeOpcode(opcode, type, loc, num, copy);
  3355. const char* data;
  3356. if (copy)
  3357. {
  3358. data = _uniformBuffer.read(g_uniformTypeSize[type]*num);
  3359. }
  3360. else
  3361. {
  3362. UniformHandle handle;
  3363. bx::memCopy(&handle, _uniformBuffer.read(sizeof(UniformHandle) ), sizeof(UniformHandle) );
  3364. data = (const char*)m_uniforms[handle.idx];
  3365. }
  3366. #define CASE_IMPLEMENT_UNIFORM(_uniform, _dxsuffix, _type) \
  3367. case UniformType::_uniform: \
  3368. case UniformType::_uniform|BGFX_UNIFORM_FRAGMENTBIT: \
  3369. { \
  3370. setShaderUniform(uint8_t(type), loc, data, num); \
  3371. } \
  3372. break;
  3373. switch ( (uint32_t)type)
  3374. {
  3375. case UniformType::Mat3:
  3376. case UniformType::Mat3|BGFX_UNIFORM_FRAGMENTBIT:
  3377. {
  3378. float* value = (float*)data;
  3379. for (uint32_t ii = 0, count = num/3; ii < count; ++ii, loc += 3*16, value += 9)
  3380. {
  3381. Matrix4 mtx;
  3382. mtx.un.val[ 0] = value[0];
  3383. mtx.un.val[ 1] = value[1];
  3384. mtx.un.val[ 2] = value[2];
  3385. mtx.un.val[ 3] = 0.0f;
  3386. mtx.un.val[ 4] = value[3];
  3387. mtx.un.val[ 5] = value[4];
  3388. mtx.un.val[ 6] = value[5];
  3389. mtx.un.val[ 7] = 0.0f;
  3390. mtx.un.val[ 8] = value[6];
  3391. mtx.un.val[ 9] = value[7];
  3392. mtx.un.val[10] = value[8];
  3393. mtx.un.val[11] = 0.0f;
  3394. setShaderUniform(uint8_t(type), loc, &mtx.un.val[0], 3);
  3395. }
  3396. }
  3397. break;
  3398. case UniformType::Sampler:
  3399. case UniformType::Sampler|BGFX_UNIFORM_FRAGMENTBIT:
  3400. // do nothing, but VkDescriptorSetImageInfo would be set before drawing
  3401. break;
  3402. // CASE_IMPLEMENT_UNIFORM(Sampler, I, int);
  3403. CASE_IMPLEMENT_UNIFORM(Vec4, F, float);
  3404. CASE_IMPLEMENT_UNIFORM(Mat4, F, float);
  3405. case UniformType::End:
  3406. break;
  3407. default:
  3408. BX_TRACE("%4d: INVALID 0x%08x, t %d, l %d, n %d, c %d", _uniformBuffer.getPos(), opcode, type, loc, num, copy);
  3409. break;
  3410. }
  3411. #undef CASE_IMPLEMENT_UNIFORM
  3412. }
  3413. }
  3414. void clearQuad(const Rect& _rect, const Clear& _clear, const float _palette[][4])
  3415. {
  3416. VkClearRect rect[1];
  3417. rect[0].rect.offset.x = _rect.m_x;
  3418. rect[0].rect.offset.y = _rect.m_y;
  3419. rect[0].rect.extent.width = _rect.m_width;
  3420. rect[0].rect.extent.height = _rect.m_height;
  3421. rect[0].baseArrayLayer = 0;
  3422. rect[0].layerCount = 1;
  3423. uint32_t numMrt = 1;
  3424. FrameBufferHandle fbh = m_fbh;
  3425. if (isValid(fbh) )
  3426. {
  3427. const FrameBufferVK& fb = m_frameBuffers[fbh.idx];
  3428. numMrt = bx::max((uint8_t)1, fb.m_num);
  3429. }
  3430. VkClearAttachment attachments[BGFX_CONFIG_MAX_FRAME_BUFFERS];
  3431. uint32_t mrt = 0;
  3432. if (true //NULL != m_currentColor
  3433. && BGFX_CLEAR_COLOR & _clear.m_flags)
  3434. {
  3435. if (BGFX_CLEAR_COLOR_USE_PALETTE & _clear.m_flags)
  3436. {
  3437. for (uint32_t ii = 0; ii < numMrt; ++ii)
  3438. {
  3439. attachments[mrt].colorAttachment = mrt;
  3440. attachments[mrt].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
  3441. uint8_t index = bx::min<uint8_t>(BGFX_CONFIG_MAX_COLOR_PALETTE-1, _clear.m_index[ii]);
  3442. bx::memCopy(&attachments[mrt].clearValue.color.float32, _palette[index], 16);
  3443. ++mrt;
  3444. }
  3445. }
  3446. else
  3447. {
  3448. float frgba[4] =
  3449. {
  3450. _clear.m_index[0] * 1.0f / 255.0f,
  3451. _clear.m_index[1] * 1.0f / 255.0f,
  3452. _clear.m_index[2] * 1.0f / 255.0f,
  3453. _clear.m_index[3] * 1.0f / 255.0f,
  3454. };
  3455. for (uint32_t ii = 0; ii < numMrt; ++ii)
  3456. {
  3457. attachments[mrt].colorAttachment = mrt;
  3458. attachments[mrt].aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
  3459. bx::memCopy(&attachments[mrt].clearValue.color.float32, frgba, 16);
  3460. ++mrt;
  3461. }
  3462. }
  3463. }
  3464. if (true //NULL != m_currentDepthStencil
  3465. && (BGFX_CLEAR_DEPTH | BGFX_CLEAR_STENCIL) & _clear.m_flags)
  3466. {
  3467. attachments[mrt].colorAttachment = mrt;
  3468. attachments[mrt].aspectMask = 0;
  3469. attachments[mrt].aspectMask |= (_clear.m_flags & BGFX_CLEAR_DEPTH ) ? VK_IMAGE_ASPECT_DEPTH_BIT : 0;
  3470. attachments[mrt].aspectMask |= (_clear.m_flags & BGFX_CLEAR_STENCIL) ? VK_IMAGE_ASPECT_STENCIL_BIT : 0;
  3471. attachments[mrt].clearValue.depthStencil.stencil = _clear.m_stencil;
  3472. attachments[mrt].clearValue.depthStencil.depth = _clear.m_depth;
  3473. ++mrt;
  3474. }
  3475. if (mrt > 0)
  3476. {
  3477. vkCmdClearAttachments(m_commandBuffer
  3478. , mrt
  3479. , attachments
  3480. , BX_COUNTOF(rect)
  3481. , rect
  3482. );
  3483. }
  3484. }
  3485. uint64_t kick(VkSemaphore _wait = VK_NULL_HANDLE, VkSemaphore _signal = VK_NULL_HANDLE)
  3486. {
  3487. VkPipelineStageFlags stageFlags = 0
  3488. | VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT
  3489. ;
  3490. VkSubmitInfo si;
  3491. si.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
  3492. si.pNext = NULL;
  3493. si.waitSemaphoreCount = VK_NULL_HANDLE != _wait;
  3494. si.pWaitSemaphores = &_wait;
  3495. si.pWaitDstStageMask = &stageFlags;
  3496. si.commandBufferCount = 1;
  3497. si.pCommandBuffers = &m_commandBuffers[m_backBufferColorIdx];
  3498. si.signalSemaphoreCount = VK_NULL_HANDLE != _signal;
  3499. si.pSignalSemaphores = &_signal;
  3500. // VK_CHECK(vkResetFences(m_device, 1, &m_fence) );
  3501. VK_CHECK(vkQueueSubmit(m_queueGraphics, 1, &si, VK_NULL_HANDLE) );
  3502. return 0;
  3503. }
  3504. void finish()
  3505. {
  3506. finishAll();
  3507. }
  3508. void finishAll()
  3509. {
  3510. VK_CHECK(vkQueueWaitIdle(m_queueGraphics) );
  3511. // VK_CHECK(vkWaitForFences(m_device, 1, &m_fence, true, INT64_MAX) );
  3512. }
  3513. int32_t selectMemoryType(uint32_t _memoryTypeBits, uint32_t _propertyFlags, int32_t _startIndex = 0) const
  3514. {
  3515. for (int32_t ii = _startIndex, num = m_memoryProperties.memoryTypeCount; ii < num; ++ii)
  3516. {
  3517. const VkMemoryType& memType = m_memoryProperties.memoryTypes[ii];
  3518. if ( (0 != ( (1<<ii) & _memoryTypeBits) )
  3519. && ( (memType.propertyFlags & _propertyFlags) == _propertyFlags) )
  3520. {
  3521. return ii;
  3522. }
  3523. }
  3524. BX_TRACE("Failed to find memory that supports flags 0x%08x.", _propertyFlags);
  3525. return -1;
  3526. }
  3527. VkResult allocateMemory(const VkMemoryRequirements* requirements, VkMemoryPropertyFlags propertyFlags, VkDeviceMemory* memory) const
  3528. {
  3529. VkMemoryAllocateInfo ma;
  3530. ma.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
  3531. ma.pNext = NULL;
  3532. ma.allocationSize = requirements->size;
  3533. VkResult result = VK_ERROR_UNKNOWN;
  3534. int32_t searchIndex = -1;
  3535. do
  3536. {
  3537. searchIndex++;
  3538. searchIndex = selectMemoryType(requirements->memoryTypeBits, propertyFlags, searchIndex);
  3539. if (searchIndex >= 0)
  3540. {
  3541. ma.memoryTypeIndex = searchIndex;
  3542. result = vkAllocateMemory(m_device
  3543. , &ma
  3544. , m_allocatorCb
  3545. , memory
  3546. );
  3547. }
  3548. }
  3549. while (result != VK_SUCCESS && searchIndex >= 0);
  3550. return result;
  3551. }
  3552. VkCommandBuffer beginNewCommand(VkCommandBufferUsageFlagBits commandBufferUsageFlag = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT)
  3553. {
  3554. VkCommandBufferAllocateInfo cbai;
  3555. cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
  3556. cbai.pNext = NULL;
  3557. cbai.commandPool = m_commandPool;
  3558. cbai.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
  3559. cbai.commandBufferCount = 1;
  3560. VkCommandBuffer commandBuffer;
  3561. VK_CHECK(vkAllocateCommandBuffers(m_device, &cbai, &commandBuffer));
  3562. VkCommandBufferBeginInfo cbbi;
  3563. cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
  3564. cbbi.pNext = NULL;
  3565. cbbi.flags = commandBufferUsageFlag;
  3566. cbbi.pInheritanceInfo = NULL;
  3567. VK_CHECK(vkBeginCommandBuffer(commandBuffer, &cbbi));
  3568. return commandBuffer;
  3569. }
  3570. void submitCommandAndWait(VkCommandBuffer commandBuffer)
  3571. {
  3572. vkEndCommandBuffer(commandBuffer);
  3573. VkSubmitInfo submitInfo;
  3574. submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
  3575. submitInfo.pNext = NULL;
  3576. submitInfo.commandBufferCount = 1;
  3577. submitInfo.pCommandBuffers = &commandBuffer;
  3578. submitInfo.waitSemaphoreCount = 0;
  3579. submitInfo.pWaitSemaphores = NULL;
  3580. submitInfo.signalSemaphoreCount = 0;
  3581. submitInfo.pSignalSemaphores = NULL;
  3582. submitInfo.pWaitDstStageMask = NULL;
  3583. VK_CHECK(vkQueueSubmit(m_queueGraphics, 1, &submitInfo, VK_NULL_HANDLE));
  3584. VK_CHECK(vkQueueWaitIdle(m_queueGraphics));
  3585. vkFreeCommandBuffers(m_device, m_commandPool, 1, &commandBuffer);
  3586. }
  3587. #define NUM_SWAPCHAIN_IMAGE 4
  3588. VkAllocationCallbacks* m_allocatorCb;
  3589. VkDebugReportCallbackEXT m_debugReportCallback;
  3590. VkInstance m_instance;
  3591. VkPhysicalDevice m_physicalDevice;
  3592. VkPhysicalDeviceProperties m_deviceProperties;
  3593. VkPhysicalDeviceMemoryProperties m_memoryProperties;
  3594. VkPhysicalDeviceFeatures m_deviceFeatures;
  3595. VkSwapchainCreateInfoKHR m_sci;
  3596. VkSurfaceKHR m_surface;
  3597. VkSwapchainKHR m_swapchain;
  3598. uint32_t m_numSwapchainImages;
  3599. VkSurfaceFormatKHR m_backBufferColorFormat;
  3600. VkSurfaceFormatKHR m_backBufferColorFormatSrgb;
  3601. VkImageLayout m_backBufferColorImageLayout[NUM_SWAPCHAIN_IMAGE];
  3602. VkImage m_backBufferColorImage[NUM_SWAPCHAIN_IMAGE];
  3603. VkImageView m_backBufferColorImageView[NUM_SWAPCHAIN_IMAGE];
  3604. VkFramebuffer m_backBufferColor[NUM_SWAPCHAIN_IMAGE];
  3605. VkCommandBuffer m_commandBuffers[NUM_SWAPCHAIN_IMAGE];
  3606. VkCommandBuffer m_commandBuffer;
  3607. bool m_needToRefreshSwapchain;
  3608. VkFormat m_backBufferDepthStencilFormat;
  3609. VkDeviceMemory m_backBufferDepthStencilMemory;
  3610. VkImage m_backBufferDepthStencilImage;
  3611. VkImageView m_backBufferDepthStencilImageView;
  3612. ScratchBufferVK m_scratchBuffer[NUM_SWAPCHAIN_IMAGE];
  3613. VkSemaphore m_presentDone[NUM_SWAPCHAIN_IMAGE];
  3614. uint32_t m_qfiGraphics;
  3615. uint32_t m_qfiCompute;
  3616. VkDevice m_device;
  3617. VkQueue m_queueGraphics;
  3618. VkQueue m_queueCompute;
  3619. VkFence m_fence;
  3620. VkRenderPass m_renderPass;
  3621. VkDescriptorPool m_descriptorPool;
  3622. // VkDescriptorSetLayout m_descriptorSetLayout;
  3623. // VkPipelineLayout m_pipelineLayout;
  3624. VkPipelineCache m_pipelineCache;
  3625. VkCommandPool m_commandPool;
  3626. void* m_renderDocDll;
  3627. void* m_vulkan1Dll;
  3628. IndexBufferVK m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS];
  3629. VertexBufferVK m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS];
  3630. ShaderVK m_shaders[BGFX_CONFIG_MAX_SHADERS];
  3631. ProgramVK m_program[BGFX_CONFIG_MAX_PROGRAMS];
  3632. TextureVK m_textures[BGFX_CONFIG_MAX_TEXTURES];
  3633. VertexLayout m_vertexLayouts[BGFX_CONFIG_MAX_VERTEX_LAYOUTS];
  3634. FrameBufferVK m_frameBuffers[BGFX_CONFIG_MAX_FRAME_BUFFERS];
  3635. void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS];
  3636. Matrix4 m_predefinedUniforms[PredefinedUniform::Count];
  3637. UniformRegistry m_uniformReg;
  3638. StateCacheT<VkPipeline> m_pipelineStateCache;
  3639. StateCacheT<VkDescriptorSetLayout> m_descriptorSetLayoutCache;
  3640. StateCacheT<VkRenderPass> m_renderPassCache;
  3641. StateCacheT<VkSampler> m_samplerCache;
  3642. Resolution m_resolution;
  3643. uint32_t m_maxAnisotropy;
  3644. bool m_depthClamp;
  3645. bool m_wireframe;
  3646. TextVideoMem m_textVideoMem;
  3647. uint8_t m_fsScratch[64<<10];
  3648. uint8_t m_vsScratch[64<<10];
  3649. uint32_t m_fsChanges;
  3650. uint32_t m_vsChanges;
  3651. uint32_t m_backBufferColorIdx;
  3652. FrameBufferHandle m_fbh;
  3653. };
  3654. static RendererContextVK* s_renderVK;
  3655. RendererContextI* rendererCreate(const Init& _init)
  3656. {
  3657. s_renderVK = BX_NEW(g_allocator, RendererContextVK);
  3658. if (!s_renderVK->init(_init) )
  3659. {
  3660. BX_DELETE(g_allocator, s_renderVK);
  3661. s_renderVK = NULL;
  3662. }
  3663. return s_renderVK;
  3664. }
  3665. void rendererDestroy()
  3666. {
  3667. s_renderVK->shutdown();
  3668. BX_DELETE(g_allocator, s_renderVK);
  3669. s_renderVK = NULL;
  3670. }
  3671. #define VK_DESTROY_FUNC(_name) \
  3672. void vkDestroy(Vk##_name& _obj) \
  3673. { \
  3674. if (VK_NULL_HANDLE != _obj) \
  3675. { \
  3676. vkDestroy##_name(s_renderVK->m_device, _obj, s_renderVK->m_allocatorCb); \
  3677. _obj = VK_NULL_HANDLE; \
  3678. } \
  3679. }
  3680. VK_DESTROY
  3681. #undef VK_DESTROY_FUNC
  3682. void ScratchBufferVK::create(uint32_t _size, uint32_t _maxDescriptors)
  3683. {
  3684. m_maxDescriptors = _maxDescriptors;
  3685. m_currentDs = 0;
  3686. m_descriptorSet = (VkDescriptorSet*)BX_ALLOC(g_allocator, m_maxDescriptors * sizeof(VkDescriptorSet) );
  3687. bx::memSet(m_descriptorSet, 0, sizeof(VkDescriptorSet) * m_maxDescriptors);
  3688. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  3689. VkDevice device = s_renderVK->m_device;
  3690. VkBufferCreateInfo bci;
  3691. bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  3692. bci.pNext = NULL;
  3693. bci.flags = 0;
  3694. bci.size = _size;
  3695. bci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
  3696. bci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  3697. bci.queueFamilyIndexCount = 0;
  3698. bci.pQueueFamilyIndices = NULL;
  3699. VK_CHECK(vkCreateBuffer(
  3700. device
  3701. , &bci
  3702. , allocatorCb
  3703. , &m_buffer
  3704. ) );
  3705. VkMemoryRequirements mr;
  3706. vkGetBufferMemoryRequirements(
  3707. device
  3708. , m_buffer
  3709. , &mr
  3710. );
  3711. VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT, &m_deviceMem) );
  3712. m_size = (uint32_t)mr.size;
  3713. m_pos = 0;
  3714. VK_CHECK(vkBindBufferMemory(device, m_buffer, m_deviceMem, 0) );
  3715. VK_CHECK(vkMapMemory(device, m_deviceMem, 0, m_size, 0, (void**)&m_data) );
  3716. }
  3717. void ScratchBufferVK::destroy()
  3718. {
  3719. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  3720. VkDevice device = s_renderVK->m_device;
  3721. reset();
  3722. BX_FREE(g_allocator, m_descriptorSet);
  3723. vkUnmapMemory(device, m_deviceMem);
  3724. vkDestroy(m_buffer);
  3725. vkFreeMemory(device
  3726. , m_deviceMem
  3727. , allocatorCb
  3728. );
  3729. }
  3730. void ScratchBufferVK::reset()
  3731. {
  3732. if (m_currentDs > 0)
  3733. {
  3734. vkFreeDescriptorSets(
  3735. s_renderVK->m_device
  3736. , s_renderVK->m_descriptorPool
  3737. , m_currentDs
  3738. , m_descriptorSet
  3739. );
  3740. }
  3741. bx::memSet(m_descriptorSet, 0, sizeof(VkDescriptorSet) * m_maxDescriptors);
  3742. m_pos = 0;
  3743. m_currentDs = 0;
  3744. }
  3745. VkResult ImageVK::create(VkFormat _format, const VkExtent3D& _extent)
  3746. {
  3747. VkResult result;
  3748. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  3749. VkDevice device = s_renderVK->m_device;
  3750. VkImageCreateInfo ici;
  3751. ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
  3752. ici.pNext = NULL;
  3753. ici.flags = 0;
  3754. ici.imageType = VK_IMAGE_TYPE_2D;
  3755. ici.format = _format;
  3756. ici.extent = _extent;
  3757. ici.mipLevels = 1;
  3758. ici.arrayLayers = 1;
  3759. ici.samples = VK_SAMPLE_COUNT_1_BIT;
  3760. ici.tiling = VK_IMAGE_TILING_OPTIMAL;
  3761. ici.usage = 0
  3762. | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
  3763. | VK_IMAGE_USAGE_TRANSFER_SRC_BIT
  3764. ;
  3765. ici.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  3766. ici.queueFamilyIndexCount = 0;
  3767. ici.pQueueFamilyIndices = 0;
  3768. ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  3769. result = vkCreateImage(device, &ici, allocatorCb, &m_image);
  3770. if (VK_SUCCESS != result)
  3771. {
  3772. BX_TRACE("vkCreateImage failed %d: %s.", result, getName(result) );
  3773. return result;
  3774. }
  3775. VkMemoryRequirements mr;
  3776. vkGetImageMemoryRequirements(device, m_image, &mr);
  3777. result = s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_memory);
  3778. if (VK_SUCCESS != result)
  3779. {
  3780. BX_TRACE("vkAllocateMemory failed %d: %s.", result, getName(result) );
  3781. destroy();
  3782. return result;
  3783. }
  3784. result = vkBindImageMemory(device, m_image, m_memory, 0);
  3785. if (VK_SUCCESS != result)
  3786. {
  3787. BX_TRACE("vkBindImageMemory failed %d: %s.", result, getName(result) );
  3788. destroy();
  3789. return result;
  3790. }
  3791. VkImageViewCreateInfo ivci;
  3792. ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  3793. ivci.pNext = NULL;
  3794. ivci.flags = 0;
  3795. ivci.image = m_image;
  3796. ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
  3797. ivci.format = _format;
  3798. ivci.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
  3799. ivci.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
  3800. ivci.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
  3801. ivci.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;
  3802. ivci.subresourceRange.aspectMask = 0
  3803. | VK_IMAGE_ASPECT_DEPTH_BIT
  3804. | VK_IMAGE_ASPECT_STENCIL_BIT
  3805. ;
  3806. ivci.subresourceRange.baseMipLevel = 0;
  3807. ivci.subresourceRange.levelCount = 1;
  3808. ivci.subresourceRange.baseArrayLayer = 0;
  3809. ivci.subresourceRange.layerCount = 1;
  3810. result = vkCreateImageView(device, &ivci, allocatorCb, &m_imageView);
  3811. if (VK_SUCCESS != result)
  3812. {
  3813. BX_TRACE("vkCreateImageView failed %d: %s.", result, getName(result) );
  3814. destroy();
  3815. return result;
  3816. }
  3817. return VK_SUCCESS;
  3818. }
  3819. void ImageVK::destroy()
  3820. {
  3821. vkDestroy(m_imageView);
  3822. vkDestroy(m_image);
  3823. if (VK_NULL_HANDLE != m_memory)
  3824. {
  3825. vkFreeMemory(s_renderVK->m_device, m_memory, s_renderVK->m_allocatorCb);
  3826. m_memory = VK_NULL_HANDLE;
  3827. }
  3828. }
  3829. void BufferVK::create(uint32_t _size, void* _data, uint16_t _flags, bool _vertex, uint32_t _stride)
  3830. {
  3831. BX_UNUSED(_stride);
  3832. m_size = _size;
  3833. m_flags = _flags;
  3834. m_dynamic = NULL == _data;
  3835. bool storage = m_flags & BGFX_BUFFER_COMPUTE_READ_WRITE;
  3836. bool indirect = m_flags & BGFX_BUFFER_DRAW_INDIRECT;
  3837. VkBufferCreateInfo bci;
  3838. bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  3839. bci.pNext = NULL;
  3840. bci.flags = 0;
  3841. bci.size = _size;
  3842. bci.usage = 0
  3843. // | (m_dynamic ? VK_BUFFER_USAGE_TRANSFER_DST_BIT : 0)
  3844. | (_vertex ? VK_BUFFER_USAGE_VERTEX_BUFFER_BIT : VK_BUFFER_USAGE_INDEX_BUFFER_BIT)
  3845. | (storage || indirect ? VK_BUFFER_USAGE_STORAGE_BUFFER_BIT : 0)
  3846. | (indirect ? VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT : 0)
  3847. | VK_BUFFER_USAGE_TRANSFER_DST_BIT
  3848. ;
  3849. bci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  3850. bci.queueFamilyIndexCount = 0;
  3851. bci.pQueueFamilyIndices = NULL;
  3852. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  3853. VkDevice device = s_renderVK->m_device;
  3854. VK_CHECK(vkCreateBuffer(device
  3855. , &bci
  3856. , allocatorCb
  3857. , &m_buffer
  3858. ) );
  3859. VkMemoryRequirements mr;
  3860. vkGetBufferMemoryRequirements(device, m_buffer, &mr);
  3861. VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_deviceMem));
  3862. VK_CHECK(vkBindBufferMemory(device, m_buffer, m_deviceMem, 0));
  3863. if (!m_dynamic)
  3864. {
  3865. // void* dst;
  3866. // VK_CHECK(vkMapMemory(device, m_deviceMem, 0, ma.allocationSize, 0, &dst) );
  3867. // bx::memCopy(dst, _data, _size);
  3868. // vkUnmapMemory(device, m_deviceMem);
  3869. // staging buffer
  3870. VkBuffer stagingBuffer;
  3871. VkDeviceMemory stagingMem;
  3872. bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  3873. bci.pNext = NULL;
  3874. bci.flags = 0;
  3875. bci.size = _size;
  3876. bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
  3877. bci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  3878. bci.queueFamilyIndexCount = 0;
  3879. bci.pQueueFamilyIndices = NULL;
  3880. VK_CHECK(vkCreateBuffer(device
  3881. , &bci
  3882. , allocatorCb
  3883. , &stagingBuffer
  3884. ));
  3885. vkGetBufferMemoryRequirements(device, stagingBuffer, &mr);
  3886. VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingMem));
  3887. VK_CHECK(vkBindBufferMemory(device, stagingBuffer, stagingMem, 0));
  3888. void* dst;
  3889. VK_CHECK(vkMapMemory(device, stagingMem, 0, mr.size, 0, &dst));
  3890. bx::memCopy(dst, _data, _size);
  3891. vkUnmapMemory(device, stagingMem);
  3892. VkCommandBuffer commandBuffer = s_renderVK->beginNewCommand();
  3893. // copy buffer to buffer
  3894. {
  3895. VkBufferCopy region;
  3896. region.srcOffset = 0;
  3897. region.dstOffset = 0;
  3898. region.size = _size;
  3899. vkCmdCopyBuffer(commandBuffer, stagingBuffer, m_buffer, 1, &region);
  3900. }
  3901. s_renderVK->submitCommandAndWait(commandBuffer);
  3902. vkFreeMemory(device, stagingMem, allocatorCb);
  3903. vkDestroy(stagingBuffer);
  3904. }
  3905. }
  3906. void BufferVK::update(VkCommandBuffer _commandBuffer, uint32_t _offset, uint32_t _size, void* _data, bool _discard)
  3907. {
  3908. BX_UNUSED(_commandBuffer, _discard);
  3909. // void* dst;
  3910. // VkDevice device = s_renderVK->m_device;
  3911. // VK_CHECK(vkMapMemory(device, m_deviceMem, _offset, _size, 0, &dst) );
  3912. // bx::memCopy(dst, _data, _size);
  3913. // vkUnmapMemory(device, m_deviceMem);
  3914. // staging buffer
  3915. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  3916. VkDevice device = s_renderVK->m_device;
  3917. VkBuffer stagingBuffer;
  3918. VkDeviceMemory stagingMem;
  3919. VkBufferCreateInfo bci;
  3920. bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  3921. bci.pNext = NULL;
  3922. bci.flags = 0;
  3923. bci.size = _size;
  3924. bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
  3925. bci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  3926. bci.queueFamilyIndexCount = 0;
  3927. bci.pQueueFamilyIndices = NULL;
  3928. VK_CHECK(vkCreateBuffer(device
  3929. , &bci
  3930. , allocatorCb
  3931. , &stagingBuffer
  3932. ));
  3933. VkMemoryRequirements mr;
  3934. vkGetBufferMemoryRequirements(device
  3935. , stagingBuffer
  3936. , &mr
  3937. );
  3938. VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingMem));
  3939. VK_CHECK(vkBindBufferMemory(device, stagingBuffer, stagingMem, 0));
  3940. void* dst;
  3941. VK_CHECK(vkMapMemory(device, stagingMem, 0, mr.size, 0, &dst));
  3942. bx::memCopy(dst, _data, _size);
  3943. vkUnmapMemory(device, stagingMem);
  3944. VkCommandBuffer commandBuffer = s_renderVK->beginNewCommand();
  3945. // copy buffer to buffer
  3946. {
  3947. VkBufferCopy region;
  3948. region.srcOffset = 0;
  3949. region.dstOffset = _offset;
  3950. region.size = _size;
  3951. vkCmdCopyBuffer(commandBuffer, stagingBuffer, m_buffer, 1, &region);
  3952. }
  3953. s_renderVK->submitCommandAndWait(commandBuffer);
  3954. vkFreeMemory(device, stagingMem, allocatorCb);
  3955. vkDestroy(stagingBuffer);
  3956. }
  3957. void BufferVK::destroy()
  3958. {
  3959. if (VK_NULL_HANDLE != m_buffer)
  3960. {
  3961. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  3962. VkDevice device = s_renderVK->m_device;
  3963. vkDestroy(m_buffer);
  3964. vkFreeMemory(device
  3965. , m_deviceMem
  3966. , allocatorCb
  3967. );
  3968. m_dynamic = false;
  3969. }
  3970. }
  3971. void VertexBufferVK::create(uint32_t _size, void* _data, VertexLayoutHandle _layoutHandle, uint16_t _flags)
  3972. {
  3973. BufferVK::create(_size, _data, _flags, true);
  3974. m_layoutHandle = _layoutHandle;
  3975. }
  3976. void ShaderVK::create(const Memory* _mem)
  3977. {
  3978. bx::MemoryReader reader(_mem->data, _mem->size);
  3979. uint32_t magic;
  3980. bx::read(&reader, magic);
  3981. VkShaderStageFlagBits shaderStage;
  3982. BX_UNUSED(shaderStage);
  3983. if (isShaderType(magic, 'C') )
  3984. {
  3985. shaderStage = VK_SHADER_STAGE_COMPUTE_BIT;
  3986. }
  3987. else if (isShaderType(magic, 'F') )
  3988. {
  3989. shaderStage = VK_SHADER_STAGE_FRAGMENT_BIT;
  3990. }
  3991. else if (isShaderType(magic, 'V') )
  3992. {
  3993. shaderStage = VK_SHADER_STAGE_VERTEX_BIT;
  3994. }
  3995. const bool fragment = isShaderType(magic, 'F');
  3996. uint32_t hashIn;
  3997. bx::read(&reader, hashIn);
  3998. uint32_t hashOut;
  3999. if (isShaderVerLess(magic, 6) )
  4000. {
  4001. hashOut = hashIn;
  4002. }
  4003. else
  4004. {
  4005. bx::read(&reader, hashOut);
  4006. }
  4007. uint16_t count;
  4008. bx::read(&reader, count);
  4009. m_numPredefined = 0;
  4010. m_numUniforms = count;
  4011. BX_TRACE("%s Shader consts %d"
  4012. , getShaderTypeName(magic)
  4013. , count
  4014. );
  4015. uint8_t fragmentBit = fragment ? BGFX_UNIFORM_FRAGMENTBIT : 0;
  4016. for (uint32_t ii = 0; ii < BGFX_CONFIG_MAX_TEXTURE_SAMPLERS; ++ii)
  4017. {
  4018. m_bindInfo[ii].uniformHandle = BGFX_INVALID_HANDLE;
  4019. m_bindInfo[ii].type = BindType::Count;
  4020. m_bindInfo[ii].binding = 0;
  4021. m_bindInfo[ii].samplerBinding = 0;
  4022. }
  4023. if (0 < count)
  4024. {
  4025. for (uint32_t ii = 0; ii < count; ++ii)
  4026. {
  4027. uint8_t nameSize = 0;
  4028. bx::read(&reader, nameSize);
  4029. char name[256];
  4030. bx::read(&reader, &name, nameSize);
  4031. name[nameSize] = '\0';
  4032. uint8_t type = 0;
  4033. bx::read(&reader, type);
  4034. uint8_t num;
  4035. bx::read(&reader, num);
  4036. uint16_t regIndex;
  4037. bx::read(&reader, regIndex);
  4038. uint16_t regCount;
  4039. bx::read(&reader, regCount);
  4040. const char* kind = "invalid";
  4041. PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name);
  4042. if (PredefinedUniform::Count != predefined)
  4043. {
  4044. kind = "predefined";
  4045. m_predefined[m_numPredefined].m_loc = regIndex;
  4046. m_predefined[m_numPredefined].m_count = regCount;
  4047. m_predefined[m_numPredefined].m_type = uint8_t(predefined|fragmentBit);
  4048. m_numPredefined++;
  4049. }
  4050. else if (UniformType::End == (~BGFX_UNIFORM_MASK & type))
  4051. {
  4052. m_bindInfo[num].uniformHandle = { 0 };
  4053. m_bindInfo[num].type = BindType::Storage;
  4054. m_bindInfo[num].binding = regCount; // regCount is used for buffer binding index
  4055. m_bindInfo[num].samplerBinding = regIndex; // regIndex is used for descriptor type
  4056. kind = "storage";
  4057. }
  4058. else if (UniformType::Sampler == (~BGFX_UNIFORM_MASK & type) )
  4059. {
  4060. const UniformRegInfo* info = s_renderVK->m_uniformReg.find(name);
  4061. BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
  4062. m_bindInfo[num].uniformHandle = info->m_handle;
  4063. m_bindInfo[num].type = BindType::Sampler;
  4064. m_bindInfo[num].binding = regIndex; // regIndex is used for image binding index
  4065. m_bindInfo[num].samplerBinding = regCount; // regCount is used for sampler binding index
  4066. kind = "sampler";
  4067. }
  4068. else
  4069. {
  4070. const UniformRegInfo* info = s_renderVK->m_uniformReg.find(name);
  4071. BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name);
  4072. if (NULL != info)
  4073. {
  4074. if (NULL == m_constantBuffer)
  4075. {
  4076. m_constantBuffer = UniformBuffer::create(1024);
  4077. }
  4078. kind = "user";
  4079. m_constantBuffer->writeUniformHandle( (UniformType::Enum)(type|fragmentBit), regIndex, info->m_handle, regCount);
  4080. }
  4081. }
  4082. BX_TRACE("\t%s: %s (%s), num %2d, r.index %3d, r.count %2d"
  4083. , kind
  4084. , name
  4085. , getUniformTypeName(UniformType::Enum(type&~BGFX_UNIFORM_MASK) )
  4086. , num
  4087. , regIndex
  4088. , regCount
  4089. );
  4090. BX_UNUSED(kind);
  4091. }
  4092. if (NULL != m_constantBuffer)
  4093. {
  4094. m_constantBuffer->finish();
  4095. }
  4096. }
  4097. uint32_t shaderSize;
  4098. bx::read(&reader, shaderSize);
  4099. const void* code = reader.getDataPtr();
  4100. bx::skip(&reader, shaderSize+1);
  4101. m_code = alloc(shaderSize);
  4102. bx::memCopy(m_code->data, code, shaderSize);
  4103. VkShaderModuleCreateInfo smci;
  4104. smci.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
  4105. smci.pNext = NULL;
  4106. smci.flags = 0;
  4107. smci.codeSize = m_code->size;
  4108. smci.pCode = (const uint32_t*)m_code->data;
  4109. // disassemble(bx::getDebugOut(), m_code->data, m_code->size);
  4110. VK_CHECK(vkCreateShaderModule(
  4111. s_renderVK->m_device
  4112. , &smci
  4113. , s_renderVK->m_allocatorCb
  4114. , &m_module
  4115. ) );
  4116. bx::memSet(m_attrMask, 0, sizeof(m_attrMask) );
  4117. bx::memSet(m_attrRemap, 0, sizeof(m_attrRemap) );
  4118. bx::read(&reader, m_numAttrs);
  4119. for (uint8_t ii = 0; ii < m_numAttrs; ++ii)
  4120. {
  4121. uint16_t id;
  4122. bx::read(&reader, id);
  4123. Attrib::Enum attr = idToAttrib(id);
  4124. if (Attrib::Count != attr)
  4125. {
  4126. m_attrMask[attr] = UINT16_MAX;
  4127. m_attrRemap[attr] = ii;
  4128. }
  4129. }
  4130. bx::HashMurmur2A murmur;
  4131. murmur.begin();
  4132. murmur.add(hashIn);
  4133. murmur.add(hashOut);
  4134. murmur.add(m_code->data, m_code->size);
  4135. murmur.add(m_numAttrs);
  4136. murmur.add(m_attrMask, m_numAttrs);
  4137. murmur.add(m_attrRemap, m_numAttrs);
  4138. m_hash = murmur.end();
  4139. bx::read(&reader, m_size);
  4140. // fill binding description with uniform informations
  4141. {
  4142. uint16_t bidx = 0;
  4143. if (m_size > 0)
  4144. {
  4145. m_uniformBinding = fragment ? 48 : 0;
  4146. m_bindings[bidx].stageFlags = VK_SHADER_STAGE_ALL;
  4147. m_bindings[bidx].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
  4148. m_bindings[bidx].binding = m_uniformBinding;
  4149. m_bindings[bidx].pImmutableSamplers = NULL;
  4150. m_bindings[bidx].descriptorCount = 1;
  4151. bidx++;
  4152. }
  4153. for (uint32_t ii = 0; ii < BX_COUNTOF(m_bindInfo); ++ii)
  4154. {
  4155. switch (m_bindInfo[ii].type)
  4156. {
  4157. case BindType::Storage:
  4158. m_bindings[bidx].stageFlags = VK_SHADER_STAGE_ALL;
  4159. m_bindings[bidx].descriptorType = (VkDescriptorType)m_bindInfo[ii].samplerBinding;
  4160. m_bindings[bidx].binding = m_bindInfo[ii].binding;
  4161. m_bindings[bidx].pImmutableSamplers = NULL;
  4162. m_bindings[bidx].descriptorCount = 1;
  4163. bidx++;
  4164. break;
  4165. case BindType::Sampler:
  4166. m_bindings[bidx].stageFlags = VK_SHADER_STAGE_ALL;
  4167. m_bindings[bidx].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
  4168. m_bindings[bidx].binding = m_bindInfo[ii].binding;
  4169. m_bindings[bidx].pImmutableSamplers = NULL;
  4170. m_bindings[bidx].descriptorCount = 1;
  4171. bidx++;
  4172. m_bindings[bidx].stageFlags = VK_SHADER_STAGE_ALL;
  4173. m_bindings[bidx].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
  4174. m_bindings[bidx].binding = m_bindInfo[ii].samplerBinding;
  4175. m_bindings[bidx].pImmutableSamplers = NULL;
  4176. m_bindings[bidx].descriptorCount = 1;
  4177. bidx++;
  4178. break;
  4179. default:
  4180. break;
  4181. }
  4182. }
  4183. m_numBindings = bidx;
  4184. }
  4185. }
  4186. void ShaderVK::destroy()
  4187. {
  4188. if (NULL != m_constantBuffer)
  4189. {
  4190. UniformBuffer::destroy(m_constantBuffer);
  4191. m_constantBuffer = NULL;
  4192. }
  4193. m_numPredefined = 0;
  4194. if (NULL != m_code)
  4195. {
  4196. release(m_code);
  4197. m_code = NULL;
  4198. m_hash = 0;
  4199. }
  4200. if (VK_NULL_HANDLE != m_module)
  4201. {
  4202. vkDestroy(m_module);
  4203. }
  4204. }
  4205. void ProgramVK::create(const ShaderVK* _vsh, const ShaderVK* _fsh)
  4206. {
  4207. BX_CHECK(NULL != _vsh->m_code, "Vertex shader doesn't exist.");
  4208. m_vsh = _vsh;
  4209. bx::memCopy(
  4210. &m_predefined[0]
  4211. , _vsh->m_predefined
  4212. , _vsh->m_numPredefined * sizeof(PredefinedUniform)
  4213. );
  4214. m_numPredefined = _vsh->m_numPredefined;
  4215. if (NULL != _fsh)
  4216. {
  4217. BX_CHECK(NULL != _fsh->m_code, "Fragment shader doesn't exist.");
  4218. m_fsh = _fsh;
  4219. bx::memCopy(
  4220. &m_predefined[m_numPredefined]
  4221. , _fsh->m_predefined
  4222. , _fsh->m_numPredefined * sizeof(PredefinedUniform)
  4223. );
  4224. m_numPredefined += _fsh->m_numPredefined;
  4225. }
  4226. // create exact pipeline layout
  4227. VkDescriptorSetLayout dsl = VK_NULL_HANDLE;
  4228. uint32_t numBindings = m_vsh->m_numBindings + (m_fsh ? m_fsh->m_numBindings : 0);
  4229. if (0 < numBindings)
  4230. {
  4231. // generate descriptor set layout hash
  4232. bx::HashMurmur2A murmur;
  4233. murmur.begin();
  4234. murmur.add(m_vsh->m_bindings, sizeof(VkDescriptorSetLayoutBinding) * m_vsh->m_numBindings);
  4235. if (NULL != m_fsh)
  4236. {
  4237. murmur.add(m_fsh->m_bindings, sizeof(VkDescriptorSetLayoutBinding) * m_fsh->m_numBindings);
  4238. }
  4239. m_descriptorSetLayoutHash = murmur.end();
  4240. dsl = s_renderVK->m_descriptorSetLayoutCache.find(m_descriptorSetLayoutHash);
  4241. if (NULL == dsl)
  4242. {
  4243. VkDescriptorSetLayoutBinding bindings[64];
  4244. bx::memCopy(
  4245. bindings
  4246. , m_vsh->m_bindings
  4247. , sizeof(VkDescriptorSetLayoutBinding) * m_vsh->m_numBindings
  4248. );
  4249. if (NULL != m_fsh)
  4250. {
  4251. bx::memCopy(
  4252. bindings + m_vsh->m_numBindings
  4253. , m_fsh->m_bindings
  4254. , sizeof(VkDescriptorSetLayoutBinding) * m_fsh->m_numBindings
  4255. );
  4256. }
  4257. VkDescriptorSetLayoutCreateInfo dslci;
  4258. dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
  4259. dslci.pNext = NULL;
  4260. dslci.flags = 0;
  4261. dslci.bindingCount = numBindings;
  4262. dslci.pBindings = bindings;
  4263. VK_CHECK(vkCreateDescriptorSetLayout(
  4264. s_renderVK->m_device
  4265. , &dslci
  4266. , s_renderVK->m_allocatorCb
  4267. , &dsl
  4268. ));
  4269. s_renderVK->m_descriptorSetLayoutCache.add(m_descriptorSetLayoutHash, dsl);
  4270. }
  4271. }
  4272. VkPipelineLayoutCreateInfo plci;
  4273. plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
  4274. plci.pNext = NULL;
  4275. plci.flags = 0;
  4276. plci.pushConstantRangeCount = 0;
  4277. plci.pPushConstantRanges = NULL;
  4278. plci.setLayoutCount = (dsl == VK_NULL_HANDLE ? 0 : 1);
  4279. plci.pSetLayouts = &dsl;
  4280. VK_CHECK(vkCreatePipelineLayout(
  4281. s_renderVK->m_device
  4282. , &plci
  4283. , s_renderVK->m_allocatorCb
  4284. , &m_pipelineLayout
  4285. ));
  4286. }
  4287. void ProgramVK::destroy()
  4288. {
  4289. vkDestroy(m_pipelineLayout);
  4290. m_numPredefined = 0;
  4291. m_vsh = NULL;
  4292. m_fsh = NULL;
  4293. }
  4294. void* TextureVK::create(const Memory* _mem, uint64_t _flags, uint8_t _skip)
  4295. {
  4296. bimg::ImageContainer imageContainer;
  4297. if (bimg::imageParse(imageContainer, _mem->data, _mem->size))
  4298. {
  4299. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  4300. VkDevice device = s_renderVK->m_device;
  4301. const bimg::ImageBlockInfo& blockInfo = bimg::getBlockInfo(imageContainer.m_format);
  4302. const uint8_t startLod = bx::min<uint8_t>(_skip, imageContainer.m_numMips - 1);
  4303. bimg::TextureInfo ti;
  4304. bimg::imageGetSize(
  4305. &ti
  4306. , uint16_t(imageContainer.m_width >> startLod)
  4307. , uint16_t(imageContainer.m_height >> startLod)
  4308. , uint16_t(imageContainer.m_depth >> startLod)
  4309. , imageContainer.m_cubeMap
  4310. , 1 < imageContainer.m_numMips
  4311. , imageContainer.m_numLayers
  4312. , imageContainer.m_format
  4313. );
  4314. ti.numMips = bx::min<uint8_t>(imageContainer.m_numMips - startLod, ti.numMips);
  4315. m_flags = _flags;
  4316. m_width = ti.width;
  4317. m_height = ti.height;
  4318. m_depth = ti.depth;
  4319. m_numLayers = ti.numLayers;
  4320. m_requestedFormat = uint8_t(imageContainer.m_format);
  4321. m_textureFormat = uint8_t(getViableTextureFormat(imageContainer));
  4322. m_vkTextureFormat = bimg::isDepth(bimg::TextureFormat::Enum(m_textureFormat) )
  4323. ? s_textureFormat[m_textureFormat].m_fmtDsv
  4324. : (m_flags & BGFX_TEXTURE_SRGB) ? s_textureFormat[m_textureFormat].m_fmtSrgb : s_textureFormat[m_textureFormat].m_fmt
  4325. ;
  4326. m_vkComponentMapping = s_textureFormat[m_textureFormat].m_mapping;
  4327. const bool convert = m_textureFormat != m_requestedFormat;
  4328. const uint8_t bpp = bimg::getBitsPerPixel(bimg::TextureFormat::Enum(m_textureFormat));
  4329. m_vkTextureAspect = bimg::isDepth((bimg::TextureFormat::Enum)m_textureFormat)
  4330. ? VK_IMAGE_ASPECT_DEPTH_BIT
  4331. : VK_IMAGE_ASPECT_COLOR_BIT
  4332. ;
  4333. if (m_vkTextureFormat == VK_FORMAT_S8_UINT
  4334. || m_vkTextureFormat == VK_FORMAT_D16_UNORM_S8_UINT
  4335. || m_vkTextureFormat == VK_FORMAT_D24_UNORM_S8_UINT
  4336. || m_vkTextureFormat == VK_FORMAT_D32_SFLOAT_S8_UINT)
  4337. {
  4338. m_vkTextureAspect |= VK_IMAGE_ASPECT_STENCIL_BIT;
  4339. }
  4340. if (imageContainer.m_cubeMap)
  4341. {
  4342. m_type = VK_IMAGE_VIEW_TYPE_CUBE;
  4343. }
  4344. else if (imageContainer.m_depth > 1)
  4345. {
  4346. m_type = VK_IMAGE_VIEW_TYPE_3D;
  4347. }
  4348. else
  4349. {
  4350. m_type = VK_IMAGE_VIEW_TYPE_2D;
  4351. }
  4352. m_numMips = ti.numMips;
  4353. m_numSides = ti.numLayers * (imageContainer.m_cubeMap ? 6 : 1);
  4354. const uint16_t numSides = ti.numLayers * (imageContainer.m_cubeMap ? 6 : 1);
  4355. const uint32_t numSrd = numSides * ti.numMips;
  4356. uint32_t kk = 0;
  4357. const bool compressed = bimg::isCompressed(bimg::TextureFormat::Enum(m_textureFormat));
  4358. const bool swizzle = TextureFormat::BGRA8 == m_textureFormat && 0 != (m_flags & BGFX_TEXTURE_COMPUTE_WRITE);
  4359. const bool writeOnly = 0 != (m_flags & BGFX_TEXTURE_RT_WRITE_ONLY);
  4360. const bool computeWrite = 0 != (m_flags & BGFX_TEXTURE_COMPUTE_WRITE);
  4361. const bool renderTarget = 0 != (m_flags & BGFX_TEXTURE_RT_MASK);
  4362. const bool blit = 0 != (m_flags & BGFX_TEXTURE_BLIT_DST);
  4363. BX_UNUSED(swizzle, writeOnly, computeWrite, renderTarget, blit);
  4364. BX_TRACE(
  4365. "Texture %3d: %s (requested: %s), %dx%d%s RT[%c], BO[%c], CW[%c]%s."
  4366. , (int)(this - s_renderVK->m_textures)
  4367. , getName((TextureFormat::Enum)m_textureFormat)
  4368. , getName((TextureFormat::Enum)m_requestedFormat)
  4369. , ti.width
  4370. , ti.height
  4371. , imageContainer.m_cubeMap ? "x6" : ""
  4372. , renderTarget ? 'x' : ' '
  4373. , writeOnly ? 'x' : ' '
  4374. , computeWrite ? 'x' : ' '
  4375. , swizzle ? " (swizzle BGRA8 -> RGBA8)" : ""
  4376. );
  4377. // decode images
  4378. struct ImageInfo
  4379. {
  4380. uint8_t* data;
  4381. uint32_t width;
  4382. uint32_t height;
  4383. uint32_t depth;
  4384. uint32_t pitch;
  4385. uint32_t slice;
  4386. uint32_t size;
  4387. uint8_t mipLevel;
  4388. uint8_t layer;
  4389. };
  4390. ImageInfo* imageInfos = (ImageInfo*)BX_ALLOC(g_allocator, sizeof(ImageInfo) * numSrd);
  4391. bx::memSet(imageInfos, 0, sizeof(ImageInfo) * numSrd);
  4392. uint32_t alignment = 1; // tightly aligned buffer
  4393. for (uint8_t side = 0; side < numSides; ++side)
  4394. {
  4395. for (uint8_t lod = 0; lod < ti.numMips; ++lod)
  4396. {
  4397. bimg::ImageMip mip;
  4398. if (bimg::imageGetRawData(imageContainer, side, lod + startLod, _mem->data, _mem->size, mip))
  4399. {
  4400. if (convert)
  4401. {
  4402. const uint32_t pitch = bx::strideAlign(bx::max<uint32_t>(mip.m_width, 4) * bpp / 8, alignment);
  4403. const uint32_t slice = bx::strideAlign(bx::max<uint32_t>(mip.m_height, 4) * pitch, alignment);
  4404. const uint32_t size = slice * mip.m_depth;
  4405. uint8_t* temp = (uint8_t*)BX_ALLOC(g_allocator, size);
  4406. bimg::imageDecodeToBgra8(
  4407. g_allocator
  4408. , temp
  4409. , mip.m_data
  4410. , mip.m_width
  4411. , mip.m_height
  4412. , pitch
  4413. , mip.m_format
  4414. );
  4415. imageInfos[kk].data = temp;
  4416. imageInfos[kk].width = mip.m_width;
  4417. imageInfos[kk].height = mip.m_height;
  4418. imageInfos[kk].depth = mip.m_depth;
  4419. imageInfos[kk].pitch = pitch;
  4420. imageInfos[kk].slice = slice;
  4421. imageInfos[kk].size = size;
  4422. imageInfos[kk].mipLevel = lod;
  4423. imageInfos[kk].layer = side;
  4424. }
  4425. else if (compressed)
  4426. {
  4427. const uint32_t pitch = bx::strideAlign((mip.m_width / blockInfo.blockWidth) * mip.m_blockSize, alignment);
  4428. const uint32_t slice = bx::strideAlign((mip.m_height / blockInfo.blockHeight) * pitch, alignment);
  4429. const uint32_t size = slice * mip.m_depth;
  4430. uint8_t* temp = (uint8_t*)BX_ALLOC(g_allocator, size);
  4431. bimg::imageCopy(
  4432. temp
  4433. , mip.m_height / blockInfo.blockHeight
  4434. , (mip.m_width / blockInfo.blockWidth) * mip.m_blockSize
  4435. , mip.m_depth
  4436. , mip.m_data
  4437. , pitch
  4438. );
  4439. imageInfos[kk].data = temp;
  4440. imageInfos[kk].width = mip.m_width;
  4441. imageInfos[kk].height = mip.m_height;
  4442. imageInfos[kk].depth = mip.m_depth;
  4443. imageInfos[kk].pitch = pitch;
  4444. imageInfos[kk].slice = slice;
  4445. imageInfos[kk].size = size;
  4446. imageInfos[kk].mipLevel = lod;
  4447. imageInfos[kk].layer = side;
  4448. }
  4449. else
  4450. {
  4451. const uint32_t pitch = bx::strideAlign(mip.m_width * mip.m_bpp / 8, alignment);
  4452. const uint32_t slice = bx::strideAlign(mip.m_height * pitch, alignment);
  4453. uint8_t* temp = (uint8_t*)BX_ALLOC(g_allocator, slice);
  4454. bimg::imageCopy(temp
  4455. , mip.m_height
  4456. , mip.m_width * mip.m_bpp / 8
  4457. , mip.m_depth
  4458. , mip.m_data
  4459. , pitch
  4460. );
  4461. imageInfos[kk].data = temp;
  4462. imageInfos[kk].width = mip.m_width;
  4463. imageInfos[kk].height = mip.m_height;
  4464. imageInfos[kk].depth = mip.m_depth;
  4465. imageInfos[kk].pitch = pitch;
  4466. imageInfos[kk].slice = slice;
  4467. imageInfos[kk].size = slice;
  4468. imageInfos[kk].mipLevel = lod;
  4469. imageInfos[kk].layer = side;
  4470. }
  4471. }
  4472. ++kk;
  4473. }
  4474. }
  4475. uint32_t totalMemSize = 0;
  4476. VkBufferImageCopy* bufferCopyInfo = (VkBufferImageCopy*)BX_ALLOC(g_allocator, sizeof(VkBufferImageCopy) * numSrd);
  4477. for (uint32_t ii = 0; ii < numSrd; ++ii)
  4478. {
  4479. uint32_t idealWidth = bx::max<uint32_t>(1, m_width >> imageInfos[ii].mipLevel);
  4480. uint32_t idealHeight = bx::max<uint32_t>(1, m_height >> imageInfos[ii].mipLevel);
  4481. bufferCopyInfo[ii].bufferOffset = totalMemSize;
  4482. bufferCopyInfo[ii].bufferRowLength = 0; // assume that image data are tightly aligned
  4483. bufferCopyInfo[ii].bufferImageHeight = 0; // assume that image data are tightly aligned
  4484. bufferCopyInfo[ii].imageSubresource.aspectMask = m_vkTextureAspect;
  4485. bufferCopyInfo[ii].imageSubresource.mipLevel = imageInfos[ii].mipLevel;
  4486. bufferCopyInfo[ii].imageSubresource.baseArrayLayer = imageInfos[ii].layer;
  4487. bufferCopyInfo[ii].imageSubresource.layerCount = 1;
  4488. bufferCopyInfo[ii].imageOffset = { 0, 0, 0 };
  4489. bufferCopyInfo[ii].imageExtent = { idealWidth, idealHeight, imageInfos[ii].depth };
  4490. totalMemSize += imageInfos[ii].size;
  4491. }
  4492. VkBuffer stagingBuffer = VK_NULL_HANDLE;
  4493. VkDeviceMemory stagingDeviceMem = VK_NULL_HANDLE;
  4494. if (totalMemSize > 0)
  4495. {
  4496. // staging buffer creation
  4497. VkBufferCreateInfo bci;
  4498. bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  4499. bci.pNext = NULL;
  4500. bci.flags = 0;
  4501. bci.size = totalMemSize;
  4502. bci.queueFamilyIndexCount = 0;
  4503. bci.pQueueFamilyIndices = NULL;
  4504. bci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  4505. bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
  4506. VK_CHECK(vkCreateBuffer(
  4507. device
  4508. , &bci
  4509. , allocatorCb
  4510. , &stagingBuffer
  4511. ));
  4512. VkMemoryRequirements mr;
  4513. vkGetBufferMemoryRequirements(
  4514. device
  4515. , stagingBuffer
  4516. , &mr
  4517. );
  4518. VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingDeviceMem));
  4519. VK_CHECK(vkBindBufferMemory(
  4520. device
  4521. , stagingBuffer
  4522. , stagingDeviceMem
  4523. , 0
  4524. ));
  4525. VK_CHECK(vkMapMemory(
  4526. device
  4527. , stagingDeviceMem
  4528. , 0
  4529. , mr.size
  4530. , 0
  4531. , (void**)& m_directAccessPtr
  4532. ));
  4533. uint8_t* mappedMemory = (uint8_t*)m_directAccessPtr;
  4534. // copy image to staging buffer
  4535. for (uint32_t ii = 0; ii < numSrd; ++ii)
  4536. {
  4537. bx::memCopy(mappedMemory, imageInfos[ii].data, imageInfos[ii].size);
  4538. mappedMemory += imageInfos[ii].size;
  4539. }
  4540. vkUnmapMemory(device, stagingDeviceMem);
  4541. }
  4542. // create texture and allocate its device memory
  4543. VkImageCreateInfo ici;
  4544. ici.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
  4545. ici.pNext = NULL;
  4546. ici.flags = VK_IMAGE_VIEW_TYPE_CUBE == m_type
  4547. ? VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT
  4548. : 0
  4549. ;
  4550. ici.pQueueFamilyIndices = NULL;
  4551. ici.queueFamilyIndexCount = 0;
  4552. ici.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  4553. ici.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  4554. ici.usage = 0
  4555. | VK_IMAGE_USAGE_TRANSFER_SRC_BIT
  4556. | VK_IMAGE_USAGE_TRANSFER_DST_BIT
  4557. | VK_IMAGE_USAGE_SAMPLED_BIT
  4558. | (_flags & BGFX_TEXTURE_RT_MASK
  4559. ? (bimg::isDepth((bimg::TextureFormat::Enum)m_textureFormat)
  4560. ? VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
  4561. : VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT)
  4562. : 0
  4563. )
  4564. | (_flags & BGFX_TEXTURE_COMPUTE_WRITE ? VK_IMAGE_USAGE_STORAGE_BIT : 0)
  4565. ;
  4566. ici.format = m_vkTextureFormat;
  4567. ici.samples = VK_SAMPLE_COUNT_1_BIT;
  4568. ici.mipLevels = m_numMips;
  4569. ici.arrayLayers = m_numSides;
  4570. ici.extent.width = m_width;
  4571. ici.extent.height = m_height;
  4572. ici.extent.depth = m_depth;
  4573. ici.imageType = VK_IMAGE_VIEW_TYPE_3D == m_type
  4574. ? VK_IMAGE_TYPE_3D
  4575. : VK_IMAGE_TYPE_2D
  4576. ;
  4577. ici.tiling = VK_IMAGE_TILING_OPTIMAL;
  4578. VK_CHECK(vkCreateImage(device, &ici, allocatorCb, &m_textureImage));
  4579. VkMemoryRequirements imageMemReq;
  4580. vkGetImageMemoryRequirements(device, m_textureImage, &imageMemReq);
  4581. VK_CHECK(s_renderVK->allocateMemory(&imageMemReq, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, &m_textureDeviceMem));
  4582. vkBindImageMemory(device, m_textureImage, m_textureDeviceMem, 0);
  4583. if (stagingBuffer)
  4584. {
  4585. copyBufferToTexture(stagingBuffer, numSrd, bufferCopyInfo);
  4586. }
  4587. else
  4588. {
  4589. VkCommandBuffer commandBuffer = s_renderVK->beginNewCommand();
  4590. setImageMemoryBarrier(
  4591. commandBuffer
  4592. , (m_flags & BGFX_TEXTURE_COMPUTE_WRITE
  4593. ? VK_IMAGE_LAYOUT_GENERAL
  4594. : VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
  4595. )
  4596. );
  4597. s_renderVK->submitCommandAndWait(commandBuffer);
  4598. }
  4599. vkFreeMemory(device, stagingDeviceMem, allocatorCb);
  4600. vkDestroy(stagingBuffer);
  4601. BX_FREE(g_allocator, bufferCopyInfo);
  4602. for (uint32_t ii = 0; ii < numSrd; ++ii)
  4603. {
  4604. BX_FREE(g_allocator, imageInfos[ii].data);
  4605. }
  4606. BX_FREE(g_allocator, imageInfos);
  4607. // image view creation
  4608. {
  4609. VkImageViewCreateInfo viewInfo;
  4610. viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  4611. viewInfo.pNext = NULL;
  4612. viewInfo.flags = 0;
  4613. viewInfo.image = m_textureImage;
  4614. viewInfo.viewType = m_type;
  4615. viewInfo.format = m_vkTextureFormat;
  4616. viewInfo.components = m_vkComponentMapping;
  4617. viewInfo.subresourceRange.aspectMask = m_vkTextureAspect;
  4618. viewInfo.subresourceRange.baseMipLevel = 0;
  4619. viewInfo.subresourceRange.levelCount = m_numMips; //m_numMips;
  4620. viewInfo.subresourceRange.baseArrayLayer = 0;
  4621. viewInfo.subresourceRange.layerCount = m_numSides; //(m_type == VK_IMAGE_VIEW_TYPE_CUBE ? 6 : m_numLayers);
  4622. VK_CHECK(vkCreateImageView(
  4623. device
  4624. , &viewInfo
  4625. , allocatorCb
  4626. , &m_textureImageView
  4627. ));
  4628. }
  4629. if ((m_vkTextureAspect & VK_IMAGE_ASPECT_DEPTH_BIT)
  4630. && (m_vkTextureAspect & VK_IMAGE_ASPECT_STENCIL_BIT))
  4631. {
  4632. VkImageViewCreateInfo viewInfo;
  4633. viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  4634. viewInfo.pNext = NULL;
  4635. viewInfo.flags = 0;
  4636. viewInfo.image = m_textureImage;
  4637. viewInfo.viewType = m_type;
  4638. viewInfo.format = m_vkTextureFormat;
  4639. viewInfo.components = m_vkComponentMapping;
  4640. viewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
  4641. viewInfo.subresourceRange.baseMipLevel = 0;
  4642. viewInfo.subresourceRange.levelCount = m_numMips; //m_numMips;
  4643. viewInfo.subresourceRange.baseArrayLayer = 0;
  4644. viewInfo.subresourceRange.layerCount = m_numSides; //(m_type == VK_IMAGE_VIEW_TYPE_CUBE ? 6 : m_numLayers);
  4645. VK_CHECK(vkCreateImageView(
  4646. device
  4647. , &viewInfo
  4648. , allocatorCb
  4649. , &m_textureImageDepthView
  4650. ));
  4651. }
  4652. // image view creation for storage if needed
  4653. if (m_flags & BGFX_TEXTURE_COMPUTE_WRITE)
  4654. {
  4655. VkImageViewCreateInfo viewInfo;
  4656. viewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
  4657. viewInfo.pNext = NULL;
  4658. viewInfo.flags = 0;
  4659. viewInfo.image = m_textureImage;
  4660. viewInfo.viewType = (m_type == VK_IMAGE_VIEW_TYPE_CUBE ? VK_IMAGE_VIEW_TYPE_2D_ARRAY : m_type);
  4661. viewInfo.format = m_vkTextureFormat;
  4662. viewInfo.components = m_vkComponentMapping;
  4663. viewInfo.subresourceRange.aspectMask = m_vkTextureAspect;
  4664. viewInfo.subresourceRange.baseMipLevel = 0;
  4665. viewInfo.subresourceRange.levelCount = m_numMips; //m_numMips;
  4666. viewInfo.subresourceRange.baseArrayLayer = 0;
  4667. viewInfo.subresourceRange.layerCount = m_numSides; //(m_type == VK_IMAGE_VIEW_TYPE_CUBE ? 6 : m_numLayers);
  4668. VK_CHECK(vkCreateImageView(
  4669. device
  4670. , &viewInfo
  4671. , allocatorCb
  4672. , &m_textureImageStorageView
  4673. ));
  4674. }
  4675. }
  4676. return m_directAccessPtr;
  4677. }
  4678. void TextureVK::destroy()
  4679. {
  4680. if (m_textureImage)
  4681. {
  4682. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  4683. VkDevice device = s_renderVK->m_device;
  4684. vkFreeMemory(device, m_textureDeviceMem, allocatorCb);
  4685. vkDestroy(m_textureImageStorageView);
  4686. vkDestroy(m_textureImageDepthView);
  4687. vkDestroy(m_textureImageView);
  4688. vkDestroy(m_textureImage);
  4689. m_currentImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  4690. }
  4691. }
  4692. void TextureVK::update(VkCommandPool _commandPool, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem)
  4693. {
  4694. BX_UNUSED(_commandPool);
  4695. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  4696. VkDevice device = s_renderVK->m_device;
  4697. VkBuffer stagingBuffer = VK_NULL_HANDLE;
  4698. VkDeviceMemory stagingDeviceMem = VK_NULL_HANDLE;
  4699. // staging buffer creation
  4700. VkBufferCreateInfo bci;
  4701. bci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
  4702. bci.pNext = NULL;
  4703. bci.flags = 0;
  4704. bci.size = (_pitch == UINT16_MAX ? _mem->size :_rect.m_height * _pitch * _depth);
  4705. bci.queueFamilyIndexCount = 0;
  4706. bci.pQueueFamilyIndices = NULL;
  4707. bci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
  4708. bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
  4709. VK_CHECK(vkCreateBuffer(
  4710. device
  4711. , &bci
  4712. , allocatorCb
  4713. , &stagingBuffer
  4714. ));
  4715. VkMemoryRequirements mr;
  4716. vkGetBufferMemoryRequirements(
  4717. device
  4718. , stagingBuffer
  4719. , &mr
  4720. );
  4721. VK_CHECK(s_renderVK->allocateMemory(&mr, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, &stagingDeviceMem));
  4722. void* directAccessPtr = NULL;
  4723. VK_CHECK(vkBindBufferMemory(device, stagingBuffer, stagingDeviceMem, 0));
  4724. VK_CHECK(vkMapMemory(device, stagingDeviceMem, 0, mr.size, 0, (void**)&directAccessPtr));
  4725. bx::memCopy(directAccessPtr, _mem->data, size_t(bci.size));
  4726. vkUnmapMemory(device, stagingDeviceMem);
  4727. const uint32_t bpp = bimg::getBitsPerPixel(bimg::TextureFormat::Enum(m_textureFormat) );
  4728. VkBufferImageCopy region;
  4729. region.bufferOffset = 0;
  4730. region.bufferRowLength = (_pitch == UINT16_MAX ? 0 : _pitch * 8 / bpp);
  4731. region.bufferImageHeight = 0;
  4732. region.imageSubresource.aspectMask = m_vkTextureAspect;
  4733. region.imageSubresource.mipLevel = _mip;
  4734. region.imageSubresource.baseArrayLayer = _side;
  4735. region.imageSubresource.layerCount = 1;
  4736. region.imageOffset = { _rect.m_x, _rect.m_y, _z };
  4737. region.imageExtent = { _rect.m_width, _rect.m_height, _depth };
  4738. copyBufferToTexture(stagingBuffer, 1, &region);
  4739. vkFreeMemory(device, stagingDeviceMem, allocatorCb);
  4740. vkDestroy(stagingBuffer);
  4741. }
  4742. void TextureVK::copyBufferToTexture(VkBuffer stagingBuffer, uint32_t bufferImageCopyCount, VkBufferImageCopy* bufferImageCopy)
  4743. {
  4744. VkCommandBuffer commandBuffer = s_renderVK->beginNewCommand();
  4745. // image Layout transition into destination optimal
  4746. setImageMemoryBarrier(commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
  4747. // copy buffer to image
  4748. vkCmdCopyBufferToImage(
  4749. commandBuffer
  4750. , stagingBuffer
  4751. , m_textureImage
  4752. , VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL
  4753. , bufferImageCopyCount
  4754. , bufferImageCopy
  4755. );
  4756. setImageMemoryBarrier(commandBuffer, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
  4757. s_renderVK->submitCommandAndWait(commandBuffer);
  4758. }
  4759. void TextureVK::setImageMemoryBarrier(VkCommandBuffer commandBuffer, VkImageLayout newImageLayout)
  4760. {
  4761. if (m_currentImageLayout == newImageLayout)
  4762. return;
  4763. bgfx::vk::setImageMemoryBarrier(commandBuffer
  4764. , m_textureImage
  4765. , m_vkTextureAspect
  4766. , m_currentImageLayout
  4767. , newImageLayout
  4768. , m_numMips
  4769. , m_numSides
  4770. );
  4771. m_currentImageLayout = newImageLayout;
  4772. }
  4773. void FrameBufferVK::create(uint8_t _num, const Attachment* _attachment)
  4774. {
  4775. // create frame buffer object
  4776. m_numAttachment = _num;
  4777. bx::memCopy(m_attachment, _attachment, sizeof(Attachment) * _num);
  4778. VkDevice device = s_renderVK->m_device;
  4779. VkAllocationCallbacks* allocatorCb = s_renderVK->m_allocatorCb;
  4780. VkRenderPass renderPass = s_renderVK->getRenderPass(_num, _attachment);
  4781. TextureVK& firstTexture = s_renderVK->m_textures[m_attachment[0].handle.idx];
  4782. ::VkImageView textureImageViews[BGFX_CONFIG_MAX_FRAME_BUFFER_ATTACHMENTS];
  4783. m_num = 0;
  4784. for (uint8_t ii = 0; ii < m_numAttachment; ++ii)
  4785. {
  4786. TextureVK& texture = s_renderVK->m_textures[m_attachment[ii].handle.idx];
  4787. textureImageViews[ii] = texture.m_textureImageView;
  4788. if (texture.m_vkTextureAspect & VK_IMAGE_ASPECT_COLOR_BIT)
  4789. {
  4790. m_texture[m_num] = m_attachment[ii].handle;
  4791. m_num++;
  4792. }
  4793. else if (texture.m_vkTextureAspect & VK_IMAGE_ASPECT_DEPTH_BIT)
  4794. {
  4795. m_depth = m_attachment[ii].handle;
  4796. }
  4797. }
  4798. VkFramebufferCreateInfo fci;
  4799. fci.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
  4800. fci.pNext = NULL;
  4801. fci.flags = 0;
  4802. fci.renderPass = renderPass;
  4803. fci.attachmentCount = m_numAttachment;
  4804. fci.pAttachments = textureImageViews;
  4805. fci.width = firstTexture.m_width >> m_attachment[0].mip;
  4806. fci.height = firstTexture.m_height >> m_attachment[0].mip;
  4807. fci.layers = firstTexture.m_numSides;
  4808. VK_CHECK( vkCreateFramebuffer(device, &fci, allocatorCb, &m_framebuffer) );
  4809. m_renderPass = renderPass;
  4810. }
  4811. void FrameBufferVK::destroy()
  4812. {
  4813. vkDestroy(m_framebuffer);
  4814. }
  4815. void RendererContextVK::submitBlit(BlitState& _bs, uint16_t _view)
  4816. {
  4817. TextureHandle currentSrc = { kInvalidHandle };
  4818. TextureHandle currentDst = { kInvalidHandle };
  4819. VkImageLayout oldSrcLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  4820. VkImageLayout oldDstLayout = VK_IMAGE_LAYOUT_UNDEFINED;
  4821. VkCommandBuffer commandBuffer = beginNewCommand();
  4822. while (_bs.hasItem(_view) )
  4823. {
  4824. const BlitItem& blit = _bs.advance();
  4825. TextureVK& src = m_textures[blit.m_src.idx];
  4826. TextureVK& dst = m_textures[blit.m_dst.idx];
  4827. if (currentSrc.idx != blit.m_src.idx)
  4828. {
  4829. if (oldSrcLayout != VK_IMAGE_LAYOUT_UNDEFINED)
  4830. {
  4831. m_textures[currentSrc.idx].setImageMemoryBarrier(commandBuffer, oldSrcLayout);
  4832. }
  4833. oldSrcLayout = src.m_currentImageLayout;
  4834. src.setImageMemoryBarrier(commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
  4835. currentSrc = blit.m_src;
  4836. }
  4837. if (currentDst.idx != blit.m_dst.idx)
  4838. {
  4839. if (oldDstLayout != VK_IMAGE_LAYOUT_UNDEFINED)
  4840. {
  4841. m_textures[currentDst.idx].setImageMemoryBarrier(commandBuffer, oldDstLayout);
  4842. }
  4843. oldDstLayout = dst.m_currentImageLayout;
  4844. dst.setImageMemoryBarrier(commandBuffer, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
  4845. currentDst = blit.m_dst;
  4846. }
  4847. uint32_t srcZ = (VK_IMAGE_VIEW_TYPE_CUBE == src.m_type ? 0 : blit.m_srcZ);
  4848. uint32_t dstZ = (VK_IMAGE_VIEW_TYPE_CUBE == dst.m_type ? 0 : blit.m_dstZ);
  4849. uint32_t srcLayer = (VK_IMAGE_VIEW_TYPE_CUBE == src.m_type ? blit.m_srcZ : 0);
  4850. uint32_t dstLayer = (VK_IMAGE_VIEW_TYPE_CUBE == dst.m_type ? blit.m_dstZ : 0);
  4851. uint32_t depth = (blit.m_depth == UINT16_MAX ? 1 : blit.m_depth);
  4852. VkImageBlit blitInfo;
  4853. blitInfo.srcSubresource.aspectMask = src.m_vkTextureAspect;
  4854. blitInfo.srcSubresource.mipLevel = blit.m_srcMip;
  4855. blitInfo.srcSubresource.baseArrayLayer = srcLayer;
  4856. blitInfo.srcSubresource.layerCount = 1;
  4857. blitInfo.srcOffsets[0].x = blit.m_srcX;
  4858. blitInfo.srcOffsets[0].y = blit.m_srcY;
  4859. blitInfo.srcOffsets[0].z = srcZ;
  4860. blitInfo.srcOffsets[1].x = bx::min<int32_t>(blit.m_srcX + blit.m_width, src.m_width);
  4861. blitInfo.srcOffsets[1].y = bx::min<int32_t>(blit.m_srcY + blit.m_height, src.m_height);
  4862. blitInfo.srcOffsets[1].z = bx::max<int32_t>(bx::min(srcZ + depth, src.m_depth), 1);
  4863. blitInfo.dstSubresource.aspectMask = dst.m_vkTextureAspect;
  4864. blitInfo.dstSubresource.mipLevel = blit.m_dstMip;
  4865. blitInfo.dstSubresource.baseArrayLayer = dstLayer;
  4866. blitInfo.dstSubresource.layerCount = 1;
  4867. blitInfo.dstOffsets[0].x = blit.m_dstX;
  4868. blitInfo.dstOffsets[0].y = blit.m_dstY;
  4869. blitInfo.dstOffsets[0].z = dstZ;
  4870. blitInfo.dstOffsets[1].x = bx::min<int32_t>(blit.m_dstX + blit.m_width, dst.m_width);
  4871. blitInfo.dstOffsets[1].y = bx::min<int32_t>(blit.m_dstY + blit.m_height, dst.m_height);
  4872. blitInfo.dstOffsets[1].z = bx::max<int32_t>(bx::min(dstZ + depth, dst.m_depth), 1);
  4873. VkFilter filter = bimg::isDepth(bimg::TextureFormat::Enum(src.m_textureFormat)) ? VK_FILTER_NEAREST : VK_FILTER_LINEAR;
  4874. vkCmdBlitImage(
  4875. commandBuffer
  4876. , src.m_textureImage
  4877. , src.m_currentImageLayout
  4878. , dst.m_textureImage
  4879. , dst.m_currentImageLayout
  4880. , 1
  4881. , &blitInfo
  4882. , filter
  4883. );
  4884. }
  4885. if (oldSrcLayout != VK_IMAGE_LAYOUT_UNDEFINED)
  4886. {
  4887. m_textures[currentSrc.idx].setImageMemoryBarrier(commandBuffer, oldSrcLayout);
  4888. }
  4889. if (oldDstLayout != VK_IMAGE_LAYOUT_UNDEFINED)
  4890. {
  4891. m_textures[currentDst.idx].setImageMemoryBarrier(commandBuffer, oldDstLayout);
  4892. }
  4893. submitCommandAndWait(commandBuffer);
  4894. }
  4895. void RendererContextVK::submit(Frame* _render, ClearQuad& _clearQuad, TextVideoMemBlitter& _textVideoMemBlitter)
  4896. {
  4897. BX_UNUSED(_render, _clearQuad, _textVideoMemBlitter);
  4898. m_commandBuffer = beginNewCommand();
  4899. BGFX_VK_PROFILER_BEGIN_LITERAL("rendererSubmit", kColorView);
  4900. submitCommandAndWait(m_commandBuffer);
  4901. m_commandBuffer = VK_NULL_HANDLE;
  4902. updateResolution(_render->m_resolution);
  4903. int64_t timeBegin = bx::getHPCounter();
  4904. int64_t captureElapsed = 0;
  4905. // m_gpuTimer.begin(m_commandList);
  4906. if (0 < _render->m_iboffset)
  4907. {
  4908. BGFX_PROFILER_SCOPE("bgfx/Update transient index buffer", kColorResource);
  4909. TransientIndexBuffer* ib = _render->m_transientIb;
  4910. m_indexBuffers[ib->handle.idx].update(/*m_commandList*/NULL, 0, _render->m_iboffset, ib->data);
  4911. }
  4912. if (0 < _render->m_vboffset)
  4913. {
  4914. BGFX_PROFILER_SCOPE("bgfx/Update transient vertex buffer", kColorResource);
  4915. TransientVertexBuffer* vb = _render->m_transientVb;
  4916. m_vertexBuffers[vb->handle.idx].update(/*m_commandList*/NULL, 0, _render->m_vboffset, vb->data);
  4917. }
  4918. _render->sort();
  4919. RenderDraw currentState;
  4920. currentState.clear();
  4921. currentState.m_stateFlags = BGFX_STATE_NONE;
  4922. currentState.m_stencil = packStencil(BGFX_STENCIL_NONE, BGFX_STENCIL_NONE);
  4923. static ViewState viewState;
  4924. viewState.reset(_render);
  4925. // bool wireframe = !!(_render->m_debug&BGFX_DEBUG_WIREFRAME);
  4926. // setDebugWireframe(wireframe);
  4927. uint16_t currentSamplerStateIdx = kInvalidHandle;
  4928. ProgramHandle currentProgram = BGFX_INVALID_HANDLE;
  4929. uint32_t currentBindHash = 0;
  4930. uint32_t currentDslHash = 0;
  4931. bool hasPredefined = false;
  4932. bool commandListChanged = false;
  4933. VkPipeline currentPipeline = VK_NULL_HANDLE;
  4934. SortKey key;
  4935. uint16_t view = UINT16_MAX;
  4936. FrameBufferHandle fbh = { BGFX_CONFIG_MAX_FRAME_BUFFERS };
  4937. BlitState bs(_render);
  4938. uint32_t blendFactor = 0;
  4939. const uint64_t primType = _render->m_debug&BGFX_DEBUG_WIREFRAME ? BGFX_STATE_PT_LINES : 0;
  4940. uint8_t primIndex = uint8_t(primType >> BGFX_STATE_PT_SHIFT);
  4941. PrimInfo prim = s_primInfo[primIndex];
  4942. bool wasCompute = false;
  4943. bool viewHasScissor = false;
  4944. bool restoreScissor = false;
  4945. Rect viewScissorRect;
  4946. viewScissorRect.clear();
  4947. const uint32_t maxComputeBindings = g_caps.limits.maxComputeBindings;
  4948. BX_UNUSED(maxComputeBindings);
  4949. uint32_t statsNumPrimsSubmitted[BX_COUNTOF(s_primInfo)] = {};
  4950. uint32_t statsNumPrimsRendered[BX_COUNTOF(s_primInfo)] = {};
  4951. uint32_t statsNumInstances[BX_COUNTOF(s_primInfo)] = {};
  4952. uint32_t statsNumIndices = 0;
  4953. uint32_t statsKeyType[2] = {};
  4954. VkSemaphore renderWait = m_presentDone[m_backBufferColorIdx];
  4955. VkResult result = vkAcquireNextImageKHR(
  4956. m_device
  4957. , m_swapchain
  4958. , UINT64_MAX
  4959. , renderWait
  4960. , VK_NULL_HANDLE
  4961. , &m_backBufferColorIdx
  4962. );
  4963. if (VK_ERROR_OUT_OF_DATE_KHR == result
  4964. || VK_SUBOPTIMAL_KHR == result)
  4965. {
  4966. m_needToRefreshSwapchain = true;
  4967. return;
  4968. }
  4969. // const uint64_t f0 = BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_FACTOR, BGFX_STATE_BLEND_FACTOR);
  4970. // const uint64_t f1 = BGFX_STATE_BLEND_FUNC(BGFX_STATE_BLEND_INV_FACTOR, BGFX_STATE_BLEND_INV_FACTOR);
  4971. const uint64_t f0 = BGFX_STATE_BLEND_FACTOR;
  4972. const uint64_t f1 = BGFX_STATE_BLEND_INV_FACTOR;
  4973. const uint64_t f2 = BGFX_STATE_BLEND_FACTOR<<4;
  4974. const uint64_t f3 = BGFX_STATE_BLEND_INV_FACTOR<<4;
  4975. ScratchBufferVK& scratchBuffer = m_scratchBuffer[m_backBufferColorIdx];
  4976. scratchBuffer.reset();
  4977. VkCommandBufferBeginInfo cbbi;
  4978. cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
  4979. cbbi.pNext = NULL;
  4980. cbbi.flags = 0
  4981. | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT
  4982. // | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
  4983. ;
  4984. cbbi.pInheritanceInfo = NULL;
  4985. m_commandBuffer = m_commandBuffers[m_backBufferColorIdx];
  4986. VK_CHECK(vkBeginCommandBuffer(m_commandBuffer, &cbbi) );
  4987. setImageMemoryBarrier(m_commandBuffer
  4988. , m_backBufferColorImage[m_backBufferColorIdx]
  4989. , VK_IMAGE_ASPECT_COLOR_BIT
  4990. , m_backBufferColorImageLayout[m_backBufferColorIdx]
  4991. , VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
  4992. , 1, 1);
  4993. m_backBufferColorImageLayout[m_backBufferColorIdx] = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
  4994. VkRenderPassBeginInfo rpbi;
  4995. rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
  4996. rpbi.pNext = NULL;
  4997. rpbi.renderPass = m_renderPass;
  4998. rpbi.framebuffer = m_backBufferColor[m_backBufferColorIdx];
  4999. rpbi.renderArea.offset.x = 0;
  5000. rpbi.renderArea.offset.y = 0;
  5001. rpbi.renderArea.extent = m_sci.imageExtent;
  5002. rpbi.clearValueCount = 0;
  5003. rpbi.pClearValues = NULL;
  5004. bool beginRenderPass = false;
  5005. if (0 == (_render->m_debug&BGFX_DEBUG_IFH) )
  5006. {
  5007. // m_batch.begin();
  5008. viewState.m_rect = _render->m_view[0].m_rect;
  5009. int32_t numItems = _render->m_numRenderItems;
  5010. for (int32_t item = 0; item < numItems;)
  5011. {
  5012. const uint64_t encodedKey = _render->m_sortKeys[item];
  5013. const bool isCompute = key.decode(encodedKey, _render->m_viewRemap);
  5014. statsKeyType[isCompute]++;
  5015. const bool viewChanged = 0
  5016. || key.m_view != view
  5017. || item == numItems
  5018. ;
  5019. const uint32_t itemIdx = _render->m_sortValues[item];
  5020. const RenderItem& renderItem = _render->m_renderItem[itemIdx];
  5021. const RenderBind& renderBind = _render->m_renderItemBind[itemIdx];
  5022. ++item;
  5023. if (viewChanged || isCompute || wasCompute)
  5024. {
  5025. if (beginRenderPass)
  5026. {
  5027. vkCmdEndRenderPass(m_commandBuffer);
  5028. beginRenderPass = false;
  5029. }
  5030. VK_CHECK(vkEndCommandBuffer(m_commandBuffer) );
  5031. // m_batch.flush(m_commandList, true);
  5032. kick(renderWait);
  5033. renderWait = VK_NULL_HANDLE;
  5034. finishAll();
  5035. view = key.m_view;
  5036. currentPipeline = VK_NULL_HANDLE;
  5037. currentSamplerStateIdx = kInvalidHandle;
  5038. currentProgram = BGFX_INVALID_HANDLE;
  5039. hasPredefined = false;
  5040. BX_UNUSED(currentSamplerStateIdx);
  5041. VK_CHECK(vkBeginCommandBuffer(m_commandBuffer, &cbbi) );
  5042. fbh = _render->m_view[view].m_fbh;
  5043. setFrameBuffer(fbh);
  5044. viewState.m_rect = _render->m_view[view].m_rect;
  5045. const Rect& rect = _render->m_view[view].m_rect;
  5046. const Rect& scissorRect = _render->m_view[view].m_scissor;
  5047. viewHasScissor = !scissorRect.isZero();
  5048. viewScissorRect = viewHasScissor ? scissorRect : rect;
  5049. rpbi.framebuffer = isValid(m_fbh) ? m_frameBuffers[m_fbh.idx].m_framebuffer : m_backBufferColor[m_backBufferColorIdx];
  5050. rpbi.renderPass = isValid(m_fbh) ? m_frameBuffers[m_fbh.idx].m_renderPass : m_renderPass;
  5051. rpbi.renderArea.offset.x = rect.m_x;
  5052. rpbi.renderArea.offset.y = rect.m_y;
  5053. rpbi.renderArea.extent.width = rect.m_width;
  5054. rpbi.renderArea.extent.height = rect.m_height;
  5055. BGFX_VK_PROFILER_END();
  5056. setViewType(view, " ");
  5057. BGFX_VK_PROFILER_BEGIN(view, kColorView);
  5058. if (!isCompute && !beginRenderPass)
  5059. {
  5060. vkCmdBeginRenderPass(m_commandBuffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
  5061. beginRenderPass = true;
  5062. VkViewport vp;
  5063. vp.x = rect.m_x;
  5064. vp.y = rect.m_y;
  5065. vp.width = rect.m_width;
  5066. vp.height = rect.m_height;
  5067. vp.minDepth = 0.0f;
  5068. vp.maxDepth = 1.0f;
  5069. vkCmdSetViewport(m_commandBuffer, 0, 1, &vp);
  5070. VkRect2D rc;
  5071. rc.offset.x = viewScissorRect.m_x;
  5072. rc.offset.y = viewScissorRect.m_y;
  5073. rc.extent.width = viewScissorRect.m_width;
  5074. rc.extent.height = viewScissorRect.m_height;
  5075. vkCmdSetScissor(m_commandBuffer, 0, 1, &rc);
  5076. restoreScissor = false;
  5077. Clear& clr = _render->m_view[view].m_clear;
  5078. if (BGFX_CLEAR_NONE != clr.m_flags)
  5079. {
  5080. Rect clearRect = rect;
  5081. clearRect.setIntersect(rect, viewScissorRect);
  5082. clearQuad(clearRect, clr, _render->m_colorPalette);
  5083. }
  5084. prim = s_primInfo[Topology::Count]; // Force primitive type update.
  5085. submitBlit(bs, view);
  5086. }
  5087. }
  5088. if (isCompute)
  5089. {
  5090. if (!wasCompute)
  5091. {
  5092. wasCompute = true;
  5093. BGFX_VK_PROFILER_END();
  5094. setViewType(view, "C");
  5095. BGFX_VK_PROFILER_BEGIN(view, kColorCompute);
  5096. // m_commandList->SetComputeRootSignature(m_rootSignature);
  5097. // ID3D12DescriptorHeap* heaps[] = {
  5098. // m_samplerAllocator.getHeap(),
  5099. // scratchBuffer.getHeap(),
  5100. // };
  5101. // m_commandList->SetDescriptorHeaps(BX_COUNTOF(heaps), heaps);
  5102. }
  5103. const RenderCompute& compute = renderItem.compute;
  5104. VkPipeline pipeline = getPipeline(key.m_program);
  5105. if (pipeline != currentPipeline)
  5106. {
  5107. currentPipeline = pipeline;
  5108. vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
  5109. currentBindHash = 0;
  5110. currentDslHash = 0;
  5111. }
  5112. bool constantsChanged = false;
  5113. if (compute.m_uniformBegin < compute.m_uniformEnd
  5114. || currentProgram.idx != key.m_program.idx)
  5115. {
  5116. rendererUpdateUniforms(this, _render->m_uniformBuffer[compute.m_uniformIdx], compute.m_uniformBegin, compute.m_uniformEnd);
  5117. currentProgram = key.m_program;
  5118. ProgramVK& program = m_program[currentProgram.idx];
  5119. UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
  5120. if (NULL != vcb)
  5121. {
  5122. commit(*vcb);
  5123. }
  5124. hasPredefined = 0 < program.m_numPredefined;
  5125. constantsChanged = true;
  5126. }
  5127. const ProgramVK& program = m_program[currentProgram.idx];
  5128. if (constantsChanged
  5129. || hasPredefined)
  5130. {
  5131. viewState.setPredefined<4>(this, view, program, _render, compute);
  5132. // commitShaderConstants(key.m_program, gpuAddress);
  5133. // m_commandList->SetComputeRootConstantBufferView(Rdt::CBV, gpuAddress);
  5134. }
  5135. uint32_t bindHash = bx::hash<bx::HashMurmur2A>(renderBind.m_bind, sizeof(renderBind.m_bind) );
  5136. if (currentBindHash != bindHash
  5137. || currentDslHash != program.m_descriptorSetLayoutHash)
  5138. {
  5139. currentBindHash = bindHash;
  5140. currentDslHash = program.m_descriptorSetLayoutHash;
  5141. allocDescriptorSet(program, renderBind, scratchBuffer);
  5142. }
  5143. uint32_t offset = 0;
  5144. if (constantsChanged
  5145. || hasPredefined)
  5146. {
  5147. const uint32_t align = uint32_t(m_deviceProperties.limits.minUniformBufferOffsetAlignment);
  5148. const uint32_t vsize = bx::strideAlign(program.m_vsh->m_size, align);
  5149. offset = scratchBuffer.m_pos;
  5150. m_vsChanges = 0;
  5151. m_fsChanges = 0;
  5152. bx::memCopy(&scratchBuffer.m_data[scratchBuffer.m_pos], m_vsScratch, program.m_vsh->m_size);
  5153. scratchBuffer.m_pos += vsize;
  5154. }
  5155. vkCmdBindDescriptorSets(
  5156. m_commandBuffer
  5157. , VK_PIPELINE_BIND_POINT_COMPUTE
  5158. , program.m_pipelineLayout
  5159. , 0
  5160. , 1
  5161. , &scratchBuffer.getCurrentDS()
  5162. , constantsChanged || hasPredefined ? 1 : 0
  5163. , &offset
  5164. );
  5165. if (isValid(compute.m_indirectBuffer) )
  5166. {
  5167. const VertexBufferVK& vb = m_vertexBuffers[compute.m_indirectBuffer.idx];
  5168. uint32_t numDrawIndirect = UINT16_MAX == compute.m_numIndirect
  5169. ? vb.m_size/BGFX_CONFIG_DRAW_INDIRECT_STRIDE
  5170. : compute.m_numIndirect
  5171. ;
  5172. uint32_t args = compute.m_startIndirect * BGFX_CONFIG_DRAW_INDIRECT_STRIDE;
  5173. for (uint32_t ii = 0; ii < numDrawIndirect; ++ii)
  5174. {
  5175. vkCmdDispatchIndirect(m_commandBuffer, vb.m_buffer, args);
  5176. args += BGFX_CONFIG_DRAW_INDIRECT_STRIDE;
  5177. }
  5178. }
  5179. else
  5180. {
  5181. vkCmdDispatch(m_commandBuffer, compute.m_numX, compute.m_numY, compute.m_numZ);
  5182. }
  5183. continue;
  5184. }
  5185. const RenderDraw& draw = renderItem.draw;
  5186. const bool hasOcclusionQuery = false; //0 != (draw.m_stateFlags & BGFX_STATE_INTERNAL_OCCLUSION_QUERY);
  5187. {
  5188. const bool occluded = false //true
  5189. // && isValid(draw.m_occlusionQuery)
  5190. // && !hasOcclusionQuery
  5191. // && !isVisible(_render, draw.m_occlusionQuery, 0 != (draw.m_submitFlags&BGFX_SUBMIT_INTERNAL_OCCLUSION_VISIBLE) )
  5192. ;
  5193. if (occluded
  5194. || _render->m_frameCache.isZeroArea(viewScissorRect, draw.m_scissor) )
  5195. {
  5196. // if (resetState)
  5197. // {
  5198. // currentState.clear();
  5199. // currentState.m_scissor = !draw.m_scissor;
  5200. // currentBind.clear();
  5201. // }
  5202. continue;
  5203. }
  5204. }
  5205. const uint64_t newFlags = draw.m_stateFlags;
  5206. uint64_t changedFlags = currentState.m_stateFlags ^ draw.m_stateFlags;
  5207. currentState.m_stateFlags = newFlags;
  5208. const uint64_t newStencil = draw.m_stencil;
  5209. uint64_t changedStencil = (currentState.m_stencil ^ draw.m_stencil) & BGFX_STENCIL_FUNC_REF_MASK;
  5210. currentState.m_stencil = newStencil;
  5211. if (viewChanged
  5212. || wasCompute)
  5213. {
  5214. if (wasCompute)
  5215. {
  5216. wasCompute = false;
  5217. }
  5218. if (viewChanged)
  5219. {
  5220. BGFX_VK_PROFILER_END();
  5221. setViewType(view, " ");
  5222. BGFX_VK_PROFILER_BEGIN(view, kColorDraw);
  5223. }
  5224. commandListChanged = true;
  5225. }
  5226. if (commandListChanged)
  5227. {
  5228. commandListChanged = false;
  5229. // m_commandList->SetGraphicsRootSignature(m_rootSignature);
  5230. // ID3D12DescriptorHeap* heaps[] = {
  5231. // m_samplerAllocator.getHeap(),
  5232. // scratchBuffer.getHeap(),
  5233. // };
  5234. // m_commandList->SetDescriptorHeaps(BX_COUNTOF(heaps), heaps);
  5235. currentPipeline = VK_NULL_HANDLE;
  5236. currentBindHash = 0;
  5237. currentDslHash = 0;
  5238. currentSamplerStateIdx = kInvalidHandle;
  5239. currentProgram = BGFX_INVALID_HANDLE;
  5240. currentState.clear();
  5241. currentState.m_scissor = !draw.m_scissor;
  5242. changedFlags = BGFX_STATE_MASK;
  5243. changedStencil = packStencil(BGFX_STENCIL_MASK, BGFX_STENCIL_MASK);
  5244. currentState.m_stateFlags = newFlags;
  5245. currentState.m_stencil = newStencil;
  5246. const uint64_t pt = newFlags&BGFX_STATE_PT_MASK;
  5247. primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT);
  5248. }
  5249. rendererUpdateUniforms(this, _render->m_uniformBuffer[draw.m_uniformIdx], draw.m_uniformBegin, draw.m_uniformEnd);
  5250. if (0 != draw.m_streamMask)
  5251. {
  5252. currentState.m_streamMask = draw.m_streamMask;
  5253. const uint64_t state = draw.m_stateFlags;
  5254. bool hasFactor = 0
  5255. || f0 == (state & f0)
  5256. || f1 == (state & f1)
  5257. || f2 == (state & f2)
  5258. || f3 == (state & f3)
  5259. ;
  5260. const VertexLayout* layouts[BGFX_CONFIG_MAX_VERTEX_STREAMS];
  5261. uint8_t numStreams = 0;
  5262. if (UINT8_MAX != draw.m_streamMask)
  5263. {
  5264. for (uint32_t idx = 0, streamMask = draw.m_streamMask
  5265. ; 0 != streamMask
  5266. ; streamMask >>= 1, idx += 1, ++numStreams
  5267. )
  5268. {
  5269. const uint32_t ntz = bx::uint32_cnttz(streamMask);
  5270. streamMask >>= ntz;
  5271. idx += ntz;
  5272. currentState.m_stream[idx].m_layoutHandle = draw.m_stream[idx].m_layoutHandle;
  5273. currentState.m_stream[idx].m_handle = draw.m_stream[idx].m_handle;
  5274. currentState.m_stream[idx].m_startVertex = draw.m_stream[idx].m_startVertex;
  5275. uint16_t handle = draw.m_stream[idx].m_handle.idx;
  5276. const VertexBufferVK& vb = m_vertexBuffers[handle];
  5277. const uint16_t decl = isValid(draw.m_stream[idx].m_layoutHandle)
  5278. ? draw.m_stream[idx].m_layoutHandle.idx
  5279. : vb.m_layoutHandle.idx
  5280. ;
  5281. const VertexLayout& layout = m_vertexLayouts[decl];
  5282. layouts[numStreams] = &layout;
  5283. }
  5284. }
  5285. VkPipeline pipeline =
  5286. getPipeline(state
  5287. , draw.m_stencil
  5288. , numStreams
  5289. , layouts
  5290. , key.m_program
  5291. , uint8_t(draw.m_instanceDataStride/16)
  5292. );
  5293. uint16_t scissor = draw.m_scissor;
  5294. uint32_t bindHash = bx::hash<bx::HashMurmur2A>(renderBind.m_bind, sizeof(renderBind.m_bind) );
  5295. if (pipeline != currentPipeline
  5296. || 0 != changedStencil)
  5297. {
  5298. const uint32_t fstencil = unpackStencil(0, draw.m_stencil);
  5299. const uint32_t ref = (fstencil&BGFX_STENCIL_FUNC_REF_MASK)>>BGFX_STENCIL_FUNC_REF_SHIFT;
  5300. vkCmdSetStencilReference(m_commandBuffer, VK_STENCIL_FRONT_AND_BACK, ref);
  5301. }
  5302. if (pipeline != currentPipeline
  5303. || (hasFactor && blendFactor != draw.m_rgba) )
  5304. {
  5305. blendFactor = draw.m_rgba;
  5306. float bf[4];
  5307. bf[0] = ( (draw.m_rgba>>24) )/255.0f;
  5308. bf[1] = ( (draw.m_rgba>>16)&0xff)/255.0f;
  5309. bf[2] = ( (draw.m_rgba>> 8)&0xff)/255.0f;
  5310. bf[3] = ( (draw.m_rgba )&0xff)/255.0f;
  5311. vkCmdSetBlendConstants(m_commandBuffer, bf);
  5312. }
  5313. if (0 != (BGFX_STATE_PT_MASK & changedFlags)
  5314. || prim.m_topology != s_primInfo[primIndex].m_topology)
  5315. {
  5316. const uint64_t pt = newFlags&BGFX_STATE_PT_MASK;
  5317. primIndex = uint8_t(pt>>BGFX_STATE_PT_SHIFT);
  5318. prim = s_primInfo[primIndex];
  5319. // m_commandList->IASetPrimitiveTopology(prim.m_topology);
  5320. }
  5321. if (currentState.m_scissor != scissor)
  5322. {
  5323. currentState.m_scissor = scissor;
  5324. if (UINT16_MAX == scissor)
  5325. {
  5326. if (restoreScissor
  5327. || viewHasScissor)
  5328. {
  5329. restoreScissor = false;
  5330. VkRect2D rc;
  5331. rc.offset.x = viewScissorRect.m_x;
  5332. rc.offset.y = viewScissorRect.m_y;
  5333. rc.extent.width = viewScissorRect.m_width;
  5334. rc.extent.height = viewScissorRect.m_height;
  5335. vkCmdSetScissor(m_commandBuffer, 0, 1, &rc);
  5336. }
  5337. }
  5338. else
  5339. {
  5340. restoreScissor = true;
  5341. Rect scissorRect;
  5342. scissorRect.setIntersect(viewScissorRect, _render->m_frameCache.m_rectCache.m_cache[scissor]);
  5343. VkRect2D rc;
  5344. rc.offset.x = scissorRect.m_x;
  5345. rc.offset.y = scissorRect.m_y;
  5346. rc.extent.width = scissorRect.m_width;
  5347. rc.extent.height = scissorRect.m_height;
  5348. vkCmdSetScissor(m_commandBuffer, 0, 1, &rc);
  5349. }
  5350. }
  5351. if (pipeline != currentPipeline)
  5352. {
  5353. currentPipeline = pipeline;
  5354. vkCmdBindPipeline(m_commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
  5355. }
  5356. bool constantsChanged = false;
  5357. if (draw.m_uniformBegin < draw.m_uniformEnd
  5358. || currentProgram.idx != key.m_program.idx
  5359. || BGFX_STATE_ALPHA_REF_MASK & changedFlags)
  5360. {
  5361. currentProgram = key.m_program;
  5362. ProgramVK& program = m_program[currentProgram.idx];
  5363. UniformBuffer* vcb = program.m_vsh->m_constantBuffer;
  5364. if (NULL != vcb)
  5365. {
  5366. commit(*vcb);
  5367. }
  5368. UniformBuffer* fcb = program.m_fsh->m_constantBuffer;
  5369. if (NULL != fcb)
  5370. {
  5371. commit(*fcb);
  5372. }
  5373. hasPredefined = 0 < program.m_numPredefined;
  5374. constantsChanged = true;
  5375. }
  5376. const ProgramVK& program = m_program[currentProgram.idx];
  5377. if (hasPredefined)
  5378. {
  5379. uint32_t ref = (newFlags & BGFX_STATE_ALPHA_REF_MASK) >> BGFX_STATE_ALPHA_REF_SHIFT;
  5380. viewState.m_alphaRef = ref / 255.0f;
  5381. viewState.setPredefined<4>(this, view, program, _render, draw);
  5382. }
  5383. if (currentBindHash != bindHash
  5384. || currentDslHash != program.m_descriptorSetLayoutHash)
  5385. {
  5386. currentBindHash = bindHash;
  5387. currentDslHash = program.m_descriptorSetLayoutHash;
  5388. allocDescriptorSet(program, renderBind, scratchBuffer);
  5389. }
  5390. uint32_t numOffset = 0;
  5391. uint32_t offsets[2] = { 0, 0 };
  5392. if (constantsChanged
  5393. || hasPredefined)
  5394. {
  5395. const uint32_t align = uint32_t(m_deviceProperties.limits.minUniformBufferOffsetAlignment);
  5396. const uint32_t vsize = bx::strideAlign(program.m_vsh->m_size, align);
  5397. const uint32_t fsize = bx::strideAlign((NULL != program.m_fsh ? program.m_fsh->m_size : 0), align);
  5398. const uint32_t total = vsize + fsize;
  5399. if (vsize > 0)
  5400. {
  5401. offsets[numOffset++] = scratchBuffer.m_pos;
  5402. bx::memCopy(&scratchBuffer.m_data[scratchBuffer.m_pos], m_vsScratch, program.m_vsh->m_size);
  5403. }
  5404. if (fsize > 0)
  5405. {
  5406. offsets[numOffset++] = scratchBuffer.m_pos + vsize;
  5407. bx::memCopy(&scratchBuffer.m_data[scratchBuffer.m_pos + vsize], m_fsScratch, program.m_fsh->m_size);
  5408. }
  5409. m_vsChanges = 0;
  5410. m_fsChanges = 0;
  5411. scratchBuffer.m_pos += total;
  5412. }
  5413. vkCmdBindDescriptorSets(
  5414. m_commandBuffer
  5415. , VK_PIPELINE_BIND_POINT_GRAPHICS
  5416. , program.m_pipelineLayout
  5417. , 0
  5418. , 1
  5419. , &scratchBuffer.getCurrentDS()
  5420. , numOffset
  5421. , offsets
  5422. );
  5423. // if (constantsChanged
  5424. // || hasPredefined)
  5425. // {
  5426. // ProgramVK& program = m_program[currentProgram.idx];
  5427. // uint32_t ref = (newFlags&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT;
  5428. // viewState.m_alphaRef = ref/255.0f;
  5429. // viewState.setPredefined<4>(this, view, program, _render, draw);
  5430. // commitShaderUniforms(m_commandBuffer, key.m_program); //, gpuAddress);
  5431. // }
  5432. // vb.setState(_commandList, D3D12_RESOURCE_STATE_GENERIC_READ);
  5433. uint32_t numIndices = 0;
  5434. for (uint32_t ii = 0; ii < numStreams; ++ii)
  5435. {
  5436. VkDeviceSize offset = 0;
  5437. vkCmdBindVertexBuffers(m_commandBuffer
  5438. , ii
  5439. , 1
  5440. , &m_vertexBuffers[draw.m_stream[ii].m_handle.idx].m_buffer
  5441. , &offset
  5442. );
  5443. }
  5444. if (isValid(draw.m_instanceDataBuffer))
  5445. {
  5446. VkDeviceSize instanceOffset = draw.m_instanceDataOffset;
  5447. VertexBufferVK& instanceBuffer = m_vertexBuffers[draw.m_instanceDataBuffer.idx];
  5448. vkCmdBindVertexBuffers(m_commandBuffer
  5449. , numStreams
  5450. , 1
  5451. , &instanceBuffer.m_buffer
  5452. , &instanceOffset
  5453. );
  5454. }
  5455. if (!isValid(draw.m_indexBuffer) )
  5456. {
  5457. const VertexBufferVK& vertexBuffer = m_vertexBuffers[draw.m_stream[0].m_handle.idx];
  5458. const VertexLayout* layout = layouts[0];
  5459. const uint32_t numVertices = UINT32_MAX == draw.m_numVertices
  5460. ? vertexBuffer.m_size / layout->m_stride
  5461. : draw.m_numVertices
  5462. ;
  5463. vkCmdDraw(m_commandBuffer
  5464. , numVertices
  5465. , draw.m_numInstances
  5466. , draw.m_stream[0].m_startVertex
  5467. , 0
  5468. );
  5469. }
  5470. else
  5471. {
  5472. BufferVK& ib = m_indexBuffers[draw.m_indexBuffer.idx];
  5473. const bool hasIndex16 = 0 == (ib.m_flags & BGFX_BUFFER_INDEX32);
  5474. const uint32_t indexSize = hasIndex16 ? 2 : 4;
  5475. numIndices = UINT32_MAX == draw.m_numIndices
  5476. ? ib.m_size / indexSize
  5477. : draw.m_numIndices
  5478. ;
  5479. vkCmdBindIndexBuffer(m_commandBuffer
  5480. , ib.m_buffer
  5481. , 0
  5482. , hasIndex16
  5483. ? VK_INDEX_TYPE_UINT16
  5484. : VK_INDEX_TYPE_UINT32
  5485. );
  5486. vkCmdDrawIndexed(m_commandBuffer
  5487. , numIndices
  5488. , draw.m_numInstances
  5489. , draw.m_startIndex
  5490. , draw.m_stream[0].m_startVertex
  5491. , 0
  5492. );
  5493. }
  5494. uint32_t numPrimsSubmitted = numIndices / prim.m_div - prim.m_sub;
  5495. uint32_t numPrimsRendered = numPrimsSubmitted*draw.m_numInstances;
  5496. statsNumPrimsSubmitted[primIndex] += numPrimsSubmitted;
  5497. statsNumPrimsRendered[primIndex] += numPrimsRendered;
  5498. statsNumInstances[primIndex] += draw.m_numInstances;
  5499. statsNumIndices += numIndices;
  5500. if (hasOcclusionQuery)
  5501. {
  5502. // m_occlusionQuery.begin(m_commandList, _render, draw.m_occlusionQuery);
  5503. // m_batch.flush(m_commandList);
  5504. // m_occlusionQuery.end(m_commandList);
  5505. }
  5506. }
  5507. }
  5508. if (wasCompute)
  5509. {
  5510. setViewType(view, "C");
  5511. BGFX_VK_PROFILER_END();
  5512. BGFX_VK_PROFILER_BEGIN(view, kColorCompute);
  5513. }
  5514. submitBlit(bs, BGFX_CONFIG_MAX_VIEWS);
  5515. // m_batch.end(m_commandList);
  5516. }
  5517. BGFX_VK_PROFILER_END();
  5518. int64_t timeEnd = bx::getHPCounter();
  5519. int64_t frameTime = timeEnd - timeBegin;
  5520. static int64_t min = frameTime;
  5521. static int64_t max = frameTime;
  5522. min = bx::min<int64_t>(min, frameTime);
  5523. max = bx::max<int64_t>(max, frameTime);
  5524. static uint32_t maxGpuLatency = 0;
  5525. static double maxGpuElapsed = 0.0f;
  5526. double elapsedGpuMs = 0.0;
  5527. BX_UNUSED(maxGpuLatency, maxGpuElapsed, elapsedGpuMs);
  5528. static int64_t presentMin = 0; //m_presentElapsed;
  5529. static int64_t presentMax = 0; //m_presentElapsed;
  5530. BX_UNUSED(presentMin, presentMax);
  5531. // presentMin = bx::min<int64_t>(presentMin, m_presentElapsed);
  5532. // presentMax = bx::max<int64_t>(presentMax, m_presentElapsed);
  5533. // m_gpuTimer.end(m_commandList);
  5534. // while (m_gpuTimer.get() )
  5535. // {
  5536. // double toGpuMs = 1000.0 / double(m_gpuTimer.m_frequency);
  5537. // elapsedGpuMs = m_gpuTimer.m_elapsed * toGpuMs;
  5538. // maxGpuElapsed = elapsedGpuMs > maxGpuElapsed ? elapsedGpuMs : maxGpuElapsed;
  5539. // }
  5540. // maxGpuLatency = bx::uint32_imax(maxGpuLatency, m_gpuTimer.m_control.available()-1);
  5541. const int64_t timerFreq = bx::getHPFrequency();
  5542. Stats& perfStats = _render->m_perfStats;
  5543. perfStats.cpuTimeBegin = timeBegin;
  5544. perfStats.cpuTimeEnd = timeEnd;
  5545. perfStats.cpuTimerFreq = timerFreq;
  5546. // perfStats.gpuTimeBegin = m_gpuTimer.m_begin;
  5547. // perfStats.gpuTimeEnd = m_gpuTimer.m_end;
  5548. // perfStats.gpuTimerFreq = m_gpuTimer.m_frequency;
  5549. // perfStats.numDraw = statsKeyType[0];
  5550. // perfStats.numCompute = statsKeyType[1];
  5551. perfStats.numBlit = _render->m_numBlitItems;
  5552. // perfStats.maxGpuLatency = maxGpuLatency;
  5553. bx::memCopy(perfStats.numPrims, statsNumPrimsRendered, sizeof(perfStats.numPrims) );
  5554. perfStats.gpuMemoryMax = -INT64_MAX;
  5555. perfStats.gpuMemoryUsed = -INT64_MAX;
  5556. if (_render->m_debug & (BGFX_DEBUG_IFH|BGFX_DEBUG_STATS) )
  5557. {
  5558. BGFX_VK_PROFILER_BEGIN_LITERAL("debugstats", kColorFrame);
  5559. // m_needPresent = true;
  5560. TextVideoMem& tvm = m_textVideoMem;
  5561. static int64_t next = timeEnd;
  5562. if (timeEnd >= next)
  5563. {
  5564. next = timeEnd + timerFreq;
  5565. double freq = double(timerFreq);
  5566. double toMs = 1000.0 / freq;
  5567. tvm.clear();
  5568. uint16_t pos = 0;
  5569. tvm.printf(0, pos++, BGFX_CONFIG_DEBUG ? 0x8c : 0x8f
  5570. , " %s / " BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME " "
  5571. , getRendererName()
  5572. );
  5573. const VkPhysicalDeviceProperties& pdp = m_deviceProperties;
  5574. tvm.printf(0, pos++, 0x8f, " Device: %s (%s)"
  5575. , pdp.deviceName
  5576. , getName(pdp.deviceType)
  5577. );
  5578. if (s_extension[Extension::EXT_memory_budget].m_supported)
  5579. {
  5580. VkPhysicalDeviceMemoryBudgetPropertiesEXT dmbp;
  5581. dmbp.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_BUDGET_PROPERTIES_EXT;
  5582. dmbp.pNext = NULL;
  5583. VkPhysicalDeviceMemoryProperties2 pdmp2;
  5584. pdmp2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MEMORY_PROPERTIES_2;
  5585. pdmp2.pNext = &dmbp;
  5586. vkGetPhysicalDeviceMemoryProperties2KHR(m_physicalDevice, &pdmp2);
  5587. for (uint32_t ii = 0; ii < VK_MAX_MEMORY_HEAPS; ++ii)
  5588. {
  5589. if (dmbp.heapBudget[ii] == 0)
  5590. {
  5591. continue;
  5592. }
  5593. char budget[16];
  5594. bx::prettify(budget, BX_COUNTOF(budget), dmbp.heapBudget[ii]);
  5595. char usage[16];
  5596. bx::prettify(usage, BX_COUNTOF(usage), dmbp.heapUsage[ii]);
  5597. tvm.printf(0, pos++, 0x8f, " Memory %d - Budget: %12s, Usage: %12s"
  5598. , ii
  5599. , budget
  5600. , usage
  5601. );
  5602. }
  5603. }
  5604. pos = 10;
  5605. tvm.printf(10, pos++, 0x8b, " Frame: % 7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] / % 6.2f FPS "
  5606. , double(frameTime)*toMs
  5607. , double(min)*toMs
  5608. , double(max)*toMs
  5609. , freq/frameTime
  5610. );
  5611. // tvm.printf(10, pos++, 0x8b, " Present: % 7.3f, % 7.3f \x1f, % 7.3f \x1e [ms] "
  5612. // , double(m_presentElapsed)*toMs
  5613. // , double(presentMin)*toMs
  5614. // , double(presentMax)*toMs
  5615. // );
  5616. const uint32_t msaa = (m_resolution.reset&BGFX_RESET_MSAA_MASK)>>BGFX_RESET_MSAA_SHIFT;
  5617. tvm.printf(10, pos++, 0x8b, " Reset flags: [%c] vsync, [%c] MSAAx%d, [%c] MaxAnisotropy "
  5618. , !!(m_resolution.reset&BGFX_RESET_VSYNC) ? '\xfe' : ' '
  5619. , 0 != msaa ? '\xfe' : ' '
  5620. , 1<<msaa
  5621. , !!(m_resolution.reset&BGFX_RESET_MAXANISOTROPY) ? '\xfe' : ' '
  5622. );
  5623. double elapsedCpuMs = double(frameTime)*toMs;
  5624. tvm.printf(10, pos++, 0x8b, " Submitted: %5d (draw %5d, compute %4d) / CPU %7.4f [ms] "
  5625. , _render->m_numRenderItems
  5626. , statsKeyType[0]
  5627. , statsKeyType[1]
  5628. , elapsedCpuMs
  5629. );
  5630. for (uint32_t ii = 0; ii < Topology::Count; ++ii)
  5631. {
  5632. tvm.printf(10, pos++, 0x8b, " %9s: %7d (#inst: %5d), submitted: %7d "
  5633. , getName(Topology::Enum(ii) )
  5634. , statsNumPrimsRendered[ii]
  5635. , statsNumInstances[ii]
  5636. , statsNumPrimsSubmitted[ii]
  5637. );
  5638. }
  5639. // tvm.printf(10, pos++, 0x8b, " Batch: %7dx%d indirect, %7d immediate "
  5640. // , m_batch.m_stats.m_numIndirect[BatchD3D12::Draw]
  5641. // , m_batch.m_maxDrawPerBatch
  5642. // , m_batch.m_stats.m_numImmediate[BatchD3D12::Draw]
  5643. // );
  5644. // tvm.printf(10, pos++, 0x8b, " %7dx%d indirect, %7d immediate "
  5645. // , m_batch.m_stats.m_numIndirect[BatchD3D12::DrawIndexed]
  5646. // , m_batch.m_maxDrawPerBatch
  5647. // , m_batch.m_stats.m_numImmediate[BatchD3D12::DrawIndexed]
  5648. // );
  5649. if (NULL != m_renderDocDll)
  5650. {
  5651. tvm.printf(tvm.m_width-27, 0, 0x4f, " [F11 - RenderDoc capture] ");
  5652. }
  5653. tvm.printf(10, pos++, 0x8b, " Indices: %7d ", statsNumIndices);
  5654. // tvm.printf(10, pos++, 0x8b, " Uniform size: %7d, Max: %7d ", _render->m_uniformEnd, _render->m_uniformMax);
  5655. tvm.printf(10, pos++, 0x8b, " DVB size: %7d ", _render->m_vboffset);
  5656. tvm.printf(10, pos++, 0x8b, " DIB size: %7d ", _render->m_iboffset);
  5657. pos++;
  5658. tvm.printf(10, pos++, 0x8b, " State cache: ");
  5659. tvm.printf(10, pos++, 0x8b, " PSO | DSL | DS | Queued ");
  5660. tvm.printf(10, pos++, 0x8b, " %6d | %6d | %6d | %6d "
  5661. , m_pipelineStateCache.getCount()
  5662. , m_descriptorSetLayoutCache.getCount()
  5663. , scratchBuffer.m_currentDs
  5664. // , m_cmd.m_control.available()
  5665. );
  5666. pos++;
  5667. double captureMs = double(captureElapsed)*toMs;
  5668. tvm.printf(10, pos++, 0x8b, " Capture: %7.4f [ms] ", captureMs);
  5669. uint8_t attr[2] = { 0x8c, 0x8a };
  5670. uint8_t attrIndex = _render->m_waitSubmit < _render->m_waitRender;
  5671. tvm.printf(10, pos++, attr[attrIndex&1], " Submit wait: %7.4f [ms] ", _render->m_waitSubmit*toMs);
  5672. tvm.printf(10, pos++, attr[(attrIndex+1)&1], " Render wait: %7.4f [ms] ", _render->m_waitRender*toMs);
  5673. min = frameTime;
  5674. max = frameTime;
  5675. // presentMin = m_presentElapsed;
  5676. // presentMax = m_presentElapsed;
  5677. }
  5678. blit(this, _textVideoMemBlitter, tvm);
  5679. BGFX_VK_PROFILER_END();
  5680. }
  5681. else if (_render->m_debug & BGFX_DEBUG_TEXT)
  5682. {
  5683. BGFX_VK_PROFILER_BEGIN_LITERAL("debugtext", kColorFrame);
  5684. blit(this, _textVideoMemBlitter, _render->m_textVideoMem);
  5685. BGFX_VK_PROFILER_END();
  5686. }
  5687. const uint32_t align = uint32_t(m_deviceProperties.limits.nonCoherentAtomSize);
  5688. const uint32_t size = bx::min(bx::strideAlign(scratchBuffer.m_pos, align), scratchBuffer.m_size);
  5689. VkMappedMemoryRange range;
  5690. range.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
  5691. range.pNext = NULL;
  5692. range.memory = scratchBuffer.m_deviceMem;
  5693. range.offset = 0;
  5694. range.size = size;
  5695. vkFlushMappedMemoryRanges(m_device, 1, &range);
  5696. if (beginRenderPass)
  5697. {
  5698. vkCmdEndRenderPass(m_commandBuffer);
  5699. beginRenderPass = false;
  5700. }
  5701. setImageMemoryBarrier(m_commandBuffer
  5702. , m_backBufferColorImage[m_backBufferColorIdx]
  5703. , VK_IMAGE_ASPECT_COLOR_BIT
  5704. , m_backBufferColorImageLayout[m_backBufferColorIdx]
  5705. , VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
  5706. , 1, 1);
  5707. m_backBufferColorImageLayout[m_backBufferColorIdx] = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
  5708. VK_CHECK(vkEndCommandBuffer(m_commandBuffer) );
  5709. kick(renderWait); //, m_presentDone[m_backBufferColorIdx]);
  5710. finishAll();
  5711. VK_CHECK(vkResetCommandPool(m_device, m_commandPool, 0) );
  5712. }
  5713. } /* namespace vk */ } // namespace bgfx
  5714. #else
  5715. namespace bgfx { namespace vk
  5716. {
  5717. RendererContextI* rendererCreate(const Init& _init)
  5718. {
  5719. BX_UNUSED(_init);
  5720. return NULL;
  5721. }
  5722. void rendererDestroy()
  5723. {
  5724. }
  5725. } /* namespace vk */ } // namespace bgfx
  5726. #endif // BGFX_CONFIG_RENDERER_VULKAN