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);
}