Skip to content

Releases: vKexterPLv/Vulkan-Core-Kit

v0.3.3 — test-harness fix

27 Apr 09:09
20be5af

Choose a tag to compare

Pre-release

Fixed

  • tests/test_r11_r12_reliability.cpp — direct include of layers/execution/VCKExecution.h. That header forward-uses VulkanDevice / VulkanCommand / VulkanSync without including their core headers, so it only compiles when the umbrella has already pulled them in. Switched the include to VCK.h to match the working tests. CI broke on all 4 jobs (Linux / macOS / Windows MinGW / Windows MSVC) on the post-merge run of v0.3.2.
  • tests/test_r19_r15_r16_cost_scope.cpp — used VCK::Test::LogCapture without vck_log_capture.h. Added the include.
  • tests/test_vckmath.cppMat4 access mismatch. Mat4 stores float m[16] flat (column-major) with an At(row, col) accessor; the tests indexed it as m[col][row]. Switched to At(row, col).
  • tests/test_vckmath.cpplookat_z_axis_points_to_target asserted positive view-space Z. VCK is right-handed (the third row of LookAt negates f, matching the Perspective convention which negates z into w), so a target one unit ahead at world (0, 0, -1) lands at view-space z = -1. Fixed assertion.

Notes

v0.3.3 is a test-harness fix release on top of v0.3.2 — no library code changed, no behaviour change. If your tree was on v0.3.2 with green CI on PR #8, you don't need to take this; it only matters for the maintainer's a9f3e92 "Moar tests" commit that landed post-merge.

v0.3.2 — bug audit + de-AI rewrite

27 Apr 08:45
b0bd1d0

Choose a tag to compare

Pre-release

Fixed

  • VMM SubmitStagingCmd — unchecked vkEndCommandBuffer. If End failed, the staging cmd was malformed, the next vkQueueSubmit would VUID-fail, AND any pending acquire barriers would issue layout transitions against resources still in UNDEFINED (the release halves never actually ran). VUID-VkImageMemoryBarrier-oldLayout-01197. Now bails with cmd-buffer free + drops m_PendingAcquire{Buffers,Images}.
  • VMM cross-family acquire path — unchecked vkBeginCommandBuffer / vkEndCommandBuffer. Recording into a not-begun cmd is undefined; submitting a not-ended cmd is a VUID violation. Both now VK_CHECK and bail with cmd-free + pending-acquire drop on failure.
  • VMM cross-family acquire path — fence path could silently skip the submit. If vkCreateFence or the fenced vkQueueSubmit failed, the acquire barriers never ran, leaving resources stranded in "released to graphics family with no matching acquire" state (UB per spec §7.7.4). Added a vkQueueWaitIdle-based fallback so the acquire submit always actually runs (matches the staging fallback).
  • Swapchain CreateSwapchain — unchecked vkCreateSwapchainKHR and both vkGetSwapchainImagesKHR. Continuing past these on failure left a half-built swapchain; now returns false on device-lost so the caller can teardown (rule 14).
  • VulkanOneTimeCommand::Begin — leaked the allocated cmd buffer when vkBeginCommandBuffer failed. m_Cmd stayed populated so the caller couldn't tell Begin failed; a later End() would VUID-fail on a never-begun cmd, or never get called and the allocation leaked until pool teardown. Free + zero m_Cmd on Begin failure.

Build

  • .spv outputs no longer tracked. glslangValidator regenerates them on every build and bytes differ across glslang versions, so tracking them dirtied every local build against a CI-built tree. Added to .gitignore.

Documentation

  • De-AI rewrite pass. Every comment, doc, README, and CONTRIBUTING that read like marketing copy got the AI tells removed (no more "leverages", "seamlessly", "robust", "this ensures"). Voice is terser, comments explain why not what, README leads with a 3-line elevator pitch, CONTRIBUTING has opinions. Technical accuracy preserved; only the voice changed.
  • CHANGELOG, VCK.h header block, and docs/*.md resynced to v0.3.2 state.
  • Wiki tarball rebuilt: VCK.wiki.v0.3.2.tar.gz.

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

27 Apr 08:43

Choose a tag to compare

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.

v0.2.1 — Ergonomic shader API

27 Apr 08:43

Choose a tag to compare

Pre-release

Added

  • Rules 18-22 in docs/Design.md:
    • R18 External synchronisation — codifies Vulkan's per-handle external-sync requirement; JobGraph is the one exception.
    • R19 Zero cost for unused features — un-Initialized modules allocate nothing, spawn no thread, emit no log line.
    • R20 Every public API has an example — public classes in VCK.h must be exercised by at least one example under example/.
    • R21 VCK.h is the API surface — layer headers are implementation detail; breaking changes to VCK.h bump the minor version until v1.0.0.
    • R22 VCK never owns user handles — completes rule 9; VCK destroys only handles it created.
  • VCKMath.hVec2 / Vec3 / Vec4 / Mat4 POD structs, free-function Translate / Rotate / Scale / Perspective / LookAt / Radians / Degrees. No templates, no SIMD, row-major.
  • VertexLayout — fluent Add(name, VertexAttrType)Binding(0) + Attributes() builder; returns plain VkVertexInput* structs the caller hands to VulkanModelPipeline (rule 22, no ownership).
  • PushConstantsDeclare(name, type) cold path, Set(name, value) + Apply(cb, layout, stages) hot path. Name → offset resolved at Declare; no hashing / std::any / std::variant in the hot path.
  • Primitives::Cube / Plane / Sphere / Quad / Line — return-by-value Mesh { positions, normals, uvs, indices }. Shrinks cube setup from ~40 lines of vertex tables to one call.
  • DebugTimeline::DumpChromeTracing(path) — emits a Chrome-tracing JSON array you can load in chrome://tracing or ui.perfetto.dev. No viewer bundled.
  • New example [10] DebugShowcaseExample — guided tour of every VCKLog level, cfg.debug gating, dedup, VK_CHECK fail-loud path, GPU / driver / memory / surface dump. No draw loop.
  • New example [11] AAShowcaseExampleDetectRecommendedAA decision matrix across forwardRenderer × supportsMotionVectors, live swapchain auto-pick echoed via GetAATechnique() + GetMSAASamples(), RGB triangle drawn with the picked AA.
  • New example [12] EasyCubeExamplePrimitives::Cube() + VertexLayout + PushConstants + VCKMath in one screen. Rule 20 parity for the v0.2.1 ergonomic API.
  • Wiki Cookbook — one-stop recipe book: image / OBJ / cube / text / line / circle / FXAA / SMAA / TAA skeletons / ImGui bootstrap / offscreen PNG readback.

Changed

  • Rule 14 tightened — now explicitly requires VCKLog::Error with a subsystem tag on every failure; a return false without a matching Error is a bug.
  • VulkanModelPipeline::Initialize (4-arg overload) emits VCKLog::Warn when called; the hardcoded VK_SAMPLE_COUNT_1_BIT is hazardous when the render pass uses MSAA. Use the 5-arg overload and pass swapchain.GetMSAASamples().
  • build.bat / build.sh — menu grew to [1]-[12].

Fixed

  • Top-left quadrant rendering in MipmapExample + VMMExample — caused by pipeline-vs-render-pass sample-count mismatch (pipeline was 1x, render pass was MSAA 4x — undefined per spec, on NVIDIA confines rasterisation to the top-left quadrant). Both examples now pass swapchain.GetMSAASamples() to the 5-arg VulkanModelPipeline::Initialize.
  • Windows ANSI colour outputVCKLog::Init() now calls SetConsoleMode with ENABLE_VIRTUAL_TERMINAL_PROCESSING once on startup so Windows CMD renders colours instead of ←[96m literals.
  • build.bat line endings.gitattributes forces CRLF on *.bat so Windows CMD stops fragmenting comment lines into garbage tokens.
  • EasyCubeExample sizeof bugVulkanMesh::Upload takes total byte count, not per-vertex stride; was uploading 1 of 24 vertices.
  • DebugTimeline::DumpChromeTracing underflow guardendUs - startUs now matches Dump()'s endUs > startUs ? endUs - startUs : 0 pattern.

v0.1.0 — Vulkan Core Kit

27 Apr 08:43

Choose a tag to compare

Pre-release

The first release under the VCK name. Project was rebranded from VVCS
("Vulkan-VCS") to VCK — Vulkan Core Kit in commit deced77. This
release establishes the public surface (VCK.h amalgam header), the
three-layer architecture (core / expansion / execution), the in-tree
example builder (build.bat + ANSI menu), the structured logger, and
a Windows CI gate. The project is Windows-only at this point;
cross-platform support lands in v0.2.0.

Added

  • Project rebrandVVCS → VCK (Vulkan Core Kit). README, build
    scripts, header guards, and namespace VCK:: finalised.
  • VCK.h amalgam header — single public include surface; per-class
    declarations stop being duplicated and the amalgam now #includes
    the layer headers directly (rule 21 precursor).
  • Three-layer architecturecore/ (VulkanContext,
    VulkanDevice, VulkanSwapchain, VulkanPipeline,
    VulkanCommand, VulkanSync, VulkanBuffer, VulkanImage,
    VulkanHelpers), expansion (framebuffers, depth, samplers,
    textures, model pipelines, descriptor sets, mipmaps), execution
    (FrameScheduler, JobGraph, GpuSubmissionBatcher,
    BackpressureGovernor, DebugTimeline, TimelineSemaphore).
  • VCK::Config master init-chain control struct — cfg.device,
    cfg.swapchain, cfg.pipeline, cfg.scheduler, cfg.aa, cfg.debug
    knobs; passed once to VulkanContext::Initialize.
  • VulkanPipeline::Config — cull mode, front-face winding, blend
    state, push-constant ranges, descriptor-set layouts.
  • Mailbox present mode by default with FIFO fallback when the
    surface doesn't expose Mailbox.
  • Six VCKExpansion examplesHelloExample, ModelExample,
    VMMExample, FrameSchedulerExample, TripleBufferExample,
    LockstepExample, plus three execution-layer examples
    (SubmissionBatchingExample, JobGraphExample,
    DebugTimelineExample).
  • example/build.bat — Windows MinGW builder with [1]-[9] / [A] / [0]
    ANSI-coloured menu, BUILD_ALL section that compiles every example in
    one pass, and CRLF-safe shader compile via glslangValidator.
  • VMM (Vulkan Memory Manager) — three-layer allocator
    (VmmPersistent / VmmTransient / VmmStaging) wrapping VMA's
    pool-aware allocators. VmmBuffer / VmmImage are typed
    POD-by-handle wrappers. LogStats dump every N frames for the
    example.
  • VCKLog — coloured [VCK] [Tag] body logger with Info /
    Notice / Warn / Error levels and an init-time global toggle
    for debug-gated Info lines.
  • docs/ at repo root — split out from README into
    Build.md, Examples.md, Design.md, Home.md. README slimmed to
    badges + 60-second tour + pointers.
  • GitHub wiki — initial structure; _Sidebar.md, design rules.
  • CI: Windows workflow.github/workflows/build.yml runs
    build.bat A on windows-latest for every push / PR. SDK installer
    • vk_video/*.h sparse-checkout patch (the LunarG installer's
      vulkan_video component is optional but vulkan_core.h hard-includes
      it).
  • .gitattributes — forces CRLF on *.bat so Windows CMD doesn't
    fragment comment lines into garbage tokens.

Changed

  • build.bat redesigned with an ANSI UI; chcp 65001 for UTF-8;
    em-dashes scrubbed from console-bound strings (CMD prints them as ?
    on default codepages).
  • AllocConsole removed in favour of g++'s default
    console-subsystem stdout — no flicker on launch, no leftover console
    if the program crashes.
  • VulkanContext::Initialize drops the leftover
    BuildRequiredExtensions helper (Win32-only dead code with no header
    declaration).

Fixed

  • VMM lifecycle bugs — wrong destruction order between
    VmmTransient ring slots and VmmStaging was leaking allocations
    on Shutdown. Routed VMM logs to a Windows console.
  • FrameScheduler Lockstep + AsyncMax deadlocks — Lockstep was
    waiting on the slot fence before signalling the previous frame's
    release; AsyncMax could double-acquire the same slot under contention.
  • build.bat BUILD_ALL trailing whitespace in set EX=... causing
    the all-build pass to skip examples whose name had a trailing space.
  • MinGW compileSubmitInfo and VCK::Config need explicit
    default ctors; gcc 13 wouldn't aggregate-init through inheritance.
  • JobGraph::Add — counted invalid (out-of-range) deps toward the
    job's wait count, so Execute() could deadlock waiting for a job that
    would never run.
  • VCKExpansion.h — forward-declared VulkanDepthBuffer before
    VulkanFramebufferSet (compile order fix).
  • HelloExample — quad winding flipped so the embedded "Hello,
    World" text isn't back-face culled.

v0.3.0 — runtime-vkDeviceWaitIdle-is-gone

26 Apr 21:43

Choose a tag to compare

The runtime-vkDeviceWaitIdle-is-gone release. Multi-queue, timeline-driven, fence-honest.

Merged via PR #4 (commit ee29ea6).
CI: green on the Windows runner (build.bat [A] — all 13 examples).

Added

  • Dedicated compute + transfer queues. VulkanDevice::FindQueueFamilies picks compute-only and transfer-only families when the vendor exposes them (AMD / NVIDIA almost always; Intel iGPUs often don't). Fallback to graphics is logged via VCKLog::Notice.
  • Timeline semaphore feature chain. VulkanDevice::Initialize enables VK_KHR_timeline_semaphore when the adapter supports it. VulkanDevice::HasTimelineSemaphores() reports the capability.
  • FrameScheduler owns one timeline. EndFrame signals a monotonic per-slot value; BeginFrame waits with one vkWaitSemaphores. Per-slot fences kept as a fallback.
  • FrameScheduler::FrameTimeline() / SlotToken(slot) / DrainInFlight(). Public timeline accessors + scheduler-owned full drain that doesn't touch the device globally.
  • Scheduler-aware HandleLiveResize. Drains via DrainInFlight(), recreates the swapchain with drainedExternally=true, leaves independent compute / transfer work alone during resize.
  • Secondary command buffer API. VulkanCommand::AllocateSecondary / FreeSecondary / BeginSecondary(cb, inheritance) / EndSecondary / ExecuteSecondaries(primary, …). Caller serialises pool access (rule 18).
  • VMM cross-family staging. When the transfer family differs from graphics, VMM records a release barrier on transfer, waits on the per-submit fence, then records an acquire barrier on graphics (Vulkan §7.7.4).
  • VMM per-submit fence. SubmitStagingCmd no longer calls vkQueueWaitIdle.
  • Config::DeviceCfg knobs. enableTimelineSemaphores, enableDedicatedComputeQueue, enableDedicatedTransferQueue (rule 19 — zero cost when off).
  • Example [13] SecondaryCmdExample. Per-slot secondary re-recorded each frame; primary opens the render pass with VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS. Uses scheduler-aware resize.
  • Example [12] EasyCubeExample. Cube via Primitives::Cube() + VertexLayout + PushConstants + VCKMath (carried over from v0.2.1).
  • docs/Overview.md. One-page tour: what VCK is / gives / never takes / modern v0.3 optimisations / why it's fresh / honest pick-vs-no-pick summary.
  • Rules 18–22. External synchronisation, zero-cost-for-unused, example parity, ABI stability (VCK.h is the surface), no ownership of user handles.

Changed

  • Rule 4 allow-list. Only Shutdown() paths may call vkDeviceWaitIdle. Concrete blocking sites: OneTimeCommand::End, VMM::SubmitStagingCmd, FrameScheduler::WaitInFlightFence (timeline or fence), DrainInFlight, BackpressureGovernor::WaitIfOverrun, Swapchain::Recreate default fallback (scheduler-aware path passes drainedExternally=true).
  • Rule 14 tightened. Every failure returns an explicit bool AND logs via VCKLog::Error(\"<subsystem>\", …). Silent false is a bug.
  • Logging. All LogVk call sites migrated to VCKLog::{Info,Notice,Warn,Error}.
  • build.bat / build.sh. Menus run [1][13], [A] builds all.
  • VCK.h. Repository layout, class index, config knobs, and .cpp function indexes synced to v0.3 surface (rule 21).

Fixed

  • VulkanOneTimeCommand::End no longer hangs when vkQueueSubmit fails (short-circuiting fence wait + warn-fallback path).
  • VMM staging cmd buffer now allocated from a transfer-family pool (was: graphics pool submitted to transfer queue, spec violation).
  • VMM fallback path now wraps vkQueueSubmit / vkQueueWaitIdle in VK_CHECK (rule 14).
  • VMM no longer records acquire barriers when the matching transfer submit failed (no more stale oldLayout=TRANSFER_DST_OPTIMAL on UNDEFINED images).
  • VulkanDevice::Shutdown nulls m_ComputeQueue / m_TransferQueue so post-shutdown getters fall through to the nulled graphics queue.
  • FrameScheduler::WaitInFlightFence timeline path now resets the first-frame VK_FENCE_CREATE_SIGNALED_BIT fence (avoids VUID-vkQueueSubmit-fence-00064 on first pass per slot).
  • SecondaryCmdExample::Run() matches the established `if (window.IsMinimized()) { window.WaitEvents(); continue; }` pattern.

Compatibility

  • VulkanSwapchain::Recreate gained an optional drainedExternally=false parameter; existing call sites keep their behaviour.
  • Legacy HandleLiveResize overloads kept (still call vkDeviceWaitIdle); the scheduler-aware overload is the recommended v0.3 path.
  • Dedicated compute / transfer queues default ON; opt out via cfg.device.enableDedicated*Queue = false.

Where to start

  • New? Read docs/Overview.md (10 min), then Hello VCK.
  • Upgrading from v0.2.x? Migrate LogVk callers to VCKLog::*; switch HandleLiveResize callers that own a FrameScheduler to the scheduler-aware overload; opt into dedicated queues / timeline by leaving the new DeviceCfg knobs at their default true.
  • Auditing? All 22 rules in docs/Design.md. Allow-list lives in rule 4; status / caveats / roadmap track shipped vs deferred.

v0.2.0 — Cross-platform

27 Apr 08:43

Choose a tag to compare

Pre-release

Added

  • Cross-platform support (Windows / Linux / macOS) via VCK::Window + VCKCrossplatform facade over GLFW. VCK_PLATFORM_WINDOWS/LINUX/MACOS macros gate platform includes.
  • example/build.sh — Linux + macOS builder with the same [1]-[9] / [A] / [0] menu as build.bat; auto-detects OS, uses pkg-config for Vulkan + GLFW.
  • Live resize as first-classVCK::HandleLiveResize(window, dev, sc, fb, pipe[, depth]) handles any OS resize (720p ↔ 4K) in one call per frame. Timeline-aware overloads in layers/execution/ emit a DebugTimeline CPU span (rule 12).
  • Anti-aliasing frameworkVCK::AATechnique enum (Auto, Off, MSAA, MSAA_A2C, SampleRate, FXAA, SMAA_1x, SMAA_T2x, TAA, TAAU). cfg.aa.technique = AATechnique::Auto runs a 5-step decision tree at VulkanSwapchain::Initialize. Sample-based techniques implemented pipeline-side; post-process names returned via swapchain.GetAATechnique() for renderer to implement (rules 15/16).
  • VCK::VCKLog structured logger — Info (debug-gated) / Notice / Warn / Error. Console-spam dedup of identical consecutive (tag, body) lines. Classify helper parses legacy LogVk("[Tag] body") into the new levels.
  • cfg.debug flag (default false) — VulkanContext::Initialize wires it into VCKLog::SetDebug().
  • cfg.pipeline.alphaToCoverage — flips alphaToCoverageEnable in pipeline multisample state.
  • cfg.pipeline.sampleRateShading + minSampleShading — enables per-sample shading.
  • Repo reorganisation: layers/{core,expansion,execution,vmm}/ + vendor/{vulkan_headers,glfw,vma}/. VCK.h at root is the single source of truth for API documentation.
  • WikiHello-VCK.md (per-line walkthrough targeting 1-hour onboarding budget), _Sidebar.md (navigation).
  • LICENSE, CHANGELOG.md, CONTRIBUTING.md, .editorconfig, .gitignore at repo root.

Changed

  • VK_CHECK now routes failures directly to VCKLog::Error(…) instead of the debug-gated LogVk(…) — fail loud regardless of cfg.debug (rule 14 fix).
  • VulkanContext::Initialize takes VCK::Window& (was HWND on Windows only); raw-handle overload preserved as escape hatch (rule 9).
  • <windows.h> / <vulkan_win32.h> guarded behind VCK_PLATFORM_WINDOWS in VulkanHelpers.h and VCK.h — no more platform leakage in the public surface.
  • docs/Design.md rule 4 allow-list updated to include VulkanSwapchain::Recreate and HandleLiveResize vkDeviceWaitIdle calls.
  • Examples 1-9 ported to VCK::Window + VCK::HandleLiveResize — dropped raw GLFWwindow*, HWND, g_Resized, g_Minimized, OnFramebufferResize.

Removed

  • core/VulkanHelpers.cpp (empty shell).
  • core/ at repo root (moved to layers/core/).
  • VMM/ at repo root (moved to layers/vmm/).
  • BuildRequiredExtensions helper in VulkanContext.cpp (dead code from pre-crossplatform era, no matching header decl).