📦 Vulkan dev tests inside Linux/BSD written in C.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
n0mad 430c51c616 improved log system to include args. Don't expect the rest of the code to work. Heavy refactoring ongoing. 1 year ago
OLD messing around with textures. 2 years ago
external code refactoring to isolate swapchains 2 years ago
inc finished uniform buffer creation 2 years ago
media got images to render. Build passing 2 years ago
src improved log system to include args. Don't expect the rest of the code to work. Heavy refactoring ongoing. 1 year ago
.gitignore working from amd bsd now 2 years ago
LICENSE Working on camera system. Guessing axis values 2 years ago
Makefile code refactoring to isolate swapchains 2 years ago
README.md Updated readme format 2 years ago
app.init Well, now we have a square. Vertex indices done. We move into ubo 2 years ago


Vulkan tests in FreeBSD/Debian

Personal development workshop to learn vulkan before implementing in serious projects

As part of a learning path, this project is aiming the creation of a coding environment (software) to interact with graphics. Please take note that this is an ongoing project I'm doing in my spare time along with the unixworks project. I try to keep it as updated as possible.

I don't like the idea of increasing the repository size by including media progress in here (it only supports gif animations) but if you're interested in the progress of the project I usually post information and video demos at my personal channel.


Software requirements

To try and reproduce what I have in my machine, install the following depending in your os:

  • Debian:
sudo apt-get install vulkan-validationlayers-dev libvulkan-dev mesa-vulkan-drivers vulkan-tools vulkan-utils libglfw3-dev glslang-tools glslang-dev spirv-tools
  • FreeBSD:

Important note: There's a bug with validation layers running with XCB. A temporary patch may be found here. I'd recommend you to build vulkan dependencies from source.

doas pkg install vulkan-validation-layers vulkan-tools vulkan-loader vulkan-headers glfw glslang spirv-tools shaderc


Most of the open source repositories doing vulkan development are using the LunarG SDK, C++ and CMAKE which is perfectly fine but I want to go in other direction. This is why this repo is focused on BSD and Linux operating systems and being written in close-to-metal C, using plain makefiles and no IDE dependency to build it and try to avoid any extra code bloat.
A scripting implementation will come when development grows, most probably the implementation will be using Lua.


  • Learn to use complex Makefiles.
  • Learn in depth C.
  • Learn Vulkan.
  • Create a basic graphics sandbox development engine.
  • Make it portable being multiplatform and multi-arch.
  • Avoid bloat.

ToDo List

  • Organize and clean main modules.

  • Select best device based on family queues.

  • Select device features automatically.

  • Implement VMA from AMD.

  • Learn layers.

  • Graphics pipeline.

  • Simple Vertex Buffers.

  • Abstracted buffer pipeline.

  • Uniform buffer object.

  • Camera navigation.

  • Free camera.

  • Orbit camera.

  • Quaternion rotations.

  • TGA format.

  • KTX format.

  • glTF format.

  • Texture mapping.

  • Mesh loading.

  • Basic PBR render (deferred or forward light).

  • Lua scripting.

  • Graphical editor.

Bugs List

Bugs are traces in code that shouldn't be there. Here I make a separation between critical(program won't run unless fixed) and non-critical(the program runs, but those things need to be fixed).

:beetle: Critical

Better have this list empty. 🍃

🐛 Non-Critical

  • A semaphore cannot be signaled. Happens when resizing the window for the first time.
UNASSIGNED-CoreValidation-DrawState-QueueForwardProgress(ERROR / SPEC): msgNum: 0 - VkQueue 0x627000028738[] is waiting on VkSemaphore 0x160000000016[] that has no way to be signaled.
    Objects: 1
        [0] 0x160000000016, type: 5, name: NULL
  • Second image in swapchain hasn't been acquired. Happens when resizing the window for the first time.
UNASSIGNED-CoreValidation-DrawState-SwapchainImageNotAcquired(ERROR / SPEC): msgNum: 0 - vkQueuePresentKHR: Swapchain image index 2 has not been acquired.
    Objects: 1
        [0] 0x20000000002, type: 1000001000, name: NULL
  • Apparently the oldswapchain doesn't reference a valid VkSwapchainKHR. Happens each time we recreate the swapchain.
VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter(ERROR / SPEC): msgNum: 0 - Invalid VkSwapchainKHR Object 0x20000000002. The Vulkan spec states: If oldSwapchain is not VK_NULL_HANDLE, oldSwapchain must be a valid VkSwapchainKHR handle (https://www.khronos.org/registry/vulkan/specs/1.1-extensions/html/vkspec.html#VUID-VkSwapchainCreateInfoKHR-oldSwapchain-parameter)
    Objects: 1
        [0] 0x20000000002, type: 1000001000, name: NULL
  • No idea what is this exactly
UNASSIGNED-Threading-Info(ERROR / SPEC): msgNum: 0 - Couldn't find VkDescriptorUpdateTemplate Object 0x20000000002. This should not happen and may indicate a bug in the application.
    Objects: 1
        [0] 0x20000000002, type: 1000001000, name: NULL
  • Segmentation fault happens when we press ESC KEY (managed by GFLW in main loop)
UNASSIGNED-ObjectTracker-ObjectLeak(ERROR / SPEC): msgNum: 0 - OBJ ERROR : VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_EXT object VkDevice 0x55a89903fe30[] has not been destroyed.
    Objects: 1
        [0] 0x55a89903fe30, type: 3, name: NULL
Segmentation fault


  • Telegram channel
  • Twitter
  • Patreon


This project is GPL v2.0 licensed. This means you can borrow the code and do whatever you want with it, but any changes you make have to be documented and the product you make has to use the same license. Check the LICENSE file for details.


Hey! Thanks for checking this out.

I'm running low on coffee, if you think the project is useful or want to look a faster development, consider buying me a coffee or becoming a patron. That way I can spend more time working on it (:

No coffee? Don't worry, check out the Telegram channel (it works from the web, no accounts required), star the repo and share it!