-
Notifications
You must be signed in to change notification settings - Fork 578
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
demo/backend: add vulkan SDL backend and demo
Based on other SDL demos and GLFW Vulkan demo.
- Loading branch information
Showing
12 changed files
with
5,484 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
src/nuklearshaders/*.spv | ||
src/nuklear_sdl_vulkan.h | ||
shaders/*.spv |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
# Install | ||
BIN = demo | ||
|
||
# Flags | ||
CFLAGS += -std=c89 -Wall -Wextra -pedantic -fsanitize=address -O2 | ||
|
||
SRC = main.c | ||
OBJ = $(SRC:.c=.o) | ||
|
||
ifeq ($(OS),Windows_NT) | ||
BIN := $(BIN).exe | ||
LIBS = -lsdl2 -lvulkan -lm | ||
else | ||
UNAME_S := $(shell uname -s) | ||
SDL2 := $(shell pkg-config --libs sdl2) | ||
LIBS = $(SDL2) -lvulkan -lm | ||
endif | ||
|
||
|
||
$(BIN): shaders/demo.vert.spv shaders/demo.frag.spv | ||
@mkdir -p bin | ||
rm -f bin/$(BIN) $(OBJS) | ||
$(CC) $(SRC) $(CFLAGS) -o bin/$(BIN) $(LIBS) | ||
|
||
shaders/demo.vert.spv: shaders/demo.vert | ||
glslc --target-env=vulkan shaders/demo.vert -o shaders/demo.vert.spv | ||
|
||
shaders/demo.frag.spv: shaders/demo.frag | ||
glslc --target-env=vulkan shaders/demo.frag -o shaders/demo.frag.spv |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
# nuklear sdl vulkan | ||
|
||
## Theory of operation | ||
|
||
The nuklear SDL vulkan integration creates an independent graphics pipeline that will render the nuklear UI to separate render targets. | ||
The application is responsible to fully manage these render targets. So it must ensure they are properly sized (and resized when requested). | ||
|
||
Furthermore it is assumed that you will have a swap chain in place and the number of nuklear overlay images and number of swap chain images match. | ||
|
||
This is how you can integrate it in your application: | ||
|
||
``` | ||
/* | ||
Setup: overlay_images have been created and their number match with the number | ||
of the swap_chain_images of your application. The overlay_images in this | ||
example have the same format as your swap_chain images (optional) | ||
*/ | ||
struct nk_context *ctx = nk_sdl_init( | ||
demo.win, demo.device, demo.physical_device, demo.indices.graphics, | ||
demo.overlay_image_views, demo.swap_chain_images_len, | ||
demo.swap_chain_image_format, 0, | ||
MAX_VERTEX_BUFFER, MAX_ELEMENT_BUFFER); | ||
[...] | ||
/* | ||
in your draw loop draw you can then render to the overlay image at | ||
`image_index` | ||
your own application can then wait for the semaphore and produce | ||
the swap_chain_image at `image_index` | ||
this should simply sample from the overlay_image (see example) | ||
*/ | ||
nk_semaphore semaphore = | ||
nk_sdl_render(demo.graphics_queue, image_index, | ||
demo.image_available, NK_ANTI_ALIASING_ON); | ||
if (!render(&demo, &bg, nk_semaphore, image_index)) { | ||
fprintf(stderr, "render failed\n"); | ||
return false; | ||
} | ||
``` | ||
|
||
You must call `nk_sdl_resize` whenever the size of the overlay_images resize. | ||
|
||
## Using images | ||
|
||
Images can be used by providing a VkImageView as an nk_image_ptr to nuklear: | ||
|
||
``` | ||
img = nk_image_ptr(demo.demo_texture_image_view); | ||
``` | ||
|
||
Note that they must have SHADER_READ_OPTIMAL layout | ||
|
||
It is currently not possible to specify how they are being sampled. The nuklear SDL vulkan integration uses a fixed sampler that does linear filtering. |
Oops, something went wrong.