parent
							
								
									2826f3d42f
								
							
						
					
					
						commit
						511183e76c
					
				
				 3 changed files with 330 additions and 330 deletions
			
			
		@ -1,22 +1,22 @@ | 
				
			||||
branches: | 
				
			||||
    only: | 
				
			||||
        - ci | 
				
			||||
        - master | 
				
			||||
skip_tags: true | 
				
			||||
environment: | 
				
			||||
    matrix: | 
				
			||||
        - BUILD_SHARED_LIBS: ON | 
				
			||||
        - BUILD_SHARED_LIBS: OFF | 
				
			||||
matrix: | 
				
			||||
    fast_finish: true | 
				
			||||
build_script: | 
				
			||||
    - mkdir build | 
				
			||||
    - cd build | 
				
			||||
    - cmake -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% .. | 
				
			||||
    - cmake --build . | 
				
			||||
notifications: | 
				
			||||
    - provider: Email | 
				
			||||
      to: | 
				
			||||
        - ci@glfw.org | 
				
			||||
    - on_build_failure: true | 
				
			||||
    - on_build_success: false | 
				
			||||
branches: | 
				
			||||
    only: | 
				
			||||
        - ci | 
				
			||||
        - master | 
				
			||||
skip_tags: true | 
				
			||||
environment: | 
				
			||||
    matrix: | 
				
			||||
        - BUILD_SHARED_LIBS: ON | 
				
			||||
        - BUILD_SHARED_LIBS: OFF | 
				
			||||
matrix: | 
				
			||||
    fast_finish: true | 
				
			||||
build_script: | 
				
			||||
    - mkdir build | 
				
			||||
    - cd build | 
				
			||||
    - cmake -DBUILD_SHARED_LIBS=%BUILD_SHARED_LIBS% .. | 
				
			||||
    - cmake --build . | 
				
			||||
notifications: | 
				
			||||
    - provider: Email | 
				
			||||
      to: | 
				
			||||
        - ci@glfw.org | 
				
			||||
    - on_build_failure: true | 
				
			||||
    - on_build_success: false | 
				
			||||
 | 
				
			||||
@ -1,106 +1,106 @@ | 
				
			||||
# Contribution Guide | 
				
			||||
 | 
				
			||||
This file is a work in progress and you can report errors or submit patches for | 
				
			||||
it the same as any other file. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
## Reporting a bug | 
				
			||||
 | 
				
			||||
If GLFW is behaving unexpectedly, make sure you have set an error callback. | 
				
			||||
GLFW will often tell you the cause of an issue via this callback. | 
				
			||||
 | 
				
			||||
If GLFW is crashing or triggering asserts, make sure that all your object | 
				
			||||
handles and other pointers are valid. | 
				
			||||
 | 
				
			||||
Always include the __operating system name and version__ (i.e. `Windows | 
				
			||||
7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW, | 
				
			||||
include the __GLFW release version__ (i.e. `3.1.2`), otherwise include the | 
				
			||||
__GLFW commit ID__ (i.e.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git. | 
				
			||||
If possible, please also include the __GLFW version string__ (`3.2.0 X11 EGL | 
				
			||||
clock_gettime /dev/js XI Xf86vm`), as described | 
				
			||||
[here](http://www.glfw.org/docs/latest/intro.html#intro_version_string). | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a compile or link bug | 
				
			||||
 | 
				
			||||
__Note:__ GLFW needs many system APIs to do its job.  See the [Building | 
				
			||||
applications](http://www.glfw.org/docs/latest/build.html) guide for more | 
				
			||||
information. | 
				
			||||
 | 
				
			||||
In addition to the information above, always include the complete build log from | 
				
			||||
your compiler and linker.  Issue posts are editable so it can always be | 
				
			||||
shortened later. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a context creation bug | 
				
			||||
 | 
				
			||||
__Note:__ Windows ships with graphics drivers that do not support OpenGL.  If | 
				
			||||
GLFW says that your machine lacks support for OpenGL, it very likely does. | 
				
			||||
Install drivers from the computer manufacturer or graphics card manufacturer | 
				
			||||
([Nvidia](http://www.geforce.com/drivers), | 
				
			||||
 [AMD](http://support.amd.com/en-us/download), | 
				
			||||
 [Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to | 
				
			||||
fix this. | 
				
			||||
 | 
				
			||||
__Note:__ AMD only supports OpenGL ES on Windows via EGL.  EGL support is not | 
				
			||||
enabled in GLFW by default.  You need to [enable EGL when | 
				
			||||
compiling](http://www.glfw.org/docs/latest/compile.html) GLFW to use this. | 
				
			||||
 | 
				
			||||
The `glfwinfo` tool is included in the GLFW source tree as `tests/glfwinfo.c` | 
				
			||||
and is built along with the library.  It lets you request any kind of context | 
				
			||||
and framebuffer format supported by the GLFW API without having to recompile. | 
				
			||||
If context creation fails in your application, please verify that it also fails | 
				
			||||
with this tool before reporting it as a bug. | 
				
			||||
 | 
				
			||||
In addition to the information above (OS and GLFW version), always include the | 
				
			||||
__GPU model and driver version__ (i.e. `GeForce GTX660 with 352.79`) when | 
				
			||||
reporting this kind of bug. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a monitor or video mode bug | 
				
			||||
 | 
				
			||||
__Note:__ On headless systems on some platforms, no monitors are reported.  This | 
				
			||||
causes glfwGetPrimaryMonitor to return `NULL`, which not all applications are | 
				
			||||
prepared for. | 
				
			||||
 | 
				
			||||
__Note:__ Some third-party tools report more video modes than those approved of | 
				
			||||
by the OS.  For safety and compatbility, GLFW only reports video modes the OS | 
				
			||||
wants programs to use.  This is not a bug. | 
				
			||||
 | 
				
			||||
The `monitors` tool is included in the GLFW source tree as `tests/monitors.c` | 
				
			||||
and is built along with the library.  lists all information about connected | 
				
			||||
monitors made available by GLFW. | 
				
			||||
 | 
				
			||||
In addition to the information above (OS and GLFW version), please also include | 
				
			||||
the output of the `monitors` tool when reporting this kind of bug.  If it | 
				
			||||
doesn't work at all, please mention this. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a window event bug | 
				
			||||
 | 
				
			||||
__Note:__ While GLFW tries to provide the exact same behavior between platforms, | 
				
			||||
the exact ordering of related window events will sometimes differ. | 
				
			||||
 | 
				
			||||
The `events` tool is included in the GLFW source tree as `tests/events.c` and is | 
				
			||||
built along with the library.  It prints all information provided to every | 
				
			||||
callback supported by GLFW as events occur.  Each event is listed with the time | 
				
			||||
and a unique number to make discussions about event logs easier.  The tool has | 
				
			||||
command-line options for creating multiple windows and full screen windows. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a documentation bug | 
				
			||||
 | 
				
			||||
If you found the error in the generated documentation then it's fine to just | 
				
			||||
link to that webpage.  You don't need to figure out which documentation source | 
				
			||||
file the text comes from. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
## Contributing a bug fix | 
				
			||||
 | 
				
			||||
There should be text here, but there isn't. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
## Contributing a feature | 
				
			||||
 | 
				
			||||
This is not (yet) the text you are looking for. | 
				
			||||
 | 
				
			||||
# Contribution Guide | 
				
			||||
 | 
				
			||||
This file is a work in progress and you can report errors or submit patches for | 
				
			||||
it the same as any other file. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
## Reporting a bug | 
				
			||||
 | 
				
			||||
If GLFW is behaving unexpectedly, make sure you have set an error callback. | 
				
			||||
GLFW will often tell you the cause of an issue via this callback. | 
				
			||||
 | 
				
			||||
If GLFW is crashing or triggering asserts, make sure that all your object | 
				
			||||
handles and other pointers are valid. | 
				
			||||
 | 
				
			||||
Always include the __operating system name and version__ (i.e. `Windows | 
				
			||||
7 64-bit` or `Ubuntu 15.10`).  If you are using an official release of GLFW, | 
				
			||||
include the __GLFW release version__ (i.e. `3.1.2`), otherwise include the | 
				
			||||
__GLFW commit ID__ (i.e.  `3795d78b14ef06008889cc422a1fb8d642597751`) from Git. | 
				
			||||
If possible, please also include the __GLFW version string__ (`3.2.0 X11 EGL | 
				
			||||
clock_gettime /dev/js XI Xf86vm`), as described | 
				
			||||
[here](http://www.glfw.org/docs/latest/intro.html#intro_version_string). | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a compile or link bug | 
				
			||||
 | 
				
			||||
__Note:__ GLFW needs many system APIs to do its job.  See the [Building | 
				
			||||
applications](http://www.glfw.org/docs/latest/build.html) guide for more | 
				
			||||
information. | 
				
			||||
 | 
				
			||||
In addition to the information above, always include the complete build log from | 
				
			||||
your compiler and linker.  Issue posts are editable so it can always be | 
				
			||||
shortened later. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a context creation bug | 
				
			||||
 | 
				
			||||
__Note:__ Windows ships with graphics drivers that do not support OpenGL.  If | 
				
			||||
GLFW says that your machine lacks support for OpenGL, it very likely does. | 
				
			||||
Install drivers from the computer manufacturer or graphics card manufacturer | 
				
			||||
([Nvidia](http://www.geforce.com/drivers), | 
				
			||||
 [AMD](http://support.amd.com/en-us/download), | 
				
			||||
 [Intel](https://www-ssl.intel.com/content/www/us/en/support/detect.html)) to | 
				
			||||
fix this. | 
				
			||||
 | 
				
			||||
__Note:__ AMD only supports OpenGL ES on Windows via EGL.  EGL support is not | 
				
			||||
enabled in GLFW by default.  You need to [enable EGL when | 
				
			||||
compiling](http://www.glfw.org/docs/latest/compile.html) GLFW to use this. | 
				
			||||
 | 
				
			||||
The `glfwinfo` tool is included in the GLFW source tree as `tests/glfwinfo.c` | 
				
			||||
and is built along with the library.  It lets you request any kind of context | 
				
			||||
and framebuffer format supported by the GLFW API without having to recompile. | 
				
			||||
If context creation fails in your application, please verify that it also fails | 
				
			||||
with this tool before reporting it as a bug. | 
				
			||||
 | 
				
			||||
In addition to the information above (OS and GLFW version), always include the | 
				
			||||
__GPU model and driver version__ (i.e. `GeForce GTX660 with 352.79`) when | 
				
			||||
reporting this kind of bug. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a monitor or video mode bug | 
				
			||||
 | 
				
			||||
__Note:__ On headless systems on some platforms, no monitors are reported.  This | 
				
			||||
causes glfwGetPrimaryMonitor to return `NULL`, which not all applications are | 
				
			||||
prepared for. | 
				
			||||
 | 
				
			||||
__Note:__ Some third-party tools report more video modes than those approved of | 
				
			||||
by the OS.  For safety and compatbility, GLFW only reports video modes the OS | 
				
			||||
wants programs to use.  This is not a bug. | 
				
			||||
 | 
				
			||||
The `monitors` tool is included in the GLFW source tree as `tests/monitors.c` | 
				
			||||
and is built along with the library.  lists all information about connected | 
				
			||||
monitors made available by GLFW. | 
				
			||||
 | 
				
			||||
In addition to the information above (OS and GLFW version), please also include | 
				
			||||
the output of the `monitors` tool when reporting this kind of bug.  If it | 
				
			||||
doesn't work at all, please mention this. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a window event bug | 
				
			||||
 | 
				
			||||
__Note:__ While GLFW tries to provide the exact same behavior between platforms, | 
				
			||||
the exact ordering of related window events will sometimes differ. | 
				
			||||
 | 
				
			||||
The `events` tool is included in the GLFW source tree as `tests/events.c` and is | 
				
			||||
built along with the library.  It prints all information provided to every | 
				
			||||
callback supported by GLFW as events occur.  Each event is listed with the time | 
				
			||||
and a unique number to make discussions about event logs easier.  The tool has | 
				
			||||
command-line options for creating multiple windows and full screen windows. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
### Reporting a documentation bug | 
				
			||||
 | 
				
			||||
If you found the error in the generated documentation then it's fine to just | 
				
			||||
link to that webpage.  You don't need to figure out which documentation source | 
				
			||||
file the text comes from. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
## Contributing a bug fix | 
				
			||||
 | 
				
			||||
There should be text here, but there isn't. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
## Contributing a feature | 
				
			||||
 | 
				
			||||
This is not (yet) the text you are looking for. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@ -1,202 +1,202 @@ | 
				
			||||
/*! | 
				
			||||
 | 
				
			||||
@page vulkan Vulkan guide | 
				
			||||
  | 
				
			||||
@tableofcontents | 
				
			||||
 | 
				
			||||
This guide is intended to fill the gaps between the [Vulkan | 
				
			||||
documentation](https://www.khronos.org/vulkan/) and the rest of the GLFW | 
				
			||||
documentation and is not a replacement for either.  It assumes some familiarity | 
				
			||||
with Vulkan concepts like loaders, devices, queues and surfaces and leaves it to | 
				
			||||
the Vulkan documentation to explain the details of Vulkan functions. | 
				
			||||
 | 
				
			||||
To develop for Vulkan you should install an SDK for your platform, for example | 
				
			||||
the [LunarG Vulkan SDK](https://vulkan.lunarg.com/).  Apart from the headers and | 
				
			||||
libraries, it also provides the validation layers necessary for development. | 
				
			||||
 | 
				
			||||
The GLFW library does not need the Vulkan SDK to enable support for Vulkan. | 
				
			||||
However, any Vulkan-specific test and example programs are built only if the | 
				
			||||
CMake files find a Vulkan SDK. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_include Including the Vulkan and GLFW header files | 
				
			||||
 | 
				
			||||
To include the Vulkan header, define [GLFW_INCLUDE_VULKAN](@ref build_macros) | 
				
			||||
before including the GLFW header. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
#define GLFW_INCLUDE_VULKAN | 
				
			||||
#include <GLFW/glfw3.h> | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
If you want to include the Vulkan header from a custom location or use your own | 
				
			||||
custom Vulkan header then you need to include them before the GLFW header. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
#include <path/to/vulkan.h> | 
				
			||||
#include <GLFW/glfw3.h> | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Unless a Vulkan header is included, either by the GLFW header or above it, any | 
				
			||||
GLFW functions that take or return Vulkan types will not be declared. | 
				
			||||
 | 
				
			||||
The `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part | 
				
			||||
of GLFW to work.  Define them only if you are using these extensions directly. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_support Querying for Vulkan support | 
				
			||||
 | 
				
			||||
If you are linking directly against the Vulkan loader then you can skip this | 
				
			||||
section.  The canonical desktop loader library exports all Vulkan core and | 
				
			||||
Khronos extension functions, allowing them to be called directly. | 
				
			||||
 | 
				
			||||
If you are loading the Vulkan loader dynamically instead of linking directly | 
				
			||||
against it, you can check for the availability of a loader with @ref | 
				
			||||
glfwVulkanSupported. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
if (glfwVulkanSupported()) | 
				
			||||
{ | 
				
			||||
    // Vulkan is available, at least for compute | 
				
			||||
} | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
This function returns `GLFW_TRUE` if the Vulkan loader was found.  This check is | 
				
			||||
performed by @ref glfwInit. | 
				
			||||
 | 
				
			||||
If no loader was found, calling any other Vulkan related GLFW function will | 
				
			||||
generate a @ref GLFW_API_UNAVAILABLE error. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@subsection vulkan_proc Querying Vulkan function pointers | 
				
			||||
 | 
				
			||||
To load any Vulkan core or extension function from the found loader, call @ref | 
				
			||||
glfwGetInstanceProcAddress.  To load functions needed for instance creation, | 
				
			||||
pass `NULL` as the instance. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
PFN_vkCreateInstance pfnCreateInstance = (PFN_vkCreateInstance) | 
				
			||||
    glfwGetInstanceProcAddress(NULL, "vkCreateInstance"); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Once you have created an instance, you can load from it all other Vulkan core | 
				
			||||
functions and functions from any instance extensions you enabled. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
PFN_vkCreateDevice pfnCreateDevice = (PFN_vkCreateDevice) | 
				
			||||
    glfwGetInstanceProcAddress(instance, "vkCreateDevice"); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
This function in turn calls `vkGetInstanceProcAddr`.  If that fails, the | 
				
			||||
function falls back to a platform-specific query of the Vulkan loader (i.e. | 
				
			||||
`dlsym` or `GetProcAddress`).  If that also fails, the function returns `NULL`. | 
				
			||||
For more information about `vkGetInstanceProcAddr`, see the Vulkan | 
				
			||||
documentation. | 
				
			||||
 | 
				
			||||
Vulkan also provides `vkGetDeviceProcAddr` for loading device-specific versions | 
				
			||||
of Vulkan function.  This function can be retrieved from an instance with @ref | 
				
			||||
glfwGetInstanceProcAddress. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) | 
				
			||||
    glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr"); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Device-specific functions may execute a little bit faster, due to not having to | 
				
			||||
dispatch internally based on the device passed to them.  For more information | 
				
			||||
about `vkGetDeviceProcAddr`, see the Vulkan documentation. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_ext Querying required Vulkan extensions | 
				
			||||
 | 
				
			||||
To do anything useful with Vulkan you need to create an instance.  If you want | 
				
			||||
to use Vulkan to render to a window, you must enable the instance extensions | 
				
			||||
GLFW requires to create Vulkan surfaces. | 
				
			||||
 | 
				
			||||
To query the instance extensions required, call @ref | 
				
			||||
glfwGetRequiredInstanceExtensions. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
int count; | 
				
			||||
const char** extensions = glfwGetRequiredInstanceExtensions(&count); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
These extensions must all be enabled when creating instances that are going to | 
				
			||||
be passed to @ref glfwGetPhysicalDevicePresentationSupport and @ref | 
				
			||||
glfwCreateWindowSurface.  The set of extensions will vary depending on platform | 
				
			||||
and may also vary depending on graphics drivers and other factors. | 
				
			||||
 | 
				
			||||
If it fails it will return `NULL` and GLFW will not be able to create Vulkan | 
				
			||||
window surfaces.  You can still use Vulkan for off-screen rendering and compute | 
				
			||||
work. | 
				
			||||
 | 
				
			||||
The returned array will always contain `VK_KHR_surface`, so if you don't | 
				
			||||
require any additional extensions you can pass this list directly to the | 
				
			||||
`VkInstanceCreateInfo` struct. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
VkInstanceCreateInfo ici; | 
				
			||||
 | 
				
			||||
memset(&ici, 0, sizeof(ici)); | 
				
			||||
ici.enabledExtensionCount = count; | 
				
			||||
ici.ppEnabledExtensionNames = extensions; | 
				
			||||
... | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Additional extensions may be required by future versions of GLFW.  You should | 
				
			||||
check whether any extensions you wish to enable are already in the returned | 
				
			||||
array, as it is an error to specify an extension more than once in the | 
				
			||||
`VkInstanceCreateInfo` struct.  | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_present Querying for Vulkan presentation support | 
				
			||||
 | 
				
			||||
Not every queue family of every Vulkan device can present images to surfaces. | 
				
			||||
To check whether a specific queue family of a physical device supports image | 
				
			||||
presentation without first having to create a window and surface, call @ref | 
				
			||||
glfwGetPhysicalDevicePresentationSupport. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
if (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_family_index)) | 
				
			||||
{ | 
				
			||||
    // Queue family supports image presentation | 
				
			||||
} | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
The `VK_KHR_surface` extension additionally provides the  | 
				
			||||
`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on | 
				
			||||
an existing Vulkan surface. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_window Creating the window | 
				
			||||
 | 
				
			||||
Unless you will be using OpenGL or OpenGL ES with the same window as Vulkan, | 
				
			||||
there is no need to create a context.  You can disable context creation with the | 
				
			||||
[GLFW_CLIENT_API](@ref window_hints_ctx) hint. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); | 
				
			||||
GLFWwindow* window = glfwCreateWindow(640, 480, "Window Title", NULL, NULL); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
See @ref context_less for more information. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_surface Creating a Vulkan window surface | 
				
			||||
 | 
				
			||||
You can create a Vulkan surface (as defined by the `VK_KHR_surface` extension) | 
				
			||||
for a GLFW window with @ref glfwCreateWindowSurface. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
VkSurfaceKHR surface; | 
				
			||||
VkResult err = glfwCreateWindowSurface(instance, window, NULL, &surface); | 
				
			||||
if (err) | 
				
			||||
{ | 
				
			||||
    // Window surface creation failed | 
				
			||||
} | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
It is your responsibility to destroy the surface.  GLFW does not destroy it for | 
				
			||||
you.  Call `vkDestroySurfaceKHR` function from the same extension to destroy it. | 
				
			||||
 | 
				
			||||
*/ | 
				
			||||
/*! | 
				
			||||
 | 
				
			||||
@page vulkan Vulkan guide | 
				
			||||
  | 
				
			||||
@tableofcontents | 
				
			||||
 | 
				
			||||
This guide is intended to fill the gaps between the [Vulkan | 
				
			||||
documentation](https://www.khronos.org/vulkan/) and the rest of the GLFW | 
				
			||||
documentation and is not a replacement for either.  It assumes some familiarity | 
				
			||||
with Vulkan concepts like loaders, devices, queues and surfaces and leaves it to | 
				
			||||
the Vulkan documentation to explain the details of Vulkan functions. | 
				
			||||
 | 
				
			||||
To develop for Vulkan you should install an SDK for your platform, for example | 
				
			||||
the [LunarG Vulkan SDK](https://vulkan.lunarg.com/).  Apart from the headers and | 
				
			||||
libraries, it also provides the validation layers necessary for development. | 
				
			||||
 | 
				
			||||
The GLFW library does not need the Vulkan SDK to enable support for Vulkan. | 
				
			||||
However, any Vulkan-specific test and example programs are built only if the | 
				
			||||
CMake files find a Vulkan SDK. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_include Including the Vulkan and GLFW header files | 
				
			||||
 | 
				
			||||
To include the Vulkan header, define [GLFW_INCLUDE_VULKAN](@ref build_macros) | 
				
			||||
before including the GLFW header. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
#define GLFW_INCLUDE_VULKAN | 
				
			||||
#include <GLFW/glfw3.h> | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
If you want to include the Vulkan header from a custom location or use your own | 
				
			||||
custom Vulkan header then you need to include them before the GLFW header. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
#include <path/to/vulkan.h> | 
				
			||||
#include <GLFW/glfw3.h> | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Unless a Vulkan header is included, either by the GLFW header or above it, any | 
				
			||||
GLFW functions that take or return Vulkan types will not be declared. | 
				
			||||
 | 
				
			||||
The `VK_USE_PLATFORM_*_KHR` macros do not need to be defined for the Vulkan part | 
				
			||||
of GLFW to work.  Define them only if you are using these extensions directly. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_support Querying for Vulkan support | 
				
			||||
 | 
				
			||||
If you are linking directly against the Vulkan loader then you can skip this | 
				
			||||
section.  The canonical desktop loader library exports all Vulkan core and | 
				
			||||
Khronos extension functions, allowing them to be called directly. | 
				
			||||
 | 
				
			||||
If you are loading the Vulkan loader dynamically instead of linking directly | 
				
			||||
against it, you can check for the availability of a loader with @ref | 
				
			||||
glfwVulkanSupported. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
if (glfwVulkanSupported()) | 
				
			||||
{ | 
				
			||||
    // Vulkan is available, at least for compute | 
				
			||||
} | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
This function returns `GLFW_TRUE` if the Vulkan loader was found.  This check is | 
				
			||||
performed by @ref glfwInit. | 
				
			||||
 | 
				
			||||
If no loader was found, calling any other Vulkan related GLFW function will | 
				
			||||
generate a @ref GLFW_API_UNAVAILABLE error. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@subsection vulkan_proc Querying Vulkan function pointers | 
				
			||||
 | 
				
			||||
To load any Vulkan core or extension function from the found loader, call @ref | 
				
			||||
glfwGetInstanceProcAddress.  To load functions needed for instance creation, | 
				
			||||
pass `NULL` as the instance. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
PFN_vkCreateInstance pfnCreateInstance = (PFN_vkCreateInstance) | 
				
			||||
    glfwGetInstanceProcAddress(NULL, "vkCreateInstance"); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Once you have created an instance, you can load from it all other Vulkan core | 
				
			||||
functions and functions from any instance extensions you enabled. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
PFN_vkCreateDevice pfnCreateDevice = (PFN_vkCreateDevice) | 
				
			||||
    glfwGetInstanceProcAddress(instance, "vkCreateDevice"); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
This function in turn calls `vkGetInstanceProcAddr`.  If that fails, the | 
				
			||||
function falls back to a platform-specific query of the Vulkan loader (i.e. | 
				
			||||
`dlsym` or `GetProcAddress`).  If that also fails, the function returns `NULL`. | 
				
			||||
For more information about `vkGetInstanceProcAddr`, see the Vulkan | 
				
			||||
documentation. | 
				
			||||
 | 
				
			||||
Vulkan also provides `vkGetDeviceProcAddr` for loading device-specific versions | 
				
			||||
of Vulkan function.  This function can be retrieved from an instance with @ref | 
				
			||||
glfwGetInstanceProcAddress. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
PFN_vkGetDeviceProcAddr pfnGetDeviceProcAddr = (PFN_vkGetDeviceProcAddr) | 
				
			||||
    glfwGetInstanceProcAddress(instance, "vkGetDeviceProcAddr"); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Device-specific functions may execute a little bit faster, due to not having to | 
				
			||||
dispatch internally based on the device passed to them.  For more information | 
				
			||||
about `vkGetDeviceProcAddr`, see the Vulkan documentation. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_ext Querying required Vulkan extensions | 
				
			||||
 | 
				
			||||
To do anything useful with Vulkan you need to create an instance.  If you want | 
				
			||||
to use Vulkan to render to a window, you must enable the instance extensions | 
				
			||||
GLFW requires to create Vulkan surfaces. | 
				
			||||
 | 
				
			||||
To query the instance extensions required, call @ref | 
				
			||||
glfwGetRequiredInstanceExtensions. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
int count; | 
				
			||||
const char** extensions = glfwGetRequiredInstanceExtensions(&count); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
These extensions must all be enabled when creating instances that are going to | 
				
			||||
be passed to @ref glfwGetPhysicalDevicePresentationSupport and @ref | 
				
			||||
glfwCreateWindowSurface.  The set of extensions will vary depending on platform | 
				
			||||
and may also vary depending on graphics drivers and other factors. | 
				
			||||
 | 
				
			||||
If it fails it will return `NULL` and GLFW will not be able to create Vulkan | 
				
			||||
window surfaces.  You can still use Vulkan for off-screen rendering and compute | 
				
			||||
work. | 
				
			||||
 | 
				
			||||
The returned array will always contain `VK_KHR_surface`, so if you don't | 
				
			||||
require any additional extensions you can pass this list directly to the | 
				
			||||
`VkInstanceCreateInfo` struct. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
VkInstanceCreateInfo ici; | 
				
			||||
 | 
				
			||||
memset(&ici, 0, sizeof(ici)); | 
				
			||||
ici.enabledExtensionCount = count; | 
				
			||||
ici.ppEnabledExtensionNames = extensions; | 
				
			||||
... | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
Additional extensions may be required by future versions of GLFW.  You should | 
				
			||||
check whether any extensions you wish to enable are already in the returned | 
				
			||||
array, as it is an error to specify an extension more than once in the | 
				
			||||
`VkInstanceCreateInfo` struct.  | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_present Querying for Vulkan presentation support | 
				
			||||
 | 
				
			||||
Not every queue family of every Vulkan device can present images to surfaces. | 
				
			||||
To check whether a specific queue family of a physical device supports image | 
				
			||||
presentation without first having to create a window and surface, call @ref | 
				
			||||
glfwGetPhysicalDevicePresentationSupport. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
if (glfwGetPhysicalDevicePresentationSupport(instance, physical_device, queue_family_index)) | 
				
			||||
{ | 
				
			||||
    // Queue family supports image presentation | 
				
			||||
} | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
The `VK_KHR_surface` extension additionally provides the  | 
				
			||||
`vkGetPhysicalDeviceSurfaceSupportKHR` function, which performs the same test on | 
				
			||||
an existing Vulkan surface. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_window Creating the window | 
				
			||||
 | 
				
			||||
Unless you will be using OpenGL or OpenGL ES with the same window as Vulkan, | 
				
			||||
there is no need to create a context.  You can disable context creation with the | 
				
			||||
[GLFW_CLIENT_API](@ref window_hints_ctx) hint. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); | 
				
			||||
GLFWwindow* window = glfwCreateWindow(640, 480, "Window Title", NULL, NULL); | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
See @ref context_less for more information. | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@section vulkan_surface Creating a Vulkan window surface | 
				
			||||
 | 
				
			||||
You can create a Vulkan surface (as defined by the `VK_KHR_surface` extension) | 
				
			||||
for a GLFW window with @ref glfwCreateWindowSurface. | 
				
			||||
 | 
				
			||||
@code | 
				
			||||
VkSurfaceKHR surface; | 
				
			||||
VkResult err = glfwCreateWindowSurface(instance, window, NULL, &surface); | 
				
			||||
if (err) | 
				
			||||
{ | 
				
			||||
    // Window surface creation failed | 
				
			||||
} | 
				
			||||
@endcode | 
				
			||||
 | 
				
			||||
It is your responsibility to destroy the surface.  GLFW does not destroy it for | 
				
			||||
you.  Call `vkDestroySurfaceKHR` function from the same extension to destroy it. | 
				
			||||
 | 
				
			||||
*/ | 
				
			||||
 | 
				
			||||
					Loading…
					
					
				
		Reference in New Issue