问题标签 [vulkan]
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.
memory - Vulkan 的 VkAllocationCallbacks 使用 malloc/free() 实现
我正在阅读Vulkan Memory Allocation - Memory Host并且似乎 VkAllocationCallbacks 可以使用天真的 malloc/realloc/free 函数来实现。
但我只看到两个可能的原因来实现我自己的 vkAllocationCallback:
- 通过 Vulkan API 记录和跟踪内存使用情况;
- 实现一种堆内存管理,它是一大块内存,可以反复使用和重用。显然,这可能是一种矫枉过正的做法,并且会遇到与托管内存相同的问题(如在 Java JVM 中)。
我在这里错过了什么吗?什么样的应用程序值得实现 vkAllocationCallbacks ?
vulkan - Why doesn't the Vulkan spec define VkDeviceSize?
The Vulkan specification (1.0.12) introduces VkDeviceSize in section 2.4:
With few exceptions, Vulkan uses the standard C types for parameters (int types from stdint.h, etc). Exceptions to this are using VkResult for return values, using VkBool32 for boolean values, VkDeviceSize for sizes and offsets pertaining to device address space, and VkFlags for passing bits or sets of bits of predefined values.
However, it never tells us what the underlying type of VkDeviceSize actually is. How are we supposed to know whether it is safe to convert between a VkDeviceSize and a size_t?
From the headers provided with the SDK, I see that it is typedef'ed to uint64_t. How likely is it that this would change, at any point in the future?
graphics - 我可以在 Vulkan 中创建不可变采样器而不将图像绑定到该绑定点吗?
我一直在阅读 Vulkan 规范和来自 Khronos 的一些示例,但我一般找不到关于不可变采样器的大量信息。
我想要做的是有一个充满不可变采样器的描述符集(类型为 VK_DESCRIPTOR_TYPE_SAMPLER,而不是 ...COMBINED_IMAGE_SAMPLER),当我想对纹理进行采样时,我在我的着色器中访问这样的采样器:
有了这个着色器,想法是:
- 在管道布局中,我在 set 0 中的绑定点 0 处有一个不可变的采样器
- 我还有一个描述符集 (3),其中包含在绑定点 0 处描述的图像,我将其绑定为我的命令缓冲区的一部分
- 我将不可变采样器应用于着色器中的图像
- 然后实际访问图像作为
sampler2D
但是,我在 Khronos 示例中看到它的方式是:
- 在管道布局中的绑定点描述 VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER 的不可变采样器(仅提供采样器)
- 创建图像并将其绑定到相同的绑定点(没有采样器)
sampler2D
在着色器中以 a 访问图像;您绑定的图像与该绑定处的不可变采样器配对
在 Vulkan 规范中,它没有说明哪种方式是“正确的”,只是指出:
如果
descriptorType
指定一个VK_DESCRIPTOR_TYPE_SAMPLER
或VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER
类型描述符,pImmutableSamplers
则可用于初始化一组不可变采样器。
现在,如果我的着色器按我预期的方式工作,我就不会问这个问题了。我遇到的问题是,在验证后,Vulkan 层抱怨我的 VkPipeline 正在使用从未绑定过的描述符集(设置 0,绑定 0 采样器所在的位置)!即使我在那里绑定垃圾数据,我仍然必须(至少一次)用垃圾更新描述符集,以抑制另一个验证错误。然而与此同时,Vulkan 规范说:
不可变采样器永久绑定到集合布局中;以后不允许将采样器绑定到描述符集中的不可变采样器槽
因此,甚至不允许将数据绑定到该绑定点!
我现在非常不确定我对不可变采样器的方法是否应该有效,因为它有点模棱两可。规范说我可以绑定一个没有图像的采样器,但是当我这样做时会抱怨,我发现的几个例子是绑定一个组合图像采样器。我只是做错了吗?
如果我的方法应该是有效的并且可以工作,我真的很喜欢这样,因为我正在尝试为 DirectX 12 和 Vulkan 构建一个系统。DX12 在其“根布局”(管道布局)中占有一席之地,所有不可变采样器都绑定在一起,没有与之关联的图像。我想模仿这种行为以保持渲染器之间的奇偶性,但我非常不确定 Vulkan 是否真的可以做到这一点,而且它在规范中非常模棱两可。
vulkan - 何时使用 VK_IMAGE_LAYOUT_GENERAL
我不清楚何时使用 VK_IMAGE_LAYOUT_GENERAL 而不是为我将要执行的任何操作转换到最佳布局是一个好主意。目前,我的政策是始终过渡到最佳布局。
但是 VK_IMAGE_LAYOUT_GENERAL 存在。当我只打算在短时间内使用给定的布局时,也许我应该使用它。
例如,现在,我正在编写代码以使用 vkCmdBlitImage 生成 mipmap。当我遍历执行 vkCmdBlitImage 命令的子资源时,我是否应该在缩小到 mip 时转换到 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,然后在我将成为下一个 mip 的源时转换到 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,然后当我最终转换到 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL全部完成?看起来有很多过渡,也许在 VK_IMAGE_LAYOUT_GENERAL 中生成 mips 会更好。
我很欣赏答案可能是测量,但很难在我所有的目标 GPU 上进行测量(特别是因为我还没有在 Android 上运行任何东西)所以如果有人有任何体面的经验法则可以应用,将不胜感激。
FWIW,我正在编写将在桌面 GPU 和 Android 上运行的 Vulkan 代码,但我主要关心后者的性能。
glsl - 在不同的着色器阶段使用不同的 push-constants
我有一个顶点着色器,它有一个包含一个浮点数的 push-constant 块:
以及带有另一个具有不同浮点值的 push-constant 块的片段着色器:
test1和test2应该是不同的。
流水线布局的 push-constant 范围定义如下:
然后在渲染过程中推送实际常量,如下所示:
但是,在检查着色器内部的值时,两者的值都是 123。似乎完全忽略了偏移量。我是否错误地使用它们?
nvidia - vkCmdBlitImage 中的分段错误
中存在分段错误vkCmdBlitImage
。根据 Valgrind 的说法,这是一个大小为 8 的无效读取,地址为 0x48。禁用图层并不能解决问题。
使用的驱动程序是 Nvidia Linux 驱动程序版本 364.19。GPU 是 GeForce GTX 970。
相关代码:
其余代码可在https://gitlab.com/pendingchaos/WIP29/tree/00f348f2ef588e5f724fcb1f695e7692128cac4c/src找到。
减少 vulkaninfo 的输出可以在http://pastebin.com/JaHqCy98找到。
vulkan - 表面格式是 B8G8R8A8_UNORM,但是 vkCmdClearColorImage 需要浮点数?
我使用vkGetPhysicalDeviceSurfaceFormatsKHR
为交换链获取支持的图像格式,并且(在 Linux + Nvidia 上,使用 SDL)我得到VK_FORMAT_B8G8R8A8_UNORM
第一个选项,然后我继续创建具有该格式的交换链:
到目前为止,这一切都说得通。用于在屏幕上绘制的图像格式是通常的每通道 8 位 BGRA。
作为我学习过程的一部分,到目前为止,我已经设置了很多东西,但还没有设置图形管道1。所以我正在尝试我可以使用的唯一一个不需要管道的命令:vkCmdClearColorImage
2。
VkClearColorValue
用于定义清晰颜色的 可以将颜色设为或,float
具体取决于图像的格式。根据提供给交换链的图像格式,我本来希望我应该给它赋值,但这似乎不正确。我知道是因为屏幕颜色没有改变。我试着给它,它有效。uint32_t
int32_t
uint32_t
float
我的问题是,为什么float
图像格式为 s 时需要在 s 中指定清晰的颜色VK_FORMAT_B8G8R8A8_UNORM
?
1 实际上我有,但我想我会先尝试更简单的没有管道的情况。我正在尝试逐步使用 Vulkan(考虑到它的冗长),特别是因为我在学习的同时也在编写关于它的教程。
2 实际上,从技术上讲,它不需要渲染通道,但我想嘿,我在这里没有使用任何管道的东西,所以让我们在没有管道的情况下尝试它,它可以工作。
我的渲染循环基本上如下:
- 从交换链获取图像
- 使用以下内容创建命令缓冲区:
- 从
VK_IMAGE_LAYOUT_UNDEFINED
到过渡VK_IMAGE_LAYOUT_GENERAL
(因为我正在清除渲染通道之外的图像) - 清除图像
- 过渡
VK_IMAGE_LAYOUT_GENERAL
到VK_IMAGE_LAYOUT_PRESENT_SRC_KHR
- 从
- 将命令缓冲区提交到队列(注意与带信号量的交换链的同步)
- 提交演示
glsl - 手动透视分割
当我注意到我的结果不正确时,我需要对gl_Position以外的东西进行手动透视划分,所以我做了一些实验。
我注意到,如果我让它使用默认转换,则生成的深度值(gl_Position.z)是正确的:
然而,当尝试手动进行透视分割时,深度值是不一样的,即使它应该是等价的(?):
那么,透视分割在 Vulkan 中的工作方式是否有所不同?如果是这样,怎么做?
视口的深度范围设置为 [0,1],以防对此有任何影响。
c - Wayland、Xlib、XCB、MIR 窗口系统的预处理器符号
在 Vulkan 文档中,我们有以下关于 WSI 平台的内容:
Vulkan API 没有定义任何类型的平台对象。定义了特定于平台的 WSI 扩展,其中包含使用 WSI 的特定于平台的功能。这些扩展的使用受到预处理器符号的保护。
• VK_USE_PLATFORM_ANDROID_KHR - Android
• VK_USE_PLATFORM_MIR_KHR - 米尔
• VK_USE_PLATFORM_WAYLAND_KHR - 韦兰
• VK_USE_PLATFORM_WIN32_KHR - Microsoft Windows
• VK_USE_PLATFORM_XCB_KHR - X 窗口系统,使用 XCB 库
• VK_USE_PLATFORM_XLIB_KHR - X 窗口系统,使用 Xlib 库
我知道我应该选择一个平台或一个窗口系统,然后在编译之前定义正确的符号。在针对 Android 或 Windows 进行编译时,我可以编写如下内容:
到目前为止,好的。Android 和 Windows 都有自己独特的窗口系统,这已经足够好了。但是 Linux 有几个窗口系统——Xlib、XCB、Wayland 和 MIR,afaik。
我想知道是否有一个 C/C++预处理器符号可能有助于了解该环境使用哪个窗口系统,因此可以编写能够处理每个 API 的通用代码,而不会弄乱。
c++ - Vulkan:管道衍生品的创造和收益
在 Vulkan 中,您可以使用vkCreateGraphicsPipeline
或vkCreateComputePipeline
创建管道派生类,以及/的basePipelineHandle
或basePipelineIndex
成员。该文档指出,出于性能原因,此功能可用:VkGraphicsPipelineCreateInfo
VkComputePipelineCreateInfo
衍生管道的目标是使用父级作为起点创建它们更便宜,并且在同一父级的子级之间切换/绑定更有效(在主机或设备上)。
这对我提出了很多问题:
- 有没有办法指示父管道和子管道之间共享哪个状态,或者由实现决定?
- 有什么方法可以知道实现是否真的从使用派生管道(分析除外)中获得了任何好处?
- 需要使用创建父管道
VK_PIPELINE_CREATE_ALLOW_DERIVATIVES_BIT
。始终使用此标志是否有不利之处(例如,如果您将来可能从该标志创建派生管道)?