1. 程式人生 > >Vulkan Cookbook 第四章 12 在緩衝區之間複製資料

Vulkan Cookbook 第四章 12 在緩衝區之間複製資料

在緩衝區之間複製資料

在Vulkan中,為了將資料上傳到緩衝區,我們不僅限於記憶體對映技術。既使繫結到它們的記憶體物件是從不同的記憶體型別分配的,也可以在緩衝區之間賦值資料。

譯者注:示例程式碼點選此處

怎麼做...

1.獲取命令緩衝區的控制代碼。將其儲存在名為command_buffer的VkCommandBuffer型別變數中。確保命令緩衝區處於記錄狀態(請參閱第3章,命令緩衝區和同步中的開始命令緩衝區記錄操作內容)。
2.獲取將從中複製資料的緩衝區,使用名為source_buffer的VkBuffer型別的變量表示此緩衝區。
3.獲取將資料拷貝到的目標緩衝區,使用名為destination_buffer的VkBuffer型別的變量表示此緩衝區。
4.建立名為regions的std::vector<VkBufferCopy>型別的變數。元素數量是我們希望複製的所有區域數量。在每個元素中,指向原緩衝區中的記憶體偏移量,目標緩衝區中對應記憶體的偏移量,以及要從給定區域複製的資料大小。
5.呼叫vkCmdCopyBuffer( command_buffer, source_buffer, destination_buffer, static_cast<uint32_t>(regions.size()), &regions[0] ),使用command_buffer、source_buffer和destination_buffer變數,regions向量中的元素數量以及指向該向量第一個元素的指標做為引數。

這個怎麼運作...

在緩衝區之間複製資料是更新給定資源的記憶體內容的另一種方法。需要將此操作記錄到命令緩衝區如下所示:

if( regions.size() > 0 ) {
  vkCmdCopyBuffer( command_buffer, source_buffer, destination_buffer, static_cast<uint32_t>(regions.size()), regions.data() );
}

為獲得最佳效能,在呈現期間使用的資源應具有裝置本地記憶體繫結。但是,我們無法對映這樣的記憶體。使用vkCmdCopyBuffer()函式,我們可以從繫結有主機可見記憶體的另一個緩衝區將資料複製到這樣的緩衝區。

提示:必須使用VK_BUFFER_USAGE_TRANSFER_SRC_BIT用法建立可以複製資料的緩衝區。
           必須使用VK_BUFFER_USAGE_TRANSFER_DST_BIT用法建立可以向其拷貝資料的緩衝區。

當我們想要使用緩衝區作為傳輸操作的目標時(我們想要將資料複製到緩衝區),應該設定一個記憶體屏障,告知驅動程式從現在開始,在緩衝區上執行的操作由VK_ACCESS_TRANSFER_WRITE_BIT記憶體訪問方式表示。在完成將資料複製到目標緩衝區並用於希望的用途之後,我們應該設定另一個記憶體屏障。這一次,我們應該告訴驅動程式我們之前的記憶體操作是什麼(之前是VK_ACCESS_TRANSFER_WRITE_BIT操作型別),還有在屏障之後,緩衝區將用於不同目的。所以還要告訴驅動屏障之後記憶體的訪問型別(參見

設定緩衝區記憶體屏障內容)。