2017-06-03 56 views
0

ppData指向一個指針,在該指針中返回一個可由主機訪問的指針 指向映射範圍的開始位置。該指針減去 偏移必須至少對齊到 VkPhysicalDeviceLimits :: minMemoryMapAlignment。查找主機可見內存的正確對齊方式

我想分配一個統一的緩衝區中的Vec3浮點數。一個Vec3浮點數是12bytes大。

VkMemoryRequirements { size: 16, alignment: 16, memory_type_bits: 15 } 

福爾康報告說,它必須對齊爲16個字節,這意味着分配的大小是現在16而不是12,所以福爾康已經處理了這個給我。

minMemoryMapAlignment在我的GPU上是64字節。這對我的分配意味着什麼?這是否意味着我無法使用VkMemoryRequirements的大小作爲我的分配?而不是在這裏分配16字節,我將不得不分配64字節?

更新:

對於具有16字節對準和64個字節minMemoryMapAlignment一個12字節分配。我仍然只分配16個字節,然後調用:

vkMapMemory(device, memory, 0, 16, 0, &mapped); 

但PTR從vkMapMemory返回實際上不是16個字節,但64個字節寬?所有相關的數據都在前12個字節中,剩下的只是「填充」內存?所以在實踐中,這基本上意味着我根本不需要使用minMemoryMapAlignment

+1

minMemoryMapAlignment是駕駛員對您的承諾,而不是您必須滿足的要求。這是一個保證,當映射時,分配將至少與此值對齊。這樣,您就可以安全地使用需要16字節對齊的SSE向量加載/存儲指令等內容。所以你不必使用這個值,當你這樣做的時候,你只需要檢查它是否至少和你的代碼需要的對齊一樣大。 –

回答

3

規範中沒有任何內容限制分配的大小。您引用的段落意味着映射將對齊到minMemoryMapAlignment,然後您可以告訴編譯器在訪問它時使用對齊的內存訪問。會發生什麼情況是,當內存映射時,後面的48個字節是主機內存空間中浪費的空間。但這不太可能。

這就是爲什麼人們會說要分配更大的塊並根據需要進行細分。這樣你可以將4個這樣的vkBuffers放入一個64字節的分配中(如果你想要渲染渲染,你將需要這個分配)。

單個vec3不太可能只是你需要記憶的東西,所以看看你的其他分配,看看你可以組合哪些。

+0

這只是一個假設的例子,我更新了我的問題,以確保我完全理解您的答案。 –