kronos_compute/ffi/
mod.rs

1//! Foreign Function Interface for Kronos
2//! 
3//! This module provides C-compatible function signatures for interop
4
5use std::ffi::{c_char, c_void};
6use crate::sys::*;
7use crate::core::*;
8
9// Vulkan error constants
10pub const VK_ERROR_OUT_OF_POOL_MEMORY: i32 = -1000069000;
11
12/// Result codes for Kronos API operations
13#[repr(i32)]
14#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
15pub enum VkResult {
16    Success = 0,
17    NotReady = 1,
18    Timeout = 2,
19    EventSet = 3,
20    EventReset = 4,
21    Incomplete = 5,
22    ErrorOutOfHostMemory = -1,
23    ErrorOutOfDeviceMemory = -2,
24    ErrorInitializationFailed = -3,
25    ErrorDeviceLost = -4,
26    ErrorMemoryMapFailed = -5,
27    ErrorLayerNotPresent = -6,
28    ErrorExtensionNotPresent = -7,
29    ErrorFeatureNotPresent = -8,
30    ErrorIncompatibleDriver = -9,
31    ErrorTooManyObjects = -10,
32    ErrorFormatNotSupported = -11,
33    ErrorFragmentedPool = -12,
34    ErrorUnknown = -13,
35    ErrorOutOfPoolMemory = VK_ERROR_OUT_OF_POOL_MEMORY,
36}
37
38/// Allocation callbacks (optional)
39#[repr(C)]
40#[derive(Debug, Clone, Copy)]
41pub struct VkAllocationCallbacks {
42    pub pUserData: *mut c_void,
43    pub pfnAllocation: Option<unsafe extern "C" fn(*mut c_void, usize, usize, VkSystemAllocationScope) -> *mut c_void>,
44    pub pfnReallocation: Option<unsafe extern "C" fn(*mut c_void, *mut c_void, usize, usize, VkSystemAllocationScope) -> *mut c_void>,
45    pub pfnFree: Option<unsafe extern "C" fn(*mut c_void, *mut c_void)>,
46    pub pfnInternalAllocation: Option<unsafe extern "C" fn(*mut c_void, usize, VkInternalAllocationType, VkSystemAllocationScope)>,
47    pub pfnInternalFree: Option<unsafe extern "C" fn(*mut c_void, usize, VkInternalAllocationType, VkSystemAllocationScope)>,
48}
49
50// VkAllocationCallbacks contains function pointers that are safe to send between threads
51unsafe impl Send for VkAllocationCallbacks {}
52unsafe impl Sync for VkAllocationCallbacks {}
53
54#[repr(i32)]
55#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
56pub enum VkSystemAllocationScope {
57    Command = 0,
58    Object = 1,
59    Cache = 2,
60    Device = 3,
61    Instance = 4,
62}
63
64#[repr(i32)]
65#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
66pub enum VkInternalAllocationType {
67    Executable = 0,
68}
69
70// Function pointer types
71pub type PFN_vkVoidFunction = Option<unsafe extern "C" fn()>;
72
73// Core function pointers
74pub type PFN_vkGetInstanceProcAddr = Option<unsafe extern "C" fn(
75    instance: VkInstance,
76    pName: *const c_char,
77) -> PFN_vkVoidFunction>;
78
79pub type PFN_vkGetDeviceProcAddr = Option<unsafe extern "C" fn(
80    device: VkDevice,
81    pName: *const c_char,
82) -> PFN_vkVoidFunction>;
83
84// Instance functions
85pub type PFN_vkCreateInstance = Option<unsafe extern "C" fn(
86    pCreateInfo: *const VkInstanceCreateInfo,
87    pAllocator: *const VkAllocationCallbacks,
88    pInstance: *mut VkInstance,
89) -> VkResult>;
90
91pub type PFN_vkDestroyInstance = Option<unsafe extern "C" fn(
92    instance: VkInstance,
93    pAllocator: *const VkAllocationCallbacks,
94)>;
95
96pub type PFN_vkEnumeratePhysicalDevices = Option<unsafe extern "C" fn(
97    instance: VkInstance,
98    pPhysicalDeviceCount: *mut u32,
99    pPhysicalDevices: *mut VkPhysicalDevice,
100) -> VkResult>;
101
102pub type PFN_vkGetPhysicalDeviceProperties = Option<unsafe extern "C" fn(
103    physicalDevice: VkPhysicalDevice,
104    pProperties: *mut VkPhysicalDeviceProperties,
105)>;
106
107pub type PFN_vkGetPhysicalDeviceQueueFamilyProperties = Option<unsafe extern "C" fn(
108    physicalDevice: VkPhysicalDevice,
109    pQueueFamilyPropertyCount: *mut u32,
110    pQueueFamilyProperties: *mut VkQueueFamilyProperties,
111)>;
112
113pub type PFN_vkGetPhysicalDeviceMemoryProperties = Option<unsafe extern "C" fn(
114    physicalDevice: VkPhysicalDevice,
115    pMemoryProperties: *mut VkPhysicalDeviceMemoryProperties,
116)>;
117
118pub type PFN_vkGetPhysicalDeviceFeatures = Option<unsafe extern "C" fn(
119    physicalDevice: VkPhysicalDevice,
120    pFeatures: *mut VkPhysicalDeviceFeatures,
121)>;
122
123// Device functions
124pub type PFN_vkCreateDevice = Option<unsafe extern "C" fn(
125    physicalDevice: VkPhysicalDevice,
126    pCreateInfo: *const VkDeviceCreateInfo,
127    pAllocator: *const VkAllocationCallbacks,
128    pDevice: *mut VkDevice,
129) -> VkResult>;
130
131pub type PFN_vkDestroyDevice = Option<unsafe extern "C" fn(
132    device: VkDevice,
133    pAllocator: *const VkAllocationCallbacks,
134)>;
135
136pub type PFN_vkGetDeviceQueue = Option<unsafe extern "C" fn(
137    device: VkDevice,
138    queueFamilyIndex: u32,
139    queueIndex: u32,
140    pQueue: *mut VkQueue,
141)>;
142
143pub type PFN_vkQueueSubmit = Option<unsafe extern "C" fn(
144    queue: VkQueue,
145    submitCount: u32,
146    pSubmits: *const VkSubmitInfo,
147    fence: VkFence,
148) -> VkResult>;
149
150pub type PFN_vkQueueWaitIdle = Option<unsafe extern "C" fn(
151    queue: VkQueue,
152) -> VkResult>;
153
154pub type PFN_vkDeviceWaitIdle = Option<unsafe extern "C" fn(
155    device: VkDevice,
156) -> VkResult>;
157
158// Memory functions
159pub type PFN_vkAllocateMemory = Option<unsafe extern "C" fn(
160    device: VkDevice,
161    pAllocateInfo: *const VkMemoryAllocateInfo,
162    pAllocator: *const VkAllocationCallbacks,
163    pMemory: *mut VkDeviceMemory,
164) -> VkResult>;
165
166pub type PFN_vkFreeMemory = Option<unsafe extern "C" fn(
167    device: VkDevice,
168    memory: VkDeviceMemory,
169    pAllocator: *const VkAllocationCallbacks,
170)>;
171
172pub type PFN_vkMapMemory = Option<unsafe extern "C" fn(
173    device: VkDevice,
174    memory: VkDeviceMemory,
175    offset: VkDeviceSize,
176    size: VkDeviceSize,
177    flags: VkMemoryMapFlags,
178    ppData: *mut *mut c_void,
179) -> VkResult>;
180
181pub type PFN_vkUnmapMemory = Option<unsafe extern "C" fn(
182    device: VkDevice,
183    memory: VkDeviceMemory,
184)>;
185
186// Buffer functions
187pub type PFN_vkCreateBuffer = Option<unsafe extern "C" fn(
188    device: VkDevice,
189    pCreateInfo: *const VkBufferCreateInfo,
190    pAllocator: *const VkAllocationCallbacks,
191    pBuffer: *mut VkBuffer,
192) -> VkResult>;
193
194pub type PFN_vkDestroyBuffer = Option<unsafe extern "C" fn(
195    device: VkDevice,
196    buffer: VkBuffer,
197    pAllocator: *const VkAllocationCallbacks,
198)>;
199
200pub type PFN_vkGetBufferMemoryRequirements = Option<unsafe extern "C" fn(
201    device: VkDevice,
202    buffer: VkBuffer,
203    pMemoryRequirements: *mut VkMemoryRequirements,
204)>;
205
206pub type PFN_vkBindBufferMemory = Option<unsafe extern "C" fn(
207    device: VkDevice,
208    buffer: VkBuffer,
209    memory: VkDeviceMemory,
210    memoryOffset: VkDeviceSize,
211) -> VkResult>;
212
213// Command functions
214pub type PFN_vkCreateCommandPool = Option<unsafe extern "C" fn(
215    device: VkDevice,
216    pCreateInfo: *const VkCommandPoolCreateInfo,
217    pAllocator: *const VkAllocationCallbacks,
218    pCommandPool: *mut VkCommandPool,
219) -> VkResult>;
220
221pub type PFN_vkDestroyCommandPool = Option<unsafe extern "C" fn(
222    device: VkDevice,
223    commandPool: VkCommandPool,
224    pAllocator: *const VkAllocationCallbacks,
225)>;
226
227pub type PFN_vkAllocateCommandBuffers = Option<unsafe extern "C" fn(
228    device: VkDevice,
229    pAllocateInfo: *const VkCommandBufferAllocateInfo,
230    pCommandBuffers: *mut VkCommandBuffer,
231) -> VkResult>;
232
233pub type PFN_vkFreeCommandBuffers = Option<unsafe extern "C" fn(
234    device: VkDevice,
235    commandPool: VkCommandPool,
236    commandBufferCount: u32,
237    pCommandBuffers: *const VkCommandBuffer,
238)>;
239
240pub type PFN_vkBeginCommandBuffer = Option<unsafe extern "C" fn(
241    commandBuffer: VkCommandBuffer,
242    pBeginInfo: *const VkCommandBufferBeginInfo,
243) -> VkResult>;
244
245pub type PFN_vkEndCommandBuffer = Option<unsafe extern "C" fn(
246    commandBuffer: VkCommandBuffer,
247) -> VkResult>;
248
249// Command buffer commands
250pub type PFN_vkCmdCopyBuffer = Option<unsafe extern "C" fn(
251    commandBuffer: VkCommandBuffer,
252    srcBuffer: VkBuffer,
253    dstBuffer: VkBuffer,
254    regionCount: u32,
255    pRegions: *const VkBufferCopy,
256)>;
257
258pub type PFN_vkCmdPipelineBarrier = Option<unsafe extern "C" fn(
259    commandBuffer: VkCommandBuffer,
260    srcStageMask: VkPipelineStageFlags,
261    dstStageMask: VkPipelineStageFlags,
262    dependencyFlags: VkDependencyFlags,
263    memoryBarrierCount: u32,
264    pMemoryBarriers: *const VkMemoryBarrier,
265    bufferMemoryBarrierCount: u32,
266    pBufferMemoryBarriers: *const VkBufferMemoryBarrier,
267    imageMemoryBarrierCount: u32,
268    pImageMemoryBarriers: *const c_void, // We don't support images
269)>;
270
271pub type PFN_vkCmdBindPipeline = Option<unsafe extern "C" fn(
272    commandBuffer: VkCommandBuffer,
273    pipelineBindPoint: VkPipelineBindPoint,
274    pipeline: VkPipeline,
275)>;
276
277pub type PFN_vkCmdBindDescriptorSets = Option<unsafe extern "C" fn(
278    commandBuffer: VkCommandBuffer,
279    pipelineBindPoint: VkPipelineBindPoint,
280    layout: VkPipelineLayout,
281    firstSet: u32,
282    descriptorSetCount: u32,
283    pDescriptorSets: *const VkDescriptorSet,
284    dynamicOffsetCount: u32,
285    pDynamicOffsets: *const u32,
286)>;
287
288pub type PFN_vkCmdDispatch = Option<unsafe extern "C" fn(
289    commandBuffer: VkCommandBuffer,
290    groupCountX: u32,
291    groupCountY: u32,
292    groupCountZ: u32,
293)>;
294
295// Synchronization functions
296pub type PFN_vkCreateFence = Option<unsafe extern "C" fn(
297    device: VkDevice,
298    pCreateInfo: *const VkFenceCreateInfo,
299    pAllocator: *const VkAllocationCallbacks,
300    pFence: *mut VkFence,
301) -> VkResult>;
302
303pub type PFN_vkDestroyFence = Option<unsafe extern "C" fn(
304    device: VkDevice,
305    fence: VkFence,
306    pAllocator: *const VkAllocationCallbacks,
307)>;
308
309pub type PFN_vkResetFences = Option<unsafe extern "C" fn(
310    device: VkDevice,
311    fenceCount: u32,
312    pFences: *const VkFence,
313) -> VkResult>;
314
315pub type PFN_vkGetFenceStatus = Option<unsafe extern "C" fn(
316    device: VkDevice,
317    fence: VkFence,
318) -> VkResult>;
319
320pub type PFN_vkWaitForFences = Option<unsafe extern "C" fn(
321    device: VkDevice,
322    fenceCount: u32,
323    pFences: *const VkFence,
324    waitAll: VkBool32,
325    timeout: u64,
326) -> VkResult>;
327
328pub type PFN_vkCreateSemaphore = Option<unsafe extern "C" fn(
329    device: VkDevice,
330    pCreateInfo: *const VkSemaphoreCreateInfo,
331    pAllocator: *const VkAllocationCallbacks,
332    pSemaphore: *mut VkSemaphore,
333) -> VkResult>;
334
335pub type PFN_vkDestroySemaphore = Option<unsafe extern "C" fn(
336    device: VkDevice,
337    semaphore: VkSemaphore,
338    pAllocator: *const VkAllocationCallbacks,
339)>;
340
341pub type PFN_vkCreateEvent = Option<unsafe extern "C" fn(
342    device: VkDevice,
343    pCreateInfo: *const VkEventCreateInfo,
344    pAllocator: *const VkAllocationCallbacks,
345    pEvent: *mut VkEvent,
346) -> VkResult>;
347
348pub type PFN_vkDestroyEvent = Option<unsafe extern "C" fn(
349    device: VkDevice,
350    event: VkEvent,
351    pAllocator: *const VkAllocationCallbacks,
352)>;
353
354pub type PFN_vkGetEventStatus = Option<unsafe extern "C" fn(
355    device: VkDevice,
356    event: VkEvent,
357) -> VkResult>;
358
359pub type PFN_vkSetEvent = Option<unsafe extern "C" fn(
360    device: VkDevice,
361    event: VkEvent,
362) -> VkResult>;
363
364pub type PFN_vkResetEvent = Option<unsafe extern "C" fn(
365    device: VkDevice,
366    event: VkEvent,
367) -> VkResult>;
368
369pub type PFN_vkCmdSetEvent = Option<unsafe extern "C" fn(
370    commandBuffer: VkCommandBuffer,
371    event: VkEvent,
372    stageMask: VkPipelineStageFlags,
373)>;
374
375pub type PFN_vkCmdResetEvent = Option<unsafe extern "C" fn(
376    commandBuffer: VkCommandBuffer,
377    event: VkEvent,
378    stageMask: VkPipelineStageFlags,
379)>;
380
381pub type PFN_vkCmdWaitEvents = Option<unsafe extern "C" fn(
382    commandBuffer: VkCommandBuffer,
383    eventCount: u32,
384    pEvents: *const VkEvent,
385    srcStageMask: VkPipelineStageFlags,
386    dstStageMask: VkPipelineStageFlags,
387    memoryBarrierCount: u32,
388    pMemoryBarriers: *const VkMemoryBarrier,
389    bufferMemoryBarrierCount: u32,
390    pBufferMemoryBarriers: *const VkBufferMemoryBarrier,
391    imageMemoryBarrierCount: u32,
392    pImageMemoryBarriers: *const c_void,
393)>;
394
395pub type PFN_vkCmdDispatchIndirect = Option<unsafe extern "C" fn(
396    commandBuffer: VkCommandBuffer,
397    buffer: VkBuffer,
398    offset: VkDeviceSize,
399)>;
400
401// Compute pipeline functions
402pub type PFN_vkCreateShaderModule = Option<unsafe extern "C" fn(
403    device: VkDevice,
404    pCreateInfo: *const VkShaderModuleCreateInfo,
405    pAllocator: *const VkAllocationCallbacks,
406    pShaderModule: *mut VkShaderModule,
407) -> VkResult>;
408
409pub type PFN_vkDestroyShaderModule = Option<unsafe extern "C" fn(
410    device: VkDevice,
411    shaderModule: VkShaderModule,
412    pAllocator: *const VkAllocationCallbacks,
413)>;
414
415pub type PFN_vkCreateComputePipelines = Option<unsafe extern "C" fn(
416    device: VkDevice,
417    pipelineCache: VkPipelineCache,
418    createInfoCount: u32,
419    pCreateInfos: *const VkComputePipelineCreateInfo,
420    pAllocator: *const VkAllocationCallbacks,
421    pPipelines: *mut VkPipeline,
422) -> VkResult>;
423
424pub type PFN_vkDestroyPipeline = Option<unsafe extern "C" fn(
425    device: VkDevice,
426    pipeline: VkPipeline,
427    pAllocator: *const VkAllocationCallbacks,
428)>;
429
430pub type PFN_vkCreatePipelineLayout = Option<unsafe extern "C" fn(
431    device: VkDevice,
432    pCreateInfo: *const VkPipelineLayoutCreateInfo,
433    pAllocator: *const VkAllocationCallbacks,
434    pPipelineLayout: *mut VkPipelineLayout,
435) -> VkResult>;
436
437pub type PFN_vkDestroyPipelineLayout = Option<unsafe extern "C" fn(
438    device: VkDevice,
439    pipelineLayout: VkPipelineLayout,
440    pAllocator: *const VkAllocationCallbacks,
441)>;
442
443// Descriptor functions
444pub type PFN_vkCreateDescriptorSetLayout = Option<unsafe extern "C" fn(
445    device: VkDevice,
446    pCreateInfo: *const VkDescriptorSetLayoutCreateInfo,
447    pAllocator: *const VkAllocationCallbacks,
448    pSetLayout: *mut VkDescriptorSetLayout,
449) -> VkResult>;
450
451pub type PFN_vkDestroyDescriptorSetLayout = Option<unsafe extern "C" fn(
452    device: VkDevice,
453    descriptorSetLayout: VkDescriptorSetLayout,
454    pAllocator: *const VkAllocationCallbacks,
455)>;
456
457pub type PFN_vkCreateDescriptorPool = Option<unsafe extern "C" fn(
458    device: VkDevice,
459    pCreateInfo: *const VkDescriptorPoolCreateInfo,
460    pAllocator: *const VkAllocationCallbacks,
461    pDescriptorPool: *mut VkDescriptorPool,
462) -> VkResult>;
463
464pub type PFN_vkDestroyDescriptorPool = Option<unsafe extern "C" fn(
465    device: VkDevice,
466    descriptorPool: VkDescriptorPool,
467    pAllocator: *const VkAllocationCallbacks,
468)>;
469
470pub type PFN_vkAllocateDescriptorSets = Option<unsafe extern "C" fn(
471    device: VkDevice,
472    pAllocateInfo: *const VkDescriptorSetAllocateInfo,
473    pDescriptorSets: *mut VkDescriptorSet,
474) -> VkResult>;
475
476pub type PFN_vkUpdateDescriptorSets = Option<unsafe extern "C" fn(
477    device: VkDevice,
478    descriptorWriteCount: u32,
479    pDescriptorWrites: *const VkWriteDescriptorSet,
480    descriptorCopyCount: u32,
481    pDescriptorCopies: *const VkCopyDescriptorSet,
482)>;