【问题标题】:Problem with API returning invalid pointerAPI返回无效指针的问题
【发布时间】:2019-01-07 05:20:13
【问题描述】:

我一直在为面向 MacOS 的 Vulkan 编写包装库。在我遇到这个障碍之前一切都很好。有一个对SDL_Vulkan_CreateSurface 的调用,它应该返回一个指向表面VkSurfaceKHR 的指针。然而,返回的指针不是内存地址,而是数字 1。起初我认为这可能是 SDL 的一个错误,但后来我注意到另一个对另一个 Vulkan API 的调用返回 2。我现在没有选择了我希望这是我可以解决的问题。这是输出:

1== 创建 VULKAN 实例 启用扩展: VK_KHR_surface VK_MVK_macos_surface === 2== 创建物理设备 创建的 GPU(物理设备):0x00007fe23b81e380 3== 创建表面(金属->MoltenVK) 创建的表面:0x0000000000000001 4== 创建设备 选择队列 Family 为 0 创建的设备:0x00007fe23c017a10 5== 创建命令池 创建的命令池:0x0000000000000002 6== 创建命令缓冲区 创建的命令缓冲区:0x00007fe23a4d2bd0 7== 创建交换链 分段错误:11

负责的函数是这样的:

func createVulkanSurface() throws -> Surface {
    var surface = VkSurfaceKHR(bitPattern: 0)

    if SDL_Vulkan_CreateSurface(window, self.instance!.pointer, &surface) != SDL_TRUE {
        throw lastSDLError()
    }

    return Surface(instance: self.instance!, surface: surface!)
}

代码在这里:https://github.com/alexanderuv/vulkanSwift

上面的具体代码在这里:https://github.com/alexanderuv/vulkanSwift/blob/master/Sources/SwiftSDL2/Window.swift#L198

任何帮助将不胜感激!

【问题讨论】:

    标签: swift pointers vulkan


    【解决方案1】:

    VkSurfaceKHR 不是指针;这是一个不可调度的句柄。来自标准:

    Non-dispatchable 句柄类型是一个 64 位整数类型,其含义是实现- 依赖,并且可以直接在句柄中编码对象信息,而不是充当 对底层对象的引用。

    所以 1 或 2 很可能是不可调度句柄的有效值。如果您遇到 seg-fault,那不是因为表面句柄无效。

    【讨论】:

    • 谢谢!这意味着段错误必须在其他地方。我会重新检查
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多