VCK is small on purpose. No scene graph, no ECS, no material system, no asset pipeline. If you want to add one of those, this is the wrong project — go fork or write your own engine on top.
What does land here:
- Bug fixes in core / expansion / execution / VMM / examples. Small, focused diffs. One bug per commit.
- New examples under
example/<Name>Example/following themain.cpp + App.{h,cpp}pattern the existing 13 use. Don't reinvent the layout. - Docs / wiki polish. The wiki mirrors
docs/; edit thedocs/source, not the wiki directly. - Cross-platform fixes for Windows / Linux / macOS. CI runs all three.
Read these. Yes really.
docs/Design.md— the 24 rules are the contract. Violating one gets a rework request unless you're changing the rule itself in the same PR.VCK.h— the header doc block is the API surface (R21). New public class orcfgknob? UpdateVCK.hin the same PR.- R20: every public class has at least one example. New API ships with its example.
- Build it.
cmake -S example -B build -G Ninja && cmake --build build -jplusctest --test-dir build. CI does this on all 4 platforms. If your local fails, CI will fail.
- Explicit over magic.
Initialize/Shutdownpairs, no singletons. - Core owns; expansion / execution borrow raw pointers.
- Strict lifecycle order: Context → Device → Swapchain → Command → Sync → ...
- No hidden synchronisation. Only
Shutdown()may callvkDeviceWaitIdle. The hot path never does. - Memory is frame-scoped or persistent. No dangling state.
- No hidden behaviour. User-visible picks log as
VCKLog::Notice. - User owns the frame loop unless they opt into
FrameScheduler. - Explicit synchronisation. No implicit ordering.
- Escape hatches everywhere. Every wrapper exposes
Get<VkHandle>(). - Zero hidden GPU state.
- Deterministic frame behaviour under Pipelined / Lockstep.
AsyncMaxis documented nondeterminism. - Explicit recreation events (logged +
DebugTimelinespans). - Debuggability is a core feature. Not optional.
- Fail fast, fail loud. Every failure returns
boolAND logsVCKLog::Error("<subsystem>", ...). Silentreturn falseis a bug. - Minimal core surface.
- No engine assumptions.
- The frame is the unit of truth.
- External synchronisation. Concurrent access from multiple threads is UB unless the caller locks.
JobGraphis the sole exception. - Zero cost for unused features. Un-
Initialized modules allocate nothing, spawn no thread, emit no log. - Every public class in
VCK.hhas at least one example. VCK.his the API surface. Layer headers underlayers/may move. Breaking changes toVCK.hbump minor (0.x) until v1.0.- VCK never owns user handles. Raw
Vk*passed in is caller-owned. Handles VCK returns via getters are borrows — don't destroy them. - Extension transparency. Every extension VCK enables silently is logged via
VCKLog::Noticeat init, with support status and fallback. cfgis the contract. If a behavioural difference changes how the user writes their renderer → it lives incfg. If it only changes how VCK works underneath → silent bundle.
VCK— current pre-release integration branch (default).first-vck— historical first-release snapshot. Don't touch.- Feature branches:
devin/<timestamp>-<name>orfeature/<name>orfix/<issue>.
- First line ≤ 72 chars, imperative mood. "Add AA auto-detector" not "Added AA auto-detector".
- Body wrapped at 72. Explain why more than what. The diff already shows what.
- No
--amendon pushed commits. Add follow-up commits. - No
--no-verify. If the hook is wrong, fix the hook.
- C++17 in core. C++20 only inside
example/(designated initializers). - Include order: local (
"../../VCK.h") → third-party (<vulkan/vulkan.h>) → std (<vector>). - Comments are sparse and explain why. The
VCK.hheader documents the public API; layer headers don't repeat it. snake_caselocals,camelCasemethods,PascalCasetypes,m_Memberfor class members.- Don't comment the diff. "Fixed X by doing Y" belongs in the commit message, not in the source.
R14 unit harness lives in tests/ and runs under ctest. It's a small home-grown thing, not GoogleTest — VCK has zero third-party test dependencies. Each test asserts that a failed Initialize() returns false AND emits exactly one VCKLog::Error.
Beyond R14, validation is manual:
- Run an example. Resize the window, including 720p ↔ 4K. No stutter.
- Run with
cfg.debug = true. The init chatter from[Context]/[Device]/[Swapchain]is visible.
By contributing, you agree your work ships under the repo's MIT licence (see LICENSE).