#c #gcc #crash #vulkan #xlib
Вопрос:
У меня есть приложение Vulkan, которое использует Xlib для создания окна. Вулкан инициализируется без проблем. Программа завершает работу с SIGABRT в строке 72: XNextEvent(отображение и событие). Это не приведет к сбою, если экземпляр Vulkan не инициализирован. Он также не завершается сбоем, если XNextEvent получает новый указатель отображения через XOpenDisplay(nullptr) каждый тик, но затем окно не отображается.
#include <iostream>
#include "dynamo.hpp"
int width = 1920 / 2;
int height = 1080 / 2;
App::App(int width, int height)
{
XInitThreads();
display = XOpenDisplay(nullptr);
if(display == nullptr)
{
throw std::runtime_error("failed to open display");
}
int screen = DefaultScreen(display);
int depth = DefaultDepth(display, screen);
Visual* visual = DefaultVisual(display, screen);
int root = RootWindow(display, screen);
XSetWindowAttributes window_attributes;
window_attributes.background_pixel = 0;
window_attributes.border_pixel = 0;
window_attributes.bit_gravity = StaticGravity;
window_attributes.event_mask = 0 | ButtonPressMask | ButtonReleaseMask | ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | StructureNotifyMask;
window = XCreateWindow(display, root, 0, 0, width, height, 0, depth, InputOutput, visual, CWBorderPixel | CWEventMask | CWBackPixel | CWBitGravity, amp;window_attributes);
XStoreName(display, window, "Dynamo");
XSelectInput(display, window, ExposureMask | KeyPressMask);
XMapWindow(display, window);
VkApplicationInfo application_info{};
application_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
application_info.pNext = nullptr;
application_info.pApplicationName = "Dynamo";
application_info.applicationVersion = VK_MAKE_VERSION(0, 1, 0);
application_info.pEngineName = "Dynamo";
application_info.engineVersion = VK_MAKE_VERSION(0, 1, 0);
application_info.apiVersion = VK_API_VERSION_1_0;
VkInstanceCreateInfo instance_create_info{};
instance_create_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
instance_create_info.pApplicationInfo = amp;application_info;
VkInstance instance;
if (vkCreateInstance(amp;instance_create_info, nullptr, amp;instance) != VK_SUCCESS)
{
throw std::runtime_error("failed to create instance!");
}
}
App::~App()
{
XCloseDisplay(display);
}
void App::main_loop()
{
XEvent event;
while (true)
{
XNextEvent(display, amp;event);
if (event.type == KeyPress)
break;
}
}
int main()
{
std::cout << "Hello world!" << std::endl;
App app(1920 / 2, 1080 / 2);
app.main_loop();
return 0;
}