问题标签 [validation-layers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Vulkan,为什么验证层(以及规范的扩展)禁止管道不写入某些附件?
在 vulkan 中,如果在单个渲染过程的生命周期内,您天真地渲染到包含多个附件的帧缓冲区,并使用渲染到所有附件的管道,然后使用仅渲染到其中一个的管道再次渲染,您将收到错误.
让我举个例子。
这是通过在反照率上编写线框获得的:
4 个“noop”输出并不是真正必要的,它们的存在只是为了防止 vulkan 错误。
假设我们改为这样做(并且我们也修改了我们的 pieline):
然后我们得到相同的图像。
但是存在一个关键的区别:
第二个图像产生多个错误,每个附件一个,如下所示:
为什么根据规范不明确写入帧缓冲区的附件无效?即为什么不规范如果您不写入附件,则内容会被保留?
vulkan - 基于屏障的同步后清理命令缓冲区(和资源);但验证层仍然抱怨
这是关于基于屏障的同步 wrt 命令缓冲区提交和清理命令缓冲区所需的资源(如使用的缓冲区和图像)的具体问题。
让我们假设,一切都在一个队列中,并且有三帧在飞行中。
我执行以下操作:
有问题的部分是我删除Init-CmdBfr
,Image
和StagingBuffer
. 或者实际上,只要应用程序运行良好,它就没有问题。但是验证层抱怨:
带有 Id[0|VUID-vkFreeCommandBuffers-pCommandBuffers-00047] 和 Message[尝试释放正在使用的 VkCommandBuffer 0x20e61cff060[] 的 Vk 回调。Vulkan 规范规定:pCommandBuffers 的所有元素不得处于挂起状态(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-vkFreeCommandBuffers-pCommandBuffers-00047 )]
还会出现更多消息,例如:
Vk-callback with Id[0|VUID-vkDestroyBuffer-buffer-00922] 和 Message[Cannot free VkBuffer 0xe6bc0400000000a1[] 正在被命令缓冲区使用。Vulkan 规范指出:所有提交的引用缓冲区的命令,无论是直接还是通过 VkBufferView,都必须已完成执行(https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html #VUID-vkDestroyBuffer-buffer-00922)]
规范规定,命令缓冲区只有在离开“待处理”状态时才能被删除。通过我和信号和等待barrier ALL_COMMANDS ALL_COMMANDS MEMORY_WRITE MEMORY_READ
的完整周期,我认为这必须在第 4 帧中给出。Fence[0]
我的第一个问题是:我对这个假设是否正确?而且,我的这种方法可以吗?
我的第二个问题是:如果我是对的并且我的方法没问题,我该如何防止验证层抱怨?
我认为,验证层只是不知道障碍并抱怨,因为可能是我没有创建障碍。Init-CmdBfr
事实上,当我在(ie )的提交中添加信号量时Submit Init-CmdBuffer and signal Init-Semaphore
,验证层不再抱怨了。但在我看来,信号量实际上是不必要的。没有它可以做到吗?
更新:
全部Semaphore[i]
替换Fence[i]
为更好地说明我的问题。(前面的例子导致了一些混乱,抱歉。)
c++ - Vulkan 队列等待无法发出信号的信号量
似乎我有一段时间的无效代码,但验证层保持沉默。将我的 sdk 更新到最新版本后,我开始收到此错误:
这发生在我的主绘制循环内,它是我代码中唯一的验证层错误。如果我从不调用负责表面呈现的代码。我没有错误。
我确定我做错的地方在这里:
目前它们被连续调用:
为了使事情正常进行,我尝试将这两个函数的部分注释掉或更改调用的顺序,但错误仍然存在或我得到不同的验证错误。
我还尝试直接向信号量发出信号:
但我所做的只是导致分段错误
cmake - Vulkan 验证层:loader_create_instance_chain:未能找到“vkGetInstanceProcAddr”
我按照本指南创建了一个非常基本的 Vulkan 程序,出于某种原因,即使完全复制了指南中的代码(并且没有使用我自己的版本,该版本略有不同并根据我的需要进行了修改),我仍然收到以下两个验证启动程序时的层错误:
而且我仍然无法弄清楚这个错误是怎么回事,我也无法在网上找到关于这个特定错误的正确信息。
我有一个线索,而且很重要——我正在使用 CLion,这意味着我需要一个CMakeLists.txt
文件来构建整个项目及其依赖项,并且在指南中它们没有显示如何正确执行。
现在,我的CMakeLists.txt
文件如下所示:
重要的是要知道我是 cmake 的新手,在 Windows 10 上工作并且程序运行正常(实际窗口看起来不错,只有控制台令人担忧)。
如果有人可以帮助解决这个问题,将不胜感激。此外,对 的任何优化CMakeLists.txt
都会很棒!
提前致谢!
vulkan - 如何使用具有非标准化纹理坐标的 vulkan 采样器?(不触发 VUID-vkCmdDrawIndexed-None-02703)
所以我一直在我的纹理采样器中使用非标准化坐标,因为我发现在将纹理用作精灵图集时更容易处理纹理的某些部分。今天我修补了我的工作站并重新编译了所有东西,验证层开始报告这个错误:
验证错误:[VUID-vkCmdDrawIndexed-None-02703] 对象 0:句柄 = 0x210000000021,类型 = VK_OBJECT_TYPE_DESCRIPTOR_SET;对象 1:句柄 = 0x1c000000001c,类型 = VK_OBJECT_TYPE_IMAGE_VIEW;对象 2:句柄 = 0x1f000000001f,类型 = VK_OBJECT_TYPE_SAMPLER;| 消息 ID = 0x30c87f64 | VkDescriptorSet 0x210000000021[] 在 vkCmdDrawIndexed() 时遇到以下验证错误:绑定 #0 索引 0 中的描述符中的 VkImageView 0x1c000000001c[] 被使用无效运算符的 VkSampler 0x1f000000001f[] 使用。Vulkan 规范规定:如果绑定到此命令使用的管道绑定点的 VkPipeline 对象访问使用非标准化坐标的 VkSampler 对象,则该采样器不得与任何带有 ImplicitLod 的 SPIR-V OpImageSample* 或 OpImageSparseSample* 指令一起使用, Dref 或 Proj 以他们的名义,https://www.khronos.org/registry/vulkan/specs/1.2-extensions/html/vkspec.html#VUID-vkCmdDrawIndexed-None-02703)
我知道在使用非标准化纹理坐标(如无 mipmap 或各向异性)时存在各种限制。这是规范中的(我认为)相关部分: https ://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkSamplerCreateInfo.html
unnormalizedCoordinates 控制是否使用非标准化或标准化纹理像素坐标来处理图像的纹理像素。当设置为 VK_TRUE 时,用于查找 texel 的图像坐标范围在从零到 x、y 和 z 的图像尺寸的范围内。当设置为 VK_FALSE 时,图像坐标的范围是零到一。
当 unnormalizedCoordinates 为 VK_TRUE 时,采样器在着色器中使用的图像具有以下要求:
当 unnormalizedCoordinates 为 VK_TRUE 时,shader 中使用采样器的图像内置函数有以下要求:
我满足所有这些要求,除非“投影”和“偏移”是指“在渲染纹理期间发生的事情”。
如果是这种情况,并且在渲染部分纹理时不能使用非规范化纹理坐标,那么:我不明白这个功能的用途。在哪里以及为什么要使用非归一化纹理坐标?此外,许多教程会像这里一样“误导”: https ://vulkan-tutorial.com/en/Texture_mapping/Image_view_and_sampler
unnormalizedCoordinates 字段指定要使用哪个坐标系来处理图像中的纹素。如果该字段为 VK_TRUE,那么您可以简单地使用 [0, texWidth) 和 [0, texHeight) 范围内的坐标。如果它是 VK_FALSE,则使用所有轴上的 [0, 1) 范围来寻址纹素。现实世界的应用程序几乎总是使用归一化坐标,因为这样就可以使用具有完全相同坐标的不同分辨率的纹理。
这(仅作为示例)听起来像是个人喜好,而不是“方法a有效,方法b只能在特殊情况下使用,很可能不是您想要的”。确实 --> 当我将样本更改为使用非标准化纹理坐标时,会报告相同的验证错误。那么有人可以解释这里发生了什么吗?
谢谢!
go - Vulkan VK_ERROR_LAYER_NOT_PRESENT
我目前正在使用 golang 学习 vulkan,并且在创建具有验证层的 vulkan 实例时遇到了问题。我正在尝试使用VK_LAYER_KHRONOS_validation
,它在我调用时显示为可用图层EnumerateInstanceLayerProperties
,但是当我将图层名称传递给我的InstanceCreateInfo.PpEnabledLayerNames
, 并调用CreateInstance
时,我得到了ErrorLayerNotPresent
我尝试更改将层传递[]string
给InstanceCreateInfo
结构的方式,并尝试测试以查看使用不同的层是否有效,但我不断遇到相同的错误。
这是我的主要功能
我的 vulkan 初始化代码
以及显示可用层的日志
c++ - 找不到 VkNonDispatchableHandle
我正在使用 Vulkan 创建一个简单的程序。在我调整窗口大小后,验证层会给我这个输出。调整大小本身工作正常。它说什么?完整的错误如下:
未分配线程信息(错误/规范):msgNum:1567320034 - 验证错误:[未分配线程信息]对象0:句柄= 0xee3a9100000000b4,类型= VK_OBJECT_TYPE_UNKNOWN;| 消息 ID = 0x5d6b67e2 | 找不到 VkNonDispatchableHandle 对象 0xee3a9100000000b4。这不应该发生,并且可能表明应用程序中存在错误。对象:1 [0] 0xee3a9100000000b4,类型:0,名称:NULL
是什么导致了问题?
vulkan - 如何使 VK_LAYER_KHRONOS_validation 可用?
我最近开始学习如何使用 Vulkan。我正在关注本教程,但即使复制/粘贴他们的代码,我也会收到错误,因为当我调用 vkEnumerateInstanceLayerProperties() 时未列出 VK_LAYER_KHRONOS_validation。
在 Vulkan 配置器中,VK_LAYER_KHRONOS_validation 出现在右侧面板中,但未出现在底部面板中(我不确定此配置器的用途,但底部面板中有一个“可用层”类别,其中写的名称就是那个由 vkEnumerateInstanceLayerProperties()) 列出。
我发现的其他教程使用 VK_LAYER_LUNARG_standard_validation 但它也不起作用并且已弃用。
那么我是否需要手动安装验证层,如果是的话在哪里?如果不是,为什么 VK_LAYER_KHRONOS_validation 不可用,我该如何使用它?
我确定我遗漏了一些明显的ç_ç。
附加信息 :
- 我正在编译 x64
- 我已经卸载/重新安装了 sdk,但它仍然无法正常工作
- 错误信息是:
validation layers requested, but not available!
- sdk 是 2021 年 5 月 5 日的 1.2.176.1。我下载了 SDK Installer(.exe 第一个)
- 要获得可用层,代码是:
- 如果我跳过验证,错误消息是:(顺便说一句,为什么 Rockstar Game 第 3 行??)
- 我不是以英语为母语的人,也不是 StackOverflow 的常规用户,所以如果我犯了错误,请告诉我,以便我进步
编辑:在 BIN 文件夹中存在 VkLayer_khronos_validation.dll/.json/.pdb 所以我运行 vulkaninfoSDK.exe 并注意到它尝试从文件 D:\Games\lib\1.2.176.1\Bin 而不是 D:\Games 加载\lib\Vulkan\1.2.176.1\Bin所以我想我找到了问题所在。但为什么?该文件不在这里为什么它跳过一个文件夹?
EDIT2:我更改了文件夹(删除了目录中的\Vulkan\),现在错误是(使用vulkaninfoSDK.exe):
并使用我得到的代码:
那么为什么选择 Rockestar Game?为什么
层清单文件版本 1.2.0 无效。?
编辑:所以我更改了文件位置,我认为它正在工作。
最后一个问题是:loaderAddLayerProperties: D:\Games\lib\1.2.176.1\Bin\VkLayer_api_dump.json invalid layer manifest file version 1.2.0. May cause errors.
为什么“可能导致错误”,这很重要吗?
只是为了好玩:为什么要加载C:\Program Files\Rockstar Games\Social Club\SocialClubVulkanLayer.json
?Rockstar 是在开发 Vulkan 还是其他什么?
重新编辑:我重新卸载/重新安装 sdk 和 ????? 这次我 100% 确定我没有移动文件,它仍然尝试从 \lib\1.2.176.1 加载并跳过 \vulkan\ ???
tbh sdk 的第一次安装在那里(没有 \vulkan)并且可能没有工作 bcs 我重命名了一个文件夹但为什么在重新安装后它保留旧路径?
但无论如何,如果我将它移动以匹配这些目录,它似乎可以工作 x)
我在一个完全不同的文件夹中重新卸载/重新安装 sdk,你猜怎么着?当我运行 vulkaninfoSDK.exe 时,sdk 安装在 D:\Prgm\1.2.176.1 中:错误:[加载器消息]代码 0:loader_get_json:无法打开 JSON 文件 D:\Games\lib\1.2.176.1\Bin\VkLayer_api_dump.json
所以我想我被我第一次安装的路径困住了
开个玩笑:(是的,我很健谈)我在其原始位置重新卸载/重新安装 sdk,现在它尝试从 D:\Games\lib\Vulkan\1.2.176.1\Bin\VkLayer_api_dump 加载文件。 json?我可能搞砸了安装,但该死
在 Vulkan 安装分析工具中,我发现了重复项。不知道为什么,但它首先查看前一个和错误的目录,但存在正确的目录
所以我试图删除不必要的目录
c++ - 如何从程序内部而不是 env var 设置验证层?
官方vulkan 文档声称:
应用程序可以通过 vkCreateInstance() 入口点以编程方式激活层。
这是设置环境变量的替代方法。但是,本节中没有其他关于如何设置它们的说明。我们可以阅读VkCreateInstance的官方文档,其中没有提及验证层,因此我们可以查看CreateInfo。在这里,唯一相关的领域似乎是ppEnabledLayerNames
.
基于到目前为止的一切,人们可能会认为将正确的字符串传递给创建信息就足以设置图层。所以有人可能会这样做:
我在一个更大的应用程序中运行上面的代码片段。如果我按照文档中的描述手动设置 env var,它就会运行。但是,如果我不设置 env var 而只依赖上面的代码片段,我的程序会在实例创建时崩溃。
由于文档明确表示您可以以编程方式设置内容,但似乎没有说明如何设置,您应该怎么做才能避免依赖 env var?
更具体地说,我在运行代码片段时遇到的错误发生在 hpp 标头中,断言失败:
使用 gdb 分析堆栈表明这发生在实例创建时。使断言失败的具体错误代码是vk::Result::eErrorLayerNotPresent
.
作为附加信息,请调用:auto [result, availableLayers] = vk::enumerateInstanceLayerProperties();
在调用实例创建之前立即返回一个空数组。
glsl - 在 Vulkan 中使用 debugPrintfEXT
我试图弄清楚如何使用 debugPrintfEXT 但没有运气。首先,我在我的顶点着色器中启用了扩展
然后我为 Vulkan 实例指定必要的扩展
在info.ppEnabledExtensionNames
我指定的领域VK_EXT_validation_features
以及VK_EXT_debug_utils
其他方面。
当我运行我的应用程序时,我得到以下日志
我还应该做什么?什么
必须满足其中一项要求
意思是?有什么我想念的吗?
编辑:
正如 Karl Schultz 所建议的,有必要添加VK_KHR_shader_non_semantic_info
到info.ppEnabledExtensionNames
.
此外,请确保使用VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT
in将日志级别设置为 INFO VkDebugUtilsMessengerCreateInfoEXT::messageSeverity
。默认情况下,由 产生的所有输出debugPrintfEXT
都具有 INFO 级别。
你可能还会看到
如果您产生太多线程,每个线程都会打印自己的长日志。