kronos_compute/implementation/
buffer.rs1use crate::sys::*;
4use crate::core::*;
5use crate::ffi::*;
6use std::ptr;
7use std::sync::atomic::{AtomicU64, Ordering};
8use std::sync::Mutex;
9use std::collections::HashMap;
10
11static BUFFER_COUNTER: AtomicU64 = AtomicU64::new(1);
13
14lazy_static::lazy_static! {
16 static ref BUFFERS: Mutex<HashMap<u64, BufferData>> = Mutex::new(HashMap::new());
17}
18
19struct BufferData {
20 device: VkDevice,
21 size: VkDeviceSize,
22 usage: VkBufferUsageFlags,
23 sharing_mode: VkSharingMode,
24 memory: Option<VkDeviceMemory>,
25 memory_offset: VkDeviceSize,
26}
27
28#[no_mangle]
30pub unsafe extern "C" fn vkCreateBuffer(
31 device: VkDevice,
32 pCreateInfo: *const VkBufferCreateInfo,
33 _pAllocator: *const VkAllocationCallbacks,
34 pBuffer: *mut VkBuffer,
35) -> VkResult {
36 log::info!("=== KRONOS vkCreateBuffer called (Pure Rust) ===");
37
38 if device.is_null() || pCreateInfo.is_null() || pBuffer.is_null() {
39 return VkResult::ErrorInitializationFailed;
40 }
41
42 let create_info = &*pCreateInfo;
43
44 if create_info.size == 0 {
46 return VkResult::ErrorInitializationFailed;
47 }
48
49 let allowed_usage = VkBufferUsageFlags::STORAGE_BUFFER
51 | VkBufferUsageFlags::TRANSFER_SRC
52 | VkBufferUsageFlags::TRANSFER_DST
53 | VkBufferUsageFlags::UNIFORM_BUFFER;
54
55 if !allowed_usage.contains(create_info.usage) {
56 log::warn!("Buffer usage {:?} contains unsupported flags", create_info.usage);
57 }
58
59 let handle = BUFFER_COUNTER.fetch_add(1, Ordering::SeqCst);
61
62 let buffer_data = BufferData {
64 device,
65 size: create_info.size,
66 usage: create_info.usage,
67 sharing_mode: create_info.sharingMode,
68 memory: None,
69 memory_offset: 0,
70 };
71
72 BUFFERS.lock().unwrap().insert(handle, buffer_data);
73
74 *pBuffer = VkBuffer::from_raw(handle);
75
76 log::info!("Created buffer {:?} with size {}", handle, create_info.size);
77
78 VkResult::Success
79}
80
81#[no_mangle]
83pub unsafe extern "C" fn vkDestroyBuffer(
84 device: VkDevice,
85 buffer: VkBuffer,
86 _pAllocator: *const VkAllocationCallbacks,
87) {
88 if device.is_null() || buffer.is_null() {
89 return;
90 }
91
92 let handle = buffer.as_raw();
93 BUFFERS.lock().unwrap().remove(&handle);
94
95 log::info!("Destroyed buffer {:?}", handle);
96}
97
98#[no_mangle]
100pub unsafe extern "C" fn vkGetBufferMemoryRequirements(
101 device: VkDevice,
102 buffer: VkBuffer,
103 pMemoryRequirements: *mut VkMemoryRequirements,
104) {
105 if device.is_null() || buffer.is_null() || pMemoryRequirements.is_null() {
106 return;
107 }
108
109 let handle = buffer.as_raw();
110 if let Some(buffer_data) = BUFFERS.lock().unwrap().get(&handle) {
111 let requirements = &mut *pMemoryRequirements;
112
113 requirements.alignment = 256; requirements.size = (buffer_data.size + 255) & !255; requirements.memoryTypeBits = 0xFFFFFFFF;
119 }
120}
121
122#[no_mangle]
124pub unsafe extern "C" fn vkBindBufferMemory(
125 device: VkDevice,
126 buffer: VkBuffer,
127 memory: VkDeviceMemory,
128 memoryOffset: VkDeviceSize,
129) -> VkResult {
130 if device.is_null() || buffer.is_null() || memory.is_null() {
131 return VkResult::ErrorInitializationFailed;
132 }
133
134 let handle = buffer.as_raw();
135 if let Some(buffer_data) = BUFFERS.lock().unwrap().get_mut(&handle) {
136 buffer_data.memory = Some(memory);
137 buffer_data.memory_offset = memoryOffset;
138
139 log::info!("Bound memory {:?} to buffer {:?} at offset {}",
140 memory.as_raw(), handle, memoryOffset);
141
142 VkResult::Success
143 } else {
144 VkResult::ErrorDeviceLost
145 }
146}