vkEnumeratePhysicalDevices 返回 VK_INCOMPLETE 表示设备数量超出传入数组容量,需先用 nullptr 获取真实数量再二次调用;选 VkPhysicalDevice 应基于特性支持与 API 版本而非设备类型;vkBeginCommandBuffer 返回 VK_ERROR_INITIALIZATION_FAILED 通常因 Primary 命令缓冲区误设 pInheritanceInfo;命令池生命周期必须严格绑定逻辑设备。
调用 vkEnumeratePhysicalDevices 时返回 VK_INCOMPLETE 不是错误,而是 Vulkan 的标准分页机制:你传入的 physicalDeviceCount 指针值小于实际可用设备数,Vulkan 只填满你给的数组并告知“没写完”。
nullptr 和 &deviceCount 获取真实数量,再分配数组deviceCount 值未被意外修改(比如被其他线程覆盖)uint32_tdeviceCount = 0; vkEnumeratePhysicalDevices(instance, &deviceCount, nullptr); std::vector
devices(deviceCount); vkEnumeratePhysicalDevices(instance, &deviceCount, devices.data());
硬编码只选独显会失败:Mac 上 M 系列芯片返回 VK_PHYSICAL_DEVICE_TYPE_INTEGRATED_GPU 但性能极强;某些嵌入式平台甚至没有离散 GPU。关键看能力而非类型。
vkGetPhysicalDeviceFeatures 是否支持你需要的特性(如 geometryShader、tessellationShader)vkGetPhysicalDeviceProperties 查 deviceName 和 apiVersion,过滤掉太旧(如 apiVersion )的设备
vkGetPhysicalDeviceQueueFamilyProperties 确认存在支持图形+传输+计算的队列族(尤其注意 queueFlags & VK_QUEUE_GRAPHICS_BIT)VK_ERROR_OUT_OF_HOST_MEMORY 或 VK_ERROR_OUT_OF_DEVICE_MEMORY 很可能不是真内存不足,而是参数配置错位。
commandPool 必须由当前 physicalDevice 对应的 device 创建(不能跨 device 复用)allocateInfo.level 设为 VK_COMMAND_BUFFER_LEVEL_PRIMARY 时,该 command pool 必须在创建时指定 flags & VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT == 0
commandBufferCount > 65535,部分驱动会静默失败(尤其是 Intel Windows 驱动),建议单次不超过 1024 个VkCommandBufferAllocateInfo allocInfo{};
allocInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
allocInfo.commandPool = commandPool;
allocInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
allocInfo.commandBufferCount = 1;
std::vector buffers(1);
vkAllocateCommandBuffers(device, &allocInfo, buffers.data());
这个错误几乎总是因为 VkCommandBufferBeginInfo 中的 pInheritanceInfo 字段非法:它仅对 VK_COMMAND_BUFFER_LEVEL_SECONDARY 有效,Primary 缓冲区传非空指针会直接触发该错误。
立即学习“C++免费学习笔记(深入)”;
beginInfo.pInheritanceInfo = nullptr
VkCommandBufferInheritanceInfo,且其中 renderPass 和 subpass 必须与将来调用它的 Primary 缓冲区匹配vkDestroyDevice,所有从它分配的 command pool 和 command buffer 都立即失效,哪怕还没提交。别试图复用或延迟销毁。