2017-05-02 51 views
2

據我所知,VK_DEFINE_NON_DISPATCHABLE_HANDLEstruct object##_T *objectuint64_t object,具體取決於架構。什麼是VK_DEFINE_NON_DISPATCHABLE_HANDLE意思是

不明白是爲什麼使用這個,它有什麼好處和/或效果。

例如,如果我想從我的VkShaderModule中獲得pCode,爲什麼我不能僅僅去myShaderModule.pCode

回答

4

在許多領域,Vulkan API都實現了不透明的手柄。從本質上講,這意味着實現者可以做任何他們喜歡的事情,並且不會受到任何與客戶的任何契約的約束,或者是對象的內存佈局,或者甚至是真正的指針。

如果你想從你的VkShaderModule得到pCode,我建議你在創建它的時候自己存儲它,而不是依靠實現來存儲它。

Vulkan的意圖是消除圖形API的負擔並消除膨脹。存儲用戶提供的數據並提供API以獲取所述用戶數據是膨脹的。如果您想保留這些內容,請將VkShaderModules的地圖設置爲您希望從VkShaderModuleCreateInfo保留的任何參數。

+0

謝謝,這對於Vulkan API – FrickeFresh

+2

背後的整體主題是有意義的。「glGetShaderSource」是您真正要求的OpenGL等價物。這真是一個毫無意義的函數調用。如果客戶需要這些信息,他們可以自己存儲它們,因爲他們首先提供了這些信息!實際上,由於驅動程序必須存儲這些字符串,因此係統中的每個圖形應用程序都會產生內存浪費。在GL中有很多這樣的廢話,它從Vulkan中刪除。 – djgandy

4

VK_DEFINE_NON_DISPATCHABLE_HANDLE是什麼意思?

根據談話elsewhere,這裏的關鍵點是:

  1. 一個手柄式的大小必須是64位
  2. 一個手柄式應該是唯一的,如果可能的話

在64位平臺上,您可以使用64位指針來創建大量不同的獨特類型;因此你的句柄類型不能互換。

否則,你可以做的最好的是uint64_t,這不是相當於類型安全。

在C++ 11中,我們可能會使用enum class handle##_t : uint64_t {}來獲得兩全其美的效果。


例如,如果我想從我的VkShaderModule得到P碼爲什麼我不能只是去myShaderModule.pCode?

不知道這是什麼意思,對不起。

+1

Vulkan中的不可分派句柄不必是唯一的。這允許實現直接將關於對象的所有信息存儲在句柄本身中(例如,可能對VkSampler有用),而不是分配單獨的對象。 –

+0

@JesseHall:沒有說他們是。 –

+0

@BoundaryImposition:「*一個句柄應該是唯一的,在可能的情況下*」這聽起來像句柄應該是唯一的。 –