- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试在 Mac 上设置 vulkan/MoltenVk,但我在让验证层和扩展正常工作时遇到了一些问题。
我已经下载/安装了 MoltenVk 和 vulkan 库,设置了一些环境变量:
export VULKAN_SDK=/opt/vulkan-sdk
export DYLD_LIBRARY_PATH=$VULKAN_SDK/lib:$DYLD_LIBRARY_PATH
export VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d/MoltenVK_icd.json
export VK_LAYER_PATH=$VULKAN_SDK/etc/vulkan/explicit_layer.d
export VK_INSTANCE_LAYERS=VK_LAYER_LUNARG_standard_validation
vulkaninfo 按预期工作并显示 6 个验证层。
当我尝试构建自己的项目时,找不到图层。
我创建了一个小型测试项目来尝试弄清楚发生了什么。它编译和链接没有错误,但是当我运行它时,我得到了
[***MoltenVK ERROR***] VK_ERROR_LAYER_NOT_PRESENT: Vulkan layer VK_LAYER_LUNARG_standard_validation is not supported.
vkCreateInstance result: -6
main.cpp(从 https://vulkan.lunarg.com/doc/sdk/latest/mac/getting_started.html 复制)
#include <iostream>
#include <vulkan/vulkan.h>
int main(int argc, const char * argv[]) {
VkInstance instance;
VkResult result;
VkInstanceCreateInfo info = {};
uint32_t instance_layer_count;
result = vkEnumerateInstanceLayerProperties(&instance_layer_count, nullptr);
std::cout << instance_layer_count << " layers found!\n";
if (instance_layer_count > 0) {
std::unique_ptr<VkLayerProperties[]> instance_layers(new VkLayerProperties[instance_layer_count]);
result = vkEnumerateInstanceLayerProperties(&instance_layer_count, instance_layers.get());
for (int i = 0; i < instance_layer_count; ++i) {
std::cout << instance_layers[i].layerName << "\n";
}
}
const char * names[] = {
"VK_LAYER_LUNARG_standard_validation"
};
info.enabledLayerCount = 1;
info.ppEnabledLayerNames = names;
result = vkCreateInstance(&info, NULL, &instance);
std::cout << "vkCreateInstance result: " << result << "\n";
vkDestroyInstance(instance, nullptr);
return 0;
}
构建
clang++ main.cpp
-I/opt/vulkan-sdk/include/
-rpath /opt/vulkan-sdk/lib
-L/opt/vulkan-sdk/lib/
-lMoltenVk
-lvulkan
-lVkLayer_core_validation
-lVkLayer_object_lifetimes
-lVkLayer_stateless_validation
-lVkLayer_thread_safety -lVkLayer_unique_objects
-o output
请注意,我链接的是 .dylib,但我之前也尝试过使用 .framework 库。
我怀疑我需要链接其他东西,或者在代码中添加特定的环境变量或#define。有谁知道如何解决这个问题?
最佳答案
我认为问题在于您错误地链接了您的应用程序。
Vulkan 加载程序将 MoltenVK 库 (dylib) 视为 ICD(可安装客户端驱动程序)。加载程序是您在链接命令中使用 -lvulkan
链接的库。 Vulkan 加载器在执行时动态加载 ICD。使用 Vulkan 加载程序时,ICD 不会直接链接到应用程序。
同样,Vulkan 加载器在执行时动态加载层。图层不直接链接到应用程序。
MoltenVK 库有点不寻常,因为它的构建方式使应用程序可以直接链接到它并运行 MoltenVK(Vulkan 子集)应用程序,而无需使用加载程序和层。
但是如果你想使用加载器和图层,你不需要将 MoltenVK 和图层链接到你的应用程序。您只链接加载程序。然后加载程序将 MoltenVK 库作为 ICD 动态加载,并在需要时动态加载层。
在您的情况下,您似乎首先链接了 MoltenVK 库。这可能会首先通过 MoltenVK 库满足所有 Vulkan 符号。您的库列表中的 Vulkan 加载器可能甚至没有包含在您的可执行文件中,因为 MoltenVK 在那里并且 Vulkan 加载器实际上没有做任何事情。
我认为如果你删除 -lMoltenVK
和其他 5 个层库,你会做得更好。
您还可以在您的环境中设置 VK_LOADER_DEBUG=all
以查看加载程序正在做什么。我怀疑如果你用这个集合运行你当前的应用程序,你将看不到任何东西,因为加载程序没有参与。
参见 https://vulkan.lunarg.com/doc/sdk/1.1.101.0/mac/loader_and_layer_interface.html了解更多信息。
关于c++ - 在 Mac 上使用 MoltenVk/Vulkan 获取 VK_ERROR_LAYER_NOT_PRESENT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512981/
我想知道为什么可以在 VkPipelineLayoutCreateInfo 中指定多个描述符集布局,因为一个已经包含所有绑定(bind)。 最佳答案 描述符集布局描述了单个描述符集的布局。但是一个管道
我试图了解整个 L1/L2 冲洗是如何工作的。假设我有一个像这样的计算着色器 layout(std430, set = 0, binding = 2) buffer Particles{ Pa
Vulkan 旨在为用户提供精简和明确的内容,但队列是此规则的一个很大异常(exception):队列可能由驱动程序复用,并且使用一个系列的多个队列是否会提高性能并不总是很明显。 在驱动程序更新之一之
来自与 vkCmdPipelineBarrier 相关的规范: If no memory barriers are specified, then the first access scope inc
Vulkan 是否提供绘制基本图元的功能?点、线、矩形、实心矩形、圆角矩形、实心圆角矩形、圆、实心圆等。 ? 我认为没有任何 VkCmdDraw* 命令可以提供此功能。如果这是真的,需要做些什么来绘制
我正在尝试进行一个模拟,该模拟涉及渲染前的两个计算步骤。我目前有一个计算基础物理的计算管道,然后是一个图形管道。我希望能够添加第二个计算着色器以在第一个计算着色器之后运行。 首先,Vulkan 中是否
取消映射后可以刷新内存范围吗? 乍一看好像不对,因为函数叫vkFlushMappedMemoryRanges() ,但是 the documentation似乎暗示内存已准备好刷新,即使在未映射之后:
Vulkan 是否支持保存流水线阶段的顶点输出?我一直在寻找,但找不到任何示例或引用资料,也许其他人不知道? 最佳答案 Transform Feedback 在最初的 Vulkan 版本中没有被削减,
我有多个具有不同纹理/管道构造的网格,例如深度测试/混合函数以使用 vulkan 进行渲染。在性能方面呈现它们的最佳实践是什么。 一种选择是为 n 个网格创建 n 个具有 n 个线程的命令缓冲区,它们
我正在开发一个使用 Vulkan 的 C++ 应用程序。我如何获得支持的扩展集? 像std::set get_supported_extensions()这样的签名会很理想。 最佳答案 vkEnume
我正在开发一个使用 Vulkan 的 C++ 应用程序。我如何获得支持的扩展集? 像std::set get_supported_extensions()这样的签名会很理想。 最佳答案 vkEnume
正在处理 Vulkan 三角形渲染代码,我想将渲染图像保存到文件而不是渲染到窗口。 那么我应该什么时候读取帧缓冲区以及如何编写在文件中。我想需要将原始 RGBA 格式的像素转换为某种已知的 BMP 或
Vulkan 规范(1.0.12)在第 2.4 节介绍了 VkDeviceSize: With few exceptions, Vulkan uses the standard C types for
即使实例在 Vulkan 中创建失败,我是否应该销毁它? 哪个是正确的: 1: VkResult Result = vkCreateInstance( info, NULL, instance );
我开始学习 Vulkan,想知道 VkCreate[...] 函数是否将结构中指向的资源复制到他自己的缓冲区中。 为了澄清我的问题,在这段代码中我加载了 斯皮尔 将着色器放入我自己的 mkShader
Khronos 刚刚发布了他们的新内存模型扩展,但还没有进行非正式讨论、示例实现等,所以我对基本细节感到困惑。 https://www.khronos.org/blog/vulkan-has-just
SubpassInput 由片段着色器隐式寻址。我想用我自己的纹理坐标来处理输入。类似于 texture(sampler, texCoord) 最佳答案 这是不可能的。如果您想在着色器内对图像进行采样
有没有办法从实例中获取对象类型枚举器(vk::ObjectType dor vulkan.hpp 和 VkObjectType for vulkan)? 例如假设我们有 3 个对象: vk::Devi
我的着色器索引到采样器和图像,但是当我从图像中采样时(如果我在着色器中采样,我只会得到错误)我得到一个错误: Descriptor in binding #0 index 0 requires FLO
我想到了以下场景,但我不知道它是否有效: 在程序的开头创建一个VkCommandPool,并从中分配一个VkCommandBuffer。 在渲染循环中,将命令记录到 VkCommandBuffer(隐
我是一名优秀的程序员,十分优秀!