mirror of
https://github.com/charles-lunarg/vk-bootstrap.git
synced 2024-11-22 15:24:34 +00:00
Added docs/getting_started.md and updated readme
This commit is contained in:
parent
782840296c
commit
00b6a74aa8
20
README.md
20
README.md
@ -12,11 +12,13 @@ This library simplifies the tedious process of:
|
|||||||
|
|
||||||
It also adds several conveniences for:
|
It also adds several conveniences for:
|
||||||
|
|
||||||
* enabling validation layers
|
* Enabling validation layers
|
||||||
* setting up a debug callback
|
* Adding a debug callback
|
||||||
* select a gpu based on a set of common criteria like features, extensions, memory, etc.
|
* Select a gpu based on a set of criteria like features, extensions, memory, etc.
|
||||||
|
|
||||||
## Example
|
Read the [Getting Started](docs/getting_started.md) guide for a quick start on using `vk-bootstrap`
|
||||||
|
|
||||||
|
## Basic Usage
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
|
|
||||||
@ -70,7 +72,8 @@ See `example/triangle.cpp` for an example that renders a triangle to the screen.
|
|||||||
|
|
||||||
### Simple
|
### Simple
|
||||||
|
|
||||||
This library has no external dependencies.
|
This library has no external dependencies beyond C++11 and the standard library.
|
||||||
|
|
||||||
Simply copy the `src/VkBootstrap.h` and `src/VkBootstrap.cpp` files into your project and compile them as you normally would
|
Simply copy the `src/VkBootstrap.h` and `src/VkBootstrap.cpp` files into your project and compile them as you normally would
|
||||||
|
|
||||||
### With git-submodule + CMake
|
### With git-submodule + CMake
|
||||||
@ -115,10 +118,3 @@ you can force enable tests by adding `-DVK_BOOTSTRAP_TEST` to the cmake command
|
|||||||
```bash
|
```bash
|
||||||
cmake ../path/to/your-project/ -DVK_BOOTSTRAP_TEST=ON
|
cmake ../path/to/your-project/ -DVK_BOOTSTRAP_TEST=ON
|
||||||
```
|
```
|
||||||
|
|
||||||
## Todo's
|
|
||||||
|
|
||||||
* Package library to be usable
|
|
||||||
* More examples
|
|
||||||
* Testing
|
|
||||||
* Documenting API
|
|
||||||
|
144
docs/getting_started.md
Normal file
144
docs/getting_started.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# Getting Started
|
||||||
|
|
||||||
|
`vk-bootstrap` reduces the complexity of setting up a vulkan application into 3 main steps; instance creation, Physical device selection, and device creation.
|
||||||
|
|
||||||
|
## Instance Creation
|
||||||
|
|
||||||
|
Creating an instance with `vk-bootstrap` uses the `vkb::InstanceBuilder` class.
|
||||||
|
|
||||||
|
Simply create a builder variable and call the `build()` member function.
|
||||||
|
```cpp
|
||||||
|
vkb::InstanceBuilder instance_builder;
|
||||||
|
auto instance_builder_return = instance_builder.build();
|
||||||
|
```
|
||||||
|
Because creating an instance may fail, the builder returns an 'Expected' type which can be either a valid `vkb::Instance` struct, containing the `VkInstance` handle, or the builder returns an error.
|
||||||
|
```cpp
|
||||||
|
if (!instance_builder_return) {
|
||||||
|
printf("Failed to create Vulkan instance. Cause %s\n",
|
||||||
|
vkb::to_string(instance_builder_return.error().type));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Now that any possible errors have been handled,
|
||||||
|
```cpp
|
||||||
|
vkb::Instance vkb_instance = instance_builder_return.value();
|
||||||
|
```
|
||||||
|
This is enough to create a usable `VkInstance` but most use cases will want to customize it a bit. To do so, simply call the member functions on the `vkb::InstanceBuilder` object before `build()` is called.
|
||||||
|
|
||||||
|
The most common customization to instance creation is enabling the "Validation Layers", an invaluable tool for any vulkan application developer.
|
||||||
|
```cpp
|
||||||
|
instance_builder.request_validation_layers ();
|
||||||
|
```
|
||||||
|
The other common customization point is setting up the `Debug Messenger Callback`, the mechanism in which an application can control what and where the "Validation Layers" log its output.
|
||||||
|
```cpp
|
||||||
|
instance_builder.set_debug_callback (
|
||||||
|
[] (VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
|
||||||
|
VkDebugUtilsMessageTypeFlagsEXT messageType,
|
||||||
|
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
|
||||||
|
void *pUserData)
|
||||||
|
-> VkBool32 {
|
||||||
|
auto severity = vkb::to_string_message_severity (messageSeverity);
|
||||||
|
auto type = vkb::to_string_message_type (messageType);
|
||||||
|
printf ("[%s: %s] %s\n", severity, type, pCallbackData->pMessage);
|
||||||
|
return VK_FALSE;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
```
|
||||||
|
Alternatively, `vk-bootstrap` provides a 'default debug messenger' that prints to standard output.
|
||||||
|
```cpp
|
||||||
|
instance_builder.use_default_debug_messenger();
|
||||||
|
```
|
||||||
|
Configuration can be chained together and done inline with building, like so.
|
||||||
|
```cpp
|
||||||
|
auto inst_builder_ret = instance_builder
|
||||||
|
.set_app_name ("Awesome Vulkan Application")
|
||||||
|
.set_engine_name("Excellent Game Engine")
|
||||||
|
.require_api_version(1,0,0)
|
||||||
|
.build();
|
||||||
|
```
|
||||||
|
|
||||||
|
The `vkb::Instance` struct is meant to hold all the necessary instance level data to enable proper Physical Device selection. It also is meant for easy destructuring into custom classes if so desired.
|
||||||
|
```cpp
|
||||||
|
struct CustomVulkanWrapper {
|
||||||
|
VkInstance instance;
|
||||||
|
//...
|
||||||
|
};
|
||||||
|
CustomVulkanWrapper custom_vk_class;
|
||||||
|
custom_vk_class.instance = vkb_instance.instance;
|
||||||
|
```
|
||||||
|
|
||||||
|
When the application is finished with the vulkan, call `vkb::destroy_instance()` to dispose of the instance and associated data.
|
||||||
|
```cpp
|
||||||
|
// cleanup
|
||||||
|
vkb::destroy_instance(vkb_instance);
|
||||||
|
```
|
||||||
|
### Instance Creation Summary
|
||||||
|
```cpp
|
||||||
|
vkb::InstanceBuilder instance_builder;
|
||||||
|
auto instance_builder_return = instance_builder
|
||||||
|
// Instance creation configuration
|
||||||
|
.request_validation_layers()
|
||||||
|
.use_default_debug_messenger()
|
||||||
|
.build ();
|
||||||
|
if (!instance_builder_return) {
|
||||||
|
// Handle error
|
||||||
|
}
|
||||||
|
vkb::Instance vkb_instance = instance_builder_return.value ();
|
||||||
|
|
||||||
|
// at program end
|
||||||
|
vkb::destroy_instance(vkb_instance);
|
||||||
|
```
|
||||||
|
## Surface Creation
|
||||||
|
|
||||||
|
Vulkan requires manually creating a surface, called `VkSurfaceKHR`. Creating a surface is the responsibility of the windowing system, thus is out of scope for `vk-bootstrap`. However, it does try to make the process as painless as possible by automatically enabling the correct windowing extensions in `VkInstance` creation.
|
||||||
|
|
||||||
|
Windowing libraries which support Vulkan usually provide a way of getting the `VkSurfaceKHR` handle for the window. These methods require a valid Vulkan instance, thus must be done after instance creation.
|
||||||
|
|
||||||
|
Examples for GLFW and SDL2 are listed below.
|
||||||
|
```cpp
|
||||||
|
vkb::Instance vkb_instance; //valid vkb::Instance
|
||||||
|
VkSurfaceKHR surface = nullptr;
|
||||||
|
// window is a valid library specific Window handle
|
||||||
|
|
||||||
|
// GLFW
|
||||||
|
VkResult err = glfwCreateWindowSurface (vkb_instance.instance, window, NULL, &surface);
|
||||||
|
if (err != VK_SUCCESS) { /* handle error */ }
|
||||||
|
|
||||||
|
// SDL2
|
||||||
|
SDL_bool err = SDL_Vulkan_CreateSurface(window, vkb_instance.instance, &surface);
|
||||||
|
if (!err){ /* handle error */ }
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Physical Device Selection
|
||||||
|
|
||||||
|
Once a Vulkan instance has been created, the next step is to find a suitable GPU for the application to use. `vk-bootstrap` provide the `vkb::PhysicalDeviceSelector` class to streamline this process.
|
||||||
|
|
||||||
|
Creating a `vkb::PhysicalDeviceSelector` requires a valid `vkb::Instance` to construct.
|
||||||
|
|
||||||
|
It follows the same pattern laid out by `vkb::InstanceBuilder`.
|
||||||
|
```cpp
|
||||||
|
vkb::PhysicalDeviceSelector phys_device_selector (vkb_instance);
|
||||||
|
auto physical_device_selector_return = phys_device_selector
|
||||||
|
.set_surface(surface_handle)
|
||||||
|
.select ();
|
||||||
|
if (!physical_device_selector_return) {
|
||||||
|
// Handle error
|
||||||
|
}
|
||||||
|
auto phys_device = phys_device_ret.value ();
|
||||||
|
```
|
||||||
|
|
||||||
|
To select a physical device, call `select()` on the `vkb::PhysicalDeviceSelector` object.
|
||||||
|
By default, this will prefer a discrete GPU.
|
||||||
|
|
||||||
|
No cleanup is required for `vkb::PhysicalDevice`.
|
||||||
|
|
||||||
|
// TODO -- configuring selection, querying phys device details, explaining why a surface is needed
|
||||||
|
|
||||||
|
## Device Creation
|
||||||
|
// TODO
|
||||||
|
## Swapchain
|
||||||
|
// TODO
|
||||||
|
## Error Handling
|
||||||
|
// TODO
|
||||||
|
|
Loading…
Reference in New Issue
Block a user