Skip to content

v0.3.1 — CMake + R23/R24 + extension matrix

Pre-release
Pre-release

Choose a tag to compare

@devin-ai-integration devin-ai-integration released this 27 Apr 08:43
· 57 commits to VCK since this release

Build (cmake migration, PR #7)

  • CMake + Ninja replaces build.bat / build.sh as the canonical build path. example/CMakeLists.txt is now the single source of truth for all 4 platforms (Windows MinGW, Windows MSVC, Linux, macOS). Auto-detects cl from a Developer Cmd Prompt or g++ / clang++ from PATH — no --toolchain flag.
  • Lib-once compile model. All 12 VCK sources compile once into vck.lib / libvck.a; the 13 example exes + the R14 test exe link against it. Eliminates 143 redundant TU recompilations. Wall-clock cold build-all on a modern 8c box: Linux/macOS ~30-45s (was 10-12 min), Windows MSVC ~1-2 min, Windows MinGW ~2-3 min.
  • Vulkan-Headers via FetchContent. CMakeLists.txt fetches the vulkan-sdk-1.4.321.0 tag itself, so the vk_video/*.h gap on Ubuntu 22.04 (which ships 1.3.x) is gone. CI no longer needs the manual sparse-checkout dance.
  • R14 unit test harness (tests/). Header-only assertion micro-framework, no GoogleTest dep. Asserts every Initialize() failure returns false AND emits exactly one VCKLog::Error. Wired through ctest. 14/14 pass on all 4 platforms.
  • build.bat / build.sh are now thin wrappers around cmake --build that preserve the interactive [1-13/A/T/0] menu UX.

Added

  • CI matrix: Linux + macOS jobs.github/workflows/build.yml now also runs on ubuntu-latest (apt: libvulkan-dev libglfw3-dev vulkan-tools glslang-tools pkg-config g++, ./build.sh A) and macos-latest (brew: vulkan-headers vulkan-loader glfw glslang molten-vk pkg-config, CXX=clang++ ./build.sh A). The Windows job (build.bat [A] on MinGW + LunarG SDK) is unchanged and remains the canonical platform; Linux + macOS catch POSIX regressions in VCK::Window / VCKCrossplatform / build.sh that the Windows runner can't.
  • Design rule R23 — Extension transparency — every instance- / device-level extension VCK enables on the user's behalf is announced via VCKLog::Notice("Context", ...) / VCKLog::Notice("Device", ...) at init, including the extension name, the support verdict from the driver, and the fallback path. The user can grep the init log for ext and see exactly what's bound to the device.
  • Design rule R24 — cfg is the contract — every behavioural difference VCK can express that the user can reasonably want to choose between lives in cfg. Litmus test: "If it changes how the user writes their renderer → cfg. If it changes how VCK works underneath → silent bundle." Codified in docs/Design.md together with R23 and the new six-category index (Explicitness / Ownership / Synchronisation / Cost & Scope / Reliability / Transparency).
  • Silent extension bundle (R24 silent path, R23 logged)VulkanDevice::CreateLogicalDevice now probes for and enables the following on-demand when the device advertises them, with one Notice line per result: VK_KHR_synchronization2, VK_KHR_buffer_device_address, VK_EXT_memory_budget, VK_EXT_device_fault, VK_KHR_present_wait, VK_KHR_present_id. No public API surface; symbols become reachable for v0.4 use sites (sync2 in FrameScheduler, BDA in VMM, memory_budget polling in DebugTimeline, present_wait / present_id pacing in FrameScheduler).
  • cfg extension knobs (R24 user-visible path, R23 logged)
    • cfg.rendering.mode = RenderingMode::{Classic, Dynamic}Dynamic requests VK_KHR_dynamic_rendering and announces it; the dynamic-rendering codepath itself ships in v0.4, today the request is acknowledged with a fallback Notice and rendering stays Classic.
    • cfg.device.enableBindlesstrue requests VK_EXT_descriptor_indexing and announces it; bindless descriptor helpers (DescriptorPool::AddBindlessSet, VulkanPipeline::EnableBindless) ship in v0.4.
    • cfg.swapchain.presentMode = PresentMode::FifoLatestReady — selects VK_PRESENT_MODE_FIFO_LATEST_READY_EXT when VK_EXT_present_mode_fifo_latest_ready is advertised, otherwise falls back to FIFO with a Notice (rule 23 — never silently substitute a present mode).

Changed

  • Example menu reordered low → high VCK assistexample/build.bat and example/build.sh now present examples in tiers (raw core → debug + tooling → expansion → execution layer → mostly VCK) so the menu narrates the design surface from "you write everything" to "VCK does the boring parts". New numbering: [1] RGBTriangle, [2] MipmapExample, [3] VMMExample, [4] SecondaryCmdExample, [5] DebugTimelineExample, [6] DebugShowcaseExample, [7] AAShowcaseExample, [8] JobGraphExample, [9] SubmissionBatchingExample, [10] TimelineExample, [11] SchedulerPolicyExample, [12] HelloExample, [13] EasyCubeExample. No example code or behaviour changes — menu, dispatch, build-all, and docs/Examples.md reflect the new ordering. Historical [#] references in the v0.3.0 / v0.2.x sections below are kept as shipped at the time.
  • Cookbook expanded to 24 recipes — added recipes 12-24 covering compute dispatch, GPU particles, indirect draw, async compute, shadow mapping, skybox / cubemap, PBR Cook-Torrance + IBL, deferred shading, HDR + tonemapping, bloom, shader hot-reload, GPU picking, and frustum culling. Cookbook now covers most rule-16 gaps (things VCK explicitly refuses to ship but every renderer ends up needing). Doc-only.
  • Linux + macOS build noise silencedexample/build.sh now compiles with -w -Werror=return-type (matching build.bat's silent-on-warnings behaviour); VMA single-header impl, GLFW Cocoa deprecations on macOS, and vulkan_core.h -Wmissing-field-initializers no longer surface as user-visible warnings. CI Linux + macOS jobs gain apt-get -qq / brew install -q flags so the workflow log isn't dominated by Get: / Setting up: / Suggested: lines from package install.