gpt4 book ai didi

c++ - Vulkan 的传输队列系列功能和视频卡支持 : Are the condition checks accurate?

转载 作者:行者123 更新时间:2023-11-27 23:43:28 25 4
gpt4 key购买 nike

我正在关注这个 Vulkan Youtube video tutorial约书亚舒克。我目前正在观看他的第 14 个视频,他正在为顶点缓冲区创建辅助队列系列。这侧重于顶点缓冲区的暂存过程。我的代码与他在他的视频中的代码相匹配,除了我在其中添加用于测试的 cout 语句 的代码。以下是 Queue Families 的功能和结构:

struct QueueFamilyIndices {
int graphicsFamily = -1;
int transferFamily = -1;

bool isComplete() {
return (graphicsFamily >= 0 && transferFamily >= 0);
}
};

QueueFamilyIndices FindQueueFamilies( const VkPhysicalDevice* device, const VkSurfaceKHR* surface ) {
QueueFamilyIndices indices;
uint32_t queueFamilyCount = 0;
vkGetPhysicalDeviceQueueFamilyProperties( *device, &queueFamilyCount, nullptr );
std::vector<VkQueueFamilyProperties> queueFamilies( queueFamilyCount );
vkGetPhysicalDeviceQueueFamilyProperties( *device, &queueFamilyCount, queueFamilies.data() );

int i = 0;
for( const auto &queueFamily : queueFamilies ) {
VkBool32 presentSupport = false;
vkGetPhysicalDeviceSurfaceSupportKHR( *device, i, *surface, &presentSupport );

if( queueFamily.queueCount > 0 && (queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) && presentSupport ) {
indices.graphicsFamily = i;
}

if( queueFamily.queueCount > 0 && (queueFamily.queueFlags & VK_QUEUE_TRANSFER_BIT) &&
!(queueFamily.queueFlags & VK_QUEUE_GRAPHICS_BIT) && presentSupport ) {
indices.transferFamily = i;
}

if( indices.isComplete() ) {
break;
}
i++;
}

if( indices.graphicsFamily >= 0 && indices.transferFamily == -1 ) {
std::cout << "Graphics family found, transfer family missing: using graphics family" << std::endl;
indices.transferFamily = indices.graphicsFamily;
}

return indices;
}

在这个函数中 vkGetPhysicalDeviceSurfaceSupportKHR(...) 被调用了两次,因为在调用 vkGetPhysicalDeviceQueueFamilyProperties(...) 之后找到了 2 个队列系列填充 VkQueueFamilyProperties 结构的 vector 。


这是我的 NVidia GeForce gtx 750 Ti 卡的规范,基于其队列系列的 Vulkan 规范:Vulkan:Report如果链接随时间变化,这里直接提供信息:

Queue family                          0     
queueCount 16
flags GRAPHICS_BIT
COMPUTE_BIT
TRANSFER_BIT
SPARSE_BINDING_BIT
timestampValidBits 64
minImageTransferGranularity.width 1
minImageTransferGranularity.height 1
minImageTransferGranularity.depth 1
supportsPresent 1

Queue family 1
queueCount 1
flags TRANSFER_BIT
timestampValidBits 64
minImageTransferGranularity.width 1
minImageTransferGranularity.height 1
minImageTransferGranularity.depth 1
supportsPresent 0

现在根据这些规范,这些规范与我的结构 vector 中的值一致,而我正在逐步调试调试器,我的结构被填充了的值(value)观:

 queueFamilies[0].queueFlags = 15;
queueFamilies[0].queueCount = 16;
queueFamilies[0].timestampValidBits = 64;
queueFamilies[0].minImageTransferGranularity = { width = 1, height = 1, depth = 1 };

queueFamilies[1].queueFlags = 4;
queueFamilies[1].queueCount = 1;
queueFamilies[1].timestampValidBits = 64;
queueFamilies[1].minImageTransferGranularity = { width = 1, height = 1, depth = 1 };

所以在我看来,我的卡确实支持单独的 queueFamily,特别是 transferFamily


基于我对这种支持的假设并逐步执行此函数,他有两个 if 语句来检查每个索引 queueFamily 对象的 for 循环内的有效条件。 if 语句完全按照它们应有的方式返回。我的代码在没有任何错误或警告的情况下编译和构建,并且当我没有通过调试器运行它时它仍然会呈现三角形并且它确实以代码 (0) 退出。所以代码看起来没问题。但是,我没有得到我至少期望的结果。

我不确定他的代码中是否存在他碰巧遗漏的错误,如果我误解了我的视频卡对此 Vulkan 功能的支持,或者这可能是 Vulkan API 错误或 NVidia 驱动程序错误.

然而,当我逐步执行此函数以找出为什么未将 indices.transferFamily 变量设置为 i 时;我注意到在循环的第二次迭代中,它与 transferFamilyQueue 的存在、它的参数值或标志无关。导致此 if 语句返回 false 的原因是 presentSupport 变量,因为它在第二次调用时被设置为 0,这确实与上面的数据表匹配。所以输出符合预期。

My question then becomes: Is there an actual implementation problem with the condition checking in the second if statement?

这是我卡住的地方,因为我有点困惑,因为我们正在检查是否有可用的 transferQueueFamily,如果有,请使用它来创建和使用 stagingBuffer 将内容从 CPU 复制到 GPU 以用于 vertex buffer(s)。据我所知,我的卡似乎确实有此 transferFamily 但没有此系列的 supportPresent。然而,仔细想想;如果您使用的是 transferFamily - transferQueue,您不会希望直接present 它,因为您只是从临时文件中复制数据CPU 上的 vertexBuffer 到将在 GPU 上使用的 vertexBuffer。所以我想知道这个 if 语句中的最终检查是否正确。如果我对 Vulkan 如何在这里工作的假设不正确,请不要犹豫纠正我,因为这是我第一次尝试让 Vulkan 渲染应用程序工作。

最佳答案

没有 Vulkan API 或 NVidia 驱动程序错误。它就在您的报告表中:

supportsPresent 0

例如AMD 似乎确实支持 VK_QUEUE_TRANSFER_BIT 队列系列上的礼物,但它完全是可选的(31.4。查询 WSI 支持):

Not all physical devices will include WSI support. Within a physical device, not all queue families will support presentation.

关于c++ - Vulkan 的传输队列系列功能和视频卡支持 : Are the condition checks accurate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52573074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com