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