Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/jpbruyere/vkvg

Vulkan 2D graphics library
https://github.com/jpbruyere/vkvg

2d cairo drawing-library gpu graphics graphics-library vector vulkan

Last synced: 28 days ago
JSON representation

Vulkan 2D graphics library

Awesome Lists containing this project

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.