我正在尝试在 Linux 中创建一个 Vulkan 应用程序。如何从原始 X11 窗口获取 Vulkan 上下文,不涉及 Qt 或 GTK。
谢谢 :)
我需要在 Vulkan 中绘制点云,点宽为 4 像素。我还需要绘制不同粗细的折线。我在 Vulkan 教程套件中没有看到任何此类演示。有人可以为我提供不同大小的点云和不同厚度的折线的正确构建命令吗?
我已经编写了一个基本的 Vulkan 渲染器一段时间了,它运行得很好。然后它坏了(电源问题),我将 Vulkan 驱动程序重新安装到版本 1.0.42.0,从那时起,在提交 CommandBuffer 供单次使用(加载纹理等)时,它给我错误 VK_ERROR_DEVICE_LOST 。我已经在具有不同 GPU 的不同设备上尝试了该代码,并且它工作得很好。确切的破解代码:
vkEndCommandBuffer(commandBuffer);
VkSubmitInfo submitInfo =
init::SubmitInfo();
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = &commandBuffer;
vkQueueSubmit(context->transferQueue, 1, &submitInfo, VK_NULL_HANDLE);
//works fine until now
vkQueueWaitIdle(context->transferQueue);
//This gives me VK_ERROR_DEVICE_LOST
vkFreeCommandBuffers(context->device, context->cmdTempPool, 1, &commandBuffer);
//Also doesn't work since commandbuffer is still in queue
Run Code Online (Sandbox Code Playgroud)
它似乎也只在初始化期间发生,因为它在运行时(实际渲染代码)期间没有给我任何错误,但它们在清理期间再次发生(删除纹理和缓冲区)是否有针对此问题的任何报告或解决方法?
确切的验证层输出是:
ParameterValidation: vkQueueWaitIdle: returned VK_ERROR_DEVICE_LOST,
indicating that the logical device has been lost
DS: Attempt to free command buffer (0x000002D18AAF1A90) which is in use. For
more information refer to Vulkan …Run Code Online (Sandbox Code Playgroud) vkCmdPipelineBarrier 没有获取任何 vkPipeline 作为参数。所以我想知道 vkCmdPipelineBarrier 适用于哪个管道。
是在命令缓冲区中之前调用的 vkCmdBindPipeline 命令中指定的命令吗?如果命令缓冲区中尚未指定管道怎么办?
我正在使用全局std::shared_ptr来处理我的 Vulkan 的自动删除VkInstance。指针有一个自定义删除器,vkDestroyInstance当它超出范围时会调用。一切都按预期工作,直到我启用该VK_LAYER_LUNARG_standard_validation层,此时该vkDestroyInstance函数会导致段错误。
我在下面添加了一个产生问题的最小示例。
#include <vulkan/vulkan.h>
#include <iostream>
#include <memory>
#include <vector>
#include <cstdlib>
// The global self deleting instance
std::shared_ptr<VkInstance> instance;
int main()
{
std::vector<const char *> extensions = {VK_EXT_DEBUG_REPORT_EXTENSION_NAME};
std::vector<const char *> layers = {};
// Uncomment to cause segfault:
// layers.emplace_back("VK_LAYER_LUNARG_standard_validation");
VkApplicationInfo app_info = {};
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
app_info.pApplicationName = "Wat";
app_info.applicationVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.pEngineName = "No Engine";
app_info.engineVersion = VK_MAKE_VERSION(1, 0, 0);
app_info.apiVersion …Run Code Online (Sandbox Code Playgroud) 我有两个实体要使用相同的渲染VkPipeline,问题是它们有不同VkDescriptorSetLayout(第一个实体使用动态统一缓冲区,第二个实体仅使用标准统一缓冲区);
如何将两者传递VkDescriptorSetLayout到图形管道,然后在创建命令缓冲区期间绑定正确的管道?
有了单VkDescriptorSetLayout,我就直接把它传递给VkPipelineLayoutCreateInfo.pSetLayouts,然后VkCmdBindDescriptorSet用那个调用VkPipelineLayout。
但是对于两个VkDescriptorSetLayouts,如何正确地将它们绑定到VkPipelineLayout,然后如何在命令缓冲期间选择我想要的一个?
如何增大 aVkBuffer的大小,如 中那样VkBufferCreateInfo.size?我应该销毁缓冲区并创建一个新缓冲区,还是可以通过调用绑定更多内存vkBindBufferMemory?
我正在尝试创建 C++ 类来封装 Vulkan 初始化过程(在非常基础的层面上,我仍在学习),并且我的设置方式要求将 vulkan 设备传递给显式的“销毁”函数进行清理发生。我将所有初始化都包含在 try-catch 块中;问题是,如果在初始化期间引发异常,对象将被销毁,并且我无法调用我的“销毁”函数。
在伪代码中:
try{
DeviceObject device; // constructor initializes
SomeResource resource(device);
OtherResource other(device); // suppose an exception is thrown here
while(programRuns){
// do something
}
// end of program
other.destroy(device);
resource.destroy(device);
device.destroy();
}
catch (myException e){
showError(e);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果在运行时抛出异常,则不会调用我的销毁函数,并且仅在程序成功终止后才会调用它们。
我想到了几种不同的设置方法来处理这种情况并确保资源被明确清理,但我的问题是:我必须这样做吗?我知道我“应该”,但是如果程序崩溃并退出,操作系统是否会处理清理我创建的资源,或者是否会在系统 GPU 上留下挂起的垃圾(或类似的东西)?
我将统一缓冲区传递给 vulkan 中的计算着色器。缓冲区包含 49 个浮点数的数组(高斯矩阵)。一切都很好,但是当我在着色器中读取数组时,它只给出了 13 个值,其他都是 0 或垃圾,它们对应于初始数组的 0、4、8 等。我认为它是某种对齐问题
着色器布局是
struct Pixel
{
vec4 value;
};
layout(push_constant) uniform params_t
{
int width;
int height;
} params;
layout(std140, binding = 0) buffer buf
{
Pixel imageData[];
};
layout (binding = 1) uniform sampler2D inputTex;
layout (binding = 2) uniform unf_t
{
float gauss[SAMPLE_SIZE*SAMPLE_SIZE];
};
Run Code Online (Sandbox Code Playgroud)
绑定 0 会影响绑定 2 吗?如果是这样,我如何将数组复制到所需对齐的缓冲区?目前我使用
vkCmdUpdateBuffer(a_cmdBuff, a_uniform, 0, a_gaussSize, (const uint32_t *)gauss)
Run Code Online (Sandbox Code Playgroud)
或者分成不同的集合可能会更好?
编辑:通过扩展缓冲区和数组,我设法以 16 的对齐方式传递它,一切都很好,但它看起来像是浪费内存。如何将浮点数对齐 4?
Vulkan 是否提供绘制基本图元的功能?点、线、矩形、实心矩形、圆角矩形、实心圆角矩形、圆、实心圆等。 ?
我不相信有任何 VkCmdDraw* 命令提供此功能。如果这是真的,需要做什么来绘制这样的简单图元?