This document defines how vkmtl distinguishes source validation, hosted compilation, deterministic GPU output, physical device execution, and manual visual evidence. It consolidates the backend test matrix, validation case inventory, release evidence rules, and the durable Period 44, 55, and 56 records.
The authoritative case and job metadata lives in
tools/development_matrix.zig. This document explains that metadata and
records observed evidence. When a command, required flag, host class, or case
name differs, update the tool metadata first and keep this document aligned in
the same change.
The authoritative statement of whether a native semantic is executable lives
in native-semantic-coverage-inventory.md. A passing validation row must not
promote planning, native-query availability, or a typed unsupported path to
executable support.
vkmtl uses the following evidence classes. They are deliberately not interchangeable.
Unit and focused tests establish backend-neutral contracts, descriptor validation, state-machine behavior, typed errors, and deterministic CPU reference values. They can also inspect backend lowering records without proving that a driver accepted those records.
Use this class for claims such as:
- an invalid descriptor fails before native allocation;
- an unsupported feature returns its documented typed error;
- queue ownership and lifecycle transitions are deterministic;
- a native plan contains the expected format, flags, or resource sizes;
- CPU color reference values map to expected bytes.
This class does not prove native GPU execution.
A hosted build compiles and links a backend on a known operating system and architecture. It proves source portability, build graph completeness, package consumption, shader precompilation, and backend-private symbol coverage.
A hosted Vulkan build does not prove that a Vulkan loader, ICD, physical device, extension, or presentation path executed. A hosted macOS build does not prove Metal command execution. Hosted runner compilation never upgrades a GPU gate.
A headless physical run creates a real backend device without creating a GLFW window or presentation surface. Deterministic transfer, compute, offscreen render, query, import, and maintenance readbacks belong here when supported by the selected device.
The artifact must identify the backend and device. Exact or bounded readback values provide stronger evidence than a successful process exit alone.
A windowed physical run proves that native surface, swapchain or layer, command submission, and presentation paths execute on a real device. A finite success marker is required so opening a window is not treated as completion.
This class can establish execution and presentation without establishing pixel correctness.
Pixel evidence reads an offscreen result back to the CPU and compares it with an exact or explicitly tolerant reference. The result must report the maximum channel delta and the accepted tolerance.
Deterministic offscreen pixels are not current-drawable readback unless the test explicitly reads the current drawable. A later bind-and-present smoke in the same executable remains separate windowed physical evidence.
Raster orientation and texture-composition orientation are independent gates.
The raster check uses a counter-clockwise asymmetric triangle with back-face
culling, samples distinct pixels above and below center, and reports
raster_orientation=top_left. The 5x2 texture-composition check reports
presentation_orientation=top_left; neither result substitutes for the other.
A soak repeats bounded resource creation, resize, shader resolution, transfer, submission, completion, and retirement work. It must publish iteration counts, live-resource bounds, work serials, and failure classification.
Observed timing, power, and frame-rate numbers are named-host observations, not portable performance requirements.
A screenshot can accept orientation, scene completeness, and obvious content errors that deterministic readback does not cover. It cannot by itself prove the backend, commit, device, validation-layer state, channel order, transfer function, or byte-exact output.
Separate FPS overlays are not comparative performance evidence.
Metal API Validation evidence requires a positive Metal API Validation Enabled marker or an equivalent captured tool configuration. A quiet Metal
stderr alone is not sufficient.
Vulkan validation-layer evidence requires a positive record that
VK_LAYER_KHRONOS_validation was available and enabled, plus the associated
device and driver identity. A quiet log with no error, warning, or VUID proves
only that the supplied output was quiet; it is not a validation-layer-clean
claim.
Every backend row uses one of these meanings:
| Status | Meaning |
|---|---|
| Executable | The public path lowers to native or portable runtime work and has the required execution evidence. |
| Capability-gated | The path is executable only when the selected device reports the exact usable feature and limits. |
| Portable fallback | The API executes through a documented fallback with the same public effect. |
| Validation-only | vkmtl validates and records the operation but intentionally emits no equivalent native command. |
| Planning-only | A descriptor or plan exists, but no executable resource or command path is claimed. |
| Typed unsupported | The path rejects with a documented typed error before incorrect lowering. |
| Native escape hatch | A backend-tagged borrowed handle exists outside the portable compatibility promise. |
Planning-only and validation-only rows are not GPU parity. Native feature discovery is also not executable support. Capability-gated support requires both a selected-device report and a complete admitted path.
An implementation may intentionally compose several native calls, vkmtl state, or a compatibility layer to reproduce a semantic. It does not need one native call per public method. If the effect cannot be reproduced faithfully, the semantic stays explicitly unsupported.
Run validation that matches the change. The standard repository baseline is:
zig fmt --check build.zig src examples tools tests/package_consumer
zig build run-api-guard
zig build run-semantic-inventory-check
zig build test --summary all
zig build
zig build -Dvulkan
zig build run-validation-plan
scripts/ci/run_package_smoke.sh
git diff --checkThe exact API guard is mandatory for changes to the public root, Device,
Swapchain, WindowContext, or HeadlessContext. The semantic inventory
check is mandatory when the native execution inventory or its source data
changes.
Documentation-only changes normally need only link/path checks and
git diff --check. Build metadata and package changes require the closest
package fetch or consumer smoke. Backend behavior changes require focused
tests and at least one matching executable example when practical.
The external package smoke uses an independent Zig project with a local vkmtl
dependency. It passes a consumer-owned source-backed shader_manifest,
compiles that shader, and verifies canonical API declarations without creating
a device. A successful repository example build is not a substitute for this
consumer contract.
The following rows are required repository integration lanes.
The general backend registry names these platform rows
macos_metal_default, linux_vulkan, and windows_vulkan. The release-job
registry uses the corresponding hosted_macos_build, hosted_linux_build,
and hosted_windows_build names below.
| Row | Host | Backend | Required command summary | Evidence class |
|---|---|---|---|---|
hosted_macos_build |
macOS aarch64 | Metal-capable default | format, API guard, tests, default build, validation plan, package smoke | Hosted build only |
hosted_linux_build |
Linux x86_64 | Forced Vulkan | format, API guard, tests, zig build -Dvulkan, validation plan, package smoke |
Hosted build only |
hosted_windows_build |
Windows x86_64 | Forced Vulkan | format, API guard, tests, zig build -Dvulkan, validation plan, package smoke |
Hosted build only |
The Windows forced build additionally gates the backend-private
vulkan-1.dll loader and complete non-Darwin Metal bridge stubs.
The hosted command shapes are:
# macOS
zig fmt --check build.zig src examples tools tests/package_consumer && \
zig build run-api-guard && \
zig build test --summary all && \
zig build && \
zig build run-validation-plan && \
scripts/ci/run_package_smoke.sh
# Linux and Windows
zig fmt --check build.zig src examples tools tests/package_consumer && \
zig build run-api-guard && \
zig build test --summary all && \
zig build -Dvulkan && \
zig build run-validation-plan && \
scripts/ci/run_package_smoke.sh.github/workflows/ci.yml owns hosted build/test evidence. A hosted job must
not be relabeled as physical evidence even if its runner happens to expose a
software adapter.
The release matrix has six physical GPU rows in addition to the three hosted rows. Together they are the nine explicit release-readiness gates.
| Row | Backend | Work | Required artifact |
|---|---|---|---|
self_hosted_metal_smoke |
Metal | capability, transfer, compute, render smoke | capability dump and workload logs |
self_hosted_vulkan_smoke |
Vulkan | capability, transfer, compute, render smoke | capability dump and workload logs |
local_metal_pixel_regression |
Metal | deterministic transfer, compute, asymmetric raster, and presentation-composition readback | readback values, deltas, and orientation markers |
local_vulkan_pixel_regression |
Vulkan | deterministic transfer, compute, asymmetric raster, and presentation-composition readback | readback values, deltas, and orientation markers |
self_hosted_metal_soak |
Metal | 120 bounded iterations | host, capability, and soak logs |
self_hosted_vulkan_soak |
Vulkan | 120 bounded iterations | host, capability, and soak logs |
The canonical commands are:
scripts/ci/run_gpu_smoke.sh metal artifacts/metal-smoke
scripts/ci/run_gpu_smoke.sh vulkan artifacts/vulkan-smoke
VKMTL_BACKEND=metal zig build run-pixel-regression
VKMTL_BACKEND=vulkan zig build run-pixel-regression -Dvulkan
scripts/ci/run_gpu_soak.sh metal 120 artifacts/metal-soak
scripts/ci/run_gpu_soak.sh vulkan 120 artifacts/vulkan-soak.github/workflows/gpu-validation.yml is a manual workflow using labeled
self-hosted physical GPU runners. Its smoke and soak bundles contain
host.txt, capability-dump.txt, and workload logs. A failure should include a
second capability dump when possible.
zig build run-release-readiness marks a gate observed only when the caller
provides its evidence flag. Its default result is not ready. Release evidence
must name the exact release commit and a clean worktree; evidence from an older
commit is historical, not an exact-commit substitute.
These rows protect portable contracts without requiring manual visual review.
The names match tools/development_matrix.zig.
| Row | Command | Contract |
|---|---|---|
headless_deterministic |
zig build run-transfer-readback && zig build run-compute-readback |
Real transfer, compute, and texture-backed offscreen readback through HeadlessContext; no GLFW window or surface. |
binding_variant_regression |
zig build test |
Dynamic buffer array offsets, native resource tables, layout compatibility, reusable indirect ranges, root constants, specialization fingerprints, and driver-cache identity. |
sync_query_regression |
zig build test |
Barriers, fences/events, synchronization descriptors, physical queue selection, ownership transfers, lifecycle retirement, and query validation. |
debug_marker_regression |
zig build test && zig build run-profiling-plan |
Borrowed labels, UTF-8/NUL checks, marker capabilities, capture gates, query sources, profiling fallback, and issue reports. |
resource_utility_regression |
zig build test |
Mipmaps, fills, copies, blits, MSAA, subresource state, sampler borders, heaps, memory reports, and transient diagnostics. |
platform_interop_regression |
zig build test |
Surface registries, present diagnostics, external wrappers, external synchronization validation, and native insertion gates. |
production_hardening_regression |
zig build test && zig build run-stability-plan -- --iterations 120 |
Cache plans, runtime diagnostics, capture names, stability planning, and Vulkan fallback diagnostics. |
advanced_resource_geometry_regression |
zig build test |
Sparse/tiled plans, residency commit/churn, tessellation planning, and mesh/task planning. |
advanced_geometry_feature_gates |
zig build run-tessellation && zig build run-mesh-shader |
Public advanced-geometry examples preserve precise executable/unsupported gates. |
ray_tracing_native_parity_regression |
zig build test |
AS, SBT, optional application-resource binding, caller-owned output, presentation selection, raw-copy compatibility, finite-run, and color/radiance-reference contracts. |
voxel_world_metal_ray_tracing |
Metal fixed-phase smoke/default finite commands below | Material-bound indexed chunk BLAS/TLAS traversal, complete current 9/169-source physical profile coverage within the 289-source bound, exact 16-byte ground/water/wood/leaf material columns, explicit TLAS-plus-indirect-BLAS read residency, opaque and water normal/distance G-buffers, screen-space refraction, RGB absorption/in-scattering, one opaque-TLAS reflection ray per visible water pixel, one full-resolution diffuse path of at most three sequential cosine-weighted segments per covered opaque pixel, nonzero x/z bounds only for a complete contiguous profile-square TLAS, zero-extent rejection for sparse subsets, terrain-top-only residual environment and outer-edge blending, independent temporal/edge-aware PTGI reconstruction, native driver submission, finite raw/radiance/visibility/reflection readback, and bounded execution under Metal API Validation. |
voxel_world_vulkan_ray_tracing |
Vulkan fixed-phase smoke/default finite commands below | The same material-bound PTGI plus refractive-water/opaque-reflection contract on a physical Vulkan RT device; source supports the complete bounded resident set through 289 instances, but physical Vulkan execution remains pending and is never satisfied by forced compilation alone. |
Metal has physical headless evidence for transfer and compute readback. Vulkan requires a loader and physical device host for equivalent execution. A forced Vulkan build remains build evidence only.
The case metadata in tools/development_matrix.zig is authoritative. The
durable expectations are:
| Case | Required behavior |
|---|---|
invalid_bind_group |
Missing, extra, duplicate, and kind-mismatched entries return typed validation errors. |
invalid_texture_format |
Automatic or unsupported ordinary texture formats fail before backend creation; presentation accepts only its bounded request set. |
invalid_barrier |
Redundant or mismatched barriers return command-encoding errors. |
resource_destroyed_while_in_use |
Pending retirements remain retained until submitted work completes. Backend integration coverage remains an explicit gap. |
unsupported_feature |
Feature-gated APIs return typed unsupported errors instead of silently lowering incorrectly. |
shader_reflection_mismatch |
Layout, resource kind, visibility, stage, fixed array count, and storage-access mismatches fail before pipeline creation. |
runtime_sync_objects |
Fences, events, and synchronization descriptors cover signal, wait, reset, timeout, borrow, same-device, and unsupported behavior. |
logical_queue_ownership |
Queue views reject cross-queue resource use until an explicit ownership transfer is recorded. |
query_readback |
Bound-pass identity, availability, reset, range/type, feature gates, and readback/resolve agreement remain deterministic. |
debug_marker_contract |
Marker lifetime and scope fail before native work; capabilities, capture gates, and profiling sources remain truthful. |
resource_utilities |
Copy, mip, blit, resolve, heap, memory, compute, atomic, and managed-readback rules keep typed validation. |
platform_interop |
Surface, present, external wrapper/import, synchronization, and native insertion contracts stay backend- and lifetime-aware. |
production_hardening |
Cache compatibility, diagnostics, capture names, stability plans, and fallback reports remain deterministic. |
advanced_resource_geometry |
Planning records remain distinct from capability-gated or typed-unsupported native execution. |
ray_tracing_native_parity |
Planning and advanced gaps remain explicit while geometry-exact AS sizing, one/N TLAS source mapping, transactional Metal AS build-state ownership/compact propagation and transitive residency, AS-kind validation, application-resource binding, caller-owned dispatch, finite runs, and direct/indirect/reconstructed radiance readbacks remain deterministic. |
period44_device_evidence |
Hosted builds, physical smoke, pixel readback, soak, and release gates stay distinct; all nine explicit gates have a record. |
voxel_world_pressure_test |
Raster smoke/default/stress remain within the current 9/169/289 resident bounds. PTGI smoke/default physically cover complete 9/169-source Metal TLAS sets, while the source remains bounded through 289 instances; finite acceptance requires ptgi_bounces=3, nontrivial direct and indirect samples, valid reconstructed radiance, zero invalid pixels, native submission, and the final voxel_world_pressure_test=ok marker carrying the bounce count. A fixed-camera water-reflection lane additionally requires nonzero covered and lit reflection pixels, zero invalid reflection pixels, and rt_reflection_validated=true; autopilot reports those metrics but may legitimately leave the marker false when no lake is visible. |
Unit-test metadata remains authoritative for portable validation. Integration
gaps must remain marked as gaps rather than being hidden by a nearby unit test.
Command lifecycle/presentation behavior is covered by runtime synchronization,
query, and resource cases. Resource-table persistence is covered by binding and
production-hardening rows. RT maintenance, many-instance TLAS, complex SBT
planning, ray-query discovery, and stress behavior are subcontracts of
ray_tracing_native_parity, not separate registered validation-case names.
This table is a validation summary, not a replacement for the native semantic inventory.
| Area | Vulkan | Metal | Evidence expectation |
|---|---|---|---|
| Backend and adapter selection | Executable | Executable | Capability dump names selected backend, adapter, source, limits, and formats. |
| Transfer and readback | Executable | Executable | Exact physical headless readback. |
| Compute dispatch | Executable | Executable | Storage buffer/texture writes and deterministic readback. |
| Render and presentation | Executable | Executable | Pixel readback plus separate current-drawable bind/present smoke. |
| Explicit barriers | Native commands | Validation/tracked no-op composition | State-machine unit tests and native lowering inspection. |
| Runtime fences/events | Executable | Executable | Signal, wait, reset, timeout, and commit ordering tests. |
| Timeline/shared-event submit | Capability-gated native timeline semaphore | Capability-gated native shared event | Full object, host, and submit path must be usable. |
| Compute/transfer queues | Queried physical family or explicit graphics fallback | Independent physical command queue or fallback | Selection plan and cross-queue synchronization. |
| Timestamp queries | Native raw ticks when all gates open; logical fallback | Native common-counter samples when all boundaries open; logical fallback | QuerySet.resultSource() must distinguish the source. |
| Boolean occlusion | Capability-gated query pool | Capability-gated visibility result | Physical readback/resolve and reset/reuse. |
| Precise/counting occlusion | Capability-gated precise flag | Counting visibility | Exact u64 result when enabled. |
| Pipeline statistics | Typed unsupported | Typed unsupported | One-u64 result cannot represent typed variable counters. |
| Object/encoder markers | Capability-gated native debug utils | Native | Capability report plus native capture/debug tool. |
| Command-buffer markers | Validation-only | Native | DebugMarkerCapabilities; do not claim Vulkan native command markers. |
| Native handles | Borrowed escape hatch | Borrowed escape hatch | Backend-tag and owner lifetime contract. |
| Feature | Vulkan | Metal | Validation |
|---|---|---|---|
| Format capabilities | Queried optimal-tiling and selected-surface properties | Explicit portable-format table plus native selection | Device.getFormatCaps(...) and capability dump. |
| Buffer/texture copy alignment | Native offset and row-pitch limits | Portable limit plus native requirements | Validate texel-size, offset, and row-pitch before encoding. |
| Color copies | Same channel-order compatible classes, including unorm/sRGB pairs | Same | Mip, layer, and 3D slice ranges. |
| Scaled color blit | Capability-gated vkCmdBlitImage |
Typed UnsupportedTextureBlit |
Source/destination caps; linear requires filtering support. |
| Depth32 exact copy/readback | Capability-gated depth aspect | Capability-gated depth texture copy | No implicit color interpretation. |
| Packed depth/stencil copy | Queried depth or stencil aspect | Typed unsupported | No implicit packed buffer layout. |
| MSAA copy/readback | Typed unsupported | Typed unsupported | Use explicit color resolve. |
| Color MSAA resolve | Native | Native | Matching multisample source and single-sample destination. |
| Depth/stencil resolve | Typed unsupported | Typed unsupported | Capability flags remain false. |
| View reinterpretation | Compatible linear/sRGB class and component swizzle | Same | Other reinterpretations remain unsupported. |
| Memoryless attachment | Typed unsupported | Capability-gated native memoryless storage | Attachment-only; no load/store persistence. |
| Feature | Vulkan | Metal | Validation |
|---|---|---|---|
| Placement heaps | Native device-memory binding | Native placement heap | Exact requirements, reservation offsets, and child-before-heap lifetime. |
| Heap aliasing | Portable lifetime/range plan | Portable lifetime/range plan | Overlap allowed only for compatible non-overlapping lifetimes. |
| Memory budget | Native when extension is usable, explicit fallback otherwise | Native working-set/current-allocation report or fallback | Report source and pressure; fallback is not native proof. |
| Transient diagnostics | Portable | Portable | Resource count, requested units, peak live units, alignment, and savings. |
| Sparse/tiled planning | Available | Available | Page grids and churn plans are diagnostic. |
| Native sparse/tiled page binding | Typed unsupported | Typed unsupported | Planning shapes do not identify an executable binding path. |
| Fixed sampler border colors | Native | Native | Feature and format gates before creation. |
| Custom sampler border colors | Not in portable enum | Not in portable enum | Native-extension-only work remains unallocated. |
| Driver artifact cache | Executable VkPipelineCache |
Executable MTLBinaryArchive |
Identity, stale recovery, persistence, and read-only policy. |
| Runtime manifest I/O | Deferred | Deferred | Compatibility planning exists; automatic ownership is not claimed. |
| Feature | Vulkan | Metal | Validation |
|---|---|---|---|
| Scalable resource table | Capability-gated descriptor indexing | Capability-gated argument buffer | Layout, allocation, update, bind, and pressure limits. |
| Pipeline compatibility | Descriptor-set layout in pipeline layout | Runtime fingerprint plus shader slot | Reject mismatch before backend work. |
| Reusable render commands | Exact draw expansion | Native ICB when usable, exact expansion otherwise | CPU-authored fixed slots and ranges. |
| Reusable compute commands | Exact dispatch expansion | Native compute ICB when usable, exact expansion otherwise | CPU-authored fixed slots and reset. |
| Tessellation planning | Available | Available | Patch metadata and factor-buffer requirements. |
| Native tessellation | Capability-gated executable patch pipeline | Typed unsupported with pinned compiler | Public example must exit precisely when unsupported. |
| Mesh planning | Available | Available | Mesh/task or mesh/object metadata. |
| Native mesh-only pipeline | Capability-gated executable | Capability-gated executable | Visible public example and physical evidence where available. |
| Task/object stage | Typed unsupported while compiler artifact is unstable | Typed unsupported while compiler artifact is unstable | Schema-valid declaration does not imply usable execution. |
| Feature | Vulkan | Metal | Validation |
|---|---|---|---|
| Surface registry | Portable runtime | Portable runtime | Independent descriptor, resize, frame, and generation state. |
| Multiple native presentation chains | Capability-gated | Capability-gated | Do not infer from registry planning alone. |
| Present-mode diagnostics | Native query plus deterministic fallback report | Display-sync support plus fallback report | Surface-specific capability remains conservative. |
| External buffer/texture wrappers | Portable wrappers | Portable wrappers | Backend, device, ownership, lifetime, shape, and usage validation. |
| Native external buffer import | Typed unsupported until exact allocation metadata exists | Same-device MTLBuffer import executable |
Physical readback for admitted Metal path. |
| Native external texture import | Typed unsupported until image metadata is complete | Same-device MTLTexture and single-plane IOSurface executable |
Physical readback for admitted Metal path. |
| External synchronization wrappers | Validation available | Validation available | Wait/signal counts and native requirements. |
| Native external wait/signal | Typed unsupported | Typed unsupported | Value and import-ownership rules are absent. |
| Native command insertion | Typed unsupported | Typed unsupported | Callback has no validated active command-buffer/encoder handle. |
| Feature | Vulkan | Metal | Validation |
|---|---|---|---|
| AS build/update/refit/copy | Backend-private native execution | Backend-private native execution | Resource ownership, size, scratch, and command records. |
| Compact-size query | Typed unsupported | Typed unsupported | No asynchronous post-build compact-size owner. |
| Many-instance TLAS | Complete instance allocation with one repeated or exactly N BLAS sources | Dynamic multi-source ownership plus final descriptor/scratch recheck; failed source/instance replacement restores prior state and compact copy transfers complete reusable build state | Current Metal PTGI smoke/default physically exercise complete 9/169-source sets; the source contract is bounded through 289 sources. Missing Metal traversal dependencies fail as typed invalid command, and Vulkan physical PTGI evidence is pending. |
| Pipeline and dispatch | Native RT pipeline/SBT dispatch with one optional application bind group | Native RT compute pipeline with one optional application bind group plus explicit TLAS and indirect-BLAS read residency | Capability gates, resource layout, dimensions, total rays, typed missing-dependency failure, raw direct/indirect output, and reconstructed-radiance readback. |
| Caller-owned texture output | Executable | Executable | dispatchRaysToTexture(...) has no presentation side effect. |
| Procedural AABB geometry | Executable with custom intersection | Native AABB input; custom intersection/function table unsupported | Keep ordinary geometry separate from custom-intersection execution. |
| Ray query | Availability/capability planning; execution remains closed | Typed unsupported | A queried native feature is not executable support. |
| Complex callable SBT | Planning only | Planning only | Schema has no callable artifact or payload region. |
| RT stress | Executable bounded maintenance lane | Executable bounded maintenance lane | run-ray-tracing-maintenance does not imply ray-query or function-table support. |
PresentationDescriptor.format is the application request.
Swapchain.selectedFormat() is the concrete native selection. Automatic SDR
selection prefers bgra8_unorm_srgb, then bgra8_unorm. An explicit request
must be selected exactly or fail with UnsupportedPresentationFormat.
Vulkan selects the exact BGRA8 format with
VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; driver enumeration order must not alter
the choice. Metal maps the selected format to CAMetalLayer.pixelFormat.
The descriptor extent is requested state. Swapchain.extent() is the actual
native drawable extent after surface constraints. Tests cover clamping,
healthy zero-size preservation, unchanged-request fast paths, recovery-forced
recreation, changed-request re-query, and terminal SurfaceLost behavior.
Current-drawable render pipelines must declare the selected format exactly.
A mismatch returns PresentationFormatMismatch before native pipeline bind or
draw. Offscreen targets retain their own format contracts.
Presentation selection performs no HDR mapping, exposure, tone mapping, gamma policy, gamut conversion, or scene-content inspection. Those transforms are application policy. The legacy RT drawable path performs raw byte copying; an sRGB destination changes how bytes are interpreted, but the copy itself does not decode or encode them.
ray_tracing.RayTracingTextureResources identifies a dispatch resource bundle
whose output texture is owned by the caller.
CommandBuffer.dispatchRaysToTexture(...) executes on both backends without a
presentation side effect and leaves the output ready for fragment sampling.
Metal binds the caller output without acquiring a drawable. Vulkan writes the caller texture and transitions it to the sampled-image postcondition. Direct RT and AS commands consume one native encoding segment; the consumer uses a later command buffer.
The example uses an rgba16_float accumulation target. Dispatch assigns no
color space to those numeric values. The ray_traced_scene composition shader
sanitizes and clamps its historical display-referred RGB, applies the standard
sRGB EOTF, and lets the final bgra8_unorm_srgb attachment perform the
matching OETF. The locked reference mapping is:
0.0 / 0.18 / 0.5 / 0.8 / 1.0 -> 0 / 46 / 128 / 204 / 255
Focused tests cover usage, view shape, queue ownership, dispatch depth and extent, whole-texture subresources, multisample rejection, the one-segment rule, finite-run failures, and non-finite color inputs. Vulkan descriptor and inline-data resources are retained per dispatch.
The Metal offscreen composition readback accepts at most one byte of channel delta. A physical three-frame Metal run under API Validation established native command execution separately from the byte-level readback.
The legacy dispatchRaysToDrawable(...) route remains a compatibility path.
It dispatches into a whole, single-sample, 2D bgra8_unorm caller texture with
shader-write and copy-source usage, then copies bytes to the selected linear or
sRGB BGRA8 drawable. It requires exact dispatch/presentation extent and a
graphics queue.
Metal preflights drawable acquisition, format, extent, and any sRGB staging
allocation before compute. Linear presentation allocates no staging buffer.
The legacy command presents internally; a second explicit present on the same
command buffer returns InvalidCommandBufferState.
Vulkan tests cover surface-clamped extents, recovery, active-command resize and
clear rejection, dedicated clear-pool isolation, failed-commit cleanup,
presentation-generation invalidation, and terminal SurfaceLost. Teardown
waits the presentation queue before destroying swapchain images, semaphores,
or the swapchain handle.
The canonical physical probes are:
# Metal application-owned composition
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_RT_FRAME_LIMIT=3 \
zig build run-ray-traced-scene
# Metal legacy sRGB and linear raw-copy routes
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_RT_FRAME_LIMIT=3 \
VKMTL_RT_LEGACY_DRAWABLE=1 VKMTL_PRESENTATION_FORMAT=srgb \
zig build run-ray-traced-scene
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_RT_FRAME_LIMIT=3 \
VKMTL_RT_LEGACY_DRAWABLE=1 VKMTL_PRESENTATION_FORMAT=linear \
zig build run-ray-traced-scene
# Vulkan application-owned composition
VKMTL_BACKEND=vulkan VKMTL_RT_FRAME_LIMIT=3 \
zig build run-ray-traced-scene -Dvulkan
# Vulkan legacy raw-copy route
VKMTL_BACKEND=vulkan VKMTL_RT_FRAME_LIMIT=3 \
VKMTL_RT_LEGACY_DRAWABLE=1 \
zig build run-ray-traced-scene -DvulkanThe backend registry calls the Metal command bundle
ray_tracing_metal_color_path and the Vulkan composition probe
ray_tracing_vulkan_color_path. manual_ray_traced_scene_visual records the
separate screenshot-review class; it never replaces deterministic pixel
readback.
The 2026-07-10 report recorded all nine release gates observed:
- hosted macOS, Linux, and Windows build/test jobs;
- physical Metal and Vulkan smoke;
- Metal and Vulkan pixel regression;
- Metal and Vulkan 120-iteration bounded soak.
Hosted evidence was collected with Zig 0.16.0. Physical Metal evidence named macOS 15.7.3 arm64 and Apple M4 Pro. Physical Vulkan evidence named Windows 10 build 19045 x86_64, NVIDIA GeForce RTX 5080, NVIDIA driver 610.62, and Vulkan API 1.4.341.
The Metal render pixel result recorded maximum channel delta 0. The Vulkan render pixel result recorded maximum channel delta 1. Both soak runs completed 120 upload/readback and portable-residency cycles with submitted/completed work serial 120/120 and a maximum of four live resources.
Both memory-budget reports used the explicit fallback source with nominal
pressure. This is not native Metal or Vulkan memory-budget proof. No device
loss was injected or observed. Multi-hour soak, native memory pressure,
physical async-queue pressure, sparse residency, and equivalent advanced
stress remain separate evidence lanes.
This is a historical exact-commit snapshot. Later code changes require fresh release artifacts for affected lanes.
The annotated v0.1.0 tag and published release point to commit
96c5b08c34163a148f9811efff04a6f78936778a.
That release passed formatting, API guard, tests, default and forced-Vulkan
builds, external consumer smoke, hosted macOS/Linux/Windows CI, physical Metal
and Vulkan smoke/pixel/soak evidence, and a fresh tag-archive consumer smoke.
The readiness evaluator reported 9/9 observed and release ready: true.
The record establishes the v0.1.0 release line. It is not evidence for changes made after that commit.
The automatic, explicit sRGB, and explicit linear pixel-regression requests completed under physical Metal API Validation:
MTL_DEBUG_LAYER=1 VKMTL_PRESENTATION_FORMAT=srgb \
VKMTL_BACKEND=metal zig build run-pixel-regression
MTL_DEBUG_LAYER=1 VKMTL_PRESENTATION_FORMAT=linear \
VKMTL_BACKEND=metal zig build run-pixel-regression
MTL_DEBUG_LAYER=1 VKMTL_PRESENTATION_FORMAT=automatic \
VKMTL_BACKEND=metal zig build run-pixel-regressionEach printed max_channel_delta=0 presentation_max_channel_delta=1 and the
positive API Validation marker. Those bytes are offscreen readback, not
drawable readback. Each run then separately encoded, bound, and presented a
pipeline matching the selected current drawable.
The native linear capability probe reported
requested=bgra8_unorm, selected=bgra8_unorm, with only linear BGRA8 marked
presentable for that selected configuration.
Both legacy Metal RT format commands printed
Presentation path: legacy_drawable_raw_copy,
trace_driver_submitted=true, and
ray traced scene finite run ok: backend=metal frames=3 under Metal API
Validation with no validation error.
The asymmetric 5x2 top/bottom-row composition regression passes physical Metal
readback with at most one byte of channel delta and reports
presentation_orientation=top_left.
After the general raster correction, a local physical Metal run also enabled
counter-clockwise front-facing state with back-face culling, preserved the
61170-sample occlusion result, returned max_channel_delta=0, and reported
both raster_orientation=top_left and
presentation_orientation=top_left.
The post-acceleration-structure-sizing Windows reruns selected both expected
presentation paths. Canonical texture_composition and compatibility
legacy_drawable_raw_copy both built BLAS/TLAS objects, dispatched 518400
rays, reported trace_driver_submitted=true and runtime_ready=true, and
completed finite runs.
The supplied canonical markers included:
blas_size=2560
tlas_size=2048
scratch_size=2048
blas_built=true
tlas_built=true
trace_driver_submitted=true
runtime_ready=true
driver_pixels=visible_vulkan_procedural_rt_scene
The legacy screenshot had the established top-left orientation. The first
canonical screenshot exposed a full vertical flip caused by deriving
fullscreen UV Y from clip-space interpolation. The correction derives 1:1 UVs
from fragment SV_Position.xy and source texture dimensions.
After that correction, the canonical route completed 3000 frames. The accepted screenshot places the blue and yellow emissive spheres above the central sphere and the lobed object and floor reflection below it. Its direct masked mean absolute RGB difference from the accepted compatibility screenshot was about 2.34; vertically flipping it increased the difference to about 18.20. Both RT visual routes are accepted.
The latest supplied Vulkan RT logs do not positively identify the device or
driver and do not prove that VK_LAYER_KHRONOS_validation was enabled. They
are physical execution and visual-orientation evidence only. The earlier named
Period 44 NVIDIA host must not be inferred as the identity of these later logs.
The asymmetric 5x2 physical Vulkan composition regression subsequently passed
on clean commit 7d88ffe with presentation_max_channel_delta=0 and
presentation_orientation=top_left. That version's ordinary raster check
sampled only the background and center, so it did not detect a separate
clip-space Y inversion in general geometry.
After the general raster correction, the supplied physical Windows rerun used:
zig build run-pixel-regressionIt selected .vulkan and returned max_channel_delta=0,
raster_orientation=top_left,
presentation_max_channel_delta=0, and
presentation_orientation=top_left. Counter-clockwise back-culling preserved
the 61170-sample occlusion result; native timestamps and query reset/reuse also
passed. This closes current physical Vulkan raster semantics independently of
the accepted RT scene orientation.
Clean commit 7d88ffe46d9c5b7f16d8f16319c84e8b6cf9f2e7
selected an NVIDIA GeForce RTX 5080 through vulkan_query with a clean
worktree. run-pixel-regression completed physical HeadlessContext transfer
and compute readback, native occlusion/timestamp work and reset/reuse, and the
then-current render/composition checks with max_channel_delta=1,
presentation_max_channel_delta=0, and
presentation_orientation=top_left.
This closes physical Vulkan loader/device execution for that exact commit. It does not establish general raster orientation: the 5x2 path tested texture composition, while the ordinary raster readback did not distinguish top from bottom and did not enable culling.
On the same code line, smoke/default/stress voxel runs completed 24/48/160
frames, drained pending rebuilds, stayed within 9/81/289 resident chunks, and
printed voxel_world_pressure_test=ok. These runs are accepted as pressure
diagnostics only. The visible Vulkan voxel scene was vertically inverted, so
they do not close raster parity or the Vulkan voxel release lane.
The subsequent corrected-path run passed the asymmetric raster/composition
readback with both channel deltas at zero. Its smoke/default/stress voxel runs
completed 24/48/160 frames with resident counts 9/81/289, pending work zero,
and voxel_world_pressure_test=ok. The stress run rendered 121 visible and
culled 168 resident chunks. Together the deterministic raster readback and
bounded voxel runs close the earlier orientation/pressure diagnostic.
The supplied corrected-path artifact did not repeat git rev-parse HEAD or
git status --short. It is accepted physical behavior evidence, but it is not
an exact-release-commit cleanliness record. The future release candidate must
still refresh every required lane against its final clean commit.
This record preserves the intermediate post-Period-56 visibility renderer that
preceded material-bound PTGI. It is historical evidence, not a description of
the current voxel output contract. The later PTGI record below supersedes its
nearest-49 TLAS, rgba8_unorm visibility target, and no-GI/no-denoising
limitations while retaining this evidence boundary.
That pre-PTGI slice preserved the existing 9/81/289 resident
pressure bounds while adding a deterministic 476 x 68 seven-tile sRGB atlas,
face-specific UVs, alpha-derived detail normals, indexed chunk BLAS objects,
and a TLAS bounded to the nearest 7 x 7 chunks. The atlas has no mipmaps. The
full-resolution rgba8_unorm RT target stores directional-light and sky
visibility and is sampled by the raster pass; it is not a path-tracing, GI,
reflection, HDR, or denoising contract.
VKMTL_VOXEL_RT=auto is the default and may retain raster rendering when the
device or required format usage is unavailable. off fixes the raster
baseline. required must either execute the native hybrid path or fail with a
typed capability/format error; it must not silently fall back.
Finite hybrid runs read back visibility after pending work drains and repeat
the readback on the final frame. The second observation prevents a valid early
sample from hiding a late Metal residency regression. The bounded smoke/default
validation lanes run long enough for the drain; intentionally shorter frame
limits may finish with rt_visibility_validated=false rather than violating
the exact-frame contract. Both observations must remain nontrivial.
Hybrid-lane acceptance requires
renderer=hybrid_rt, rt_driver_submitted=true,
rt_visibility_validated=true, at least one primary hit, and at least one
shadowed or sky-occluded pixel. The Metal API Validation smoke and default runs
passed. After the 60-second day/night cycle landed, that historical default
49-source TLAS completed 48 frames, 48 dispatches, and 176947200 primary rays
with 81 resident chunks, 49 visible chunks, and zero pending work. Its final
observation reported:
rt_primary_hits=1846752 rt_shadowed=553298 rt_sky_occluded=403844
Those values are observations from that run and cycle phase, not portable numeric thresholds. Acceptance requires nontrivial visibility rather than matching the exact counts.
This also exercises the Metal corrections that query the real geometry and final TLAS descriptors, reserve adequate result/scratch sizes, dynamically own source arrays, and retain the reusable build/traversal state in each AS wrapper rather than a temporary descriptor. TLAS source/instance replacement is transactional: failure restores the previous descriptor sources and instance contents, while successful build/update publishes the new state. TLAS compact copy transfers the complete descriptor, backing-resource, traversal, and update-sizing state needed by subsequent operations. Dispatch explicitly declares the TLAS and all indirectly referenced BLAS objects as compute-read resources, returns typed invalid command if a built TLAS lacks those dependencies, and separately rejects a pipeline/AS BLAS-versus-TLAS kind mismatch. A 300-frame Metal default-profile soak repeated the final visibility observation and retained non-zero primary, shadowed, and sky-occluded counts. Focused Vulkan tests cover complete TLAS instance allocation and exact one-repeated or N-source mapping. That historical Vulkan hybrid lane was never run physically; the current material-bound Vulkan lane is specified below.
The historical one-bounce voxel route recorded in this section binds
application material resources directly to the RT pipeline. Its caller-owned
rgba16_float target stores direct visibility and one cosine-weighted indirect
sample for every covered full-resolution surface pixel. Secondary hits use the
CPU terrain sampler's exact 16-byte
ground/water/wood/leaf material columns and the same atlas as rasterization. A
normal-plus-distance G-buffer, temporal reprojection with rejection and
clamping, and four edge-aware a-trous passes produce the reconstructed indirect
texture consumed by the linear HDR raster composition.
On 2026-07-18 an Apple M4 Pro executed the then-current material-bound route
with a positive Metal API Validation Enabled marker. This historical
snapshot used the former 60-second clock, so fixed time 30 meant noon. Every
recorded run reported
renderer=hybrid_rt, rt_driver_submitted=true,
rt_visibility_validated=true, rt_ptgi_validated=true, zero pending work,
and voxel_world_pressure_test=ok.
| Profile | Frames | Fixed cycle | Resident / traced | Dispatches | Primary rays | Primary hits | Direct lit | Shadowed | Indirect lit | Low indirect | Reconstructed lit | Invalid |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| smoke | 24 | 0 (midnight) | 9 / 9 | 24 | 88473600 | 3686400 | 727803 | 2958597 | 3558961 | 127559 | 3686400 | 0 |
| default | 48 | 30 (noon) | 81 / 81 | 48 | 176947200 | 3686400 | 1129790 | 2556610 | 3686400 | 10059 | 3686400 | 0 |
| smoke soak | 300 | 0 (midnight) | 9 / 9 | 300 | 1105920000 | 3686400 | 447903 | 3238497 | 3367508 | 323306 | 3686388 | 0 |
The counts are observations, not portable numeric thresholds. Direct lit and
Shadowed partition covered primary surfaces. Indirect lit counts samples
above the admitted nonzero threshold. Low indirect is a low-radiance
diagnostic, not a generic sky-occlusion semantic. Reconstructed lit comes
from the post-temporal/a-trous texture. Invalid combines non-finite or
negative raw/reconstructed samples and must remain zero.
The exact Metal commands for this snapshot were:
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=smoke VKMTL_VOXEL_FRAME_LIMIT=24 \
VKMTL_VOXEL_AUTOPILOT=1 VKMTL_VOXEL_CYCLE_TIME=0 \
zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=default VKMTL_VOXEL_FRAME_LIMIT=48 \
VKMTL_VOXEL_AUTOPILOT=1 VKMTL_VOXEL_CYCLE_TIME=30 \
zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=smoke VKMTL_VOXEL_FRAME_LIMIT=300 \
VKMTL_VOXEL_AUTOPILOT=1 VKMTL_VOXEL_CYCLE_TIME=0 \
zig build run-voxel-worldThis was a dirty-source snapshot rather than a clean exact-commit run. It is accepted implementation and physical Metal evidence, but it is not release candidate evidence and cannot satisfy the future exact-commit refresh.
The source supports a complete resident TLAS through 289 instances. At this historical snapshot, physical Metal coverage was 9 sources in smoke and 81 in default; the superseding 169-source record appears below. Vulkan shader artifacts, focused tests, the ordinary build, and the forced Vulkan build pass, but none proves execution of the material-bound route. The current physical Windows Vulkan RT lane remains:
$env:VKMTL_BACKEND="vulkan"
$env:VKMTL_VOXEL_RT="required"
$env:VKMTL_VOXEL_PROFILE="smoke"
$env:VKMTL_VOXEL_FRAME_LIMIT="24"
$env:VKMTL_VOXEL_AUTOPILOT="1"
$env:VKMTL_VOXEL_CYCLE_TIME="0"
zig build run-voxel-world -Dvulkan
Remove-Item Env:VKMTL_VOXEL_AUTOPILOT -ErrorAction SilentlyContinue
$env:VKMTL_VOXEL_PROFILE="default"
$env:VKMTL_VOXEL_FRAME_LIMIT="96"
$env:VKMTL_VOXEL_CYCLE_TIME="150"
zig build run-voxel-world -DvulkanThat lane must record backend/device identity, native submission, complete 9/169-source traversal, direct and indirect raw radiance, reconstructed radiance and visibility, zero invalid pixels, the diagnostic penumbra count, and the finite success marker. Physical Vulkan PTGI remains pending.
The example's displayed sun and moon radii now also define the angular extent
sampled by direct hardware shadow rays. Each pixel keeps one direct shadow ray
per frame: a static pixel scramble and R2 temporal sequence choose a point on
the active source disk, while center-direction NdotL keeps fully visible
surface brightness stable. Independent sample lanes are used for the indirect
bounce, primary visibility, and secondary-hit visibility.
Direct visibility no longer reaches the raster material as a raw binary alpha.
Two separate rgba16_float histories store its mean, second moment, validity,
and history length. The same depth/normal reprojection contract rejects stale
geometry, a minimum current weight keeps the moving day/night source
responsive, and one 5 x 5 normal/depth-aware pass produces final visibility.
The original indirect path remains independent and retains all four a-trous
passes. This is example-private policy, not a new public denoiser or ray-tracing
semantic.
On 2026-07-18 an Apple M4 Pro reran the deterministic physical Metal lanes
under a positive Metal API Validation Enabled marker. This is historical
evidence from the former 60-second clock, where fixed time 30 meant noon:
| Profile | Frames | Fixed cycle | Traced chunks | Primary rays | Penumbra pixels | Invalid |
|---|---|---|---|---|---|---|
| smoke | 24 | 0 (midnight) | 9 | 88473600 | 86867 | 0 |
| default | 48 | 30 (noon) | 81 | 176947200 | 237145 | 0 |
Both runs reported rt_driver_submitted=true,
rt_visibility_validated=true, rt_ptgi_validated=true, and the finite
pressure marker. rt_penumbra counts reconstructed surface samples between
the admitted fully shadowed and fully lit thresholds; it is an observation,
not a portable numeric gate. zig build test, zig build,
zig build -Dvulkan, and git diff --check also passed. Interactive
fixed-noon and lower-sun inspection showed softened but geometry-aligned
transitions. The evidence is from a dirty source snapshot, so it does not
satisfy future exact-release-commit gates, and physical Vulkan execution
remains pending.
This post-Period-56 refinement remains entirely inside the example. When PTGI is disabled, raster terrain keeps the established environment term. When PTGI is enabled, raster environment becomes only a residual fill, preventing the raster path and reconstructed indirect texture from each supplying a complete skylight contribution. Direct sun/moon radiance remains controlled by the separate reconstructed visibility signal. This is scene-lighting policy, not a vkmtl color, GI, or public rendering semantic.
Deterministic feature columns extend the existing fixed-point terrain. Tree anchors are accepted only when their complete footprint is ordinary grass, dry, and level enough; snow footprints therefore cannot contain trunks or leaves. A low-frequency mask adds water above selected low sandy ground while preserving the ground below it. Raster meshing uses these same world-coordinate columns through its one-block halo. RT secondary-hit lookup receives an exact 16-byte packed column containing ground height, surface and water level, plus wood and leaf vertical spans. The Zig packer, Slang path, and direct Metal MSL path share that layout.
The atlas now has eleven deterministic tiles, adding wood top/side, leaves, and water. Atlas alpha remains a height signal, the terrain BLAS remains opaque, and the raster terrain pass does not blend, so leaves and water are deliberately opaque voxel materials. This record does not claim cutout foliage, transparent or refractive water, or RT any-hit transmission.
On 2026-07-18 an Apple M4 Pro reran the current feature-balanced source under Metal API Validation:
| Profile | Renderer | Frames | Resident / pending | Visible vertices | Primary rays | Penumbra pixels | Invalid |
|---|---|---|---|---|---|---|---|
| smoke | hybrid RT | 24 | 9 / 0 | 19180 | 88473600 | 118340 | 0 |
| default | hybrid RT | 48 | 81 / 0 | 81912 | 176947200 | 258864 | 0 |
| stress | raster | 160 | 289 / 0 | 242336 | n/a | n/a | n/a |
The smoke/default penumbra counts are observations, not portable thresholds;
zero invalid pixels remains required. All three lanes retained their bounded
pressure success markers. Chunk dimensions remain 16 x 64 x 16, profiles
remain bounded at 9/81/289 resident chunks, and processing remains capped at
two rebuilds and 8 MiB of uploads per frame. zig build test, zig build, and
zig build -Dvulkan passed. The forced Vulkan build proves source and shader
compilation only; physical Vulkan execution of this feature-balanced PTGI route
remains pending. These observations came from the current dirty source snapshot
and do not satisfy a future exact-release-commit refresh.
This earlier post-Period-56 refinement is example-private and is superseded by the refractive-water record below. It changed no vkmtl public API, backend semantic, or compatibility claim. Leaves remain opaque. Each chunk now carries exact opaque and water index ranges, and meshing retains the solid-water interface. Only the opaque range enters the terrain G-buffer and BLAS; hardware-RT primary, visibility, and indirect rays therefore pass optically thin through lake water and can reach the bed.
The visible water is a separate premultiplied-alpha pass into the HDR target,
with depth writes disabled and water-bearing chunks ordered far to near. Four
world-coordinate analytic waves use one continuous 64-second phase. Fresnel
response blends body color with the current sky and active celestial highlight.
The path requires DeviceFeatures.blend_state and blendable rgba16_float.
It does not claim refraction, volumetric absorption, RT reflections, multilayer
transparency, or order-independent transparency.
On 2026-07-18 an Apple M4 Pro reran the translucent-water source under Metal API Validation:
| Profile | Frames | Resident / pending | Draws | Visible vertices | Visible indices | Uploaded bytes | Primary rays | Invalid |
|---|---|---|---|---|---|---|---|---|
| smoke | 24 | 9 / 0 | 12 | 20976 | 31464 | 1095464 | 88473600 | 0 |
| default | 48 | 81 / 0 | 44 | 84224 | 126336 | 7080312 | 176947200 | 0 |
Both lanes retained their finite pressure markers and native RT submission.
zig build test, zig build, and zig build -Dvulkan passed on the current
source. The forced Vulkan build remains compilation evidence only, and physical
Vulkan execution of this route is pending. These observations came from a
dirty source snapshot and do not satisfy a future exact-release-commit refresh.
The current example keeps the exact opaque/water index partition and retained solid-water contact faces, but no longer treats the visible lake as a premultiplied-alpha material pass. Opaque sky and terrain first produce a complete scene-linear HDR texture. Water then resolves transmission and reflection into a separate full-coverage HDR overlay, whose alpha is a coverage mask. The presentation pass composites the overlay over opaque HDR before bloom, tone mapping, and output transfer. This avoids sampling and writing the same HDR target in one pass.
The G-buffer pass emits two independent normal/distance surfaces: the opaque surface retains the detailed material normal and camera distance, while the water surface stores the matching animated wave normal and water distance. The current clean-room, SEUS PTGI E12-inspired surface combines six world-continuous analytic wave bands with different scales, directions, and temporal harmonics. Raster shading and the G-buffer share that evaluation, including camera-distance and grazing-angle stabilization. No E12 source, constants, shader organization, or assets are copied.
The water shader projects a thickness- and distance-aware refracted camera
segment into screen space, rejects invalid UV or opaque-depth candidates, and
falls back to the direct pixel. The admitted water-to-opaque distance is
clamped and used as a path-length estimate. A homogeneous single-scattering
medium uses sigma_a = (0.240, 0.062, 0.014) and sigma_s = 0.070 for RGB
Beer-Lambert transmission and in-scattering. It applies no painted blue body
tint, so thin water remains dominated by transmitted scene radiance while
deeper paths develop blue-green attenuation.
When hybrid RT is selected, the existing ray-generation dispatch also clears a
writable rgba16_float reflection target. Every valid water G-buffer pixel
reconstructs its world point, reflects the camera ray around the animated
normal, and traces the opaque terrain TLAS with a 96-world-unit maximum; the
opaque PTGI ray bound remains 384. Opaque hits reuse the material column/atlas
plus direct and environment lighting. Misses evaluate a directional day,
twilight, or night sky with a restrained horizon and the active sun or moon
disk and halo. The reflection target's alpha marks valid traced results.
Raster fallback leaves it invalid so the water shader selects the sky
reflection instead. Fresnel uses dielectric F0 = 0.02 and a narrow
approximately 420-exponent celestial glint. Water itself remains absent from
the TLAS, and reflection rays therefore cannot see another water surface.
The shared HDR/G-buffer admission gate requires blend_state,
independent_blend, at least three simultaneous color attachments,
rgba16_float sampling, filtering, linear filtering, and color-attachment
support, plus a depth32_float attachment. rgba16_float blending is not
required. The hybrid route separately requires storage and copy-source/
copy-destination support for its RT and readback textures.
This is bounded screen-space transmission, not a general participating-medium renderer. Off-screen opaque data and geometry hidden behind another opaque surface are unavailable to refraction. Foam, caustics, rain response, parallax water, TAA and reflection denoising, nested or underwater media, water-to-water reflection, multilayer transparency, and OIT remain out of scope. The reflection is one unfiltered ray per visible water pixel and has no separate temporal reconstruction or fixed numeric pixel golden.
Finite RT validation now copies the reflection target to CPU-visible memory.
Each texel must be finite and nonnegative; alpha must be either uncovered zero
or covered one, and an uncovered texel may not contain radiance. A fixed-camera
finite run is the deterministic water lane and fails with
VoxelWaterReflectionRegression unless it observes nonzero covered pixels,
nonzero lit covered pixels, and zero invalid pixels. It records the maximum
observed counts as rt_reflection_pixels and rt_reflection_lit and publishes
rt_reflection_validated=true. Autopilot can legitimately turn away from every
lake, so it reports the same counts and marker without requiring the marker.
On 2026-07-18 an Apple M4 Pro completed the strict fixed-camera 24-frame smoke
with MTL_DEBUG_LAYER=1, VKMTL_BACKEND=metal, and
VKMTL_VOXEL_RT=required, under a positive API Validation Enabled marker. It
submitted 24 RT dispatches and 88,473,600 primary rays and reported 1,017,402
primary-hit pixels, 438,485 reflection-covered pixels, 438,485 lit reflection
pixels, and zero invalid pixels. It ended with:
voxel_world_pressure_test=ok backend=metal profile=smoke frames=24 renderer=hybrid_rt rt_driver_submitted=true rt_visibility_validated=true rt_ptgi_validated=true rt_reflection_validated=true
The subsequent E12-inspired clean-room surface refinement retained those
strict fixed-noon counts and validation markers. A fixed-midnight 24-frame API
Validation lane retained 88,473,600 rays, 1,017,402 primary hits, and 438,485
reflection-covered pixels, with 429,947 lit reflection pixels, zero invalid
pixels, and all native/visibility/PTGI/reflection markers true. Its 24-frame
Metal raster lane also passed, as did zig build test and
zig build -Dvulkan. Together these prove the G-buffer, writable
reflection texture, RT dispatch, strict readback, water overlay, and
presentation route under Metal API Validation. The observed counts are not
fixed numeric gates and cannot prove every screen-space fallback case. The
forced Vulkan build is compilation evidence only; no physical Vulkan execution
of this route is claimed.
The example-private presentation slice does not allocate public API or backend support claims. One 300-second clock maps 0/75/150/225/300 seconds to midnight, sunrise, noon, sunset, and wrapped midnight. It drives the celestial sky, terrain lighting, direct RT visibility, and indirect RT environment. The independent real-time cloud wind and 64-second water loop are not frozen by the celestial validation override. Validation separates deterministic scene construction, forced backend compilation, finite physical execution, and interactive visual review:
| Layer | Required evidence | Current record |
|---|---|---|
| Deterministic source behavior | Terrain coordinate snapshots, bounded climate-biome coverage, grass-only tree and low-lake rules, exact packed RT feature spans, opaque/water index partitioning with retained contact faces, continuous 64-second world-coordinate water phase, cached-halo/direct-sampler equality across negative chunk boundaries, cycle phase/wrap/continuity and opposite-direction checks, PTGI history/reset and finite-radiance/visibility checks, sky/raster/water uniform ABI, and 5x7 UI batching tests | zig build test passed for the preceding translucent-water snapshot; shader compilation and the physical smoke below cover the superseding water transmission/reflection route. |
| Forced Vulkan build | Compile the registered sky/UI/opaque-and-water-G-buffer/PTGI/presentation/RT shader artifacts and the windowed example with zig build -Dvulkan |
Passed. This is compilation evidence, not physical Vulkan execution. |
| Metal material-bound PTGI finite runs | Fixed-phase smoke for 24 frames and default for 48 frames under Metal API Validation; require native submission, direct and indirect raw radiance, reconstructed radiance and visibility, zero invalid pixels, and drained work. A fixed-camera water lane also requires nonzero covered/lit reflection readback and rt_reflection_validated=true; autopilot reports but does not require that marker. |
The preceding translucent-water rerun completed both lanes. The superseding refractive/RT-reflected fixed-noon smoke and its E12-inspired clean-room surface refinement completed 24 frames with 24 dispatches, 88,473,600 rays, 1,017,402 primary hits, 438,485 reflection-covered and lit pixels, zero invalid pixels, and all native/visibility/PTGI/reflection markers true. A fixed-midnight 24-frame lane retained those rays, hits, covered pixels, zero-invalid result, and markers, with 429,947 lit reflection pixels. Its default lane has not been rerun. |
| Metal material-bound PTGI soak | Fixed-midnight smoke for 300 frames under Metal API Validation; retain native submission, PTGI validation, reconstructed output, zero invalid pixels, and the bounded pressure marker | Passed with nine resident/traced chunks, 300 dispatches, and 1105920000 primary rays. |
| Metal raster pressure | Stress profile, 160 frames, RT off; require 289 resident chunks, zero pending work, and the pressure-test success marker | The current feature terrain rerun passed with 289 resident chunks, zero pending work, and 242,336 visible vertices. The later E12-inspired water-surface refinement also passed a 24-frame raster smoke lane. |
| Metal visual interaction | Inspect representative night, twilight, and daytime frames, their sky/terrain-light transitions, refracted lake composition, depth-dependent absorption, RT/sky Fresnel response, and world-continuous waves; retain the upper-right FPS and both ESC overlay states | The preceding translucent-water presentation was accepted on a physical Metal device. The superseding refraction/absorption/reflection route has API-Validation smoke evidence, but its explicit visual-acceptance lane remains pending. |
| Physical Vulkan presentation | Repeat finite hybrid execution and visually inspect the day/night sky, lighting, UI, and orientation on a supported Vulkan RT host | Pending; no claim is inferred from the forced build. |
The current PTGI fixed-phase commands and 300-frame soak are recorded in the material-bound PTGI section above. The retained raster stress command is:
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_PROFILE=stress \
VKMTL_VOXEL_FRAME_LIMIT=160 VKMTL_VOXEL_RT=off \
zig build run-voxel-worldThe next physical Vulkan host run must use one clean, identified source commit and must record backend/device identity, finite-run direct/indirect and reconstructed-radiance metrics, plus representative day/night images with correctly oriented FPS/title UI. It remains a follow-up evidence lane and is not required to describe the completed example-private implementation.
This example-private refinement does not allocate public API or backend support
claims. The celestial clock is 300 seconds with deterministic probes at 0
(midnight), 75 (sunrise), 150 (noon), 225 (sunset), and 300 (wrapped midnight).
VKMTL_VOXEL_CYCLE_TIME freezes only that celestial phase. World-anchored
cloud wind continues from real elapsed time, and water retains its independent
continuous 64-second loop.
The clean-room, E12-inspired sky is an analytic direction- and sun-dependent atmosphere with a bright horizon, deep zenith, and warm low-sun glow around the existing moon and stars. Lower self-shadowed cumulus and upper stretched cirrus are evaluated by raster sky and, on the hybrid path, RT miss/PTGI environment and hardware-RT water reflection. Raster water fallback retains the analytic current-sky tint and does not evaluate procedural clouds or celestial disks. The downward ground hemisphere fades smoothly into the ground response rather than returning a bright sky for downward misses. For cost control, the RT cloud environment is evaluated only for actual reflection/PTGI misses and the outer traced-edge environment blend. Dense cumulus supplies full moving day/twilight cloud shadows plus restrained moonlight shadows. Active-light strength gates its direct-visibility attenuation so the sun/moon direction switch occurs at zero directional contribution. No E12 source, constants, shader organization, textures, or assets are copied. Weather/rain, volumetric cloud raymarching, cloud TAA, and a public atmospheric API remain out of scope.
The darker-daylight balance uses daytime ambient 0.44, hybrid raster
daylight safety 0.14 while night remains 0.20, RT secondary-hit daylight
environment 0.13, and traced-edge daylight environment 0.56. Direct sun,
night ambient, water Fresnel, and the celestial glint are unchanged.
Current validation is:
| Lane | Result |
|---|---|
| Deterministic/build | zig build, zig build test, and zig build -Dvulkan passed. The forced Vulkan build is compilation evidence only. |
Metal required RT, fixed noon 150, smoke 24 |
88,473,600 rays, 1,017,402 primary hits, 438,485 reflection-covered and lit pixels, zero invalid pixels, every native/visibility/PTGI/reflection marker true, rt_ms=9.992. |
Metal required RT, fixed midnight 0, smoke 24 |
Same ray, hit, and covered counts; 429,962 lit reflection pixels, zero invalid pixels, every marker true, rt_ms=9.547. |
Metal raster, fixed noon 150, smoke 24 |
Passed under Metal API Validation. |
| Interactive Metal observation | Default required-RT noon stabilized around 65-68 FPS after warmup; raster sky was about 120 FPS on this machine. These are observations, not performance gates. |
The physical Vulkan atmosphere/cloud/PTGI lane remains pending.
The superseding example contract uses smoke/default/stress resident bounds of
9/169/289 chunks. CPU terrain meshing runs through one example-private worker
with at most one outstanding ticket. Ticket identity discards stale results
after the desired set changes; startup failure selects the synchronous fallback
instead of weakening correctness. Interactive runs admit one completed mesh per
frame and finite validation admits two, both under the unchanged 8 MiB upload
budget. GPU buffer upload, BLAS construction, and command submission remain
synchronous on the render thread. TLAS publication normally batches additions
for four frames, but bootstrap, queue drain, and source replacement publish
immediately. Replaced BLAS owners retire only after the replacement TLAS is
published. These are example-private scheduling rules: they add no native-
semantic row and do not change the synchronous CommandBuffer.commit contract.
The current fixed-noon default commands intentionally omit autopilot and allow 96 frames for the 169-chunk neighborhood to drain:
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=default VKMTL_VOXEL_FRAME_LIMIT=96 \
VKMTL_VOXEL_CYCLE_TIME=150 zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=off \
VKMTL_VOXEL_PROFILE=default VKMTL_VOXEL_FRAME_LIMIT=96 \
VKMTL_VOXEL_CYCLE_TIME=150 zig build run-voxel-worldUnder Metal API Validation, the required-RT command completed 96 frames with 169 resident and 169 traced chunks, zero pending work, 169 BLAS objects, 22 TLAS builds, 96 dispatches, and 353,894,400 rays. Readback reported 2,404,265 primary hits, 862,626 direct-lit and 1,541,639 shadowed pixels, 2,403,729 indirect-lit and 2,404,265 reconstructed-lit pixels, 632,564 reflection-covered and 632,564 reflection-lit pixels, 298,276 reconstructed penumbra pixels, zero invalid pixels, and every native/visibility/PTGI/reflection marker true. The background scheduler reported 169 submitted, 169 completed, zero failed, and zero stale jobs. Total background mesh time was 411.750 ms; synchronous upload and TLAS time were 179.797 ms and 18.437 ms. Frame p50/p95/max were 19.919/23.364/401.845 ms; the maximum includes the strict final readback and is not an interactive frame-time gate.
The matching Metal raster command completed 96 frames with 169 resident chunks, 81 visible and 88 culled, zero pending work, 104 draws, 180,132 vertices, 270,198 indices, and 14,111,376 uploaded bytes. Both observations are from the current development snapshot, not a clean exact-release-commit candidate. Physical Vulkan execution of the 169-chunk default lane remains pending.
The required-RT metrics immediately above are retained one-bounce development evidence for the wider-view scheduler. The scheduler and raster observations remain applicable, but the PTGI shader result is superseded by the current three-segment record below.
For every covered opaque pixel, each frame launches one path with at most three
sequential cosine-weighted diffuse segments. Every hit evaluates an independent
sun/moon next-event sample, material albedo propagates path throughput, and a
terminal residual environment contribution is added at most once. The water
surface keeps its separate one-segment specular reflection. Ray generation
issues each trace in sequence; shaders do not recurse and the native pipeline
continues to use max_recursion_depth=1. FrameData receives nonzero x/z
chunk bounds only when the currently published TLAS contains the complete
contiguous square required by the active profile. During initial fill or
movement, a sparse subset publishes zero extent and diffuse misses cannot
sample environment. Once the square is complete, a miss samples residual
environment only when the path is confirmed to reach terrain top before a
horizontal side. The existing outer-edge blend applies the same terrain-top
gate and adds nothing to a side miss. This prevents untraced geometry beyond
the second- or third-bounce boundary from appearing as sky light. Consequently
this is an example-private shader-policy change, not new public API, command
behavior, or a new native-semantic contract. It is a clean-room experimental
enhancement and does not claim that default SEUS PTGI E12 uses three bounces.
The log now emits ptgi_bounces=3. The existing primary_rays field retains
its compatibility name but counts dispatch threads only; it does not count the
additional sequential diffuse or next-event trace segments. The finite success
marker carries the same bounce count, for example:
voxel_world_pressure_test=ok backend=metal profile=smoke frames=24 renderer=hybrid_rt ptgi_bounces=3 rt_driver_submitted=true rt_visibility_validated=true rt_ptgi_validated=true rt_reflection_validated=true
Under Metal API Validation, the fixed-noon default lane completed 96 frames
with 169 resident chunks, zero pending work, 169 submitted/169 completed/zero
failed/zero stale mesh jobs, ptgi_bounces=3, 22 TLAS builds, and 96 RT
dispatches. It reported rt_ms_per_frame=16.327, 353,894,400 dispatch threads
in primary_rays, 2,404,265 primary hits, 863,410 direct-lit and 1,540,855
shadowed pixels, 1,932,365 indirect-lit and 626,079 low-indirect pixels,
2,404,258 reconstructed-lit pixels, 632,564 reflection-covered and 632,564
reflection-lit pixels, 297,535 reconstructed penumbra pixels, zero invalid
pixels, and every native/visibility/PTGI/reflection marker true. Frame
p50/p95/max were 24.081/28.004/442.164 ms.
The final-boundary fixed-noon smoke completed 24 frames with nine resident
chunks, zero pending work, ptgi_bounces=3, rt_ms_per_frame=10.767, 1,017,402
primary hits, 431,231 direct-lit and 586,171 shadowed pixels, 303,369
indirect-lit and 744,071 low-indirect pixels, 1,017,398 reconstructed-lit pixels,
438,485 reflection-covered/lit pixels, 45,238 penumbra pixels, zero invalid
pixels, and all markers true. Fixed-midnight smoke retained the same resident
and pending counts plus the same primary-hit count with
rt_ms_per_frame=11.248, 431,228 direct-lit, 586,174 shadowed, 279,887
indirect-lit, 839,646 low-indirect, 960,442 reconstructed-lit, 438,485
reflection-covered, 429,973 reflection-lit, 53,592 penumbra, zero invalid
pixels, and all markers true.
On the same fixed-noon default96 command, host, and final boundary logic, a
temporary bounce-count-only one-bounce A/B reported
rt_ms_per_frame=12.870, frame p50/p95
20.960/23.583 ms, 2,137,634 indirect-lit, 507,522 low-indirect, and 2,404,265
reconstructed-lit pixels, with all validation markers true. The three-bounce
run reported 16.327 RT ms and p50/p95 24.081/28.004 ms, about 26.9% more RT
cost. Its 1,932,365 indirect-lit, 626,079 low-indirect, and 2,404,258
reconstructed-lit counts are not an unbiased energy comparison: terminal
residual is deferred until the final configured hit and side exits are
conservative. Frame maximum and load transients are not performance gates.
Both A/B runs came from a dirty source snapshot and are not clean evidence for
an exact release commit. Physical Vulkan execution of this exact three-bounce
workload remains pending.
The first Windows RTX interactive attempt reached Vulkan hybrid_rt, printed
ptgi_bounces=3, and loaded all registered voxel shaders, then returned
InvalidResourceBarrierState before the first live/metrics line. The async
no-producer frame had no TLAS, so RT plus temporal/a-trous dispatch was skipped
and both PTGI scratch images retained Vulkan's undefined layout. The HDR pass
then drew the sky before binding the terrain group, making the required sampled
layout transition illegal inside the active render pass. The current candidate
guards terrain and water-lighting binding until the first PTGI producer has
completed. Its focused test, Metal interactive startup, forced Vulkan build,
and Windows Vulkan cross-build pass. A follow-up interactive Windows RTX rerun
no longer reproduced the startup error. That confirms the immediate barrier
fix, but does not substitute for a bounded physical run with PTGI pixel metrics.
zig build run-capability-dump should report:
- selected backend and adapter identity;
- capability source;
- usable vkmtl features;
- native queried backend features;
- selected limits;
- representative format capabilities;
- requested and selected presentation state when a surface exists.
Native queried features may appear before vkmtl exposes a complete lowering. The usable section must stay conservative.
The bounded raster-only Metal pressure commands are:
MTL_DEBUG_LAYER=1 VKMTL_VOXEL_RT=off VKMTL_VOXEL_PROFILE=smoke \
VKMTL_VOXEL_FRAME_LIMIT=24 VKMTL_VOXEL_AUTOPILOT=1 \
VKMTL_BACKEND=metal zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_VOXEL_RT=off VKMTL_VOXEL_PROFILE=default \
VKMTL_VOXEL_FRAME_LIMIT=96 VKMTL_BACKEND=metal \
zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_VOXEL_RT=off VKMTL_VOXEL_PROFILE=stress \
VKMTL_VOXEL_FRAME_LIMIT=160 VKMTL_BACKEND=metal \
zig build run-voxel-worldEach run must print voxel_world_pressure_test=ok, drain pending rebuilds,
and remain within the current 9/169/289 resident bounds. The current scheduler
admits one background completion per interactive frame or two per finite frame
under the 8 MiB upload budget; upload and GPU work remain synchronous. The
durable older Metal observation used an Apple M4 Pro and the former bounded
upload/rebuild policy. Equivalent Vulkan pressure execution on 7d88ffe met
the then-current numeric bounds but used the inverted general raster path. The
post-correction historical rerun again passed smoke/default/stress at
9/81/289 resident chunks with zero pending work; the asymmetric top/bottom
pixel readback independently establishes corrected raster orientation.
The capability-gated material-bound Metal PTGI lane is:
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=smoke VKMTL_VOXEL_FRAME_LIMIT=24 \
VKMTL_VOXEL_AUTOPILOT=1 VKMTL_VOXEL_CYCLE_TIME=0 \
zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=default VKMTL_VOXEL_FRAME_LIMIT=96 \
VKMTL_VOXEL_CYCLE_TIME=150 \
zig build run-voxel-world
MTL_DEBUG_LAYER=1 VKMTL_BACKEND=metal VKMTL_VOXEL_RT=required \
VKMTL_VOXEL_PROFILE=smoke VKMTL_VOXEL_FRAME_LIMIT=300 \
VKMTL_VOXEL_AUTOPILOT=1 VKMTL_VOXEL_CYCLE_TIME=0 \
zig build run-voxel-worldThese are the current fixed-phase commands. The earlier recorded Metal runs
printed native submission, direct-visibility and PTGI validation,
reconstructed radiance, zero invalid pixels, and the bounded success marker
under the former 60-second clock; its exact 30-second noon command remains in
the historical record above. The Vulkan physical material-bound lane remains
pending as described in the PTGI record above.
macos_moltenvk_forced is an optional forced-backend build and requires
explicit loader and ICD configuration:
zig build -Dvulkan \
-Dvulkan-loader-dir=/path/to/vulkan/lib \
-Dvulkan-icd=/path/to/MoltenVK_icd.jsonIt is for backend testing and is not the default macOS release target.
The ios_metal_optional planning command is:
zig build -Dtarget=aarch64-iosThat row remains planning metadata until platform surface packaging is designed.
The windowed feature-gate bundle is:
VKMTL_PIXEL_REGRESSION=1 zig build run-bindless-textures
zig build run-multi-window
zig build run-external-texture
zig build run-streaming-textureEach example must preserve a typed unsupported result when its selected-device gate is closed. A successful planning screen is not native feature execution.
zig build run-ray-tracing-maintenance provides headless physical evidence for
build, update/refit, compact-copy, AABB, and multi-source acceleration
structure work. It does not imply executable ray query, callable SBT records,
or Metal custom-intersection function tables.
Every physical release bundle should include:
- the full Git commit and clean/dirty worktree state;
- Zig version and target triple;
- operating system and architecture;
- selected backend, adapter, driver, and native API version when available;
- capability dump before the workload;
- the exact command and relevant environment variables;
- stdout/stderr without truncating the success or error marker;
- deterministic readback values, deltas, and tolerances where applicable;
- screenshots only when visual evidence is part of the gate.
Review must distinguish:
- compilation from driver execution;
- process completion from pixel correctness;
- offscreen readback from drawable readback;
- a quiet log from an enabled validation layer;
- native feature discovery from usable vkmtl support;
- fallback output from native execution;
- named-host observations from portable requirements;
- historical exact-commit evidence from current release evidence.
Failures should preserve the typed vkmtl error and classify the broad category
as device_lost, surface_lost, validation, unsupported_feature, or
another explicit class. Do not turn an unexpected failure into a skip merely
because another backend passes.
A release candidate is ready only when every required hosted and physical gate is observed against the exact candidate commit, the worktree is clean, public API and semantic inventories pass their guards, the external package consumer passes, and no supported capability has been promoted from planning or build evidence alone.
Optional device-specific lanes may remain unavailable when their capability is not part of the portable release promise. Their unavailable status and typed behavior must remain documented.
The current durable state is:
- the historical Period 44 and v0.1.0 nine-gate records are complete;
- current Metal caller-owned RT, presentation selection, raw-copy, API Validation, and asymmetric 5x2 readback evidence is recorded;
- current Vulkan canonical and legacy RT execution and visual orientation are accepted;
- clean-commit Windows Vulkan HeadlessContext and 5x2 composition execution is recorded on an RTX 5080, while its old general raster path was vertically inverted;
- corrected physical Vulkan asymmetric raster/cull and composition readback both report top-left orientation with zero channel delta, and all three voxel profiles pass their pressure bounds;
- the historical pre-PTGI textured hybrid voxel route passed Metal smoke/default with 9/49 indexed chunk sources, native submission, drain/final-frame visibility readback, and a 300-frame non-zero soak; it remains historical evidence rather than the current material-bound contract;
- the material-bound PTGI source passes the deterministic test suite, the
ordinary and forced Vulkan builds, and Metal API Validation on an Apple M4
Pro. The earlier translucent-water rerun retained complete 9/81-source
smoke/default TLAS sets. The superseding screen-space-refraction,
Beer-Lambert absorption/in-scattering, and opaque-TLAS reflection route,
including the clean-room E12-inspired water and atmosphere/cloud refinement,
completed a fixed-noon
15024-frame Metal API Validation smoke with 24 dispatches, 88,473,600 rays, 1,017,402 primary hits, 438,485 reflection- covered and lit pixels, native submission, PTGI/visibility/reflection validation, zero invalid pixels, andrt_ms=9.992. Its forced Vulkan build is compilation evidence only. A fixed-midnight024-frame lane retained 438,485 covered pixels and reported 429,962 lit pixels with the same ray/hit counts, zero-invalid result, all markers, andrt_ms=9.547. Physical Vulkan PTGI/water/atmosphere execution remains pending. The superseding 96-frame fixed-noon default run drained and traced all 169 current default chunks, built 169 BLAS and 22 batched TLAS versions, submitted 353,894,400 rays, retained zero invalid pixels and every validation marker, and reported 169/169/0/0 submitted/completed/failed/stale CPU mesh jobs. Its matching raster lane also drained 169 chunks. The current three-bounce default rerun retained the same 169 chunks, job counts, 22 TLAS builds, 96 dispatches, and zero-invalid/all-markers result withptgi_bounces=3;primary_rayscounted 353,894,400 dispatch threads, reconstructed radiance covered 2,404,258 pixels, andrt_ms_per_frame=16.327after complete-square TLAS-boundary publication and terrain-top-only environment correction. These current development observations are not clean candidate evidence; - representative night/twilight/day frames, FPS, and the ESC overlay remain visually accepted on Metal, while current physical Vulkan presentation and material-bound PTGI evidence remain pending;
- every required lane must still be refreshed on the exact clean future release commit.