问题标签 [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.
graphics - GPU上的相干内存是什么?
我在
与图形编程相关的技术论文。我一直在寻找一个简单而清晰的解释,但发现大多是这种类型的“硬核”论文。我很高兴收到外行风格的回答,关于 GPU 架构上的相干内存实际上是什么以及它是如何实现的与其他(可能不连贯的)内存类型进行比较。
c++ - 全局加载 Vulkan 函数
随着 Vulkan 的发布,我决定(作为一种爱好)编写一个基于 Vulkan 的 GUI。但是,我目前停留在第一步——加载 Vulkan 函数。我正在使用 Nvidia 的 C++ Vulkan 包装器,据我所知,它需要全局加载 Vulkan 函数。
我可以成功加载本地函数,但是::vkCreateInstance
失败了:
尝试全局分配新函数指针会给我 2 个编译时错误(使用 VS2015 编译):
- 表达式必须是可修改的左值。
- '=':作为左操作数。
在vulkan.h
header 中声明了函数原型,例如:
这可能会阻止我全局加载函数。如果我要定义VK_NO_PROTOTYPES
,那么这些原型将被跳过,我相信我可以重新声明它们PFN_vkCreateInstance vkCreateInstance = nullptr;
,依此类推。但这是正确的方法吗?
所以,我的问题 - 全局加载 Vulkan 函数的正确方法是什么?
pipeline - 来自 vkCreateGraphicsPipelines 的访问冲突
我在这段 Vulkan API 上遇到了访问冲突。
错误是:
据我所知,所有其他相关代码:
device 和 pipelineCache 都由超类设置,该超类由 Sascha Willems 编写,适用于他创建的所有示例,所以我不认为问题会出现。但是,这实际上只留下了 pipelineCreateInfo 或 pipelines.billboard 作为错误的潜在来源。
这两者的处理方式与 Sascha 在他的示例中的示例(几乎完全相同)相同,所以我在这里不知所措。
编辑:我发现了问题。我未能在我的着色器中指定采样器的绑定点。
c# - C#:结构中的非托管委托,以及包装 vulkan API dll 的其他非托管问题
我正在尝试在我的 C# 程序中使用新的 vulkan API。由于我们只能访问头文件,因此我复制了代码并将其调整为一个不安全的类来包装它:
所有的 PFN_xxx 原本都是头部中的函数指针,我直观地把它们改写为委托。所以,目前,它正在工作。但是,在代码的后期,我有以下从 dll 导入的函数,它会出错:
错误是CS0208,由以下消息描述:“无法获取托管类型的地址、大小或声明指向托管类型的指针('Vk.AllocationCallbacks')” 通过谷歌搜索,我了解到 AllocationCallbacks 是管理,因为它的代表。那么我该如何解决这个问题呢?我在网上没有找到令人满意的答案,我试图将我的结构中的委托编组为非托管函数指针(像这样),但它似乎不起作用,编译器保留错误。
这是另一个问题:我有一个结构,其中定义了固定大小的结构数组。原始声明是:
我只是这样翻译:
但同样,我有同样的问题,著名的 CS0208 错误,因为以下函数导入:
而这一次,错误是由于固定大小的数组。任何想法 ?
谢谢你的帮助 !
c - Vulkan:vk*CreateInfo 结构中的 sType 有什么意义?
在新 Vulkan API 的所有创建信息结构 ( vk*CreateInfo
) 中,总是有一个.sType
成员。如果价值只能是一件事,为什么会出现这种情况?此外,Vulkan 规范非常明确,您只能将vk*CreateInfo
结构用作其相应vkCreate*
功能的参数。似乎有点多余。我可以看到,如果驱动程序将此结构直接传递给 GPU,您可能需要拥有它(我确实注意到它始终是第一个成员)。但这对于应用程序来说似乎是一个非常糟糕的主意,因为如果驱动程序这样做了,应用程序将不太容易出错,并且在结构之前添加一个 int 似乎并不是一个计算效率极低的操作。我只是不明白它为什么存在。
TL;DR
为什么vk*CreateInfo
结构有.sType
成员?
memory-management - 有人可以帮我理解 VkPhysicalDeviceMemoryProperties 吗?
我想弄清楚,但我有点卡住了。
类型和堆的关联方式很简单,虽然有点奇怪。(为什么不给VkMemoryHeap
会员VkMemoryType
?)
我想我明白所有的VkMemoryPropertyFlags
意思,它们看起来相当简单。
但是VkMemoryHeap.flags
会员怎么了?它显然只有一个非零有效值,VkMemoryHeapFlagBits.VK_MEMORY_HEAP_DEVICE_LOCAL_BIT
虽然这本身不会太奇怪,但VkMemoryPropertyFlagBits.VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT
堆的内存类型上也可能存在一个。
会员是什么VkMemoryHeap.flags
意思,它与VkMemoryType.flags
会员有什么关系?
c++ - VkLayer_param_checker.dll 访问冲突
我使用 LunarG 安装程序设置了一个 Vulkan 1.0.5.0 程序,它无需启用任何层即可工作。
当我尝试启用以下任一功能时:
当我尝试调用 vkCreateInstance 时,我在 VkLayer_param_checker.dll 或 VkLayer_api_dump.dll 中遇到访问冲突。
如果我尝试单独加载任何一个作为唯一层,它们也会失败。
JSON 文件存在于注册表中的 ExplicitLayers 下,文件本身看起来很好。
我还在 Visual Studio 中收到有关已加载 dll 的消息。
这些层适用于较旧的 1.0.3.1 测试程序,这很奇怪,我能够启用以下所有功能:
是否有必须加载图层的特定顺序?我确定我在某个地方读到过,但我再也找不到了。任何帮助表示赞赏。
c++ - X11 上的 Vulkan:vkGetPhysicalDeviceSurfaceCapabilitiesKHR 错误
我试图让 Vulkan 在 X11 下运行。
我(显然)成功地创建了一个实例、设备和表面,并且与表面相关的几个调用也成功了,甚至返回了合理的值(例如vkGetPhysicalDeviceSurfaceFormatsKHR
返回两种格式)。但是,当我打电话时vkGetPhysicalDeviceSurfaceCapabilitiesKHR
,我得到以下信息:
X11 窗口是0x5800009
,如错误中所引用。我正在使用 Vulkan SDK 1.0.5 和 Nvidia 364.12 驱动程序(如果相关)。
c++ - 从同一个 VkPhysicalDevice 创建两个 VkDevice 是否有效?
我正在为 Vulkan API 编写 C++ 包装器,因此我想确保我的文档不会与实际 API 所说的相矛盾。
即使在启用 LunarG 标准验证层的情况下运行,此方案也有效。但是目前有很多东西通过了验证层,尽管是不正确的。所以我的问题是,这样做是否有效?
c++ - 带有 VK_NULL_HANDLE 的 Vulkan DestroyInstance / DestroyDevice
我的印象是你可以在 NULL 句柄上调用 Destroy / Free,这将是一个空操作。
2.5.1 有效使用
将 VK_NULL_HANDLE 传递给任何 vkDestroy* 或 vkFree* 命令是有效的,它们会默默地忽略这些值。
但是如果你使用vkGetInstanceProcAddr和vkGetDeviceProcAddr来获取函数指针会发生什么呢?我正在执行以下操作:
当然,当为原始设备调用析构函数时,它会将空句柄传递给特定于设备的vkDestroyDevice。
目前,这给了我一个读取访问冲突,我不确定这是 AMD 的错、LunarG 的错还是我的错。