2016-11-09 26 views
2

在約HOST_WRITE_BIT的規格是寫:HOST_WRITE有用或驗證圖層錯誤?

對於主機寫入到由後續命令緩衝器的操作可以看出,從VK_ACCESS_HOST_WRITE_BIT源和VK_PIPELINE_STAGE_HOST_BIT到相關設備的流水線級和訪問的目的地的管道屏障類型必須執行。另外,這樣的屏障在每個命令緩衝區提交隱式執行,所以顯式屏障僅很少需要

但是,當過渡(通過vkCmdPipelineBarrier(所以在commandBuffer))從預先初始化佈局與一種圖像一個srcAccessMask到0,而不是HOST_WRITE_BIT,則得到一個錯誤:

驗證層:源AccessMask 0 [無]必須具有所需的訪問位16384時佈局VK_IMAGE_LAYOUT_PREINITIALIZED,除非該應用以前添加的屏障[VK_ACCESS_HOST_WRITE_BIT]爲了這個轉變。

從規格中是否有錯誤?從驗證層?我們談論的障礙是純粹的執行障礙而不是記憶嗎?我錯過了什麼嗎?

回答

3

我的私人意見是:驗證層錯誤。

它只是簡單地檢查佈局VS訪問標誌和似乎沒有意識到這個角落情況: https://github.com/KhronosGroup/Vulkan-LoaderAndValidationLayers/blob/master/layers/core_validation.cpp#L9005

還有,當你重新考慮,並在所有沒有承載寫入到VK_IMAGE_LAYOUT_PREINITIALIZED圖像也時(因而不需要屏障),不是嗎?

我相信層消息是WARNING而不是ERROR。這可能意味着它僅僅是「啓發式」,並且預計會出現一些誤報(直到他們改進了層次,這似乎是可能的,但對於這種情況並不那麼微不足道)。


他們甚至只是近來修正可能性爲0演示訪問標誌,所以它不是遙不可及的,他們會(類似頭腦)忘了什麼東西一樣,在該層。

我會在那裏報告問題。他們不會咬人,更糟糕的是,可能發生的一些Khronos內部人士比我更懂得解釋爲什麼你錯了。


話雖這麼說,也許VK_PIPELINE_STAGE_HOST_BIT不必太(和TOP應該足夠了)?

+0

好的就在你回答之前,我在github上做了一個問題^^。 所以這是一個警告,而不是一個錯誤,你是對的。 我不明白TOP_OF_PIPE是從哪裏來的^^ –

+0

那麼,你所說的聲明說,根本不需要**屏障。按照這個邏輯,如果你有障礙,那麼非阻塞的('src = TOP_OF_PIPE')就足夠了,不是嗎? – krOoze

+0

要轉換圖像佈局,您必須使用內存屏障。但恕我直言,你不需要告訴Vulkan內存可用,因爲它已經由隱含屏障執行了。 –