2016-05-04 212 views
5

我不清楚在什麼時候使用VK_IMAGE_LAYOUT_GENERAL是一個好主意,而不是爲了我將要執行的任何操作而轉換到最佳佈局。目前,我的政策是始終過渡到最佳佈局。什麼時候使用VK_IMAGE_LAYOUT_GENERAL

但存在VK_IMAGE_LAYOUT_GENERAL。也許我應該在短時間內使用給定的佈局時使用它。

例如,現在,我正在編寫使用vkCmdBlitImage生成mipmap的代碼。當我循環執行vkCmdBlitImage命令的子資源時,當我縮小爲mip時,是否應該轉換爲VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,然後當我成爲下一個mip的源時轉換到VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,然後當我轉到VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL時全做完了?看起來好像有很多轉換,並且可能在VK_IMAGE_LAYOUT_GENERAL中生成mips更好。我很欣賞答案可能是衡量,但很難衡量我所有的目標GPU(特別是因爲我還沒有在Android上運行任何東西),所以如果任何人有任何體面的經驗法則來應用它會非常感謝。我正在寫Vulkan代碼,可以在桌面GPU和Android上運行,但我主要關注後者的性能。

回答

5

你會使用它的時候:

  1. 你懶
  2. 您需要映射內存到主機當您使用圖像作爲多個不兼容的附件(除非你可以使用預先初始化)
  3. 和你別無選擇
  4. 對於圖像存儲

(5,其他情況下,當你切換佈局過多(一d你甚至不需要障礙)相對於在圖像上完成的工作。在這種情況下,確認GENERAL所需的測量值會更好。即使那樣,最有可能是過早的最優化。 PS:你可以預先通過一個命令將所有的mip-map轉換到TRANSFER_DST,然後只有你需要的那個到SRC。如果這是一個選項(甚至可能使用一些複雜的算法來獲得更好的質量),那麼使用體面的硬盤,應該甚至可以將它們存儲在mip-maps中。

PS2:太糟糕了,沒有mip-map創建命令。對於小於一半分辨率的圖像來說,cmdBlit最有可能在罩下進行......

+0

重要的是要注意,這些測量需要在適當的實現上進行。 IE:已知對佈局敏感的那些。 –

+0

^好吧,這是暗示的。測量應該始終在代碼應該運行的機器上完成。 – krOoze

+0

接受了這個答案。我認爲你關於過早優化的觀點實際上是問題的關鍵。我想我擔心我目前可能過度使用轉換的方法是不成熟的優化,但是您可以令人信服地說,在這種情況下,嘗試*避免*轉換將是不成熟的優化。我將繼續使用轉換到最佳佈局,直到我有足夠的進展來測量目標硬件。 – Columbo

2

如果您從mipmap [n]圖像讀取mipmap [n + 1]圖像的圖像,那麼您應該使用傳輸圖像標誌,如果您希望您的代碼在所有Vulkan實現上運行並獲得所有實現的最佳性能因爲這些標誌可能會被GPU用來優化圖像的讀取或寫入。

因此,如果您想要跨供應商只使用VK_IMAGE_LAYOUT_GENERAL設置使用最終圖像而不是圖像讀取或寫入的描述符。

如果你不想使用那麼多的轉換,你可能會從緩衝區而不是圖像複製,儘管你顯然不會獲得vkCmdBlitImage爲你免費的格式轉換,縮放和過濾。

另外不要忘記檢查目標格式實際上是否支持BLIT_SRC或BLIT_DST位。這與您是否使用傳輸或副本的總體佈局無關。

相關問題