【发布时间】:2020-05-17 19:23:47
【问题描述】:
运行 MacOS Catalina 和 VSCode。
这就是我初始化设备的方式
void Renderer::InitDevice() {
{
uint32_t gpu_count = 0;
vkEnumeratePhysicalDevices(Instance, &gpu_count, nullptr);
std::vector<VkPhysicalDevice> gpu_list(gpu_count);
vkEnumeratePhysicalDevices(Instance, &gpu_count, gpu_list.data()); //populates gpu_list with all gpu handles
GPU = gpu_list[0]; //grab first gpu. debug and figure out a ranking system
vkGetPhysicalDeviceProperties(GPU, &GPU_device_properties);
}
{
uint32_t family_count = 0;
vkGetPhysicalDeviceQueueFamilyProperties(GPU, &family_count, nullptr);
std::vector<VkQueueFamilyProperties> family_properties(family_count);
vkGetPhysicalDeviceQueueFamilyProperties(GPU, &family_count, family_properties.data());
bool found_graphics_bit = false;
for ( u_int32_t i = 0; i<family_count; i++){
if(family_properties[i].queueFlags & VK_QUEUE_GRAPHICS_BIT){
found_graphics_bit = true;
graphics_family_index = i;
}
}
if (!found_graphics_bit){
assert(1 && "Vulkan Error: Queue family supporting graphics card not found");
std::exit(-1);
}
}
{
uint32_t layer_count = 0;
vkEnumerateInstanceLayerProperties(&layer_count, nullptr);
std::vector<VkLayerProperties> layer_properties(layer_count);
vkEnumerateInstanceLayerProperties(&layer_count, layer_properties.data()); //something about system layers
std::cout << "Instance Layers: \n";
for (auto &layer_property: layer_properties){
std::cout << "\t" << layer_property.layerName << "\n";
std::cout << "\t\t" << layer_property.description << "\n";
}
std::cout << "\n";
}
{
uint32_t layer_count = 0;
vkEnumerateDeviceLayerProperties(GPU, &layer_count, nullptr);
std::vector<VkLayerProperties> layer_properties(layer_count);
vkEnumerateDeviceLayerProperties(GPU, &layer_count, layer_properties.data()); //something about system layers
std::cout << "Device Layers: \n";
for (auto &layer_property: layer_properties){
std::cout << "\t" << layer_property.layerName << "\n";
std::cout << "\t\t" << layer_property.description << "\n";
}
std::cout << "\n";
}
float queue_priorities[] { 1.0f };
VkDeviceQueueCreateInfo device_queue_info = {};
//need to understand queue properties
device_queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
device_queue_info.queueFamilyIndex = graphics_family_index;
device_queue_info.queueCount = 1;
device_queue_info.pQueuePriorities = queue_priorities;
VkDeviceCreateInfo device_info{};
device_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
device_info.queueCreateInfoCount = 1;
device_info.pQueueCreateInfos = &device_queue_info;
device_info.enabledLayerCount = device_layers.size();
device_info.ppEnabledLayerNames = device_layers.data();
device_info.enabledExtensionCount = device_extensions.size();
device_info.ppEnabledExtensionNames = device_extensions.data();
auto err = vkCreateDevice(GPU, &device_info, nullptr, &Device);
if (err != VK_SUCCESS){
assert(1 && "Vulkan Error: Device Creation Failed");
std::exit(-1);
}
}
发生此错误时,Vulkan 设备创建返回 VK_SUCCESS。 我就是这样摧毁它的
void Renderer::DeinitDevice() {
vkDeviceWaitIdle(Device);
vkDestroyDevice(Device, nullptr); //uncommenting this causes program to crash.
Device = nullptr;
}
在vkDeviceWaitIdle(Device); 上,或者如果它被删除,它会在vkDestroyDevice(Device, nullptr); 上发生
我收到EXC_BAD_ACCESS
和
@"2020-05-17 15:06:54.832625-0400 main[4816:29494] flock failed to lock maps file: errno = 35\r\n"
@"UNASSIGNED-ObjectTracker-ObjectLeak(ERROR / SPEC): msgNum: 699204130 - Validation Error: [ UNASSIGNED-ObjectTracker-ObjectLeak ] Object 0: handle = 0x10104e018, type = VK_OBJECT_TYPE_DEVICE; | MessageID = 0x29ad0222 | OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT object VkDevice 0x10104e018[] has not been destroyed.\r\n"
@" Objects: 1\r\n"
@" [0] 0x10104e018, type: 3, name: NULL\r\n"
我一直在关注 vulkan 教程,但我无法真正理解,但我发现了一些视频,这些视频解释了教程真正没有涵盖的内容。到目前为止,我已经把它放在一起,但我不确定是什么导致了错误。我见过其他类似的错误,但似乎不知道他们是如何解决的。
【问题讨论】:
-
我假设您使用 MoltenVK 来支持 Vulkan(因为 macOS 没有原生 Vulkan 支持)。如果是这样,您应该编辑标签以包含moltenvk 标签。
-
我会调查 MoltenVK,我的实际问题是我在销毁设备之前销毁了实例。我假设破坏实例也会破坏设备。
标签: c++ macos visual-studio-code vulkan