我正在写一些vulkan代码,遇到了一个我无法理解的问题。我有以下代码:
NativeMethods.cs:
[DllImport("libvulkan.1.dylib", EntryPoint = "vkGetPhysicalDeviceProperties", CallingConvention = CallingConvention.Cdecl)]
public static extern void vkGetPhysicalDeviceProperties(IntPtr vkPhysicalDevice, VkPhysicalDeviceProperties* properties);GraphicsAdapter.cs:
internal GraphicsAdapter(
IntPtr deviceHandle,
IntPtr surfaceHandle)
{
VkPhysicalDeviceProperties properties;
NativeMethods.vkGetPhysicalDeviceProperties(deviceHandle, &properties);
...
}我遇到的问题是,在P/Invoke调用之后,变量deviceHandle & surfaceHandle被重置为0x0。另外,如果我在调用后声明一个带有一些值的列表,它的空值。
我在MacBook Air dotnet 6& MoltenVK上运行这个程序。有人能解释一下为什么会发生这种事吗?
编辑1:多亏了我的评论,我发现了这个问题。这确实是我所称的胡子平衡,因为通过的结构有一个不同于vulkan预期的内存布局。
Vulkan使用VkBool32来表示布尔值,即uint32。我想,因为一个普通的bool也是4个字节,所以我可以直接使用它。结果却不知何故..。当将其更改为VkBool32结构(它只有一个uint32值)时,它将按预期的方式再次工作!
编辑2: C#中的bool是1字节,而不是4字节(正如我所怀疑的)。
发布于 2022-05-07 17:08:47
多亏了我的评论,我发现了这个问题。这确实是我所称的胡子平衡,因为通过的结构有一个不同于vulkan预期的内存布局。
Vulkan使用VkBool32来表示布尔值,即uint32。我想,因为一个普通的bool也是4个字节,所以我可以直接使用它。结果却不知何故..。(它在CLR上的1字节)当将其更改为VkBool32结构(它只有一个uint32值)时,它将按预期的方式再次工作!
https://stackoverflow.com/questions/72148175
复制相似问题