日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

TBR架构的一些理解

發(fā)布時(shí)間:2023/12/14 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TBR架构的一些理解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
  • 現(xiàn)在移動(dòng)側(cè)的GPU渲染架構(gòu)(Bifrost、valhall)是按照job的方式來進(jìn)行的,共有3類job:vs-job、tile-job、fs-job;它們都是在shader core中執(zhí)行的;tile-job主要負(fù)責(zé)把圖元加到Tile-list中(由于三角形眾多,所以這也是個(gè)大規(guī)模并行任務(wù));
  • G77采用的是valhall架構(gòu):
    a. 一個(gè)shader-core可以執(zhí)行1024個(gè)threads (注:thread可以理解為streaming processor(sp): 最基本的處理單元),但它們不是同時(shí)執(zhí)行的,而是將其分成64個(gè)warp, 每個(gè)warp有16個(gè)threads(16-wide warps),shader-core同時(shí)只能執(zhí)行2個(gè)warp,如果某個(gè)warp在執(zhí)行時(shí)阻塞了,調(diào)度單元就會(huì)先去執(zhí)行其它warp,類似于CPU中線程調(diào)度的概念;
    b. 每個(gè)warp中的threads它們才是并發(fā)執(zhí)行的,所以每個(gè)shader-core真正能并發(fā)執(zhí)行的thread是32個(gè),(一個(gè)job可能被拆分執(zhí)行,因?yàn)槊總€(gè)thread的寄存器數(shù)量有限32個(gè),如果是過于復(fù)雜的vs可能要占用很多寄存器所以只能拆開執(zhí)行);
  • 執(zhí)行時(shí)以4個(gè)cycles為基本單位,在這4個(gè)cycle里能同時(shí)執(zhí)行加、減、乘等運(yùn)算;
  • CPU和GPU真正傳輸?shù)氖羌拇嫫鞯呐渲眯盘?hào)(相互通知交互),數(shù)據(jù)部分如ibo/vbo/texture這些數(shù)據(jù)都是存在共享內(nèi)存(動(dòng)態(tài)內(nèi)存,如4+128的4)里,它有唯一的物理地址,CPU和GPU都通過虛擬地址來映射到它;它不需要做真正的數(shù)據(jù)傳輸;
  • 在VS結(jié)束后,會(huì)根據(jù)三角形的大小及在屏幕空間的位置,將屏幕空間分成三類大小不同的tile-bins,這是為了減少?gòu)腄DR中加載數(shù)據(jù)到GPU時(shí)讀寫帶寬開銷,渲染時(shí)以pass為單位進(jìn)行渲染,可以想象很多pass在渲染時(shí)某些tile根本沒有三角形需要繪制,這樣就不需要讀取相關(guān)的紋理數(shù)據(jù)啥的了;但注意最終渲染的時(shí)候的Tile大小是固定的為16x16的像素點(diǎn),加入tile之前會(huì)做背面裁剪、視椎體裁剪等大顆粒的裁剪動(dòng)作;
  • 在執(zhí)行真正的FS之前,有一個(gè)Fragment Front-End階段,這里面除了Early-Z(以像素為單位),還有個(gè)FPK流程(Forward pixel kill,采用FIFO隊(duì)列之后的數(shù)據(jù)按該隊(duì)列順序執(zhí)行FS),它是對(duì)Early-Z的互補(bǔ),假設(shè)圖元A和圖元B都覆蓋同一個(gè)Quad,當(dāng)A先于B提交,如果A的深度小于B則由early-z將B剔除,如果A的深度大于B則由FPK將A剔除;
  • 其它補(bǔ)充:(源自針對(duì)移動(dòng)端TBDR架構(gòu)GPU特性的渲染優(yōu)化,https://www.likecs.com/show-203322391.html)
    7. TBR架構(gòu)下什么時(shí)候真正對(duì)Tile進(jìn)行渲染
    TBR一般的實(shí)現(xiàn)策略是對(duì)于cpu過來的commandbuffer,只對(duì)他們做vetex process,然后對(duì)vs產(chǎn)生的結(jié)果暫時(shí)保存(對(duì)當(dāng)前Tile渲染有關(guān)的三角形保存至Tiling list或者Framedata),等待非得刷新整個(gè)FrameBuffer的時(shí)候,才真正的隨這批繪制做光柵化,做tile-based-rendering。什么是非得刷新整個(gè)FrameBuffer的時(shí)候?比如Swap Back and Front Buffer,glflush,glfinish,glreadpixels,glcopytexiamge,glbitframebuffer,queryingocclusion,unbind the framebuffer。

  • 不使用Framebuffer的時(shí)候clear或者discard
    glclear操作是可以把當(dāng)前的framedata清空的;比如你一直往一個(gè)Rendertexture上繪制,過了一會(huì)當(dāng)你不再使用這張rendertexture的時(shí)候(即unbind)也會(huì)觸發(fā)這些framedata的繪制,如果在你不再使用這張圖之前能夠調(diào)用一次clear,那么unbind的時(shí)候framedata就是清空的,可以減少很多不必要的繪制;因?yàn)槿绻籧lear,那么每個(gè)tile在初始化的時(shí)候都要從dram上的framebuffer把那一塊的內(nèi)容完整拷貝過來,而clear后這個(gè)初始化就變得非常簡(jiǎn)單了,

  • 不要在一幀里面頻繁的切換framebuffer
    須知每次切換都意味著一次全量的Tile Rending;

  • 避免大量的drawcall和頂點(diǎn)量
    若頂點(diǎn)數(shù)量太大,可能會(huì)導(dǎo)致framedata爆炸,framedata暫時(shí)被移到其它地方存儲(chǔ),嚴(yán)重影響效率,一般百萬(wàn)以上的頂點(diǎn)量不管drawcall多少,無(wú)論shader多簡(jiǎn)單,大部分機(jī)器都肯定會(huì)觸發(fā)這個(gè)瓶頸。

  • Alpha Test 和 Alpha Blending區(qū)別
    Alpha Test就是在執(zhí)行FS的時(shí)候,需要從一個(gè)類似Alpha Texture上讀當(dāng)前像素做采樣對(duì)比,如果比較不過則直接discard,不會(huì)寫Depth;因此如果存在AlphaTest會(huì)導(dǎo)致FrameData失效(無(wú)法提前緩存準(zhǔn)確的z值),最終AlphaTest之前保存的FrameData無(wú)法進(jìn)行early-z,整個(gè)early-z失效;
    AlphaBlending不會(huì)修改深度值,所以不影響early-z,但是它會(huì)增加對(duì)FB的讀操作。

  • 總結(jié)

    以上是生活随笔為你收集整理的TBR架构的一些理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。