From a868378b996caf682c1b342b0ce25221b9632bac Mon Sep 17 00:00:00 2001 From: Orkuncakilkaya Date: Tue, 15 Sep 2026 20:22:12 +0300 Subject: [PATCH] feat(vk): call shapes for the acceleration-structure commands the interposer lacks NVIDIA Streamline's interposer exports none of VK_KHR_acceleration_structure's commands, so ray tracing looks each up per device with vkGetDeviceProcAddr and calls it through a pointer: create (four pointers -> result), destroy (device, handle, allocator), build sizes (device, type, info, counts, sizes), the command-buffer build (buffer, count, infos, ranges) and the device address (device, info -> u64). Both runtimes assemble; nothing uses them yet. Co-Authored-By: Claude Opus 5 --- runtime/native/vk.ludic | 7 +++++++ runtime/native/vk_mac.ll | 32 ++++++++++++++++++++++++++++++++ runtime/native/vk_win.ll | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/runtime/native/vk.ludic b/runtime/native/vk.ludic index 7ad3fdfd..2a6985ac 100644 --- a/runtime/native/vk.ludic +++ b/runtime/native/vk.ludic @@ -46,3 +46,10 @@ extern function vk_sl_call_ip(fn: pointer, a: int, b: pointer) -> int = "lsl_cal # a command-buffer command with three counts through a pointer (vkCmdDrawMeshTasksEXT, which the # Streamline interposer does not export; looked up with vkGetDeviceProcAddr) extern function vk_sl_call_piii(fn: pointer, a: pointer, b: int, c: int, d: int) = "lsl_call_piii" + +# acceleration-structure commands through a pointer from vkGetDeviceProcAddr (the interposer exports none) +extern function vk_sl_call_pppp(fn: pointer, a: pointer, b: pointer, c: pointer, d: pointer) -> int = "lsl_call_pppp" +extern function vk_sl_call_plp(fn: pointer, a: pointer, b: long, c: pointer) = "lsl_call_plp" +extern function vk_sl_call_pippp(fn: pointer, a: pointer, b: int, c: pointer, d: pointer, e: pointer) = "lsl_call_pippp" +extern function vk_sl_call_pipp(fn: pointer, a: pointer, b: int, c: pointer, d: pointer) = "lsl_call_pipp" +extern function vk_sl_call_pp_l(fn: pointer, a: pointer, b: pointer) -> long = "lsl_call_pp_l" diff --git a/runtime/native/vk_mac.ll b/runtime/native/vk_mac.ll index 52c27be3..51c976db 100644 --- a/runtime/native/vk_mac.ll +++ b/runtime/native/vk_mac.ll @@ -190,3 +190,35 @@ entry: call void %fn(ptr %a0, i32 %a1, i32 %a2, i32 %a3) ret void } + +; ---- acceleration structures: commands the Streamline interposer does not export -------------------- +; vkCreateAccelerationStructureKHR(device, info, allocator, out) -> VkResult +define i32 @lsl_call_pppp(ptr %fn, ptr %a0, ptr %a1, ptr %a2, ptr %a3) { +entry: + %r = call i32 %fn(ptr %a0, ptr %a1, ptr %a2, ptr %a3) + ret i32 %r +} +; vkDestroyAccelerationStructureKHR(device, handle, allocator) +define void @lsl_call_plp(ptr %fn, ptr %a0, i64 %a1, ptr %a2) { +entry: + call void %fn(ptr %a0, i64 %a1, ptr %a2) + ret void +} +; vkGetAccelerationStructureBuildSizesKHR(device, buildType, info, maxPrimitiveCounts, sizes) +define void @lsl_call_pippp(ptr %fn, ptr %a0, i32 %a1, ptr %a2, ptr %a3, ptr %a4) { +entry: + call void %fn(ptr %a0, i32 %a1, ptr %a2, ptr %a3, ptr %a4) + ret void +} +; vkCmdBuildAccelerationStructuresKHR(commandBuffer, infoCount, infos, buildRangeInfos) +define void @lsl_call_pipp(ptr %fn, ptr %a0, i32 %a1, ptr %a2, ptr %a3) { +entry: + call void %fn(ptr %a0, i32 %a1, ptr %a2, ptr %a3) + ret void +} +; vkGetAccelerationStructureDeviceAddressKHR(device, info) -> VkDeviceAddress +define i64 @lsl_call_pp_l(ptr %fn, ptr %a0, ptr %a1) { +entry: + %r = call i64 %fn(ptr %a0, ptr %a1) + ret i64 %r +} diff --git a/runtime/native/vk_win.ll b/runtime/native/vk_win.ll index 1d816b94..5bca3814 100644 --- a/runtime/native/vk_win.ll +++ b/runtime/native/vk_win.ll @@ -331,3 +331,35 @@ entry: call void %fn(ptr %a0, i32 %a1, i32 %a2, i32 %a3) ret void } + +; ---- acceleration structures: commands the Streamline interposer does not export -------------------- +; vkCreateAccelerationStructureKHR(device, info, allocator, out) -> VkResult +define i32 @lsl_call_pppp(ptr %fn, ptr %a0, ptr %a1, ptr %a2, ptr %a3) { +entry: + %r = call i32 %fn(ptr %a0, ptr %a1, ptr %a2, ptr %a3) + ret i32 %r +} +; vkDestroyAccelerationStructureKHR(device, handle, allocator) +define void @lsl_call_plp(ptr %fn, ptr %a0, i64 %a1, ptr %a2) { +entry: + call void %fn(ptr %a0, i64 %a1, ptr %a2) + ret void +} +; vkGetAccelerationStructureBuildSizesKHR(device, buildType, info, maxPrimitiveCounts, sizes) +define void @lsl_call_pippp(ptr %fn, ptr %a0, i32 %a1, ptr %a2, ptr %a3, ptr %a4) { +entry: + call void %fn(ptr %a0, i32 %a1, ptr %a2, ptr %a3, ptr %a4) + ret void +} +; vkCmdBuildAccelerationStructuresKHR(commandBuffer, infoCount, infos, buildRangeInfos) +define void @lsl_call_pipp(ptr %fn, ptr %a0, i32 %a1, ptr %a2, ptr %a3) { +entry: + call void %fn(ptr %a0, i32 %a1, ptr %a2, ptr %a3) + ret void +} +; vkGetAccelerationStructureDeviceAddressKHR(device, info) -> VkDeviceAddress +define i64 @lsl_call_pp_l(ptr %fn, ptr %a0, ptr %a1) { +entry: + %r = call i64 %fn(ptr %a0, ptr %a1) + ret i64 %r +}