Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • panfrost/mesa
  • lima/mesa
  • anarsoul/mesa
  • mesa/mesa
  • kwg/mesa
  • curan/mesa
  • kusma/mesa
  • gfxstrand/mesa
  • ajax/mesa
  • FireBurn/mesa
  • bnieuwenhuizen/mesa
  • tarceri/mesa
  • chuckatkins/mesa
  • cmarcelo/mesa
  • anholt/mesa
  • rantogno/mesa
  • gerddie/mesa
  • keithp/mesa
  • chema/mesa
  • airlied/mesa
  • majanes/mesa
  • craftyguy/mesa
  • gurchetansingh/mesa
  • mvicomoya/mesa
  • kallisti5/mesa
  • bochecha/mesa
  • pauk.denis/mesa
  • dbaker/mesa
  • krh/mesa
  • jasuarez/mesa
  • sagarghuge/mesa
  • ofourdan/mesa
  • ickle/mesa
  • zzoon/mesa
  • Keenuts/mesa
  • tpohjola/mesa
  • velurimithun/mesa
  • cwabbott0/mesa
  • Richard_Yunchao/mesa
  • bkmgit/mesa
  • sima/mesa
  • GL/mesa
  • frkoenig/mesa
  • adelva1984/mesa
  • linyaa/mesa
  • slavslav/mesa
  • daniels/mesa
  • rellla/mesa
  • hakzsam/mesa
  • lyudess/panfrost-mesa
  • narmstrong/mesa-lima
  • robertfoss/mesa
  • nh/mesa
  • carlosg/mesa
  • jvesely/mesa
  • xlin16/mesa
  • narmstrong/panfrost-mesa
  • narmstrong/mesa
  • david.hanna11/mesa
  • idr/mesa
  • jljusten/mesa
  • antonovitch/mesa
  • arnomessiaen/mesa
  • mattst88/mesa
  • tpalli/mesa
  • mmha/mesa
  • llandwerlin/mesa
  • zumbi/mesa
  • rhyskidd/mesa
  • vlee/mesa
  • pmoreau/mesa
  • coypoop/mesa
  • jturney/mesa
  • strassek/mesa
  • olv/mesa
  • flto/mesa
  • iglosiggio/mesa
  • frohlich/mesa
  • karolherbst/mesa
  • elima/mesa
  • AtoningUnifex/mesa
  • tlonnber/mesa
  • samuelig/mesa
  • apinheiro/mesa
  • sjoerd/mesa
  • ahota/mesa
  • robh/mesa
  • daniel-schuermann/mesa
  • alistair23/mesa
  • linkmauve/mesa
  • elongbug/mesa
  • Haxk20/mesa
  • bartoldeman/mesa
  • daenzer/mesa
  • tjaalton/mesa
  • dhewg/mesa
  • Venemo/mesa
  • alyssa/mesa
  • Hi-Angel/mesa
  • carnaval/mesa
  • victure86/mesa
  • robclark/mesa
  • Vivek/mesa
  • tutankhamen/mesa
  • hopetech/mesa
  • marmeladema/mesa
  • ibriano/mesa
  • tanty/mesa
  • Oschowa/mesa
  • nroberts/mesa
  • zhanglei002/mesa
  • pal1000/mesa
  • xxxbxxx/mesa
  • lyudess/mesa
  • bentiss/mesa
  • afrantzis/mesa
  • yuq825/mesa
  • jamesxio/mesa
  • lkundrak/mesa
  • aphogat/mesa
  • ZeGentzy/mesa
  • aqxa1/mesa
  • mareko/mesa
  • austriancoder/mesa
  • jrtc27/mesa
  • skirk/mesa
  • grmat/mesa
  • heinrich.fink/mesa
  • el_christianito/mesa
  • davidriley/mesa
  • starnight/mesa
  • davidbepo/mesa
  • pendingchaos/mesa
  • icenowy/mesa
  • dominikd/mesa
  • zmike/mesa
  • tzimmermann/mesa
  • enunes/mesa
  • noblock/mesa
  • pzanoni/mesa
  • hygonsoc/mesa
  • lrusak/mesa
  • cap/mesa
  • pepp/mesa
  • axeldavy/mesa
  • domen55/mesa
  • john.stultz/mesa
  • jadahl/mesa
  • 10110111/mesa
  • alexvillacislasso/mesa
  • jzielins/mesa
  • pmanolova/mesa
  • nicholasbishop/mesa
  • david.boddie.puri.sm/mesa
  • agx/mesa
  • krzysztof.raszkowski/mesa
  • KhaledEmaraDev/mesa
  • itoral/mesa
  • shadeslayer/mesa
  • kszaq/mesa
  • haihao/mesa
  • wanderman.luck/mesa
  • Chunming-Zhou/mesa
  • emersion/mesa
  • agoldmints/mesa
  • marex/mesa
  • renchenglei/mesa
  • dbehr/mesa
  • zhen/mesa
  • ndufresne/mesa
  • abergmeier/mesa
  • grimkriegor/mesa
  • dlehman25/mesa
  • mmenzyns/mesa
  • jorgenatz/mesa
  • lostgoat/mesa
  • xexaxo/mesa
  • lynxeye/mesa
  • roman.stratiienko/mesa
  • brianp/mesa
  • Ericson2314/mesa
  • lfrb/mesa
  • dongwonk/mesa
  • pH5/mesa
  • q66/mesa
  • lepton/mesa
  • nia/mesa
  • AmanPatel599/mesa
  • currojerez/mesa
  • mol/mesa
  • danyspin97/mesa
  • zeising/mesa
  • mvlad/mesa
  • ssbertilson/mesa
  • Tofe/mesa
  • tomeu/mesa
  • kenmays/mesa
  • smbarber/mesa
  • dgstevens/mesa
  • YaLTeR/mesa
  • issor.oruam/mesa
  • cubanismo/mesa
  • bnf/mesa
  • libcg/mesa
  • bbrezillon/mesa
  • y2kenny/mesa
  • leandrohrb/mesa
  • psii/mesa
  • maos20008/mesa
  • MarijnS95/mesa
  • urjaman/mesa
  • banzr/mesa
  • rmader/mesa
  • daniels-test/mesa
  • thongthai/mesa
  • leoliu/mesa
  • baryluk/mesa
  • macieksolinski49/mesa
  • shikhar394/mesa
  • awatry/mesa
  • lordheavym/mesa
  • degasus/mesa
  • rg3igalia/mesa
  • miguelecasassanchez/mesa
  • italonicola/mesa
  • luis.mendes/mesa
  • bcrocker/mesa
  • pcercuei/mesa
  • Ikke/mesa
  • pelwell/mesa
  • John-Gee/mesa
  • Plagman/mesa
  • liyi42/mesa
  • Behem0th/mesa
  • kraj/mesa
  • abordado/mesa
  • romangg/mesa
  • sonny/mesa
  • ruanc/mesa
  • icecream95/mesa
  • tpyra/mesa
  • mariogrip/mesa
  • avdgrinten/mesa
  • Stephan/mesa
  • imbens/mesa
  • dh/mesa
  • stev47/mesa
  • haasn/mesa
  • RaspberryPiFan/mesa
  • sthibaul/mesa
  • zahraee.sm/mesa
  • brkho/mesa
  • lemon.py/mesa
  • sonicadvance1/mesa
  • Lasse/mesa
  • zhangjie/mesa
  • djogorchock/mesa
  • ShirishS/mesa
  • zhuravlev1134/mesa
  • castout/mesa
  • martin.fuzzey/mesa
  • idas/mesa
  • apesch/mesa
  • ngcortes/mesa
  • manu/mesa
  • JAYL/mesa
  • neochapay/mesa
  • w-flo/mesa
  • timkrause/mesa
  • ddavenport/mesa
  • thomash/mesa
  • andrzejuk.szymon/mesa
  • bkuhls/mesa
  • julianwi/mesa
  • aroth-fastprotect/mesa
  • DadSchoorse/mesa
  • berolinux/mesa
  • charmainel/mesa
  • shawn.p.huang/mesa
  • paska/mesa
  • hjl.tools/mesa
  • sroland/mesa
  • aacid/mesa
  • frog/mesa
  • scott-ph/mesa
  • awilfox/mesa
  • nyanmisaka/mesa
  • stalkerg/mesa
  • Cwiiis/mesa
  • imirkin/mesa
  • Bizjak/mesa
  • psreport/mesa
  • duncan.hopkins/mesa
  • maxice8/mesa
  • orbea/mesa
  • eschwartz/mesa
  • edmondo/mesa
  • jrfonseca/mesa
  • bbarladian/mesa
  • bhenden/mesa
  • alucowie/mesa
  • RAOF/mesa
  • leigh123linux/mesa
  • gtucker/mesa
  • LouisLi/mesa
  • sjnewbury/mesa
  • saavedra.pablo/mesa
  • ascent/mesa
  • wyqkp/mesa
  • Shao-Feng/mesa
  • jzhums/mesa
  • plevine457/mesa
  • tobiasjakobi/mesa
  • jpalus/mesa
  • yuzaipiaofei/mesa
  • jenatali/mesa
  • abhishek4/mesa
  • njha/mesa
  • konradybcio/mesa
  • mslusarz/mesa
  • fents290/mesa
  • edb/mesa
  • chewitt/mesa
  • ckolivas/mesa
  • blaztinn/mesa
  • cooperch/mesa
  • hikiko/mesa
  • adityaatluri/mesa
  • AniLeo/mesa
  • JibbityJobbity/mesa
  • rashedabdeltawab/mesa
  • ashafer/mesa
  • cme3000/mesa
  • farnoy/mesa
  • asheplyakov/mesa
  • kjliew/mesa
  • hanno/mesa
  • mikeroyal/mesa
  • ssingh/mesa
  • vitalyp/mesa
  • jpark37/mesa
  • mkasprza/mesa
  • WGH/mesa
  • mtmkls/mesa
  • vliaskov/mesa
  • kleinerm/mesa
  • hafixo/mesa
  • SureshG/mesa
  • mntmn/mesa
  • jbeich/mesa
  • yaongtime/mesa
  • xdontwox/mesa
  • jsg/mesa
  • EasyIP2023/mesa
  • Satyajit/mesa
  • jmunhoz/mesa
  • luigi.santivetti/mesa
  • italove/mesa
  • shawnguo/mesa
  • ricardoquesada/mesa
  • bcheng/mesa
  • Fahien/mesa
  • chrisf/mesa
  • alexhenrie/mesa
  • Yaong/mesa
  • gtskhadadze83/mesa
  • brightclark/mesa
  • gongmingqing/mesa
  • chturne/mesa
  • fjdegroo/mesa
  • dwg/mesa
  • hattrickcr7/mesa
  • Corngood/mesa
  • ccallawa/mesa
  • nh2/mesa
  • neobrain/mesa
  • yogeshmohan/mesa
  • felixonmars/mesa
  • hch12907/mesa
  • kode54/mesa
  • Sudland/mesa
  • woodychow/mesa
  • pichika/mesa
  • jschueller/mesa
  • tagr/mesa
  • Yang/mesa
  • ChaojiangLuo/mesa
  • vivekvpandya/mesa
  • yshui/mesa
  • av.linux.dev/mesa
  • DPA/mesa
  • m.tretter/mesa
  • mcoffin/mesa
  • johnkeeping/mesa
  • zhuyong/mesa
  • wareyang/mesa
  • jbates/mesa
  • boyzhang/mesa
  • padovan/mesa
  • xxmitsu/mesa
  • skarczew/mesa
  • alimon/mesa
  • RavenGSD/mesa
  • tguillem/mesa
  • mupuf/mesa
  • rui/mesa
  • ryanneph/mesa
  • Igortorrente/mesa
  • randrianasulu/mesa
  • dmrlawson/mesa
  • Jsn2win/mesa
  • krupatel/mesa
  • sahouston/mesa
  • tangm/mesa
  • qarmin/mesa
  • alex.kanavin/mesa
  • johnbradstreet/mesa
  • igor.v.kovalenko/mesa
  • OnikenX/mesa
  • martell/mesa
  • themaister/mesa
  • BranDougherty/mesa
  • MJDSys/mesa
  • segfaultxavi/mesa
  • pleath/mesa
  • tongwang-en/mesa
  • ptt-en/mesa
  • JoelLinn/mesa
  • Danil/mesa
  • theogen/mesa
  • luigifcruz/mesa
  • chenli/mesa
  • vjaquez/mesa
  • apopple/mesa
  • theozzhh79/mesa
  • BryanQuigley/mesa
  • rroohhh/mesa
  • caramelli/mesa
  • mforney/mesa
  • yannik/mesa
  • twoerner/mesa
  • zhangguoqing.kernel/mesa
  • swartzlib7/mesa
  • sergey042011/mesa
  • nicuborta123/mesa
  • lyintel/mesa
  • q4a/mesa-panfrost
  • q4a/mesa
  • alexander.kapshuk/mesa
  • stephane.marchesin/mesa
  • jeremyhu/mesa
  • bl4ckb0ne/mesa
  • geecandrey/mesa
  • wenxiaoming/mesa
  • billkris.ms/mesa
  • ella/mesa
  • luporl/mesa
  • danielzgtg/mesa
  • frediz/mesa
  • lubosz/mesa
  • gio/mesa
  • rsmith/mesa
  • neo.tzion/mesa
  • pundiramit/mesa
  • zongzi13545329/mesa
  • Mic92/mesa
  • mwnn/mesa
  • tamara-schmitz/mesa
  • luckyxxl/mesa
  • jcline/mesa
  • akihiko.odaki/mesa
  • yugang/mesa
  • lljgithub/mesa
  • leeball/mesa
  • dianders/mesa
  • tina/mesa
  • jschwartzentruber/mesa
  • maccraft/mesa
  • vsyrjala/mesa
  • timothee.chabat/mesa
  • adirat/mesa
  • egalli/mesa
  • zhenhanintel/mesa
  • ccrtnsp/mesa
  • tintou/mesa
  • mhenning/mesa
  • blaws05/mesa
  • Zamundaaa/mesa
  • retrooper/mesa
  • ernstp/mesa
  • xoddark/mesa
  • ericonr/mesa
  • axylp/mesa
  • Edgeworth/mesa
  • siyueyinghua/mesa
  • asahi/mesa
  • JN-Chen/mesa
  • alshi-msft/mesa
  • williamvds/mesa
  • kupper.pa/mesa
  • A-w-x/mesa
  • Lucretia/mesa
  • shannonliu011/mesa
  • bastianbeischer/mesa
  • CosineMath/mesa
  • zzyiwei/mesa
  • lucmann/mesa
  • spronovo/mesa
  • xgupta/mesa
  • oldherl/mesa
  • ezequielgarcia/mesa
  • mercuriete/mesa
  • lumag/mesa
  • msisov/mesa
  • jialina/mesa
  • Zakhrov/mesa
  • hexin.op/mesa
  • FrostKiwi/mesa
  • PaulKocialkowski/mesa
  • flightlessmango/mesa
  • arkamar/mesa
  • khfeng/mesa
  • mrisaacb/mesa
  • zhangxiaolin.a/mesa
  • chivay/mesa
  • Daft-Freak/mesa
  • iemaghni/mesa
  • amonakov/mesa
  • zhaofengli/mesa
  • mwalle/mesa
  • marcan/mesa
  • davidedmundson/mesa
  • qihangkong/mesa
  • philn/mesa
  • lfelipe/mesa
  • Mystro256/mesa
  • wicastC/mesa
  • Gofman/mesa
  • nurmukhametov/mesa
  • ishitatsuyuki/mesa
  • phomes/mesa
  • AlexZ/mesa
  • Ermine/mesa
  • mwen/mesa
  • zboszor/mesa
  • Tooniis/mesa
  • lorenz/mesa
  • tantan/mesa
  • liamwhite/mesa
  • dyang23/mesa
  • aswarup/mesa
  • shengyao/mesa
  • zhuyl/mesa
  • bvarner/mesa
  • jeff_shuai/mesa
  • jpewhacker/mesa
  • suijingfeng/mesa
  • svenny/mesa
  • xantares/mesa
  • nicuborta/mesa
  • rakko/mesa
  • WangChuan/mesa
  • thomas.wagner/mesa
  • janjanmostafa8/mesa
  • gallo/mesa
  • gh6h56j85ihg/mesa
  • quantum/mesa
  • liuyujun/mesa
  • edman007/mesa
  • mattvchandler/mesa
  • ebaker/mesa
  • mherrb/mesa
  • alxu/mesa
  • mikezackles/mesa
  • ArvindYadav/mesa-amd
  • satmandu/mesa
  • gdevi/mesa
  • gawin/mesa
  • rbrune/mesa
  • mwezdeck/mesa
  • derekf/mesa
  • amos/mesa
  • sadlerap/mesa
  • kbrenneman/mesa
  • augustin.zidek/mesa
  • arichardson/mesa
  • jasberc/mesa
  • Pokechu22/mesa
  • h0tc0d3/mesa
  • HayashiEsme/mesa
  • Lone_Wolf/mesa
  • maniraj87/mesa
  • bbeckett/mesa
  • scholzi1980/mesa
  • ssidhart/mesa
  • mstoeckl/mesa
  • shanshengwang/mesa
  • lukvec27/mesa
  • cristicc/mesa
  • autumnontape/mesa
  • smcv/mesa
  • elmarco/mesa
  • jchen10/mesa
  • rbernon/mesa
  • Cherser-s/mesa
  • mhillenbrand/mesa
  • t.clastres/mesa
  • jxzgithub/mesa
  • Daasin/mesa-bak
  • JoseExposito/mesa
  • stefandoesinger/mesa
  • lygstate/mesa
  • larumbe/mesa
  • renatopereyra/mesa
  • raininggibs/mesa
  • sin3point14/mesa
  • chris8136393/mesa
  • microlinux/mesa
  • Markus-included/mesa
  • Jason2013/mesa
  • xndcn/mesa
  • ryan.krattiger/mesa
  • badsector/mesa
  • hamarb123/mesa
  • frankbinns/mesa
  • yulang/mesa
  • mmp.dux/mesa
  • charles-lunarg/mesa
  • gt23263tq/mesa
  • KonstantinSeurer/mesa
  • ondracka/mesa
  • biju.das.au/mesa
  • apauk/mesa
  • zwuj/mesa
  • samael/mesa
  • croberts81/mesa
  • nanokatze/mesa
  • kwk/mesa
  • StefanBruens/mesa
  • parasyte/mesa
  • kvark/mesa
  • longxin2019/mesa
  • jorcrous/mesa
  • igor.torrente/mesa
  • AidoP/mesa
  • shmerl/mesa
  • preda/mesa
  • andrey-konovalov/mesa
  • peterh/mesa
  • otaviobp/mesa
  • zeekim/mesa
  • vkoul/mesa
  • bigon/mesa
  • beviu/mesa
  • alatiera/mesa
  • cvurdige/chandan-mesa
  • jesse.zhang/mesa
  • MTCoster/mesa
  • digetx/mesa
  • gbelgurr/mesa
  • akien/mesa
  • tales-aparecida/mesa
  • jocelyn/mesa
  • helen.fornazier/mesa
  • wingdeans/mesa
  • superm1/mesa
  • justsid/mesa
  • mallemsalam/mesa
  • rajnesh-kanwal/mesa
  • illiliti/mesa
  • ghishadow/mesa
  • YusufKhan-gamedev/mesa
  • jbillingsley/mesa
  • illwieckz/mesa
  • sergi/mesa
  • jevolk/mesa
  • arunpravin24/mesa
  • jeffk/mesa
  • bkylerussell/mesa
  • jjjighg/mesa
  • Ken2022/mesa
  • skywing/mesa
  • sharny/mesa
  • vitorhnn/mesa
  • a-wai/mesa
  • xperia64/mesa
  • yuesOctober/mesa
  • nouveau/mesa
  • zzag/mesa
  • yurikoles/mesa
  • dawnhan/mesa
  • garnet/mesa
  • andrescj-chromium/mesa
  • aleasto/mesa
  • zhangn1985/mesa
  • fangbaohui/mesa
  • tiago.shibata/mesa
  • flynnjiang/mesa
  • dikidiki26138/mesa
  • bnagappa/mesa
  • zhoubm/mesa
  • wuwh91/mesa
  • chandupokuru/mesa
  • JoniSt/mesa
  • pixelcluster/mesa
  • kuove/mesa
  • asahilina/mesa
  • evelez/mesa
  • skeller/mesa
  • limingchina1/mesa
  • panos-lunarg/mesa
  • zehortigoza/mesa
  • i509VCB/mesa
  • bigbear1385/mesa
  • tbettler/mesa
  • skyostil/mesa
  • Soroush/mesa
  • newbluemoon/mesa
  • jdtatz/mesa
  • chuansheng/mesa
  • jjun.9523/mesa
  • kai/mesa
  • jheaff1/mesa
  • TSnake41/mesa
  • flakylawww/mesa
  • alexfanqi/mesa
  • dakr/mesa
  • TheSpydog/mesa
  • ikshwaku.chauhan_amd/ikshwaku-mesa
  • justonli/mesa
  • Frogging101/mesa
  • sarojk/mesa
  • sjfricke/mesa
  • PixelyIon/mesa
  • adolfintel/mesa
  • vikramsingh0204/mesa
  • riteo/mesa
  • xphillyx/mesa
  • markboth/mesa
  • MaxKellermann/mesa
  • bitstreamout/mesa-fork
  • kg233/mesa-rkuixi-fork
  • zhililab/mesa
  • isinyaaa/mesa
  • swick/mesa
  • JeremyRand/mesa
  • thomas.devoogdt/mesa
  • Thaodan/mesa
  • delphij/mesa
  • zhanglianjie-163/mesa
  • d.ivo/mesa
  • os369510/mesa
  • shanep/mesa
  • alikates/mesa
  • Smokey365/mesa
  • nanotwerp/nanomesa
  • Beyley/mesa-glide
  • semjon00/mesa
  • andri/mesa
  • jadeja14890/mesa
  • bydavenet/mesa
  • mainiomano/mesa
  • flibitijibibo/mesa
  • endlesspring/mesa
  • kulikjak/mesa
  • lun/mesa
  • RandomShaper/mesa
  • georgeouzou/mesa
  • christophe-lunarg/mesa
  • Reiver/mesa
  • morphis/mesa
  • fvogt/mesa
  • Erdroy/mesa
  • antmonteiro/mesa
  • deathmist/mesa
  • michaelonchrome/mesa
  • sukhatri/mesa-sukhatri
  • tommydrum/mesa
  • jenneron/mesa
  • momo666750/mesa
  • antoniospg100/mesa
  • noah1510/mesa
  • mairacanal/mesa
  • rmckeever/mesa
  • jfoxwoosh/mesa
  • Triang3l/mesa
  • marysaka/mesa
  • morrisoncave56/mesa
  • MayeulC/mesa
  • himanshu.nayak/mesa-him
  • 8infy/mesa
  • ayaka/mesa
  • Chiitoo/mesa
  • jkqxz/mesa
  • zxs-un/mesa-riscv
  • zxs-un/mesa
  • pyuan/mesa
  • GermanAizek/mesa
  • StaticRocket/mesa
  • dwlsalmeida/mesa
  • heftig/mesa
  • mgorny/mesa
  • WebsterEndymion/mesa
  • qyliss/mesa
  • stilriv/mesa
  • zzcc231/mesa
  • davidwu2/mesa
  • iaguis/mesa
  • evan.quan/mesa
  • martty/mesa
  • nowrep/mesa
  • osy/mesa
  • Azedin1111/mesa
  • Quipyowert2/mesa
  • nihui/mesa
  • libyahhh519/mesa
  • filip.binkiewicz/mesa
  • Jing/mesa
  • ilikerackmounts/mesa
  • EmperorPenguin18/mesa
  • yixie/mesa
  • gustafullberg/mesa
  • etaash.mathamsetty/mesa
  • hongaoo/mesa
  • hlinander/mesa
  • crab2313/mesa
  • msahastr/mesa
  • driver1998/mesa
  • amber/mesa
  • CounterPillow/mesa
  • shangyatsen/mesa
  • rosefromthedead/mesa
  • ItzSwirlz/mesa
  • kwizart/mesa
  • sobkas/mesa
  • timvp/mesa
  • philipl/mesa
  • turol/mesa
  • antonino/mesa
  • valpackett/mesa
  • X547/mesa
  • alanc/mesa
  • soonray8989/mesa
  • xxlxng25/mesa
  • mivanchev/mesa
  • wangxiaoming321/mesa
  • yangyangdaji/mesa
  • atmitch75/mesa
  • Hazematman/mesa
  • gfx-ci-bot/mesa
  • zaps166/mesa
  • CFSworks/mesa
  • lynne/mesa
  • lorn10/mesa
  • MrPurple666/mesa
  • pino/mesa
  • ccawley2011/mesa
  • lukeyyyy/mesa
  • maririn312/mesa
  • mohamexiety/mesa
  • chenrui/mesa
  • gmitrano/mesa
  • ndeshpan/mesa
  • cheako/mesa
  • xzhan34/mesa
  • heitbaum/mesa
  • LunaFoxgirlVT/mesa
  • tengjinchung/mesa
  • wujiangGitHub/mesa
  • K900/mesa
  • lb90/mesa
  • DodoGTA/mesa-nvk
  • moiman/mesa
  • Rui511/mesa
  • andrealmeid/mesa
  • Macdu/mesa
  • raun/mesa
  • jannau/mesa
  • ouchuan/mesa
  • jdknight/mesa
  • weibinwu/mesa
  • davidre/mesa
  • fcui/mesa
  • rawoul/mesa
  • stolk/mesa
  • alan_previn_intel/mesa-alan-previn-features
  • Yogayaojia/mesa
  • lucaweiss/mesa
  • JiadongZhu/mesa
  • asriniva/mesa
  • nitin.reddy88/mesa
  • Sterophonick/mesa
  • Teddy-Kun/mesa
  • donaldrobson/mesa
  • jide/mesa
  • kkartaltepe/mesa
  • mbouron/mesa
  • pkubaj/mesa
  • nora/mesa
  • dvrogozh1/mesa
  • MrRobbin/mesa
  • Ristovski/mesa
  • veerabadhran/mesa
  • Kiskae/mesa
  • vaishali/mesa
  • gbeatty/mesa
  • doraskayo/mesa
  • benjaminl/mesa
  • Blisto/mesa
  • baikaishiuc/mesa
  • shanminchao/mesa
  • Samsuper/mesa
  • phodina/mesa
  • diederik/mesa
  • adamjoseph/mesa
  • xry111/mesa
  • dburkov05/mesa
  • penguin42/mesa
  • tpambor/mesa
  • stepri/mesa
  • vigneshraman/mesa
  • Julia/mesa
  • bishoman123/mesa
  • rosasco-wk/mesa
  • jani/mesa
  • smaeul/mesa
  • QwertyChouskie/mesa
  • K1ngst0m/mesa
  • conversy/mesa
  • WinLinux1028/mesa-fix
  • Nefsen402/mesa
  • tripzero/mesa
  • max8rr8/mesa
  • MaxVerevkin/mesa
  • BinHani/mesa
  • spencercw/mesa
  • jazzfool/mesa
  • renfeng/mesa
  • 246tnt/mesa
  • twisted89/mesa
  • iyes/mesa
  • krz/mesa
  • Conan_Kudo/mesa
  • kociap/mesa
  • huangrui666/mesa
  • mildsunrise/mesa
  • ids1024/mesa
  • VladSchillerimgtec/mesa
  • zwang20/mesa
  • LaserEyess/mesa
  • carsten.haitzler/mesa
  • doitsujin/mesa
  • fzatlouk/mesa
  • afd/mesa
  • ratatouillemorde/mesa
  • reillybrogan/mesa
  • vanvugt/mesa
  • ralphcampbell/mesa
  • llyyr/mesa
  • amdrexu/mesa
  • oreaus/mesa
  • liucong2/mesa
  • wangra/mesa
  • asuka-mio/mesa
  • slp/mesa
  • vimproved/mesa
  • antco/mesa
  • mtasaka/mesa
  • SoshyuCelia/mesa
  • cheyang/mesa
  • hmann/mesa
  • zfigura/mesa
  • haopiliu/upstream_vpelib
  • Sid127/mesa
  • jwillikers/mesa
  • 6by9/mesa
  • eerii/mesa
  • ElectrodeYT/mesa
  • rilian-la-te/mesa
  • yrlf/mesa
  • sunzhguy/mesa
  • andrewgazizov/mesa
  • nanonyme/mesa
  • lpy/mesa
  • parona/mesa
  • cgbowman/mesa
  • YukariChiba/mesa
  • jexposit/mesa
  • kiroma/mesa
  • theoparis/mesa
  • Tele42/mesa
  • Dudemanguy/mesa
  • blu/mesa
  • myelin/mesa
  • strongtz/mesa
  • detlev.c/mesa
  • MollySophia/mesa
  • dabrain34/mesa
  • jnoorman/mesa
  • leio/mesa
  • Reflux5231/mesa
  • lihongtao/mesa
  • anthony-linaro/mesa
  • tshikaboom/mesa
  • ramenguy99/mesa
  • vhorinek/mesa
  • GKraats/mesa_alu
  • russelltg/mesa
  • rgallaispou/mesa
  • pleasurefish/mesa
  • SupSuper/mesa
  • chaos_princess/mesa
  • chrisduerr/mesa
  • MouriNaruto/mesa
  • absurdistcode/mesa
  • daoxiang.gong/mesa
  • chyyran/mesa
  • Snowiiii/mesa
  • rooq/mesa
  • colinmarc/mesa
  • rpavlik/mesa
  • DarkFire01/mesa
  • VladimirTechMan/mesa
  • Anzel/mesa
  • catvinyl/mesa
  • h0lyalg0rithm/mesa
  • fweimer/mesa
  • Anorak/mesa
  • imagination/mesa
  • javierm/mesa
  • ericsmith/mesa
  • tranquillity-codes/mesa
  • dan.g.tob/mesa
  • ekurzinger/mesa
  • zdobersek/mesa-fork
  • dodger_mink/mesa
  • tursulin/mesa-llandwerlin
  • Vladimir-A/mesa
  • surafel911/mesa
  • thfr/mesa
  • City-busz/mesa
  • dtobolik/mesa
  • sarthakbhatt/mesa
  • Jorropo/mesa
  • rankinc/mesa
  • sushmave/mesa
  • IsaacMarovitz/mesa
  • vnovotny/mesa
  • smit-mayani/mesa
  • Yifan.Zhang/merge-gfx-patch
  • K0bin/mesa
  • qbojj/mesa
  • Valentine/mesa
  • SludgePhD/mesa
  • tong1wu/mesa
  • npopov/mesa
  • alexmrqt/mesa
  • chipitsine/mesa
  • Mstrodl/mesa
  • whot/mesa
  • cmsanta/mesa
  • kaiwenjon/mesa
  • ystreet/mesa
  • sixtyfourktec/mesa
  • yu-re-ka/mesa
  • vorporeal/mesa
  • MischaBaars/mesa
  • peytolee/mesa-radeonsi
  • zack/mesa
  • nadaouf/mesa
  • ahuillet/mesa
  • oscarbg/mesa
  • thsr/mesa
  • JCWasmx86/mesa
  • gonsolo/mesa
  • msizanoen1/mesa
  • subzeroxr3i/mesa
  • NaveenKumar/mesa
  • Civiloid/mesa
  • phreer/mesa
  • amazingfate/mesa
  • zsnow/mesa
  • aperezdc/mesa
  • cepsylon/mesa
  • Pipetto-crypto/mesa
  • yuanqingxiang520/mesa
  • jvutukur/mesa
  • zachary.battleman/mesa
  • ncopa/mesa
  • ao2/mesa
  • e.rosebrock/mesa
  • bbhtt/mesa
  • marvelrenju1/mesa
  • hmtheboy154/mesa
  • asurati/mesa
  • ahokananoevolution/mesa
  • FredFunk/mesa
  • zturtleman/mesa
  • MingcongBai/mesa
  • dbrouwer/mesa
  • wswsmao/mesa
  • dlundqvist/mesa
  • DDoSQc/mesa
  • mahkoh/mesa
  • TimHuang/mesa
  • jeremyg/mesa
  • n3rdopolis/mesa
  • CreativeCylon/mesa
  • rjodin/mesa
  • mastag/mesa
  • alihomafar/mesa
  • smartavionics/mesa
  • esdrastarsis/mesa
  • spottumu/mesa
  • ShenghuaLinINTEL/mesa
  • Calandracas/mesa
  • dougg3/mesa
  • jsimmons1/mesa
  • mcatanzaro/mesa
  • yinjiyao/mesa
  • Zhaojiale/mesa
  • agd5f/mesa
  • Jelgnum/add-RADV_UMR_EXTRA_ARGS-docs
  • jopadan/mesa
  • DeeptiPatil/mesa
  • alvinhochun/mesa
  • ShriramShastry/mesa
  • Jaakkonen/mesa
  • pmenzel/mesa
  • raki-huawei/mesa
  • xen0n/mesa
  • Zer0xFF/mesa
  • twitt-thornwaite/mesa
  • larsivsi/mesa
  • clemy/mesa
  • demarchi/mesa
  • calder/mesa
  • lemonflynn/mesa
  • asrivats/mesa
  • ketil.johnsen/mesa
  • Trigger.Huang/mesa
  • brad0/mesa
  • RussellLiu/mesa
  • quic_lkondred/mesa
  • mombasa/mesa
  • jmacnak/mesa
  • company/mesa
  • jna/mesa
  • utkuiseri-arm/mesa
  • ritalat/mesa
  • dsvensson/mesa
  • jules.blok/mesa
  • Drakulix/mesa
  • iforbes/mesa
  • zhanghe9702/mesa
  • slouken/mesa
  • chihchie/mesa
  • Guy1524/mesa
  • Hust-YL/hust-yl-mesa
  • ziyao233/mesa
  • MegWATTT/mesa
  • genhoayi/mesa
  • me-cafebabe/mesa
  • EBADBEEF/mesa
  • manueldun/mesa
  • xclaesse/mesa
  • chenyche_codegen/mesa
  • lcagustini/mesa
  • jkim/mesa
  • marc-hb/mesa
  • benh/mesa
  • shreeya/mesa
  • vladly/mesa
  • poweif/mesa
  • zeux/mesa
  • whao/mesa
  • Yanfeng-Mi/mesa
  • fuel-pcbox/mesa
  • sewn/mesa
  • JohannesKauffmann/mesa
  • barracuda156/mesa
  • provod/mesa
  • xytovl/mesa
  • dtgs1208/mesa
  • mbrost/mesa-bind-queues
  • fknfilewalker/mesa
  • benjarobin/mesa
  • jameshogan/mesa
  • caciottax86/mesa
  • Gobrosse/mesa
  • runderwo/mesa
  • orowith2os/oro-mesa
  • hnez/mesa
  • gizmo98/mesa-hwdb
  • tjk/mesa
  • sarbes/mesa
  • GabiAle97/mesa-termux
  • ashleysmithcol/mesa
  • SnowyCoder/mesa
  • aswolfers/mesa
  • InFamousBear/mesa
  • adalessandro/mesa
  • thesamesam/mesa
  • zzxyb/mesa
  • rpsingh.amd/mesa
  • lool/mesa
  • molinari/mesa
  • chrpil/mesa
  • iv-m/mesa
  • leftmostcat/mesa
  • gaoshunli/mesa
  • Nunwan/mesa
  • forbiddenlake/mesa
  • taras.pisetskyi/mesa
  • andrei.matraguna/mesa
  • mdziuban/mesa
  • zlice1/mesa
  • cfoch/mesa
  • kpouget/mesa
  • nikolaszimmermann/mesa
  • kennylevinsen/mesa
  • itistotalbotnet/mesa
1222 results
Show changes
Showing
with 620 additions and 391 deletions
...@@ -250,3 +250,19 @@ intel_gem_supports_protected_context(int fd) ...@@ -250,3 +250,19 @@ intel_gem_supports_protected_context(int fd)
return ret; return ret;
} }
bool
intel_gem_get_param(int fd, uint32_t param, int *value)
{
drm_i915_getparam_t gp = {
.param = param,
.value = value,
};
return intel_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp) == 0;
}
bool intel_gem_can_render_on_fd(int fd)
{
int val;
return intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, &val) && val > 0;
}
...@@ -174,6 +174,8 @@ intel_gem_get_context_param(int fd, uint32_t context, uint32_t param, ...@@ -174,6 +174,8 @@ intel_gem_get_context_param(int fd, uint32_t context, uint32_t param,
uint64_t *value); uint64_t *value);
bool intel_gem_read_render_timestamp(int fd, uint64_t *value); bool intel_gem_read_render_timestamp(int fd, uint64_t *value);
bool intel_gem_get_param(int fd, uint32_t param, int *value);
bool intel_gem_can_render_on_fd(int fd);
#ifdef __cplusplus #ifdef __cplusplus
} }
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "c99_compat.h" #include "c99_compat.h"
#include "common/intel_gem.h" #include "common/intel_gem.h"
#include "dev/intel_device_info.h" #include "dev/intel_device_info.h"
#include "intel_gem.h"
#include "drm-uapi/i915_drm.h" #include "drm-uapi/i915_drm.h"
#include "genxml/gen_macros.h" #include "genxml/gen_macros.h"
#include "util/macros.h" #include "util/macros.h"
...@@ -189,11 +190,8 @@ mi_builder_test::SetUp() ...@@ -189,11 +190,8 @@ mi_builder_test::SetUp()
* --device option with it. * --device option with it.
*/ */
int device_id; int device_id;
drm_i915_getparam getparam = drm_i915_getparam(); ASSERT_TRUE(intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, &device_id))
getparam.param = I915_PARAM_CHIPSET_ID; << strerror(errno);
getparam.value = &device_id;
ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GETPARAM,
(void *)&getparam), 0) << strerror(errno);
ASSERT_TRUE(intel_get_device_info_from_pci_id(device_id, &devinfo)); ASSERT_TRUE(intel_get_device_info_from_pci_id(device_id, &devinfo));
if (devinfo.ver != GFX_VER || if (devinfo.ver != GFX_VER ||
...@@ -215,11 +213,8 @@ mi_builder_test::SetUp() ...@@ -215,11 +213,8 @@ mi_builder_test::SetUp()
if (GFX_VER >= 8) { if (GFX_VER >= 8) {
/* On gfx8+, we require softpin */ /* On gfx8+, we require softpin */
int has_softpin; int has_softpin;
drm_i915_getparam getparam = drm_i915_getparam(); ASSERT_TRUE(intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN, &has_softpin))
getparam.param = I915_PARAM_HAS_EXEC_SOFTPIN; << strerror(errno);
getparam.value = &has_softpin;
ASSERT_EQ(drmIoctl(fd, DRM_IOCTL_I915_GETPARAM,
(void *)&getparam), 0) << strerror(errno);
ASSERT_TRUE(has_softpin); ASSERT_TRUE(has_softpin);
} }
......
...@@ -3933,15 +3933,147 @@ fs_visitor::lower_load_payload() ...@@ -3933,15 +3933,147 @@ fs_visitor::lower_load_payload()
return progress; return progress;
} }
/**
* Factor an unsigned 32-bit integer.
*
* Attempts to factor \c x into two values that are at most 0xFFFF. If no
* such factorization is possible, either because the value is too large or is
* prime, both \c result_a and \c result_b will be zero.
*/
static void
factor_uint32(uint32_t x, unsigned *result_a, unsigned *result_b)
{
/* This is necessary to prevent various opportunities for division by zero
* below.
*/
assert(x > 0xffff);
/* This represents the actual expected constraints on the input. Namely,
* both the upper and lower words should be > 1.
*/
assert(x >= 0x00020002);
*result_a = 0;
*result_b = 0;
/* The value is too large to factor with the constraints. */
if (x > (0xffffu * 0xffffu))
return;
/* A non-prime number will have the form p*q*d where p is some prime
* number, q > 1, and 1 <= d <= q. To meet the constraints of this
* function, (p*d) < 0x10000. This implies d <= floor(0xffff / p).
* Furthermore, since q < 0x10000, d >= floor(x / (0xffff * p)). Finally,
* floor(x / (0xffff * p)) <= d <= floor(0xffff / p).
*
* The observation is finding the largest possible value of p reduces the
* possible range of d. After selecting p, all values of d in this range
* are tested until a factorization is found. The size of the range of
* possible values of d sets an upper bound on the run time of the
* function.
*/
static const uint16_t primes[256] = {
2, 3, 5, 7, 11, 13, 17, 19,
23, 29, 31, 37, 41, 43, 47, 53,
59, 61, 67, 71, 73, 79, 83, 89,
97, 101, 103, 107, 109, 113, 127, 131, /* 32 */
137, 139, 149, 151, 157, 163, 167, 173,
179, 181, 191, 193, 197, 199, 211, 223,
227, 229, 233, 239, 241, 251, 257, 263,
269, 271, 277, 281, 283, 293, 307, 311, /* 64 */
313, 317, 331, 337, 347, 349, 353, 359,
367, 373, 379, 383, 389, 397, 401, 409,
419, 421, 431, 433, 439, 443, 449, 457,
461, 463, 467, 479, 487, 491, 499, 503, /* 96 */
509, 521, 523, 541, 547, 557, 563, 569,
571, 577, 587, 593, 599, 601, 607, 613,
617, 619, 631, 641, 643, 647, 653, 659,
661, 673, 677, 683, 691, 701, 709, 719, /* 128 */
727, 733, 739, 743, 751, 757, 761, 769,
773, 787, 797, 809, 811, 821, 823, 827,
829, 839, 853, 857, 859, 863, 877, 881,
883, 887, 907, 911, 919, 929, 937, 941, /* 160 */
947, 953, 967, 971, 977, 983, 991, 997,
1009, 1013, 1019, 1021, 1031, 1033, 1039, 1049,
1051, 1061, 1063, 1069, 1087, 1091, 1093, 1097,
1103, 1109, 1117, 1123, 1129, 1151, 1153, 1163, /* 192 */
1171, 1181, 1187, 1193, 1201, 1213, 1217, 1223,
1229, 1231, 1237, 1249, 1259, 1277, 1279, 1283,
1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321,
1327, 1361, 1367, 1373, 1381, 1399, 1409, 1423, /* 224 */
1427, 1429, 1433, 1439, 1447, 1451, 1453, 1459,
1471, 1481, 1483, 1487, 1489, 1493, 1499, 1511,
1523, 1531, 1543, 1549, 1553, 1559, 1567, 1571,
1579, 1583, 1597, 1601, 1607, 1609, 1613, 1619, /* 256 */
};
unsigned p;
unsigned x_div_p;
for (int i = ARRAY_SIZE(primes) - 1; i >= 0; i--) {
p = primes[i];
x_div_p = x / p;
if ((x_div_p * p) == x)
break;
}
/* A prime factor was not found. */
if (x_div_p * p != x)
return;
/* Terminate early if d=1 is a solution. */
if (x_div_p < 0x10000) {
*result_a = x_div_p;
*result_b = p;
return;
}
/* Pick the maximum possible value for 'd'. It's important that the loop
* below execute while d <= max_d because max_d is a valid value. Having
* the wrong loop bound would cause 1627*1367*47 (0x063b0c83) to be
* incorrectly reported as not being factorable. The problem would occur
* with any value that is a factor of two primes in the table and one prime
* not in the table.
*/
const unsigned max_d = 0xffff / p;
/* Pick an initial value of 'd' that (combined with rejecting too large
* values above) guarantees that 'q' will always be small enough.
* DIV_ROUND_UP is used to prevent 'd' from being zero.
*/
for (unsigned d = DIV_ROUND_UP(x_div_p, 0xffff); d <= max_d; d++) {
unsigned q = x_div_p / d;
if ((q * d) == x_div_p) {
assert(p * d * q == x);
assert((p * d) < 0x10000);
*result_a = q;
*result_b = p * d;
break;
}
/* Since every value of 'd' is tried, as soon as 'd' is larger
* than 'q', we're just re-testing combinations that have
* already been tested.
*/
if (d > q)
break;
}
}
void void
fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block) fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
{ {
const fs_builder ibld(this, block, inst); const fs_builder ibld(this, block, inst);
const bool ud = (inst->src[1].type == BRW_REGISTER_TYPE_UD); /* It is correct to use inst->src[1].d in both end of the comparison.
* Using .ud in the UINT16_MAX comparison would cause any negative value to
* fail the check.
*/
if (inst->src[1].file == IMM && if (inst->src[1].file == IMM &&
(( ud && inst->src[1].ud <= UINT16_MAX) || (inst->src[1].d >= INT16_MIN && inst->src[1].d <= UINT16_MAX)) {
(!ud && inst->src[1].d <= INT16_MAX && inst->src[1].d >= INT16_MIN))) {
/* The MUL instruction isn't commutative. On Gen <= 6, only the low /* The MUL instruction isn't commutative. On Gen <= 6, only the low
* 16-bits of src0 are read, and on Gen >= 7 only the low 16-bits of * 16-bits of src0 are read, and on Gen >= 7 only the low 16-bits of
* src1 are used. * src1 are used.
...@@ -3949,6 +4081,7 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block) ...@@ -3949,6 +4081,7 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
* If multiplying by an immediate value that fits in 16-bits, do a * If multiplying by an immediate value that fits in 16-bits, do a
* single MUL instruction with that value in the proper location. * single MUL instruction with that value in the proper location.
*/ */
const bool ud = (inst->src[1].d >= 0);
if (devinfo->ver < 7) { if (devinfo->ver < 7) {
fs_reg imm(VGRF, alloc.allocate(dispatch_width / 8), inst->dst.type); fs_reg imm(VGRF, alloc.allocate(dispatch_width / 8), inst->dst.type);
ibld.MOV(imm, inst->src[1]); ibld.MOV(imm, inst->src[1]);
...@@ -4029,6 +4162,7 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block) ...@@ -4029,6 +4162,7 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
high.stride = inst->dst.stride; high.stride = inst->dst.stride;
high.offset = inst->dst.offset % REG_SIZE; high.offset = inst->dst.offset % REG_SIZE;
bool do_addition = true;
if (devinfo->ver >= 7) { if (devinfo->ver >= 7) {
/* From Wa_1604601757: /* From Wa_1604601757:
* *
...@@ -4047,10 +4181,37 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block) ...@@ -4047,10 +4181,37 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
lower_src_modifiers(this, block, inst, 1); lower_src_modifiers(this, block, inst, 1);
if (inst->src[1].file == IMM) { if (inst->src[1].file == IMM) {
ibld.MUL(low, inst->src[0], unsigned a;
brw_imm_uw(inst->src[1].ud & 0xffff)); unsigned b;
ibld.MUL(high, inst->src[0],
brw_imm_uw(inst->src[1].ud >> 16)); /* If the immeditate value can be factored into two values, A and
* B, that each fit in 16-bits, the multiplication result can
* instead be calculated as (src1 * (A * B)) = ((src1 * A) * B).
* This saves an operation (the addition) and a temporary register
* (high).
*
* Skip the optimization if either the high word or the low word
* is 0 or 1. In these conditions, at least one of the
* multiplications generated by the straightforward method will be
* eliminated anyway.
*/
if (inst->src[1].ud > 0x0001ffff &&
(inst->src[1].ud & 0xffff) > 1) {
factor_uint32(inst->src[1].ud, &a, &b);
if (a != 0) {
ibld.MUL(low, inst->src[0], brw_imm_uw(a));
ibld.MUL(low, low, brw_imm_uw(b));
do_addition = false;
}
}
if (do_addition) {
ibld.MUL(low, inst->src[0],
brw_imm_uw(inst->src[1].ud & 0xffff));
ibld.MUL(high, inst->src[0],
brw_imm_uw(inst->src[1].ud >> 16));
}
} else { } else {
ibld.MUL(low, inst->src[0], ibld.MUL(low, inst->src[0],
subscript(inst->src[1], BRW_REGISTER_TYPE_UW, 0)); subscript(inst->src[1], BRW_REGISTER_TYPE_UW, 0));
...@@ -4067,9 +4228,11 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block) ...@@ -4067,9 +4228,11 @@ fs_visitor::lower_mul_dword_inst(fs_inst *inst, bblock_t *block)
inst->src[1]); inst->src[1]);
} }
ibld.ADD(subscript(low, BRW_REGISTER_TYPE_UW, 1), if (do_addition) {
subscript(low, BRW_REGISTER_TYPE_UW, 1), ibld.ADD(subscript(low, BRW_REGISTER_TYPE_UW, 1),
subscript(high, BRW_REGISTER_TYPE_UW, 0)); subscript(low, BRW_REGISTER_TYPE_UW, 1),
subscript(high, BRW_REGISTER_TYPE_UW, 0));
}
if (needs_mov || inst->conditional_mod) if (needs_mov || inst->conditional_mod)
set_condmod(inst->conditional_mod, ibld.MOV(orig_dst, low)); set_condmod(inst->conditional_mod, ibld.MOV(orig_dst, low));
......
...@@ -766,15 +766,39 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry) ...@@ -766,15 +766,39 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
entry->dst, entry->size_written)) entry->dst, entry->size_written))
continue; continue;
/* If the type sizes don't match each channel of the instruction is /* If the size of the use type is larger than the size of the entry
* either extracting a portion of the constant (which could be handled * type, the entry doesn't contain all of the data that the user is
* with some effort but the code below doesn't) or reading multiple * trying to use.
* channels of the source at once.
*/ */
if (type_sz(inst->src[i].type) != type_sz(entry->dst.type)) if (type_sz(inst->src[i].type) > type_sz(entry->dst.type))
continue; continue;
fs_reg val = entry->src; fs_reg val = entry->src;
/* If the size of the use type is smaller than the size of the entry,
* clamp the value to the range of the use type. This enables constant
* copy propagation in cases like
*
*
* mov(8) g12<1>UD 0x0000000cUD
* ...
* mul(8) g47<1>D g86<8,8,1>D g12<16,8,2>W
*/
if (type_sz(inst->src[i].type) < type_sz(entry->dst.type)) {
if (type_sz(inst->src[i].type) != 2 || type_sz(entry->dst.type) != 4)
continue;
assert(inst->src[i].subnr == 0 || inst->src[i].subnr == 2);
/* When subnr is 0, we want the lower 16-bits, and when it's 2, we
* want the upper 16-bits. No other values of subnr are valid for a
* UD source.
*/
const uint16_t v = inst->src[i].subnr == 2 ? val.ud >> 16 : val.ud;
val.ud = v | (uint32_t(v) << 16);
}
val.type = inst->src[i].type; val.type = inst->src[i].type;
if (inst->src[i].abs) { if (inst->src[i].abs) {
...@@ -836,6 +860,33 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry) ...@@ -836,6 +860,33 @@ fs_visitor::try_constant_propagate(fs_inst *inst, acp_entry *entry)
inst->src[i] = val; inst->src[i] = val;
progress = true; progress = true;
} else if (i == 0 && inst->src[1].file != IMM) { } else if (i == 0 && inst->src[1].file != IMM) {
/* Don't copy propagate the constant in situations like
*
* mov(8) g8<1>D 0x7fffffffD
* mul(8) g16<1>D g8<8,8,1>D g15<16,8,2>W
*
* On platforms that only have a 32x16 multiplier, this will
* result in lowering the multiply to
*
* mul(8) g15<1>D g14<8,8,1>D 0xffffUW
* mul(8) g16<1>D g14<8,8,1>D 0x7fffUW
* add(8) g15.1<2>UW g15.1<16,8,2>UW g16<16,8,2>UW
*
* On Gfx8 and Gfx9, which have the full 32x32 multiplier, it
* results in
*
* mul(8) g16<1>D g15<16,8,2>W 0x7fffffffD
*
* Volume 2a of the Skylake PRM says:
*
* When multiplying a DW and any lower precision integer, the
* DW operand must on src0.
*/
if (inst->opcode == BRW_OPCODE_MUL &&
type_sz(inst->src[1].type) < 4 &&
type_sz(val.type) == 4)
break;
/* Fit this constant in by commuting the operands. /* Fit this constant in by commuting the operands.
* Exception: we can't do this for 32-bit integer MUL/MACH * Exception: we can't do this for 32-bit integer MUL/MACH
* because it's asymmetric. * because it's asymmetric.
......
...@@ -951,7 +951,10 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir, ...@@ -951,7 +951,10 @@ brw_preprocess_nir(const struct brw_compiler *compiler, nir_shader *nir,
brw_nir_optimize(nir, compiler, is_scalar, true); brw_nir_optimize(nir, compiler, is_scalar, true);
OPT(nir_lower_doubles, softfp64, nir->options->lower_doubles_options); OPT(nir_lower_doubles, softfp64, nir->options->lower_doubles_options);
OPT(nir_lower_int64); if (OPT(nir_lower_int64)) {
OPT(nir_opt_algebraic);
OPT(nir_lower_doubles, softfp64, nir->options->lower_doubles_options);
}
OPT(nir_lower_bit_size, lower_bit_size_callback, (void *)compiler); OPT(nir_lower_bit_size, lower_bit_size_callback, (void *)compiler);
...@@ -1283,6 +1286,9 @@ brw_postprocess_nir(nir_shader *nir, const struct brw_compiler *compiler, ...@@ -1283,6 +1286,9 @@ brw_postprocess_nir(nir_shader *nir, const struct brw_compiler *compiler,
OPT(brw_nir_opt_peephole_ffma); OPT(brw_nir_opt_peephole_ffma);
} }
if (devinfo->ver >= 7 && is_scalar)
OPT(brw_nir_opt_peephole_imul32x16);
if (OPT(nir_opt_comparison_pre)) { if (OPT(nir_opt_comparison_pre)) {
OPT(nir_copy_prop); OPT(nir_copy_prop);
OPT(nir_opt_dce); OPT(nir_opt_dce);
......
...@@ -176,6 +176,8 @@ void brw_nir_analyze_ubo_ranges(const struct brw_compiler *compiler, ...@@ -176,6 +176,8 @@ void brw_nir_analyze_ubo_ranges(const struct brw_compiler *compiler,
bool brw_nir_opt_peephole_ffma(nir_shader *shader); bool brw_nir_opt_peephole_ffma(nir_shader *shader);
bool brw_nir_opt_peephole_imul32x16(nir_shader *shader);
void brw_nir_optimize(nir_shader *nir, void brw_nir_optimize(nir_shader *nir,
const struct brw_compiler *compiler, const struct brw_compiler *compiler,
bool is_scalar, bool is_scalar,
......
/*
* Copyright © 2022 Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include "brw_nir.h"
#include "compiler/nir/nir_builder.h"
/**
* Implement a peephole pass to convert integer multiplications to imul32x16.
*/
struct pass_data {
struct hash_table *range_ht;
};
static void
replace_imul_instr(nir_builder *b, nir_alu_instr *imul, unsigned small_val,
nir_op new_opcode)
{
assert(small_val == 0 || small_val == 1);
b->cursor = nir_before_instr(&imul->instr);
nir_alu_instr *imul_32x16 = nir_alu_instr_create(b->shader, new_opcode);
imul_32x16->dest.saturate = imul->dest.saturate;
imul_32x16->dest.write_mask = imul->dest.write_mask;
nir_alu_src_copy(&imul_32x16->src[0], &imul->src[1 - small_val], imul_32x16);
nir_alu_src_copy(&imul_32x16->src[1], &imul->src[small_val], imul_32x16);
nir_ssa_dest_init(&imul_32x16->instr, &imul_32x16->dest.dest,
imul->dest.dest.ssa.num_components,
32, NULL);
nir_ssa_def_rewrite_uses(&imul->dest.dest.ssa,
&imul_32x16->dest.dest.ssa);
nir_builder_instr_insert(b, &imul_32x16->instr);
nir_instr_remove(&imul->instr);
nir_instr_free(&imul->instr);
}
enum root_operation {
non_unary = 0,
integer_neg = 1 << 0,
integer_abs = 1 << 1,
integer_neg_abs = integer_neg | integer_abs,
invalid_root = 255
};
static enum root_operation
signed_integer_range_analysis(nir_shader *shader, struct hash_table *range_ht,
nir_ssa_scalar scalar, int *lo, int *hi)
{
if (nir_ssa_scalar_is_const(scalar)) {
*lo = nir_ssa_scalar_as_int(scalar);
*hi = *lo;
return non_unary;
}
if (nir_ssa_scalar_is_alu(scalar)) {
switch (nir_ssa_scalar_alu_op(scalar)) {
case nir_op_iabs:
signed_integer_range_analysis(shader, range_ht,
nir_ssa_scalar_chase_alu_src(scalar, 0),
lo, hi);
if (*lo == INT32_MIN) {
*hi = INT32_MAX;
} else {
const int32_t a = abs(*lo);
const int32_t b = abs(*hi);
*lo = MIN2(a, b);
*hi = MAX2(a, b);
}
/* Absolute value wipes out any inner negations, and it is redundant
* with any inner absolute values.
*/
return integer_abs;
case nir_op_ineg: {
const enum root_operation root =
signed_integer_range_analysis(shader, range_ht,
nir_ssa_scalar_chase_alu_src(scalar, 0),
lo, hi);
if (*lo == INT32_MIN) {
*hi = INT32_MAX;
} else {
const int32_t a = -(*lo);
const int32_t b = -(*hi);
*lo = MIN2(a, b);
*hi = MAX2(a, b);
}
/* Negation of a negation cancels out, but negation of absolute value
* must preserve the integer_abs bit.
*/
return root ^ integer_neg;
}
case nir_op_imax: {
int src0_lo, src0_hi;
int src1_lo, src1_hi;
signed_integer_range_analysis(shader, range_ht,
nir_ssa_scalar_chase_alu_src(scalar, 0),
&src0_lo, &src0_hi);
signed_integer_range_analysis(shader, range_ht,
nir_ssa_scalar_chase_alu_src(scalar, 1),
&src1_lo, &src1_hi);
*lo = MAX2(src0_lo, src1_lo);
*hi = MAX2(src0_hi, src1_hi);
break;
}
case nir_op_imin: {
int src0_lo, src0_hi;
int src1_lo, src1_hi;
signed_integer_range_analysis(shader, range_ht,
nir_ssa_scalar_chase_alu_src(scalar, 0),
&src0_lo, &src0_hi);
signed_integer_range_analysis(shader, range_ht,
nir_ssa_scalar_chase_alu_src(scalar, 1),
&src1_lo, &src1_hi);
*lo = MIN2(src0_lo, src1_lo);
*hi = MIN2(src0_hi, src1_hi);
break;
}
default:
break;
}
}
/* Any value with the sign-bit set is problematic. Consider the case when
* bound is 0x80000000. As an unsigned value, this means the value must be
* in the range [0, 0x80000000]. As a signed value, it means the value must
* be in the range [0, INT_MAX] or it must be INT_MIN.
*
* If bound is -2, it means the value is either in the range [INT_MIN, -2]
* or it is in the range [0, INT_MAX].
*
* This function only returns a single, contiguous range. The union of the
* two ranges for any value of bound with the sign-bit set is [INT_MIN,
* INT_MAX].
*/
const int32_t bound = nir_unsigned_upper_bound(shader, range_ht,
scalar, NULL);
if (bound < 0) {
*lo = INT32_MIN;
*hi = INT32_MAX;
} else {
*lo = 0;
*hi = bound;
}
return non_unary;
}
static bool
brw_nir_opt_peephole_imul32x16_instr(nir_builder *b,
nir_instr *instr,
void *cb_data)
{
struct pass_data *d = (struct pass_data *) cb_data;
struct hash_table *range_ht = d->range_ht;
if (instr->type != nir_instr_type_alu)
return false;
nir_alu_instr *imul = nir_instr_as_alu(instr);
if (imul->op != nir_op_imul)
return false;
if (imul->dest.dest.ssa.bit_size != 32)
return false;
nir_op new_opcode = nir_num_opcodes;
unsigned i;
for (i = 0; i < 2; i++) {
if (!nir_src_is_const(imul->src[i].src))
continue;
int64_t lo = INT64_MAX;
int64_t hi = INT64_MIN;
for (unsigned comp = 0; comp < imul->dest.dest.ssa.num_components; comp++) {
int64_t v = nir_src_comp_as_int(imul->src[i].src, comp);
if (v < lo)
lo = v;
if (v > hi)
hi = v;
}
if (lo >= INT16_MIN && hi <= INT16_MAX) {
new_opcode = nir_op_imul_32x16;
break;
} else if (lo >= 0 && hi <= UINT16_MAX) {
new_opcode = nir_op_umul_32x16;
break;
}
}
if (new_opcode != nir_num_opcodes) {
replace_imul_instr(b, imul, i, new_opcode);
return true;
}
if (imul->dest.dest.ssa.num_components > 1)
return false;
const nir_ssa_scalar imul_scalar = { &imul->dest.dest.ssa, 0 };
int idx = -1;
enum root_operation prev_root = invalid_root;
for (i = 0; i < 2; i++) {
/* All constants were previously processed. There is nothing more to
* learn from a constant here.
*/
if (imul->src[i].src.ssa->parent_instr->type == nir_instr_type_load_const)
continue;
nir_ssa_scalar scalar = nir_ssa_scalar_chase_alu_src(imul_scalar, i);
int lo = INT32_MIN;
int hi = INT32_MAX;
const enum root_operation root =
signed_integer_range_analysis(b->shader, range_ht, scalar, &lo, &hi);
/* Copy propagation (in the backend) has trouble handling cases like
*
* mov(8) g60<1>D -g59<8,8,1>D
* mul(8) g61<1>D g63<8,8,1>D g60<16,8,2>W
*
* If g59 had absolute value instead of negation, even improved copy
* propagation would not be able to make progress.
*
* In cases where both sources to the integer multiplication can fit in
* 16-bits, choose the source that does not have a source modifier.
*/
if (root < prev_root) {
if (lo >= INT16_MIN && hi <= INT16_MAX) {
new_opcode = nir_op_imul_32x16;
idx = i;
prev_root = root;
if (root == non_unary)
break;
} else if (lo >= 0 && hi <= UINT16_MAX) {
new_opcode = nir_op_umul_32x16;
idx = i;
prev_root = root;
if (root == non_unary)
break;
}
}
}
if (new_opcode == nir_num_opcodes) {
assert(idx == -1);
assert(prev_root == invalid_root);
return false;
}
assert(idx != -1);
assert(prev_root != invalid_root);
replace_imul_instr(b, imul, idx, new_opcode);
return true;
}
bool
brw_nir_opt_peephole_imul32x16(nir_shader *shader)
{
struct pass_data cb_data;
cb_data.range_ht = _mesa_pointer_hash_table_create(NULL);
bool progress = nir_shader_instructions_pass(shader,
brw_nir_opt_peephole_imul32x16_instr,
nir_metadata_block_index |
nir_metadata_dominance,
&cb_data);
_mesa_hash_table_destroy(cb_data.range_ht, NULL);
return progress;
}
...@@ -98,6 +98,7 @@ libintel_compiler_files = files( ...@@ -98,6 +98,7 @@ libintel_compiler_files = files(
'brw_nir_lower_shading_rate_output.c', 'brw_nir_lower_shading_rate_output.c',
'brw_nir_lower_storage_image.c', 'brw_nir_lower_storage_image.c',
'brw_nir_opt_peephole_ffma.c', 'brw_nir_opt_peephole_ffma.c',
'brw_nir_opt_peephole_imul32x16.c',
'brw_nir_rt.h', 'brw_nir_rt.h',
'brw_nir_rt.c', 'brw_nir_rt.c',
'brw_nir_rt_builder.h', 'brw_nir_rt_builder.h',
......
...@@ -1955,10 +1955,9 @@ intel_i915_get_device_info_from_fd(int fd, struct intel_device_info *devinfo) ...@@ -1955,10 +1955,9 @@ intel_i915_get_device_info_from_fd(int fd, struct intel_device_info *devinfo)
update_cs_workgroup_threads(devinfo); update_cs_workgroup_threads(devinfo);
} }
int timestamp_frequency; int val;
if (getparam(fd, I915_PARAM_CS_TIMESTAMP_FREQUENCY, if (getparam(fd, I915_PARAM_CS_TIMESTAMP_FREQUENCY, &val))
&timestamp_frequency)) devinfo->timestamp_frequency = val;
devinfo->timestamp_frequency = timestamp_frequency;
else if (devinfo->ver >= 10) { else if (devinfo->ver >= 10) {
mesa_loge("Kernel 4.15 required to read the CS timestamp frequency."); mesa_loge("Kernel 4.15 required to read the CS timestamp frequency.");
return false; return false;
...@@ -2005,6 +2004,13 @@ intel_i915_get_device_info_from_fd(int fd, struct intel_device_info *devinfo) ...@@ -2005,6 +2004,13 @@ intel_i915_get_device_info_from_fd(int fd, struct intel_device_info *devinfo)
get_context_param(fd, 0, I915_CONTEXT_PARAM_GTT_SIZE, &devinfo->gtt_size); get_context_param(fd, 0, I915_CONTEXT_PARAM_GTT_SIZE, &devinfo->gtt_size);
devinfo->has_tiling_uapi = has_get_tiling(fd); devinfo->has_tiling_uapi = has_get_tiling(fd);
if (getparam(fd, I915_PARAM_MMAP_GTT_VERSION, &val))
devinfo->has_mmap_offset = val >= 4;
if (getparam(fd, I915_PARAM_HAS_USERPTR_PROBE, &val))
devinfo->has_userptr_probe = val;
if (getparam(fd, I915_PARAM_HAS_CONTEXT_ISOLATION, &val))
devinfo->has_context_isolation = val;
return true; return true;
} }
......
...@@ -146,6 +146,9 @@ struct intel_device_info ...@@ -146,6 +146,9 @@ struct intel_device_info
bool has_local_mem; bool has_local_mem;
bool has_lsc; bool has_lsc;
bool has_mesh_shading; bool has_mesh_shading;
bool has_mmap_offset;
bool has_userptr_probe;
bool has_context_isolation;
/** /**
* \name Intel hardware quirks * \name Intel hardware quirks
......
...@@ -580,18 +580,9 @@ load_pipeline_statistic_metrics(struct intel_perf_config *perf_cfg, ...@@ -580,18 +580,9 @@ load_pipeline_statistic_metrics(struct intel_perf_config *perf_cfg,
static int static int
i915_perf_version(int drm_fd) i915_perf_version(int drm_fd)
{ {
int tmp; int tmp = 0;
drm_i915_getparam_t gp = { intel_gem_get_param(drm_fd, I915_PARAM_PERF_REVISION, &tmp);
.param = I915_PARAM_PERF_REVISION, return tmp;
.value = &tmp,
};
int ret = intel_ioctl(drm_fd, DRM_IOCTL_I915_GETPARAM, &gp);
/* Return 0 if this getparam is not supported, the first version supported
* is 1.
*/
return ret < 0 ? 0 : tmp;
} }
static void static void
......
...@@ -45,6 +45,7 @@ ...@@ -45,6 +45,7 @@
#include "dev/intel_debug.h" #include "dev/intel_debug.h"
#include "dev/intel_device_info.h" #include "dev/intel_device_info.h"
#include "common/intel_gem.h"
#include "util/macros.h" #include "util/macros.h"
static int close_init_helper(int fd); static int close_init_helper(int fd);
...@@ -410,16 +411,12 @@ close(int fd) ...@@ -410,16 +411,12 @@ close(int fd)
static int static int
get_pci_id(int fd, int *pci_id) get_pci_id(int fd, int *pci_id)
{ {
struct drm_i915_getparam gparam;
if (device_override) { if (device_override) {
*pci_id = device; *pci_id = device;
return 0; return 0;
} }
gparam.param = I915_PARAM_CHIPSET_ID; return intel_gem_get_param(fd, I915_PARAM_CHIPSET_ID, pci_id) ? 0 : -1;
gparam.value = pci_id;
return libc_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gparam);
} }
static void static void
......
...@@ -118,7 +118,7 @@ libintel_dump_gpu = shared_library( ...@@ -118,7 +118,7 @@ libintel_dump_gpu = shared_library(
), ),
dependencies : [dep_dl, idep_mesautil], dependencies : [dep_dl, idep_mesautil],
include_directories : [inc_include, inc_src, inc_intel], include_directories : [inc_include, inc_src, inc_intel],
link_with : libintel_dev, link_with : [libintel_dev, libintel_common],
c_args : [no_override_init_args], c_args : [no_override_init_args],
gnu_symbol_visibility : 'hidden', gnu_symbol_visibility : 'hidden',
install_dir : get_option('libexecdir'), install_dir : get_option('libexecdir'),
......
...@@ -263,33 +263,6 @@ get_blorp_surf_for_anv_image(const struct anv_device *device, ...@@ -263,33 +263,6 @@ get_blorp_surf_for_anv_image(const struct anv_device *device,
} }
} }
static bool
get_blorp_surf_for_anv_shadow_image(const struct anv_device *device,
const struct anv_image *image,
VkImageAspectFlags aspect,
struct blorp_surf *blorp_surf)
{
const uint32_t plane = anv_image_aspect_to_plane(image, aspect);
if (!anv_surface_is_valid(&image->planes[plane].shadow_surface))
return false;
const struct anv_surface *surface = &image->planes[plane].shadow_surface;
const struct anv_address address =
anv_image_address(image, &surface->memory_range);
*blorp_surf = (struct blorp_surf) {
.surf = &surface->isl,
.addr = {
.buffer = address.bo,
.offset = address.offset,
.mocs = anv_mocs(device, address.bo, ISL_SURF_USAGE_RENDER_TARGET_BIT),
},
};
return true;
}
static void static void
copy_image(struct anv_cmd_buffer *cmd_buffer, copy_image(struct anv_cmd_buffer *cmd_buffer,
struct blorp_batch *batch, struct blorp_batch *batch,
...@@ -358,20 +331,6 @@ copy_image(struct anv_cmd_buffer *cmd_buffer, ...@@ -358,20 +331,6 @@ copy_image(struct anv_cmd_buffer *cmd_buffer,
dstOffset.x, dstOffset.y, dstOffset.x, dstOffset.y,
extent.width, extent.height); extent.width, extent.height);
} }
struct blorp_surf dst_shadow_surf;
if (get_blorp_surf_for_anv_shadow_image(cmd_buffer->device,
dst_image,
1UL << aspect_bit,
&dst_shadow_surf)) {
for (unsigned i = 0; i < layer_count; i++) {
blorp_copy(batch, &src_surf, src_level, src_base_layer + i,
&dst_shadow_surf, dst_level, dst_base_layer + i,
srcOffset.x, srcOffset.y,
dstOffset.x, dstOffset.y,
extent.width, extent.height);
}
}
} }
} else { } else {
struct blorp_surf src_surf, dst_surf; struct blorp_surf src_surf, dst_surf;
...@@ -394,19 +353,6 @@ copy_image(struct anv_cmd_buffer *cmd_buffer, ...@@ -394,19 +353,6 @@ copy_image(struct anv_cmd_buffer *cmd_buffer,
dstOffset.x, dstOffset.y, dstOffset.x, dstOffset.y,
extent.width, extent.height); extent.width, extent.height);
} }
struct blorp_surf dst_shadow_surf;
if (get_blorp_surf_for_anv_shadow_image(cmd_buffer->device,
dst_image, dst_mask,
&dst_shadow_surf)) {
for (unsigned i = 0; i < layer_count; i++) {
blorp_copy(batch, &src_surf, src_level, src_base_layer + i,
&dst_shadow_surf, dst_level, dst_base_layer + i,
srcOffset.x, srcOffset.y,
dstOffset.x, dstOffset.y,
extent.width, extent.height);
}
}
} }
} }
...@@ -527,8 +473,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer, ...@@ -527,8 +473,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
buffer_layout.row_stride_B, buffer_format, buffer_layout.row_stride_B, buffer_format,
false, &buffer.surf, &buffer_isl_surf); false, &buffer.surf, &buffer_isl_surf);
bool dst_has_shadow = false;
struct blorp_surf dst_shadow_surf;
if (&image == dst) { if (&image == dst) {
/* In this case, the source is the buffer and, since blorp takes its /* In this case, the source is the buffer and, since blorp takes its
* copy dimensions in terms of the source format, we have to use the * copy dimensions in terms of the source format, we have to use the
...@@ -542,11 +486,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer, ...@@ -542,11 +486,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
aspect, dst->surf.aux_usage, aspect, dst->surf.aux_usage,
dst->level, dst->level,
dst->offset.z, extent.depth); dst->offset.z, extent.depth);
dst_has_shadow =
get_blorp_surf_for_anv_shadow_image(cmd_buffer->device,
anv_image, aspect,
&dst_shadow_surf);
} }
for (unsigned z = 0; z < extent.depth; z++) { for (unsigned z = 0; z < extent.depth; z++) {
...@@ -555,14 +494,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer, ...@@ -555,14 +494,6 @@ copy_buffer_to_image(struct anv_cmd_buffer *cmd_buffer,
src->offset.x, src->offset.y, dst->offset.x, dst->offset.y, src->offset.x, src->offset.y, dst->offset.x, dst->offset.y,
extent.width, extent.height); extent.width, extent.height);
if (dst_has_shadow) {
blorp_copy(batch, &src->surf, src->level, src->offset.z,
&dst_shadow_surf, dst->level, dst->offset.z,
src->offset.x, src->offset.y,
dst->offset.x, dst->offset.y,
extent.width, extent.height);
}
image.offset.z++; image.offset.z++;
buffer.surf.addr.offset += buffer_layout.image_stride_B; buffer.surf.addr.offset += buffer_layout.image_stride_B;
} }
...@@ -1063,7 +994,7 @@ void anv_CmdClearDepthStencilImage( ...@@ -1063,7 +994,7 @@ void anv_CmdClearDepthStencilImage(
anv_blorp_batch_init(cmd_buffer, &batch, 0); anv_blorp_batch_init(cmd_buffer, &batch, 0);
assert((batch.flags & BLORP_BATCH_USE_COMPUTE) == 0); assert((batch.flags & BLORP_BATCH_USE_COMPUTE) == 0);
struct blorp_surf depth, stencil, stencil_shadow; struct blorp_surf depth, stencil;
if (image->vk.aspects & VK_IMAGE_ASPECT_DEPTH_BIT) { if (image->vk.aspects & VK_IMAGE_ASPECT_DEPTH_BIT) {
get_blorp_surf_for_anv_image(cmd_buffer->device, get_blorp_surf_for_anv_image(cmd_buffer->device,
image, VK_IMAGE_ASPECT_DEPTH_BIT, image, VK_IMAGE_ASPECT_DEPTH_BIT,
...@@ -1073,17 +1004,11 @@ void anv_CmdClearDepthStencilImage( ...@@ -1073,17 +1004,11 @@ void anv_CmdClearDepthStencilImage(
memset(&depth, 0, sizeof(depth)); memset(&depth, 0, sizeof(depth));
} }
bool has_stencil_shadow = false;
if (image->vk.aspects & VK_IMAGE_ASPECT_STENCIL_BIT) { if (image->vk.aspects & VK_IMAGE_ASPECT_STENCIL_BIT) {
get_blorp_surf_for_anv_image(cmd_buffer->device, get_blorp_surf_for_anv_image(cmd_buffer->device,
image, VK_IMAGE_ASPECT_STENCIL_BIT, image, VK_IMAGE_ASPECT_STENCIL_BIT,
VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
imageLayout, ISL_AUX_USAGE_NONE, &stencil); imageLayout, ISL_AUX_USAGE_NONE, &stencil);
has_stencil_shadow =
get_blorp_surf_for_anv_shadow_image(cmd_buffer->device, image,
VK_IMAGE_ASPECT_STENCIL_BIT,
&stencil_shadow);
} else { } else {
memset(&stencil, 0, sizeof(stencil)); memset(&stencil, 0, sizeof(stencil));
} }
...@@ -1115,17 +1040,6 @@ void anv_CmdClearDepthStencilImage( ...@@ -1115,17 +1040,6 @@ void anv_CmdClearDepthStencilImage(
clear_depth, pDepthStencil->depth, clear_depth, pDepthStencil->depth,
clear_stencil ? 0xff : 0, clear_stencil ? 0xff : 0,
pDepthStencil->stencil); pDepthStencil->stencil);
if (clear_stencil && has_stencil_shadow) {
union isl_color_value stencil_color = {
.u32 = { pDepthStencil->stencil, },
};
blorp_clear(&batch, &stencil_shadow,
ISL_FORMAT_R8_UINT, ISL_SWIZZLE_IDENTITY,
level, base_layer, layer_count,
0, 0, level_width, level_height,
stencil_color, 0 /* color_write_disable */);
}
} }
} }
...@@ -1484,63 +1398,6 @@ void anv_CmdResolveImage2( ...@@ -1484,63 +1398,6 @@ void anv_CmdResolveImage2(
} }
} }
void
anv_image_copy_to_shadow(struct anv_cmd_buffer *cmd_buffer,
const struct anv_image *image,
VkImageAspectFlagBits aspect,
uint32_t base_level, uint32_t level_count,
uint32_t base_layer, uint32_t layer_count)
{
struct blorp_batch batch;
anv_blorp_batch_init(cmd_buffer, &batch, 0);
/* We don't know who touched the main surface last so flush a bunch of
* caches to ensure we get good data.
*/
anv_add_pending_pipe_bits(cmd_buffer,
ANV_PIPE_DEPTH_CACHE_FLUSH_BIT |
ANV_PIPE_HDC_PIPELINE_FLUSH_BIT |
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT |
ANV_PIPE_TEXTURE_CACHE_INVALIDATE_BIT,
"before copy_to_shadow");
struct blorp_surf surf;
get_blorp_surf_for_anv_image(cmd_buffer->device,
image, aspect,
VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
VK_IMAGE_LAYOUT_GENERAL,
ISL_AUX_USAGE_NONE, &surf);
assert(surf.aux_usage == ISL_AUX_USAGE_NONE);
struct blorp_surf shadow_surf;
get_blorp_surf_for_anv_shadow_image(cmd_buffer->device,
image, aspect, &shadow_surf);
for (uint32_t l = 0; l < level_count; l++) {
const uint32_t level = base_level + l;
const VkExtent3D extent = vk_image_mip_level_extent(&image->vk, level);
if (image->vk.image_type == VK_IMAGE_TYPE_3D)
layer_count = extent.depth;
for (uint32_t a = 0; a < layer_count; a++) {
const uint32_t layer = base_layer + a;
blorp_copy(&batch, &surf, level, layer,
&shadow_surf, level, layer,
0, 0, 0, 0, extent.width, extent.height);
}
}
/* We just wrote to the buffer with the render cache. Flush it. */
anv_add_pending_pipe_bits(cmd_buffer,
ANV_PIPE_RENDER_TARGET_CACHE_FLUSH_BIT,
"after copy_to_shadow");
anv_blorp_batch_finish(&batch);
}
void void
anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer, anv_image_clear_color(struct anv_cmd_buffer *cmd_buffer,
const struct anv_image *image, const struct anv_image *image,
...@@ -1639,23 +1496,6 @@ anv_image_clear_depth_stencil(struct anv_cmd_buffer *cmd_buffer, ...@@ -1639,23 +1496,6 @@ anv_image_clear_depth_stencil(struct anv_cmd_buffer *cmd_buffer,
ANV_PIPE_END_OF_PIPE_SYNC_BIT, ANV_PIPE_END_OF_PIPE_SYNC_BIT,
"after clear DS"); "after clear DS");
struct blorp_surf stencil_shadow;
if ((aspects & VK_IMAGE_ASPECT_STENCIL_BIT) &&
get_blorp_surf_for_anv_shadow_image(cmd_buffer->device, image,
VK_IMAGE_ASPECT_STENCIL_BIT,
&stencil_shadow)) {
union isl_color_value stencil_color = {
.u32 = { stencil_value },
};
blorp_clear(&batch, &stencil_shadow,
ISL_FORMAT_R8_UINT, ISL_SWIZZLE_IDENTITY,
level, base_layer, layer_count,
area.offset.x, area.offset.y,
area.offset.x + area.extent.width,
area.offset.y + area.extent.height,
stencil_color, 0 /* color_write_disable */);
}
anv_blorp_batch_finish(&batch); anv_blorp_batch_finish(&batch);
} }
......
...@@ -741,41 +741,43 @@ static VkResult ...@@ -741,41 +741,43 @@ static VkResult
anv_i915_physical_device_get_parameters(struct anv_physical_device *device) anv_i915_physical_device_get_parameters(struct anv_physical_device *device)
{ {
VkResult result = VK_SUCCESS; VkResult result = VK_SUCCESS;
int fd = device->local_fd; int val, fd = device->local_fd;
if (!anv_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT)) { if (!intel_gem_get_param(fd, I915_PARAM_HAS_WAIT_TIMEOUT, &val) || !val) {
result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
"kernel missing gem wait"); "kernel missing gem wait");
return result; return result;
} }
if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2)) { if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXECBUF2, &val) || !val) {
result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
"kernel missing execbuf2"); "kernel missing execbuf2");
return result; return result;
} }
if (!device->info.has_llc && if (!device->info.has_llc &&
anv_gem_get_param(fd, I915_PARAM_MMAP_VERSION) < 1) { (!intel_gem_get_param(fd, I915_PARAM_MMAP_VERSION, &val) || val < 1)) {
result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
"kernel missing wc mmap"); "kernel missing wc mmap");
return result; return result;
} }
if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN)) { if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_SOFTPIN, &val) || !val) {
result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
"kernel missing softpin"); "kernel missing softpin");
return result; return result;
} }
if (!anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY)) { if (!intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_FENCE_ARRAY, &val) || !val) {
result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED, result = vk_errorf(device, VK_ERROR_INITIALIZATION_FAILED,
"kernel missing syncobj support"); "kernel missing syncobj support");
return result; return result;
} }
device->has_exec_async = anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC); if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_ASYNC, &val))
device->has_exec_capture = anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_CAPTURE); device->has_exec_async = val;
if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_CAPTURE, &val))
device->has_exec_capture = val;
/* Start with medium; sorted low to high */ /* Start with medium; sorted low to high */
const VkQueueGlobalPriorityKHR priorities[] = { const VkQueueGlobalPriorityKHR priorities[] = {
...@@ -791,17 +793,8 @@ anv_i915_physical_device_get_parameters(struct anv_physical_device *device) ...@@ -791,17 +793,8 @@ anv_i915_physical_device_get_parameters(struct anv_physical_device *device)
device->max_context_priority = priorities[i]; device->max_context_priority = priorities[i];
} }
device->has_context_isolation = if (intel_gem_get_param(fd, I915_PARAM_HAS_EXEC_TIMELINE_FENCES, &val))
anv_gem_get_param(fd, I915_PARAM_HAS_CONTEXT_ISOLATION); device->has_exec_timeline = val;
device->has_exec_timeline =
anv_gem_get_param(fd, I915_PARAM_HAS_EXEC_TIMELINE_FENCES);
device->has_mmap_offset =
anv_gem_get_param(fd, I915_PARAM_MMAP_GTT_VERSION) >= 4;
device->has_userptr_probe =
anv_gem_get_param(fd, I915_PARAM_HAS_USERPTR_PROBE);
return result; return result;
} }
...@@ -960,7 +953,7 @@ anv_physical_device_try_create(struct vk_instance *vk_instance, ...@@ -960,7 +953,7 @@ anv_physical_device_try_create(struct vk_instance *vk_instance,
device->compiler->shader_debug_log = compiler_debug_log; device->compiler->shader_debug_log = compiler_debug_log;
device->compiler->shader_perf_log = compiler_perf_log; device->compiler->shader_perf_log = compiler_perf_log;
device->compiler->constant_buffer_0_is_relative = device->compiler->constant_buffer_0_is_relative =
!device->has_context_isolation; !device->info.has_context_isolation;
device->compiler->supports_shader_constants = true; device->compiler->supports_shader_constants = true;
device->compiler->indirect_ubos_use_sampler = device->info.ver < 12; device->compiler->indirect_ubos_use_sampler = device->info.ver < 12;
...@@ -975,10 +968,8 @@ anv_physical_device_try_create(struct vk_instance *vk_instance, ...@@ -975,10 +968,8 @@ anv_physical_device_try_create(struct vk_instance *vk_instance,
if (instance->vk.enabled_extensions.KHR_display) { if (instance->vk.enabled_extensions.KHR_display) {
master_fd = open(primary_path, O_RDWR | O_CLOEXEC); master_fd = open(primary_path, O_RDWR | O_CLOEXEC);
if (master_fd >= 0) { if (master_fd >= 0) {
/* prod the device with a GETPARAM call which will fail if /* fail if we don't have permission to even render on this device */
* we don't have permission to even render on this device if (!intel_gem_can_render_on_fd(master_fd)) {
*/
if (anv_gem_get_param(master_fd, I915_PARAM_CHIPSET_ID) == 0) {
close(master_fd); close(master_fd);
master_fd = -1; master_fd = -1;
} }
...@@ -4308,7 +4299,7 @@ VkResult anv_MapMemory( ...@@ -4308,7 +4299,7 @@ VkResult anv_MapMemory(
/* GEM will fail to map if the offset isn't 4k-aligned. Round down. */ /* GEM will fail to map if the offset isn't 4k-aligned. Round down. */
uint64_t map_offset; uint64_t map_offset;
if (!device->physical->has_mmap_offset) if (!device->physical->info.has_mmap_offset)
map_offset = offset & ~4095ull; map_offset = offset & ~4095ull;
else else
map_offset = 0; map_offset = 0;
......
...@@ -146,7 +146,7 @@ anv_gem_mmap(struct anv_device *device, uint32_t gem_handle, ...@@ -146,7 +146,7 @@ anv_gem_mmap(struct anv_device *device, uint32_t gem_handle,
uint64_t offset, uint64_t size, uint32_t flags) uint64_t offset, uint64_t size, uint32_t flags)
{ {
void *map; void *map;
if (device->physical->has_mmap_offset) if (device->physical->info.has_mmap_offset)
map = anv_gem_mmap_offset(device, gem_handle, offset, size, flags); map = anv_gem_mmap_offset(device, gem_handle, offset, size, flags);
else else
map = anv_gem_mmap_legacy(device, gem_handle, offset, size, flags); map = anv_gem_mmap_legacy(device, gem_handle, offset, size, flags);
...@@ -176,7 +176,7 @@ anv_gem_userptr(struct anv_device *device, void *mem, size_t size) ...@@ -176,7 +176,7 @@ anv_gem_userptr(struct anv_device *device, void *mem, size_t size)
.flags = 0, .flags = 0,
}; };
if (device->physical->has_userptr_probe) if (device->physical->info.has_userptr_probe)
userptr.flags |= I915_USERPTR_PROBE; userptr.flags |= I915_USERPTR_PROBE;
int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr); int ret = intel_ioctl(device->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr);
...@@ -278,23 +278,6 @@ anv_gem_set_tiling(struct anv_device *device, ...@@ -278,23 +278,6 @@ anv_gem_set_tiling(struct anv_device *device,
return ret; return ret;
} }
int
anv_gem_get_param(int fd, uint32_t param)
{
int tmp;
drm_i915_getparam_t gp = {
.param = param,
.value = &tmp,
};
int ret = intel_ioctl(fd, DRM_IOCTL_I915_GETPARAM, &gp);
if (ret == 0)
return tmp;
return 0;
}
bool bool
anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority) anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority)
{ {
......
...@@ -118,12 +118,6 @@ anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle, ...@@ -118,12 +118,6 @@ anv_gem_set_caching(struct anv_device *device, uint32_t gem_handle,
return 0; return 0;
} }
int
anv_gem_get_param(int fd, uint32_t param)
{
unreachable("Unused");
}
int int
anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value) anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, uint64_t value)
{ {
......
...@@ -321,46 +321,6 @@ add_surface(struct anv_device *device, ...@@ -321,46 +321,6 @@ add_surface(struct anv_device *device,
&surf->memory_range); &surf->memory_range);
} }
/**
* Do hardware limitations require the image plane to use a shadow surface?
*
* If hardware limitations force us to use a shadow surface, then the same
* limitations may also constrain the tiling of the primary surface; therefore
* parameter @a inout_primary_tiling_flags.
*
* If the image plane is a separate stencil plane and if the user provided
* VkImageStencilUsageCreateInfo, then @a usage must be stencilUsage.
*
* @see anv_image::planes[]::shadow_surface
*/
static bool
anv_image_plane_needs_shadow_surface(const struct intel_device_info *devinfo,
struct anv_format_plane plane_format,
VkImageTiling vk_tiling,
VkImageUsageFlags vk_plane_usage,
VkImageCreateFlags vk_create_flags,
isl_tiling_flags_t *inout_primary_tiling_flags)
{
if (devinfo->ver <= 8 &&
(vk_create_flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT) &&
vk_tiling == VK_IMAGE_TILING_OPTIMAL) {
/* We must fallback to a linear surface because we may not be able to
* correctly handle the offsets if tiled. (On gfx9,
* RENDER_SURFACE_STATE::X/Y Offset are sufficient). To prevent garbage
* performance while texturing, we maintain a tiled shadow surface.
*/
assert(isl_format_is_compressed(plane_format.isl_format));
if (inout_primary_tiling_flags) {
*inout_primary_tiling_flags = ISL_TILING_LINEAR_BIT;
}
return true;
}
return false;
}
static bool static bool
can_fast_clear_with_non_zero_color(const struct intel_device_info *devinfo, can_fast_clear_with_non_zero_color(const struct intel_device_info *devinfo,
const struct anv_image *image, const struct anv_image *image,
...@@ -868,42 +828,6 @@ add_aux_surface_if_supported(struct anv_device *device, ...@@ -868,42 +828,6 @@ add_aux_surface_if_supported(struct anv_device *device,
return VK_SUCCESS; return VK_SUCCESS;
} }
static VkResult
add_shadow_surface(struct anv_device *device,
struct anv_image *image,
uint32_t plane,
struct anv_format_plane plane_format,
uint32_t stride,
VkImageUsageFlags vk_plane_usage)
{
ASSERTED bool ok;
ok = isl_surf_init(&device->isl_dev,
&image->planes[plane].shadow_surface.isl,
.dim = vk_to_isl_surf_dim[image->vk.image_type],
.format = plane_format.isl_format,
.width = image->vk.extent.width,
.height = image->vk.extent.height,
.depth = image->vk.extent.depth,
.levels = image->vk.mip_levels,
.array_len = image->vk.array_layers,
.samples = image->vk.samples,
.min_alignment_B = 0,
.row_pitch_B = stride,
.usage = ISL_SURF_USAGE_TEXTURE_BIT |
(vk_plane_usage & ISL_SURF_USAGE_CUBE_BIT),
.tiling_flags = ISL_TILING_ANY_MASK);
/* isl_surf_init() will fail only if provided invalid input. Invalid input
* here is illegal in Vulkan.
*/
assert(ok);
return add_surface(device, image, &image->planes[plane].shadow_surface,
ANV_IMAGE_MEMORY_BINDING_PLANE_0 + plane,
ANV_OFFSET_IMPLICIT);
}
/** /**
* Initialize the anv_image::*_surface selected by \a aspect. Then update the * Initialize the anv_image::*_surface selected by \a aspect. Then update the
* image's memory requirements (that is, the image's size and alignment). * image's memory requirements (that is, the image's size and alignment).
...@@ -1045,13 +969,6 @@ check_memory_bindings(const struct anv_device *device, ...@@ -1045,13 +969,6 @@ check_memory_bindings(const struct anv_device *device,
.test_surface = &plane->primary_surface, .test_surface = &plane->primary_surface,
.expect_binding = primary_binding); .expect_binding = primary_binding);
/* Check shadow surface */
if (anv_surface_is_valid(&plane->shadow_surface)) {
check_memory_range(accum_ranges,
.test_surface = &plane->shadow_surface,
.expect_binding = primary_binding);
}
/* Check aux_surface */ /* Check aux_surface */
if (anv_surface_is_valid(&plane->aux_surface)) { if (anv_surface_is_valid(&plane->aux_surface)) {
enum anv_image_memory_binding binding = primary_binding; enum anv_image_memory_binding binding = primary_binding;
...@@ -1159,7 +1076,6 @@ check_drm_format_mod(const struct anv_device *device, ...@@ -1159,7 +1076,6 @@ check_drm_format_mod(const struct anv_device *device,
assert(isl_layout->txc == ISL_TXC_NONE); assert(isl_layout->txc == ISL_TXC_NONE);
assert(isl_layout->colorspace == ISL_COLORSPACE_LINEAR || assert(isl_layout->colorspace == ISL_COLORSPACE_LINEAR ||
isl_layout->colorspace == ISL_COLORSPACE_SRGB); isl_layout->colorspace == ISL_COLORSPACE_SRGB);
assert(!anv_surface_is_valid(&plane->shadow_surface));
if (isl_mod_info->aux_usage != ISL_AUX_USAGE_NONE) { if (isl_mod_info->aux_usage != ISL_AUX_USAGE_NONE) {
/* Reject DISJOINT for consistency with the GL driver. */ /* Reject DISJOINT for consistency with the GL driver. */
...@@ -1207,28 +1123,12 @@ add_all_surfaces_implicit_layout( ...@@ -1207,28 +1123,12 @@ add_all_surfaces_implicit_layout(
choose_isl_surf_usage(image->vk.create_flags, vk_usage, choose_isl_surf_usage(image->vk.create_flags, vk_usage,
isl_extra_usage_flags, aspect); isl_extra_usage_flags, aspect);
/* Must call this before adding any surfaces because it may modify
* isl_tiling_flags.
*/
bool needs_shadow =
anv_image_plane_needs_shadow_surface(devinfo, plane_format,
image->vk.tiling, vk_usage,
image->vk.create_flags,
&isl_tiling_flags);
result = add_primary_surface(device, image, plane, plane_format, result = add_primary_surface(device, image, plane, plane_format,
ANV_OFFSET_IMPLICIT, stride, ANV_OFFSET_IMPLICIT, stride,
isl_tiling_flags, isl_usage); isl_tiling_flags, isl_usage);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
return result; return result;
if (needs_shadow) {
result = add_shadow_surface(device, image, plane, plane_format,
stride, vk_usage);
if (result != VK_SUCCESS)
return result;
}
/* Disable aux if image supports export without modifiers. */ /* Disable aux if image supports export without modifiers. */
if (image->vk.external_handle_types != 0 && if (image->vk.external_handle_types != 0 &&
image->vk.tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) image->vk.tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
...@@ -2474,20 +2374,6 @@ anv_image_fill_surface_state(struct anv_device *device, ...@@ -2474,20 +2374,6 @@ anv_image_fill_surface_state(struct anv_device *device,
struct isl_view view = *view_in; struct isl_view view = *view_in;
view.usage |= view_usage; view.usage |= view_usage;
/* For texturing with VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL from a
* compressed surface with a shadow surface, we use the shadow instead of
* the primary surface. The shadow surface will be tiled, unlike the main
* surface, so it should get significantly better performance.
*/
if (anv_surface_is_valid(&image->planes[plane].shadow_surface) &&
isl_format_is_compressed(view.format) &&
(flags & ANV_IMAGE_VIEW_STATE_TEXTURE_OPTIMAL)) {
assert(isl_format_is_compressed(surface->isl.format));
assert(surface->isl.tiling == ISL_TILING_LINEAR);
assert(image->planes[plane].shadow_surface.isl.tiling != ISL_TILING_LINEAR);
surface = &image->planes[plane].shadow_surface;
}
if (view_usage == ISL_SURF_USAGE_RENDER_TARGET_BIT) if (view_usage == ISL_SURF_USAGE_RENDER_TARGET_BIT)
view.swizzle = anv_swizzle_for_render(view.swizzle); view.swizzle = anv_swizzle_for_render(view.swizzle);
......
...@@ -963,9 +963,6 @@ struct anv_physical_device { ...@@ -963,9 +963,6 @@ struct anv_physical_device {
bool has_exec_async; bool has_exec_async;
bool has_exec_capture; bool has_exec_capture;
VkQueueGlobalPriorityKHR max_context_priority; VkQueueGlobalPriorityKHR max_context_priority;
bool has_context_isolation;
bool has_mmap_offset;
bool has_userptr_probe;
uint64_t gtt_size; uint64_t gtt_size;
bool always_use_bindless; bool always_use_bindless;
...@@ -1349,7 +1346,6 @@ int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle, ...@@ -1349,7 +1346,6 @@ int anv_gem_set_tiling(struct anv_device *device, uint32_t gem_handle,
bool anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority); bool anv_gem_has_context_priority(int fd, VkQueueGlobalPriorityKHR priority);
int anv_gem_set_context_param(int fd, uint32_t context, uint32_t param, int anv_gem_set_context_param(int fd, uint32_t context, uint32_t param,
uint64_t value); uint64_t value);
int anv_gem_get_param(int fd, uint32_t param);
int anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle); int anv_gem_get_tiling(struct anv_device *device, uint32_t gem_handle);
int anv_gem_context_get_reset_stats(int fd, int context, int anv_gem_context_get_reset_stats(int fd, int context,
uint32_t *active, uint32_t *pending); uint32_t *active, uint32_t *pending);
...@@ -3441,13 +3437,6 @@ struct anv_image { ...@@ -3441,13 +3437,6 @@ struct anv_image {
struct anv_image_plane { struct anv_image_plane {
struct anv_surface primary_surface; struct anv_surface primary_surface;
/**
* A surface which shadows the main surface and may have different
* tiling. This is used for sampling using a tiling that isn't supported
* for other operations.
*/
struct anv_surface shadow_surface;
/** /**
* The base aux usage for this image. For color images, this can be * The base aux usage for this image. For color images, this can be
* either CCS_E or CCS_D depending on whether or not we can reliably * either CCS_E or CCS_D depending on whether or not we can reliably
...@@ -3757,13 +3746,6 @@ anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer, ...@@ -3757,13 +3746,6 @@ anv_image_ccs_op(struct anv_cmd_buffer *cmd_buffer,
enum isl_aux_op ccs_op, union isl_color_value *clear_value, enum isl_aux_op ccs_op, union isl_color_value *clear_value,
bool predicate); bool predicate);
void
anv_image_copy_to_shadow(struct anv_cmd_buffer *cmd_buffer,
const struct anv_image *image,
VkImageAspectFlagBits aspect,
uint32_t base_level, uint32_t level_count,
uint32_t base_layer, uint32_t layer_count);
enum isl_aux_state ATTRIBUTE_PURE enum isl_aux_state ATTRIBUTE_PURE
anv_layout_to_aux_state(const struct intel_device_info * const devinfo, anv_layout_to_aux_state(const struct intel_device_info * const devinfo,
const struct anv_image *image, const struct anv_image *image,
......