I am aware of libraries that already do this (like GLFW), but I would actually prefer do all of the window and context creation by myself.
1 Answer
There's no such thing as a Vulkan context, the way there is with OpenGL. This is because Vulkan is a lower level API and an OpenGL context ties together a number of concepts that are distinct in the Vulkan API.
For example, the OpenGL context ties together the concept of extension management, memory management, draw commands and surface presentation. In Vulkan those are all managed through independent interfaces.
There are a number of things in Vulkan that kind of correspond to an OpenGL context in different ways, depending on what you're trying to do.
VkInstance
encapsulates access to the Vulkan libraries on the system, including enumerating the global extensions.
VkPhysicalDevice
lets you query the hardware capabilities and hardware specific extensions.
VkDevice
lets you actually interact with the hardware to do things like allocate memory.
VkCommandBuffer
is the interface for setting up and executing draw calls.
However, since you're focused on windows, what you're probably interested in is VkSurfaceKHR
. This encapsulates interaction with a windowing system, including initializing a surface from the OS specific window handles and doing presentation calls.
On Windows, to interact with a window, you need to have an existing VkInstance
, and you need to call vkCreateWin32SurfaceKHR
and pass it a structure containing an HWND
and an HINSTANCE
. If it succeeds then you have a surface to which you can then present images.