跳到主要内容

vkCreateXcbSurfaceKHR

函数原型

VkResult vkCreateXcbSurfaceKHR(
VkInstance instance,
const VkXcbSurfaceCreateInfoKHR* pCreateInfo,
const VkAllocationCallbacks* pAllocator,
VkSurfaceKHR* pSurface);

描述

为X11窗口创建VkSurfaceKHR对象。

参数

  • instance : 与surface关联的surface。
  • pCreateInfo : VkXcbSurfaceCreateInfoKHR 结构体指针,包含创建surface的信息。
  • pAllocator : host memory 分配器。
  • pSurface : 创建返回的suface句柄。

补充

VkXcbSurfaceCreateInfoKHR 结构体定义:

typedef struct VkXcbSurfaceCreateInfoKHR {
VkStructureType sType;
const void* pNext;
VkXcbSurfaceCreateFlagsKHR flags;
xcb_connection_t* connection; //xcb connectin
xcb_window_t window; //xcb window
} VkXcbSurfaceCreateInfoKHR;

返回值

  • VK_SUCCESS : 成功创建surface。
  • 其他 : 创建失败。

代码示例

struct sample_info {
xcb_connection_t *connection;
xcb_screen_t *screen;
xcb_window_t window;
xcb_intern_atom_reply_t *atom_wm_delete_window;
VkSurfaceKHR surface;
}

void init_connection(struct sample_info &info) {
const xcb_setup_t *setup;
xcb_screen_iterator_t iter;
int scr;

info.connection = xcb_connect(NULL, &scr);
if (info.connection == NULL || xcb_connection_has_error(info.connection)) {
std::cout << "Unable to make an XCB connection\n";
exit(-1);
}

setup = xcb_get_setup(info.connection);
iter = xcb_setup_roots_iterator(setup);
while (scr-- > 0) xcb_screen_next(&iter);
info.screen = iter.data;
}


void init_window(struct sample_info &info) {
uint32_t value_mask, value_list[32];

info.window = xcb_generate_id(info.connection);

value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
value_list[0] = info.screen->black_pixel;
value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE;

xcb_create_window(info.connection, XCB_COPY_FROM_PARENT, info.window, info.screen->root, 0, 0, info.width, info.height, 0,
XCB_WINDOW_CLASS_INPUT_OUTPUT, info.screen->root_visual, value_mask, value_list);

/* Magic code that will send notification when window is destroyed */
xcb_intern_atom_cookie_t cookie = xcb_intern_atom(info.connection, 1, 12, "WM_PROTOCOLS");
xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(info.connection, cookie, 0);

xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(info.connection, 0, 16, "WM_DELETE_WINDOW");
info.atom_wm_delete_window = xcb_intern_atom_reply(info.connection, cookie2, 0);

xcb_change_property(info.connection, XCB_PROP_MODE_REPLACE, info.window, (*reply).atom, 4, 32, 1,
&(*info.atom_wm_delete_window).atom);
free(reply);

xcb_map_window(info.connection, info.window);

// Force the x/y coordinates to 100,100 results are identical in consecutive
// runs
const uint32_t coords[] = {100, 100};
xcb_configure_window(info.connection, info.window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
xcb_flush(info.connection);

xcb_generic_event_t *e;
while ((e = xcb_wait_for_event(info.connection))) {
if ((e->response_type & ~0x80) == XCB_EXPOSE) break;
}
}


void main()
{
struct sample_info info = {};
init_connection(info);
init_window(info);

VkXcbSurfaceCreateInfoKHR createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
createInfo.pNext = NULL;
createInfo.connection = info.connection;
createInfo.window = info.window;
vkCreateXcbSurfaceKHR(info.inst, &createInfo, NULL, &info.surface);
}