Skip to content

Antialiased 2D vector drawing library on top of Vulkan for UI and visualizations

License

Notifications You must be signed in to change notification settings

SubiyaCryolite/nanovg_vulkan

 
 

Repository files navigation

Background

This repo is based on the amazing work done by danilw in the archived repository danilw/nanovg_vulkan

Goal

For this library to be a Vulkan 1.0 compatible implementation of NanoVG, while using the full featureset of more capable hardware via optional extensions. Enhancements thus far include:

  • Optimising pipeline selection and creation via use of VK_EXT_extended_dynamic_state and VK_EXT_extended_dynamic_state3
  • Using one fragment shader instance, based on the NVG_ANTIALIAS flag (specialization constants)
  • Using Push constants in the Vertex Shader
  • Optimizations to vkCmdBindVertexBuffers (call once per frame) and vkCmdDraw (use firstVertex)
  • Using SSBO for single write of fragment data, rendered using uniform offset via pushConstant
  • Optimise texture memory flags, only update descriptors if texture is present

2024 - Im archive this.

Just use IMGUI

if you want - fork it and update it as you with, this is working in 2024 but im not going to update or change anything anymore.


Note about Vulkan - this nanovg_vulkan is Vulkan 1.0 project.
Vulkan 1.3 already released with about 10 years back GPU support in drivers. Vulkan 1.3 have VK_KHR_dynamic_rendering in core.
As minmal example of setup of complex pipeline look this blog - modern Vulkan with descriptor indexing, dynamic rendering and shader objects tutorial - and this repository vknew.
I think rewriting this entire project from scratch in Vulkan 1.3 - will be faster and easier than fixin some bugs here and improving it.


Notice - I wanted to fix one major bug here - DPI scale does not work, read known-bugs-related-info but I have no motivation to do it, too much effort, pointless no one need task.

Contact me in Discord or anywhere else if you want to ask some tech-info stuff, or I can add your "active" fork of this as link to this page.


added vulkan build, and cmake files, removed premake4.lua

Why I made this - I made it as a "test task for Vulkan related job" a year ago, for me this project has no real use. I would recommend for everyone use imgui if you look for production-ready Vulkan UI, also look on egui. I will not support or update this project at all, the last update was just to fix bugs and Validation errors.

Description - nanovg in C, no external dependencies. GLFW used only by one example (look examples description, there is example without using GLFW).


To launch - copy builded binary to example folder(or launch when this folder is current as on build example commands below). Because required fonts and images/shaders to load.


Known bugs-related info:


Build:

(use cmake to build on Windows, Windows/Linux supported and tested)

git clone --recursive https://github.com/danilw/nanovg_vulkan
cd nanovg_vulkan/example
mkdir build
cd build
cmake ../
make
cd ../
./build/example-vk
./build/example-vk_min_no_glfw

Look Examples description below there link to repository with C only minimal example without dependencies not using any library.

MoltenVK note - after TOPOLOGY_TRIANGLE_LIST update(look below) this Vulkan port does work on MoltenVK(Mac/etc) but I dont have it to test so you should make cmake config to build it and launch by yourself.


Examples description:

Multiple frames in flight - example_vulkan.c is multiple frames in flight example, example_vulkan_min_no_glfw.c is single frame in flight. Clearly visible on FPS - with multiple frames about 3x better FPS.


example_vulkan.c - minimal NanoVG example that use GLFW.

example_vulkan_min_no_glfw.c - same as above but not using GLFW, supported Linux and Windows.


Old examples, they not compatible with this latest nanovg_vulkan.

Two external examples:

nanovg-vulkan-min-integration-demo - repository with minimal RenderPass integration example. Not using any libraries, no GLFW, only NanoVG code and C. Look description and screenshot on link.

nanovg-vulkan-glfw-integration-demo - repository with example from Vulkan-tutorial Depth buffering modified adding NanoVG integration. Using C++ and GLFW.

Remember NanoVG is not GUI, and examples about is just examples of this NanoVG integration, not GUI examples.

About RenderPass integration - copy paste code from integration examples above after your vkCmdEndRenderPass (or before vkCmdBeginRenderPass) and everything should work.

Framebuffer integration, where UI rendered in its own Framebuffer - I did not add example for this case, because it should be obvious - just replace framebuffer RenderPass with RenderPass of NanoVG integration examples above(look linked commit).



2023 update - huge performance improvement thanks to @SubiyaCryolite

SubiyaCryolite pull request Optimizations > Cached Descriptor Sets, Implied Multiple Frames in Flight, Fencing for faster perf

  • Support for multiple command buffers, specifically one per swap-chain image / buffer
  • Caching of descriptor sets, removing the need to create new ones per draw func or to call vkResetDescriptorPool per frame.
  • Under example_vulkan, using vkWaitForFences to control rendering as opposed to vkQueueWaitIdle (seems to be the biggest perf booster). This change also has implied "multiple frames in flight" as dictated by the swap-chain image count.
  • Using persisted mapped buffers via VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT instead of VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT , allows to skip calls to vkMap/UnmapMemory per frame

Link to version before this change 5ba9d31, this change 10d5211.



2022 update - thanks to @nidefawl pull request with lots of changes:

In this PR:

  1. Merge latest nanovg

  2. Fix Stencil Strokes: I added a new enum to handle the 3 different pipelines used for stencil strokes. I wanted to also use enums for the fill-path (nvgFill) to make the code cleaner, but haven't done that yet.

  3. I combined the 2 CMakeLists.txt into example/CMakeLists.txt and added some bits to make it easier to build and debug in MSVC/VSCode.

  4. I added GLAD as default gl-loader for the GL3 example. It can be switched back to GLEW (I kept glew to allow easier merge with main nanovg)

  5. I Increased the number of swapchain images to minimum 3 and updated the swapchain barrier to gain some extra performance.

  6. Spacebar renders the demo multiple times to add some 'load' when comparing performance


2021 update - fixed all errors, this code has no Validation errors and work correctly everywhere.

Thanks to @fzwoch commits by default used TOPOLOGY_TRIANGLE_LIST, because TOPOLOGY_TRIANGLE_FAN is optional in Vulkan.

To enable TOPOLOGY_TRIANGLE_FAN edit src/nanovg_vk.h and set there #define USE_TOPOLOGY_TRIANGLE_FAN

Depth order bug on AMD fix by @leranger 6ee1009.


Screenshot of Vulkan version from Linux:

nvgvk


Read original readme for more info about NanoVG API https://github.com/memononen/nanovg

About

Antialiased 2D vector drawing library on top of Vulkan for UI and visualizations

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • C 99.2%
  • Other 0.8%