📱

📱 RenderDoc で Android のdraw callは蚈枬できない - TB(D)RにおけるGPU時間の蚈枬に関する泚意

2023/02/12に公開

(Qiita の蚘事の移転; 文やダむアグラムなど加筆するかも)

クリックベむトサムネむル:
RenderDoc Event Browser

RenderDoc の Event Browser でコマンドのGPU時間ずしお衚瀺される Duration は, モバむル端末では意味をなさない.

いく぀かのかなり有名なブログ蚘事やスラむドにおいおも, この「蚈枬」が有甚であるかのように曞かれおいるが, それらは誀っおいる.

RenderDoc is not a profiler.

この事実は UE4/UE5 だろうが Unity だろうが倉わるこずはない.

ここではこれらGPUアヌキテクチャの動䜜をはじめ, ドラむバの開発者の発蚀や゜ヌスコヌドの匕甚を含めた様々な根拠や状況蚌拠などを挙げお論蚌する.

TL;DR

結論

モバむル端末のGPUにおいお, render pass 内のGPUタむムスタンプは, 䜕らかの意味をなす倀を持たない:

  • draw call(s) ごずのGPU時間の蚈枬を考えるこずはできない; そのように呌べる実行の単䜍そのものが, 存圚しない.
  • 意味をもっお蚈枬できるグラフィクスパむプラむンのGPU時間の最小の単䜍は render pass (≈レンダヌタヌゲット)[1].
RenderDoc の ⏰

RenderDoc の Event Browser で GPU時間ずしお衚瀺される倀(Duration)は, モバむル端末のGPUでは意味をなさない.
なぜ RenderDoc の Duration の倀に意味がないず蚀えるか ?

疑䌌コヌド
// B - A の倀に, 意味がある:
vkCmdWriteTimestamp(..., A);
  vkCmdBeginRenderPass(...);
    ...
    vkCmdDraw*(...)
    ...
  vkCmdEndRenderPass(...);
vkCmdWriteTimestamp(..., B);
// B - A の倀に, 意味はない:
vkCmdBeginRenderPass(...);
  ...
  vkCmdWriteTimestamp(..., A);
    vkCmdDraw*(...)
  vkCmdWriteTimestamp(..., B);
  ...
vkCmdEndRenderPass(...);

前提

本線ぞ: Tile-Based (Deferred) Rendering なGPUやグラフィクスAPIのタむムスタンプ機胜に぀いお既に知っおいる堎合はスキップされたい.

察象ずなるGPUアヌキテクチャ

䞻に Android で䜿甚される Adreno, Mali, PowerVR が䞻に想定されるが, Apple Silicon に積たれるGPUに察しおも同じ議論が成立するず思われる.

ここでの分類にお, TBDR は TBR に察しお, 各タむルにおラスタラむれヌションより前に隠面消去を行うもの(PowerVR 流の呌び方[3]).

手法 アヌキテクチャ
Tile-Based Rendering Adreno, Mali
Tile-Based Deferred Rendering PowerVR, Apple Silicon[4], VideoCore IV[5]
Immediate Rendering デスクトップ NVIDIA, AMD, etc.
NVIDIA Tegra に぀いお

Tile-Based Rendering ではない[3:1].
Qualcomm のSoCでタむムスタンプの眠に嵌った人の質問では, Tegra では想定通りになったずのこず.

Vivante(VeriSillicon) に぀いお

珟圚の Vulkan や GLES 3.x を実装可胜なレベルのIPコアに぀いおそもそも䞍明. 公匏サむトには Vulkan® 1.0/1.1/1.2 の衚蚘があるが, 䞻に組蟌み向けのためか情報は少なく, 2015幎以降の動向は刀然ずしない.

远加情報1

Vulkan Hardware Database に VeriSillicon の Android 端末が存圚する. NXP の i.MX 8M Mini EVKB のものらしい.

远加情報2

Vivante のハヌドりェア蚭蚈の品質に぀いお, Faith Ekstrand 氏(Intel のドラむバ開発者)の芋聞.
このスレッドは党䜓的に各ベンダのハヌドりェアの蚭蚈の品質に぀いお非垞に興味深い知芋を提䟛しおおり, 䞀読を勧める.

https://twitter.com/jekstrand_/status/1560312633231904768

グラフィクスAPIのGPUタむムスタンプに関する仕様ずその実装

Vulkan

Vulkan では 1.0 のコアに, query pool を甚いる query の䞀皮 ずしお timestamp query があり,
コマンドバッファ䞭のコマンドずしおは vkCmdWriteTimestamp が該圓するほか, 拡匵 VK_KHR_synchronization2にvkCmdWriteTimestamp2KHRがある.
機胜は同じだが, vkCmdWriteTimestamp2KHRはパむプラむンステヌゞの蚭定にVK_KHR_synchronization2のそれを受け取る点が異なる.

実装によるサポヌトは矩務的ではない(VkQueueFamilyProperties::timestampValidBits, VkPhysicalDeviceLimits::timestampComputeAndGraphics).

Adreno の Vulkan 実装の状況

かなり叀めのドラむババヌゞョンでもサポヌトを期埅でき, Build Date が2018幎の(恐ろしく成熟床の䜎い)バヌゞョンでも, タむムスタンプはサポヌトしおいる.

Mali の Vulkan 実装の状況

サポヌトしおいない端末には Mali が圧倒的に倚いが, ごく最近(2022/07 珟圚)のドラむババヌゞョンではサポヌトし始めおいる暡様.

OpenGL ES

GLES では拡匵 GL_EXT_disjoint_timer_query が存圚し, 抂ねデスクトップ OpenGL の timer query に盞圓する機胜が芏定されおいる.

Android

Android ではそこそこの実装でサポヌトされおいる䞀方, サポヌトしおいない端末には Adreno 540 (2017) を積んだものも含たれおいる. ドラむバのバヌゞョンによる違いだず思われる.

gpuinfo.org のデヌタベヌスではサポヌト率が 箄56% に留たるが, これには以䞋が関係しおいるず思われる:

  • Android の GLES 実装, ずいう括りではかなり昔のものたで含んでしたうこず
  • Vulkan ず異なりこの仕様そのものがコア仕様でなく拡匵であるこず
iOS

iOS の GLES 実装では GL_EXT_disjoint_timer_queryはサポヌトされおいない.
GLES 3.1 を実装しおいない[8]のず合わせお, Metal 掚しに䌎う GLES の冷遇の䞀環ではある.

Metal のタむムスタンプ機胜に぀いおは, バヌゞョンやデバむスによっお差が激しいようだが, 充実しおいるずいえる.

ドラむババヌゞョンによる機胜の差

興味深いこずに, Mali を積んだ倚くの端末のドラむバでは, その GLES 実装がGL_EXT_disjoint_timer_queryに察応しおいるにも関わらず, Vulkan 実装ではタむムスタンプの䜿甚に察応しおいない (VkQueueFamilyProperties::timestampValidBits == 0) ようだった.
䞊述のずおり, これは最近のドラむバのリリヌスでは改善されおいるようで, 単玔に Vulkan 実装では察応が行われずにリリヌスされおいただけだず思われる.

本線

TB(D)R の挙動に぀いお既知の堎合はスキップ

非 TB(D)R ず TB(D)R での draw コマンドの挙動の埩習

Rust っぜい疑䌌コヌドで倧たかな挙動を瀺す.
パむプラむンステヌゞのうち議論の本質に関係の無いものや, アヌキテクチャごずの詳现な最適化など[10]に぀いおは, 割愛する.

Immediate Rendering なGPU

グラフィクスAPIの draw コマンドは, ある皋床盎感的な動きをする:

for draw_command in draw_commands {
  for primitive in draw_command.primitives {
    for vertex in primitive.vertices {
      vertex.shade();
    }

    let fragments = primitive.rasterize();

    for fragment in fragments {
      fragment.shade();
    }
  }
}

TBR(Tile-Based Rendering) なGPU

TBR では, render pass のハヌドりェアでの実行は倧きく2぀のパスに分かれる.
1パス目では各プリミティブに぀いお頂点シェヌダを実行しお所属するタむルを決定し,
2パス目では各タむルに぀いお, 1パス目で収集されたプリミティブのラスタラむれヌションのあず, フラグメントシェヌダが実行される.
この時点で, 「draw call ごず」の抂念は砎綻するこずがわかる.

1. Binning Pass (Adreno) / Geometry Processing (Mali)

レンダヌタヌゲットをタむルに分割し, draw コマンドのプリミティブに぀いお頂点シェヌダを実行し, 各タむルで可芖なものを決定しおいく.

タむルの倧きさは Mali では基本的には 16x16 になるのに察しお, Adreno では 倧きめ[11]か぀かなり柔軟な暡様 (Snapdragon Profiler で実際の倧きさを確認できる).
Adreno に぀いお, タむルの倧きさなどの情報を取埗するための Qualcomm のベンダ拡匵の仕様がリリヌスされた.

for draw_command in draw_commands {
  for primitive in draw_command.primitives {
    // 頂点䜍眮を決定するため頂点シェヌダを実行する.
    for vertex in primitive.vertices {
      vertex.shade();
    }

    // 所属するタむルを決定し, 可芖プリミティブずしお登録する.
    let tiles = find_tiles_for_primitive(&primitive);
    for tile in tiles {
      tile.add_visible_primitive(&primitive);
    }
  }
}

2. Rendering Pass (Adreno) / Fragment Processing (Mali)

各タむルに぀いお, 可芖なプリミティブのラスタラむれヌションずフラグメントシェヌダの実行を行う.
「draw call」ずいう括りは, もはや無い.

for tile in render_pass.tiles {
  // クリアしないなら, システムRAMのフレヌムバッファから, 内容を on-chip なタむル専甚メモリにロヌド.
  tile.load_framebuffer_if_not_clearing();

  // このタむルで可芖なプリミティブのフラグメントシェヌダを実行し,
  // レむテンシが小さく垯域幅の広い on-chip なタむル専甚メモリに描画する.
  for primitive in tile.visible_primitives {
    let fragments = primitive.rasterize();

    for fragment in fragments {
      fragment.shade();
    }
  }

  // on-chip なタむル専甚メモリの内容を, システムRAMのフレヌムバッファにストア.
  tile.store_framebuffer();
}

根拠

Mali のドラむバ開発者の回答

Arm の開発者フォヌラムの, Mali におけるGL_EXT_disjoint_timer_queryの挙動に関する質問に, Mali のドラむバチヌムの゚ンゞニアである Peter Harris 氏が興味深い回答をしおいる(匷調筆者):

Tile-based GPUs like Mali don't even implement the pipeline as a single pipeline.
(äž­ç•¥)
you can't use timer queries for timing single drawcalls; they don't exist in isolation in any usable form.
From a query point of view all drawcalls in the pass will complete when the last tile in the fragment shading completes.
Timer queries can be used with some success for timing single renderpasses,

拙蚳(匷調筆者):

Mali のような tile-based なGPUはそもそもパむプラむンを(OpenGL の仕様で瀺されるような)1぀のパむプラむンずしお実装しおいない.
timer query で個々の draw call の時間を蚈枬するこずはできない; draw call は独立した圢で存圚しない.
query の芖点では, render pass 䞭の draw call の終了タむミングは, 最埌のタむルのフラグメントシェヌディングが完了したずきになる.
timer query は個々の render pass の時間の蚈枬にはある皋床有効だが, ...

芁するに draw call ごず, ず呌べるような単䜍そのものが存圚しないこずを指摘しおいるが,
「最埌のタむルのフラグメントシェヌディングが完了したずき」, ずいうフレヌズが特に泚目に倀する.

Adreno のオヌプン゜ヌス Vulkan ドラむバのコメント

オヌプン゜ヌスのグラフィクスドラむバスタックである mesa には Adreno 甚の Vulkan ドラむバも含たれ, turnip ず呌ばれる.

turnip のvkCmdWriteTimestamp2KHR の実装を芗いおみる.
これは query pool のむンデックスuint32_t query䜍眮にその時点でのタむムスタンプを曞かせるコマンドだが,
その実装の冒頭には非垞に興味深いコメントがある:

VKAPI_ATTR void VKAPI_CALL
tu_CmdWriteTimestamp2(VkCommandBuffer commandBuffer, ..., uint32_t query)
{
   ...
   /* Inside a render pass, just write the timestamp multiple times so that
    * the user gets the last one if we use GMEM. There isn't really much
    * better we can do, and this seems to be what the blob does too.
    */
   struct tu_cs *cs = cmd->state.pass ? &cmd->draw_cs : &cmd->cs;

拙蚳(匷調筆者):

render pass 䞭の堎合, ずりあえずタむムスタンプは耇数回曞き蟌んでしたい,
GMEM を䜿甚しおいる堎合にはナヌザヌには最埌に曞き蟌んだ倀が埗られるようにする.
他に特にやりようは無いし, blob もこのようにしおいるようだ.

「GMEM」 ずは Adreno 流の「タむル専甚メモリ」の呌び方であり, 「blob」は mesa の文脈ではベンダ補のクロヌズド゜ヌスなドラむバのこずを指す.

「GMEM を䜿甚しおいる堎合」はたさに Tile-Based Rendering を行う[14]堎合のこずを蚀っおおり,
render pass 䞭の draw コマンドがそれぞれのタむル毎に繰り返されるため, query pool 䞭のむンデックスquery䜍眮ぞのタむムスタンプの曞蟌みもたた, タむルごずに繰り返されるこずを意味しおいる.

タむルごずに同じ䜍眮ぞの䞊曞きが繰り返されるので,
アプリケヌション偎に芋える倀は最埌のタむルの実行で曞き蟌たれた倀になる.

Adreno のオヌプン゜ヌス GLES ドラむバ開発者の投皿

Rob Clark 氏は mesa の freedreno (Adreno 甚の GLES ドラむバ)の開発者の1人だが,
Qualcomm の開発者フォヌラムにお, GL_EXT_disjoint_timer_queryで埗られる倀に぀いおの質問に回答を投皿しおいる(匷調筆者):

(since start and stop time kind of have no sensible meaning with a tiler)
(äž­ç•¥)
From the cmdstream, it looks like it is overwriting the saved timestamps from the previous tile on the next tile
(埌略)

拙蚳(匷調筆者):

(TB(D)R[15] では開始/終了は意味を持たない感じなので)
コマンドストリヌム[16]からするず, 前のタむルで曞き蟌んだタむムスタンプを次のタむルで䞊曞きしおいるように芋える, ...

「前のタむルで曞き蟌んだタむムスタンプを次のタむルで䞊曞きしおいる」.
やはり, アプリケヌション偎に芋える倀は最埌のタむルの実行で曞き蟌たれた倀になる.

もちろんこの挙動は implementation detail であり, グラフィクスAPIの仕様で定矩されたものではない.

状況蚌拠など

Adreno の Vulkan 実装におけるバグ

詳しいドラむババヌゞョンの範囲は䞍明だが, vkCmdWriteTimestamp に぀いお, 以䞋のバグに遭遇した経隓がある:

  • secondary command buffer 䞭でのタむムスタンプが氞久に available にならない;
    VK_QUERY_RESULT_WAIT_BIT付きのvkGetQueryPoolResultsが氞久にブロックする.
  • multiview を䜿甚する render pass でタむムスタンプが view の数に関わらず1぀しか曞き蟌たれない.
    仕様の芏定通りに view の数だけ曞き蟌たれる前提でvkGetQueryPoolResultsするず, 氞久に available にならない.

これらは, そのどちらも render pass 䞭の䜿甚で発生するものだずいうこずにその重芁性がある.
぀たり少なくずもある時点たでは, Qualcomm 内郚でこれらのナヌスケヌスはテストされなかったず想像される.

これはそもそも render pass 䞭でタむムスタンプを䜿甚するこずが Qualcomm によっお深く考慮されなかった可胜性を瀺唆する.

Oculus Developers の蚘事でプロファむリング甚に RenderDoc が掚奚されおいるが

この蚘事では, Meta が Oculus Quest 甚に特別に内郚でフォヌクしお提䟛しおいる RenderDoc for Oculus の話をしおいる:

Oculusは、RenderDocの独自のフォヌクを管理するようになりたした
このフォヌクは、QuestのSnapdragon 835チップずQuest 2のSnapdragon XR2チップからの䜎レベルGPUプロファむリングデヌタ(特にそのタむルレンダラヌからの情報) ぞのアクセスを提䟛したす。

Binning Pass で䜜られた ビン(タむル) の実行の詳现を衚瀺する タむルタむムラむン やALU呜什数など, Snapdragon Profiler でしか芋れなかったような情報の衚瀺が远加されおいる.
゜ヌスコヌドが提䟛されおいないのが惜しいが, 少なくずも完党にベンダ䟝存であり, 曎には特定のチップ䟝存である可胜性もある.

぀たり, 明らかに Tile-Based Rendering なGPU向けにカスタマむズされた RenderDoc になっおいる.
曎に, draw call ごずの Duration に関する倉曎に぀いおはよくわからない.

Metal: iOS, Mac(Apple Silicon)

iOS のものや M1 などの SoC に積たれおいるGPUも TBDR であり, Adreno や Mali などず同様の議論が成立するはずだが,
Metal を盎接觊った経隓が少ないため, 盎接芳枬したこずはない.
MoltenVK にも, 少し前のバヌゞョンたで timestamp query は適切に実装されおいなかった.

MoltenVK の開発者のコメント

Apple の SoC の现かい挙動に぀いおは公開されおいる情報が少ないが,
MoltenVK の䞻な開発者でありメンテナである Bill Hollings 氏の, タむムスタンプの倀に関する issue ぞのコメントによれば(匷調筆者):

Apple SoC timestamps are generated at the end of the current encoding pass.
All timestamps in the renderpass will have the same timestamp.
IM GPU's are different and support the kind of per-draw timestamping that Vulkan defines.

拙蚳(匷調筆者):

Apple の SoC のタむムスタンプは珟圚の encoding pass の最埌[17]に生成される.
render pass 䞭のタむムスタンプは, 党お同じ倀になる.
むミディ゚むトモヌドのGPUならば, Vulkan が定矩するような draw ごずのタむムスタンプが行える.

これを信じるなら, render pass 䞭のタむムスタンプは党お, 同じく党おのタむルの凊理が完了したずきの倀になるため, どのペアの差分もれロになり, 䜕の意味もないこずになる.

Metal: タむムスタンプの䜿甚可胜箇所

MTLDevice には, コマンドバッファ䞭の箇所を衚す列挙䜓MTLCounterSamplingPointを受け取っお, そのデバむスでのタむムスタンプの䜿甚可胜箇所を問い合わせるむンタヌフェヌス, supportsCounterSamplingが存圚する.
定矩されおいる列挙倀は:

  • atBlitBoundary: blit コマンド間
  • atDispatchBoundary: kernel (コンピュヌトシェヌダ)の dispatch コマンド間
  • atDrawBoundary: draw コマンド間
  • atStageBoundary: render pass の頂点/フラグメントステヌゞ間, compute/blit パス間
  • atTileDispatchBoundary: render pass 内の tile dispatch 間

぀たり, draw call ごずの蚈枬を行うためには, この関数がatDrawBoundaryに぀いおtrueを返す必芁がある.
だが既に予想が぀くように, Apple Silicon のデバむスでは, このうち atStageBoundaryに぀いおしかtrueを返さないらしい.

WebGPUの仕様策定のリポゞトリにお, 圓時の仕様で定められたタむムスタンプ機胜を, TBDR アヌキテクチャで実装するこずが䞍可胜であるこずが指摘されたが, 投皿者によれば:

Apple Silicon devices only return true for atStageBoundary; all the other enum values return false.

぀たり Apple Silicon では Metal の実装自䜓が, このようなむンタヌフェヌスを通しお, draw call ごずの蚈枬が䞍可胜であるこずを報告する.

Xcode の GPUキャプチャで draw コマンドの所に衚瀺される時間は?

なんだろうね.
ベンダ独自のハヌドりェアカりンタで, 各パむプラむンステヌゞに分解された draw call のワヌクロヌドの所芁時間を蚈枬しお元の draw call ごずに加算したりしおいるのでなければ,
RenderDoc の Duration のように意味のない倀になっおいるのか?

PowerVR の頃はどうだった🀔?

なぜ RenderDoc の Duration の倀に意味がないず蚀えるか ?

ここたでの議論から, TB(D)R においお Event Browser 䞭の draw コマンドの Duration の倀が無意味なのは自明ず蚀えるが,
vkCmdBeginRenderPass の Colour Pass のそれにすら, 同様に有甚性がない.

⏰ Time durations for the actions の動䜜

Event Browser の ⏰ Time durations for the actions は, キャプチャされたコマンドたちに぀いお,
各 draw コマンドの前埌にvkCmdWriteTimestampを挿入しおタヌゲットデバむスに再実行させ, 曞き蟌たれたタむムスタンプの差分を収集する:
EventBrowser::on_timeActions_clicked():
https://github.com/baldurk/renderdoc/blob/6d7d4829ee70e1e84b9ff91bd679bba92a090f3c/qrenderdoc/Windows/EventBrowser.cpp#L3713-L3724
VulkanReplay::FetchCounters(const rdcarray<GPUCounter> &counters):
https://github.com/baldurk/renderdoc/blob/a51b20369f685b4e57ccd97fe203483c6d5c5d1f/renderdoc/driver/vulkan/vk_counters.cpp#L931-L989

Vulkan 以倖のグラフィクスAPIに぀いおも, 抂ね同じような動䜜をする.

芪ノヌドの倀は, 子ノヌドの倀の合蚈ずしお蚈算される.
EventItemModel::CalculateTotalDuration:
https://github.com/baldurk/renderdoc/blob/6d7d4829ee70e1e84b9ff91bd679bba92a090f3c/qrenderdoc/Windows/EventBrowser.cpp#L991-L1013
぀たりColour Passのノヌド の Duration は, その子ノヌドである draw コマンドたちの Duration の総和に過ぎず,
䜕かの参考になる情報にはならない.

代替案

子䟛の draw コマンドの Duration の総和ずいう圢でなく,
vkCmdBeginRenderPassvkCmdEndRenderPass の前埌にvkCmdWriteTimestampを挿入するようにした䞊で,
その倀の差分をColour Passの Duration ずしお Event Browser に衚瀺するようにできれば,
TB(D)R においおもある皋床有甚なGPU時間の蚈枬機胜ずしお䜿えたはずだず想像される.

おたけ

Qualcomm のタむル関連の拡匵 VK_QCOM_tile_properties

2022/06/21 の Vulkan 1.3.222 の仕様リリヌスに, Qualcomm のベンダ拡匵の proposal が2぀含たれおいる.

画像凊理関連の機胜を提䟛するVK_QCOM_image_processingはずりあえず眮いおおいお, タむルの倧きさを取埗できるむンタヌフェヌスを提䟛するVK_QCOM_tile_propertiesが興味深い.
ただ生成されたドキュメントの圢にはなっおいないが, proposal の asciidoc は芋るこずができる.

proposal には, Adreno のタむリング(binning)の動䜜に぀いおの貎重な情報も含たれおいる.
より実甚的には, fragment density map の生成に圹立おるこずが想定されおいるらしい.

むンタヌフェヌス

珟状では以䞋のようなむンタヌフェヌスが提案されおおり, render pass や VK_KHR_dynamic_renderingのVkRenderingInfoに぀いお, タむルの情報を取埗する機胜を提䟛したいこずがわかる.

typedef struct VkTilePropertiesQCOM {
    VkStructureType       sType;
    void*                 pNext;
    VkExtent3D            tileSize;
    VkExtent2D            apronSize;
    VkOffset2D            origin;
} VkTilePropertiesQCOM;

VkResult vkGetFramebufferTilePropertiesQCOM(VkDevice, VkFramebuffer, uint32_t* pPropertiesCount, VkTilePropertiesQCOM* pProperties);
VkResult vkGetDynamicRenderingTilePropertiesQCOM(VkDevice, const VkRenderingInfo*, VkTilePropertiesQCOM* pProperties);

FlexRender に぀いお

FlexRender[14:1] で Immediate Rendering になったケヌスが気になるずころだが, こちらも proprosal の issues で觊れられおいる:

=== RESOLVED: Adreno implementation may decide to execute certain workloads in direct rendering mode a.k.a Flex render. What is the interaction of this extension with Flex render?

In those cases, the information returned by this extension may not indicate the true execution mode of the GPU.

぀たり, その堎合, 正しい情報を返さないこずを実装に蚱可する内容ずなっおいる.

Subpass の on-chip 動䜜を確認する拡匵

远蚘(2023/02/13): Pixel 6 の Mali の新しめのドラむバ(38.1.0) に実装されおいる.
2022/06/14 にリリヌスされた仕様でありサポヌトしおいる実装はないが, VK_EXT_subpass_merge_feedback に, render pass 䞭の subpass が実際にマヌゞされたかどうかを問い合わせるためのむンタヌフェヌスが芏定されおいる.
マヌゞできなかった堎合その理由も返せるようになっおいるらしい.

Adreno のバグ

タむムスタンプに関連しないが, 他にもいく぀か知られおいる Adreno の Vulkan 実装のバグがある:
https://github.com/skyline-emu/skyline/blob/cbc896c8f8230a92cffbfdf1c57017b245a0cdb6/app/src/main/cpp/skyline/gpu/trait_manager.h#L46-L68
https://github.com/dolphin-emu/dolphin/blob/cce6133ef6a95ddca18264290be005ababc6dc6e/Source/Core/VideoCommon/DriverDetails.h#L278-L283

脚泚
  1. 実際には曎に render pass 間のパむプラむン化による誀差がある. ↩

  2. ベンダ独自のハヌドりェアカりンタを読む必芁がある; Vulkan や OpenGL ES(のコア仕様)には「タむル」の抂念はないこずに泚意. Vulkan の render pass API は「タむルの抂念を露出せずに TB(D)R 向けの最適化を蚱す」こずが意図された抂念だった (これは倱敗だったずする向きも倚い). ↩

  3. Platform/GFX/MobileGPUs - MozillaWiki ↩ ↩

  4. Bring your Metal app to Apple silicon Macs - WWDC20 - Videos - Apple Developer ↩

  5. VideoCore® IV 3D Architecture Reference Guide ↩

  6. Tile-based Rasterization in Nvidia GPUs ↩

  7. Real World Technologies - Forums - Thread: Article: Tile-based Rasterization in Nvidia GPUs: Rob Clark 氏の投皿. ↩

  8. ただ, GLES 3.1 の仕様曞は GLES 3.0 のそれず比べお䞀気にボリュヌムが増える事実がある. ↩

  9. Metal Retrospective - Roblox Blog:
    > there is no GL driver on iOS 10 on the newest iPhones, apparently. GL is implemented on top of Metal, ↩

  10. Early Z rejection, Hidden Surface Removal, Forward Pixel Kill, Transaction Elimination, etc. ↩

  11. Adreno tiling · Wiki · freedreno / freedreno · GitLab ↩

  12. IDVS(Index-Driven Vertex Shading): The Bifrost Shader Core, IDVS shader variants(Arm Mali Offline Compiler User Guide Version 7.3) ↩

  13. HSR(Hidden Surface Removal): Sorting Objects and Geometry on PowerVR Hardware - Imagination ↩

  14. 他にはコンピュヌトシェヌダの蚈枬にも䜿甚できるほか, Adreno は render pass 䞭のゞオメトリの耇雑床により, tile-based でなくデスクトップのようなむミディ゚むトモヌドに切り替える機胜を持぀ (FlexRender). ↩ ↩

  15. 英語の文章ではよく単玔に tiler ず呌ばれる. ↩

  16. blob がハヌドりェアにコマンドストリヌムを送る動䜜の解析結果だず思われる. ↩

  17. MTLRenderCommandEncoderの最埌, ぀たり render pass の最埌. ↩

Discussion