An OpenVX 1.3.1 implementation written in Rust. rustVX provides the complete OpenVX Vision Feature Set through a standard C API (libopenvx_ffi), enabling existing OpenVX applications to use a memory-safe, portable backend with no source changes.
rustVX passes the full Khronos OpenVX 1.3 Conformance Test Suite for both required profiles, plus an opt-in slice of the Enhanced Vision profile:
| Profile | Required tests | Passing |
|---|---|---|
| OpenVX baseline | 863 | 863 / 863 |
| Vision conformance profile | 4957 | 4957 / 4957 |
| Enhanced Vision (Phase 2) | 106 | 106 / 106 |
| Total enabled | 5926 | 5926 / 5926 |
The remaining Enhanced Vision kernels (BilateralFilter, TensorOp, HOGCells, HOGFeatures, ControlFlow/Select, ScalarOperation) are tracked as follow-up phases. All implemented Enhanced Vision kernels are exercised in CI with -DOPENVX_USE_ENHANCED_VISION=ON.
Latest CTS run results are published on each push and pull request via the Actions tab.
rustVX/
├── openvx-core/ # Core framework: context, graph, node, types, C API
├── openvx-image/ # Image data object and channel operations
├── openvx-buffer/ # Generic buffer for intermediate data
├── openvx-vision/ # All vision kernels (filters, geometric, features, etc.)
├── openvx-ffi/ # C shared library (cdylib) exporting the full OpenVX API
├── include/VX/ # Standard OpenVX C headers
└── OpenVX-cts/ # Khronos Conformance Test Suite (git submodule)
The workspace compiles into a single shared library (libopenvx_ffi.so / .dylib / .dll) that any OpenVX application can link against.
| Tool | Version |
|---|---|
| Rust | stable |
| C compiler | gcc, clang, or MSVC |
| CMake | 3.10+ |
| Make or Ninja | for building the CTS |
# Clone with submodules
git clone --recurse-submodules https://github.com/kiritigowda/rustVX.git
cd rustVX
# Build the library
cargo build --releaseThe shared library is produced at:
| Platform | Path |
|---|---|
| Linux | target/release/libopenvx_ffi.so |
| macOS | target/release/libopenvx_ffi.dylib |
| Windows | target/release/openvx_ffi.dll |
The standard OpenVX 1.3 C headers are bundled in include/VX/ and can be passed to your C/C++ build directly.
Both openvx-core (host of the C-API kernel callbacks the OpenVX graph executor invokes) and openvx-vision (host of the public Rust API kernels) expose a matching opt-in feature set:
| Feature | Effect |
|---|---|
simd |
Enables architecture-neutral SIMD code paths |
sse2 / avx2 |
x86_64 SIMD back-ends (imply simd) |
neon |
AArch64 SIMD back-end (implies simd) |
parallel (openvx-vision only) |
Enables Rayon-based multi-threaded kernels |
Build with the matching pair on each crate so the FFI graph path and the direct Rust API path both pick up the SIMD kernels:
cargo build --release -p openvx-ffi \
--features "openvx-core/sse2 openvx-core/avx2 openvx-vision/sse2 openvx-vision/avx2"Performance work targets AMD Zen (Ryzen / EPYC, Zen 2+) — that's what CI measures and what the Benchmark & compare numbers come from. Intel and ARM aren't penalised; the runtime dispatcher reads CPU flags, not vendor strings, so any host whose flags match the same gate runs the same path:
- AMD Zen 2+ (Ryzen 3000+, Threadripper 3000+, EPYC Rome / Milan / Genoa) → AVX2 kernels +
-C target-cpu=x86-64-v3auto-vec. - Intel Haswell and later → same AVX2 path, parity with Zen.
- Older x86_64 (pre-AVX2) → SSE2 kernels +
-C target-cpu=x86-64-v2. - AArch64 (Apple Silicon, AWS Graviton, etc.) → NEON path.
- Anything else / no features → scalar slice loop (still ~50× faster than the original per-pixel kernels).
Dispatch lives in openvx-core::simd_kernels (FFI graph path) and openvx-vision::x86_64_simd (Rust API). CI auto-detects host flags; for a manual Zen-targeted build:
RUSTFLAGS="-C target-cpu=x86-64-v3" \
cargo build --release -p openvx-ffi \
--features "openvx-core/sse2 openvx-core/avx2 \
openvx-vision/sse2 openvx-vision/avx2"libopenvx_ffi exports the full vx* / vxu* symbol set defined by the standard OpenVX headers, so existing OpenVX code links against it with no source changes. A minimal example:
#include <VX/vx.h>
int main(void) {
vx_context ctx = vxCreateContext();
vx_graph g = vxCreateGraph(ctx);
/* ... build graph, call vxVerifyGraph / vxProcessGraph ... */
vxReleaseGraph(&g);
vxReleaseContext(&ctx);
return 0;
}# Linux
gcc app.c -I rustVX/include -L rustVX/target/release -lopenvx_ffi -o app
LD_LIBRARY_PATH=rustVX/target/release ./appFor drop-in compatibility with build systems that look for libopenvx / libvxu (e.g. find_library(NAMES openvx vxu)), symlink the rustVX library to those names:
ln -s libopenvx_ffi.so target/release/libopenvx.so
ln -s libopenvx_ffi.so target/release/libvxu.soThe Khronos OpenVX Conformance Test Suite is included as a git submodule. Build and run it against the rustVX library:
Note
The -DCMAKE_POLICY_VERSION_MINIMUM=3.5 flag below is needed when configuring with CMake 4.0+, which dropped compatibility with the older cmake_minimum_required versions used by the upstream CTS. It is harmless on older CMake.
# Build the CTS
cd OpenVX-cts
mkdir -p build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-DCMAKE_C_STANDARD_LIBRARIES="-lm" \
-DCMAKE_CXX_STANDARD_LIBRARIES="-lm" \
-DOPENVX_INCLUDES="$(pwd)/../../include;$(pwd)/../include" \
-DOPENVX_LIBRARIES="$(pwd)/../../target/release/libopenvx_ffi.so;m" \
-DOPENVX_CONFORMANCE_VISION=ON
make -j$(nproc)
# Run all tests
export LD_LIBRARY_PATH=$(pwd)/../../target/release
export VX_TEST_DATA_PATH=$(pwd)/../test_data/
./bin/vx_test_conformance# Build the CTS
cd OpenVX-cts
mkdir -p build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 \
-DOPENVX_INCLUDES="$(pwd)/../../include;$(pwd)/../include" \
-DOPENVX_LIBRARIES="$(pwd)/../../target/release/libopenvx_ffi.dylib" \
-DOPENVX_CONFORMANCE_VISION=ON
make -j$(sysctl -n hw.ncpu)
# Run all tests
export DYLD_LIBRARY_PATH=$(pwd)/../../target/release
export VX_TEST_DATA_PATH=$(pwd)/../test_data/
./bin/vx_test_conformance# Build the CTS
cd OpenVX-cts
mkdir build; cd build
cmake .. `
-DCMAKE_BUILD_TYPE=Release `
-DCMAKE_POLICY_VERSION_MINIMUM=3.5 `
-DOPENVX_INCLUDES="$PWD\..\..\include;$PWD\..\include" `
-DOPENVX_LIBRARIES="$PWD\..\..\target\release\openvx_ffi.dll.lib" `
-DOPENVX_CONFORMANCE_VISION=ON
cmake --build . --config Release
# Run all tests
$env:PATH = "$PWD\..\..\target\release;$env:PATH"
$env:VX_TEST_DATA_PATH = "$PWD\..\test_data\"
.\bin\Release\vx_test_conformance.exeUse the --filter flag to run a subset of tests:
# Run only filter tests
./bin/vx_test_conformance --filter="Gaussian3x3.*:Median3x3.*:Box3x3.*"
# Run only feature detection tests
./bin/vx_test_conformance --filter="HarrisCorners.*:FastCorners.*:vxCanny.*"Beyond the Khronos CTS, rustVX has its own Rust-side test and benchmark suites:
# Run all unit and integration tests
cargo test --workspace --release
# Run the Criterion micro-benchmarks for vision kernels
cargo bench -p openvx-visionEnd-to-end performance is also tracked against the Khronos OpenVX sample implementation on every CI run via openvx-mark; see the Benchmark & compare job in the Actions tab for the latest comparison report.
Tip
The Benchmark & compare job renders the rustVX-vs-Khronos comparison table directly into the GitHub Actions job summary for each run — no need to dig into logs. The summary opens with a headline panel showing the geomean speedup of rustVX over the Khronos sample (per-kernel best/worst speedups and a win/loss count) followed by the full per-benchmark detail table. The raw JSON reports are also published as downloadable workflow artifacts (benchmark-results-rustvx, benchmark-results-khronos-sample, and benchmark-comparison) on every push and pull request.
GitHub Actions builds and runs the full CTS on every push and pull request. The workflow splits the suite into parallel jobs for faster feedback:
See the Actions tab for full run history.
Contributions, bug reports, and feature requests are welcome.
- Found a bug or have a question? Open an issue.
- Want to contribute a fix or new kernel? Fork the repo, create a topic branch, and open a pull request against
main. CI must pass — both the Khronos CTS jobs and the rustVX-vs-Khronos benchmark comparison run on every PR. - Please make sure
cargo fmt,cargo clippy --workspace --all-targets, andcargo test --workspacepass locally before submitting.
This project is licensed under the MIT License.
The OpenVX logo is a trademark of The Khronos Group Inc. The vector logo file in docs/openvx-logo.svg is sourced from Wikimedia Commons and is included for identification purposes only.