Vulkan 动态设置原始拓扑导致崩溃

问题描述 投票:0回答:1

创建图形管道时我已经设置了

VkPipelineDynamicStateCreateInfo.pDynamicStates = { VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY };

(将其设置为

VK_DYNAMIC_STATE_PRIMITIVE_TOPOLOGY_EXT
没有什么区别,它们在我的计算机上都是相同的值)并在创建 VkDevice 时启用
extendedDynamicState
功能:

uint32_t deviceExtensionCount = 1;
const char* deviceExtensions[] = { "VK_KHR_swapchain", "VK_EXT_extended_dynamic_state" };
const float queuePriority[] = { 1.0f };

VkPhysicalDeviceFeatures features;
vkGetPhysicalDeviceFeatures(s_VkData.PhysicalDevice, &features);

VkPhysicalDeviceExtendedDynamicStateFeaturesEXT featuresEXT{};
featuresEXT.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_FEATURES_EXT;
featuresEXT.extendedDynamicState = VK_TRUE;

VkPhysicalDeviceFeatures2 features2{};
features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
features2.features = features;
features2.pNext = &featuresEXT;

VkDeviceQueueCreateInfo queueInfo[1] = {};
queueInfo[0].sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueInfo[0].queueFamilyIndex = s_VkData.QueueFamily;
queueInfo[0].queueCount = 1;
queueInfo[0].pQueuePriorities = queuePriority;

VkDeviceCreateInfo deviceInfo{};
deviceInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
deviceInfo.queueCreateInfoCount = sizeof(queueInfo) / sizeof(queueInfo[0]);
deviceInfo.pQueueCreateInfos = queueInfo;
deviceInfo.enabledExtensionCount = deviceExtensionCount;
deviceInfo.ppEnabledExtensionNames = deviceExtensions;
deviceInfo.pNext = &features2;
VkResult result = vkCreateDevice(PhysicalDevice, &deviceInfo, s_VkData.Allocator, &s_VkData.Device);
CheckVkResult(result);

但是当我在记录命令缓冲区时调用

vkCmdSetPrimitiveTopology
vkCmdSetPrimitiveTopologyEXT
时,我收到访问冲突异常。我的命令缓冲区是有效的(使用 Visual Studio 的调试器检查了这一点)并且我没有收到任何验证错误。用
vkCmdSetPrimitiveTopologyEXT
加载
vkGetInstanceProcAddr
不会改变结果。

c++ rendering vulkan
1个回答
0
投票

您正在调用不属于 Vulkan Core 1.0 的函数。除非您执行某些操作来加载它们,否则调用它们将导致崩溃,因为它们没有有效的函数指针。

可通过三种方法解决此问题:

  • 您使用像

    vkCmdSetPrimitiveTopology
    这样的核心功能(无EXT后缀)。如果是这样,您需要使用 API 版本创建 Vulkan 实例,其中这些函数是核心的一部分。这将是
    VK_API_VERSION_1_3
    并启用核心功能。然后函数指针将作为核心函数可用。请注意,这仅适用于支持 Vulkan 1.3 及更高版本的设备。

  • 您可以使用

    vkCmdSetPrimitiveTopologyEXT´ and manually load the function pointers. For this you enable the extension, the extension feature and then use 
    vkGetInstanceProcAddr` 等扩展函数来获取有效的函数指针。

  • 您使用像volk这样的元加载器,它将为您加载函数指针。

© www.soinside.com 2019 - 2024. All rights reserved.