// Copyright (c) 2014-2017 The Khronos Group Inc.
// Copyright notice at https://www.khronos.org/registry/speccopyright.html

[[platformCreateSurface_xcb,platformCreateSurface_xcb]]

=== XCB Platform

// refBegin vkCreateXcbSurfaceKHR - Create a slink:VkSurfaceKHR object for a X11 window, using the XCB client-side library

To create a sname:VkSurfaceKHR object for an X11 window, using the XCB
client-side library, call:

include::../../api/protos/vkCreateXcbSurfaceKHR.txt[]

  * pname:instance is the instance to associate the surface with.
  * pname:pCreateInfo is a pointer to an instance of the
    sname:VkXcbSurfaceCreateInfoKHR structure containing parameters
    affecting the creation of the surface object.
  * pname:pAllocator is the allocator used for host memory allocated for the
    surface object when there is no more specific allocator available (see
    <<memory-allocation,Memory Allocation>>).
  * pname:pSurface points to a sname:VkSurfaceKHR handle in which the
    created surface object is returned.

include::../../validity/protos/vkCreateXcbSurfaceKHR.txt[]

// refBegin VkXcbSurfaceCreateInfoKHR - Structure specifying parameters of a newly created Xcb surface object

The sname:VkXcbSurfaceCreateInfoKHR structure is defined as:

include::../../api/structs/VkXcbSurfaceCreateInfoKHR.txt[]

  * pname:sType is the type of this structure.
  * pname:pNext is `NULL` or a pointer to an extension-specific structure.
  * pname:flags is reserved for future use.
  * pname:connection is a pointer to an code:xcb_connection_t to the X
    server.
  * pname:window is the code:xcb_window_t for the X11 window to associate
    the surface with.

.Valid Usage
****
  * [[VUID-VkXcbSurfaceCreateInfoKHR-connection-01310]]
    pname:connection must: point to a valid X11 code:xcb_connection_t.
  * [[VUID-VkXcbSurfaceCreateInfoKHR-window-01311]]
    pname:window must: be a valid X11 code:xcb_window_t.
****

include::../../validity/structs/VkXcbSurfaceCreateInfoKHR.txt[]

With Xcb, pname:minImageExtent, pname:maxImageExtent, and
pname:currentExtent are the window size.
Therefore, a swapchain's pname:imageExtent must: match the window's size.

Some Vulkan functions may: send protocol over the specified xcb connection
when using a swapchain or presentable images created from a VkSurface
referring to an xcb window.
Applications must: therefore ensure the xcb connection is available to
Vulkan for the duration of any functions that manipulate such swapchains or
their presentable images, and any functions that build or queue command
buffers that operate on such presentable images.
Specifically, applications using Vulkan with xcb-based swapchains must:

  * Avoid holding a server grab on an xcb connection while waiting for
    Vulkan operations to complete using a swapchain derived from a different
    xcb connection referring to the same X server instance.
    Failing to do so may: result in deadlock.
