# vkvg **Repository Path**: vulkan3d/vkvg ## Basic Information - **Project Name**: vkvg - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-04-13 - **Last Updated**: 2025-04-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README


vkvg

Vulkan Vector Graphics

**vkvg** is an open-source *2D graphics library* written in **C** using [Vulkan](https://www.khronos.org/vulkan/) as backend. The **API** follows the same pattern as [Cairo](https://www.cairographics.org/), but new functions and original drawing mechanics may be added. **vkvg** is in alpha development stage and the core api is mostly stabilized. All contributions are welcome. In progress API documentation is available online at http://vkvg.org.

## Performance comparison


major libs perf comparison

## Current status: - Fill (stencil even-odd, non-zero). - Stroke. - Basic painting operation. - Font system with caching operational. - Linear/Radial Gradients. - Line caps and joins. - Dashes. - Context should be thread safe, extensive tests required. - Image loading and writing with [stb lib](https://github.com/nothings/stb) - Test includes svg rendering either with built-in renderer or [nanoSVG](https://github.com/memononen/nanosvg) ## Requirements: - [CMake](https://cmake.org/): version >= 3.16 - [Vulkan](https://www.khronos.org/vulkan/): version >= 1.1 - [FontConfig](https://www.freedesktop.org/wiki/Software/fontconfig/): optional, without fontconfig, use `vkvg_load_font_from_path`. - [Freetype](https://www.freetype.org/): optional, stb_truetype as alternative. - [Harfbuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/): optional, without complex text shaping may be wrong. - GLSLC: spirv compiler, included in [LunarG SDK](https://www.lunarg.com/vulkan-sdk/): compile shader to spir-V (building only, optional) - [xxd](https://linux.die.net/man/1/xxd): generate headers with precompiled shaders (building only, optional) - [GLFW](http://www.glfw.org/): optional, if present tests are built. if `glslc` or `xxd` are not present, a precompiled version of the shaders is stored in the git tree. ## Building ```bash #fetch sources from github git clone --recursive https://github.com/jpbruyere/vkvg.git cd vkvg # Create build directory mkdir build cd build # Run CMake configuration cmake .. ``` ### CMake configure options ##### Core library options: * `-DVKVG_USE_GLUTESS=true`: Use embedded glu tesselator to fill polygones in NON-ZERO mode. If false, a simple ear clipping algorithm is used. * `-DVKVG_SVG=true`: Enable experimental svg renderer. If false, use nanoSVG. * `-DVKVG_RECORDING=true`: Enable experimental draw commands recording infrastructure. * `-DVKVG_BUILD_DOCS=true`: Build documentation if doxygen is found. ##### Vulkan Features: * `-DVKVG_ENABLE_VK_SCALAR_BLOCK_LAYOUT=true`: Enable `VK_EXT_scalar_block_layout` that reduce structure padding for gpu. * `-VKVG_ENABLE_VK_TIMELINE_SEMAPHORE=true`: Enable experimental work syncing with `VK_KHR_timeline_semaphore` instead of Fences. ##### Text rendering libraries: Those libraries are enabled by default, but disabled if not found. * `-DVKVG_USE_FONTCONFIG=true`: enable FontConfig to resolve font's names. * `-DVKVG_USE_FREETYPE=true`: enable FreeType to render glyphs, if false glyphs are rendered with stb_truetype. * `-DVKVG_USE_HARFBUZZ=true`: enable harfbuzz for text shaping. ##### Tests options: * `-DVKVG_BUILD_TESTS=true`: build all tests in the tests forlder. * `-DVKVG_TEST_DIRECT_DRAW=true`: enable drawing directly on the swapchain images. ##### Debugging options: If vkvg is compiled with `CMAKE_BUILD_TYPE=Debug`, several additional options are made available to help debugging: * `-DENABLE_VALIDATION=true`: enable vulkan validation layer. * `-DENABLE_DBG_UTILS=true`: enable various vulkan debug utils extensions features. * `-DENABLE_RENDERDOC=true`: enable renderdoc layer. * `-DENABLE_WIRED_FILL=true`: enable rendering in wired mode, current mode is controled with the global variable `vkvg_wired_debug`. * `-DENABLE_PROFILING=true`: add -pg to the compile options. * `-DVKVG_DBG_STATS=true`: store various context statistics fetchable with `vkvg_device_get_stats()` ```bash cmake --build . ``` A [detailed tutorial](doc/windows_build_tutorial.md) is available for Windows. ## Running tests Append the `-h` option to see available command line parameters. ## Contributing See the [contribution guide](https://github.com/jpbruyere/vkvg/blob/master/CONTRIBUTING.md) for more information. Join us on [gitter](https://gitter.im/CSharpRapidOpenWidgets) for any question. ## Addtitional Credits - vkvg use the [AGG project](http://antigrain.com/)'s recursive bezier algorithm which is kindly exposed [here](http://agg.sourceforge.net/antigrain.com/research/adaptive_bezier/index.html). - I've learned Vulkan with the help of the excellent [Sacha Willems's vulkan examples](https://github.com/SaschaWillems/Vulkan). - The 2d affine matrix implementation follows Cairo's one. ## Change log * v0.2.0 - radial gradients. - better stroke joins handling. - png saved in srgb format. - doxygen cmake target and style ## To Do - [x] Use Scissor where possible. - [x] Improve stroke algorithms. - [x] Radial gradients. - [x] Dashed lines. - [ ] Operators. - [x] Optimize vulkan memory allocations by sub-allocating from a single shared memory chunk per type. - [x] Optimize command submissions. - [x] Test SDF font rendering. - [x] Avoid line joins inside curves and arc. - [ ] Structured unit testing. - [x] Perf and memory checks. - [ ] Code cleanup and comments. - [ ] Documentations.