This repo is based on the amazing work done by danilw in the archived repository danilw/nanovg_vulkan
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
andVK_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) andvkCmdDraw
(usefirstVertex
) - 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
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).
Contact: Join discord server
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.
- Bug - DPI scale is broken when it
!=1
, Currectly - DPI scale set to 1 always. Read danilw/nanovg-vulkan-glfw-integration-demo#1 - Bug - crash on resize on AMD-GPU only in Linux in Wayland. Read danilw/nanovg-vulkan-glfw-integration-demo#2
- Fix what Cppcheck pointing, unused variables etc, not bugs.
- Performance - after SubiyaCryolite pull danilw#7 performance of Vulkan version very close to OpenGL.
(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.
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.
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
, usingvkWaitForFences
to control rendering as opposed tovkQueueWaitIdle
(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 ofVK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
, allows to skip calls tovkMap/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:
-
Merge latest nanovg
-
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.
-
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.
-
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)
-
I Increased the number of swapchain images to minimum 3 and updated the swapchain barrier to gain some extra performance.
-
Spacebar renders the demo multiple times to add some 'load' when comparing performance
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:
Read original readme for more info about NanoVG API https://github.com/memononen/nanovg