use kronos::*;
use std::ffi::CString;
use std::ptr;
fn main() {
println!("Kronos Rust Implementation Test");
println!("================================");
unsafe {
let app_name = CString::new("Kronos Rust Implementation Test").unwrap();
let engine_name = CString::new("Kronos Native").unwrap();
let app_info = VkApplicationInfo {
sType: VkStructureType::ApplicationInfo,
pNext: ptr::null(),
pApplicationName: app_name.as_ptr(),
applicationVersion: make_version(1, 0, 0),
pEngineName: engine_name.as_ptr(),
engineVersion: KRONOS_API_VERSION,
apiVersion: VK_API_VERSION_1_0,
};
let create_info = VkInstanceCreateInfo {
sType: VkStructureType::InstanceCreateInfo,
pNext: ptr::null(),
flags: 0,
pApplicationInfo: &app_info,
enabledLayerCount: 0,
ppEnabledLayerNames: ptr::null(),
enabledExtensionCount: 0,
ppEnabledExtensionNames: ptr::null(),
};
let mut instance = VkInstance::NULL;
let result = kronos::implementation::instance::vkCreateInstance(
&create_info,
ptr::null(),
&mut instance
);
println!("✓ Instance created: {:?} (handle: {})", result, instance.as_raw());
let mut device_count = 0;
kronos::implementation::instance::vkEnumeratePhysicalDevices(
instance,
&mut device_count,
ptr::null_mut()
);
println!("✓ Found {} physical device(s)", device_count);
let mut devices = vec![VkPhysicalDevice::NULL; device_count as usize];
kronos::implementation::instance::vkEnumeratePhysicalDevices(
instance,
&mut device_count,
devices.as_mut_ptr()
);
let physical_device = devices[0];
let mut properties = std::mem::zeroed::<VkPhysicalDeviceProperties>();
kronos::implementation::instance::vkGetPhysicalDeviceProperties(
physical_device,
&mut properties
);
let device_name = std::ffi::CStr::from_ptr(properties.deviceName.as_ptr())
.to_string_lossy();
println!("✓ Device: {}", device_name);
println!(" Type: {:?}", properties.deviceType);
println!(" Vendor ID: 0x{:04X}", properties.vendorID);
let queue_priority = 1.0f32;
let queue_info = VkDeviceQueueCreateInfo {
sType: VkStructureType::DeviceQueueCreateInfo,
pNext: ptr::null(),
flags: 0,
queueFamilyIndex: 0,
queueCount: 1,
pQueuePriorities: &queue_priority,
};
let device_create_info = VkDeviceCreateInfo {
sType: VkStructureType::DeviceCreateInfo,
pNext: ptr::null(),
flags: 0,
queueCreateInfoCount: 1,
pQueueCreateInfos: &queue_info,
enabledLayerCount: 0,
ppEnabledLayerNames: ptr::null(),
enabledExtensionCount: 0,
ppEnabledExtensionNames: ptr::null(),
pEnabledFeatures: ptr::null(),
};
let mut device = VkDevice::NULL;
let result = kronos::implementation::device::vkCreateDevice(
physical_device,
&device_create_info,
ptr::null(),
&mut device
);
println!("✓ Device created: {:?} (handle: {})", result, device.as_raw());
let mut queue = VkQueue::NULL;
kronos::implementation::device::vkGetDeviceQueue(
device,
0, 0, &mut queue
);
println!("✓ Compute queue obtained (handle: {})", queue.as_raw());
let buffer_info = VkBufferCreateInfo {
sType: VkStructureType::BufferCreateInfo,
pNext: ptr::null(),
size: 1024 * 1024, usage: VkBufferUsageFlags::STORAGE_BUFFER | VkBufferUsageFlags::TRANSFER_DST,
sharingMode: VkSharingMode::Exclusive,
queueFamilyIndexCount: 0,
pQueueFamilyIndices: ptr::null(),
flags: VkBufferCreateFlags::empty(),
};
let mut buffer = VkBuffer::NULL;
let result = kronos::implementation::buffer::vkCreateBuffer(
device,
&buffer_info,
ptr::null(),
&mut buffer
);
println!("✓ Buffer created: {:?} (handle: {})", result, buffer.as_raw());
let mut mem_reqs = std::mem::zeroed::<VkMemoryRequirements>();
kronos::implementation::buffer::vkGetBufferMemoryRequirements(
device,
buffer,
&mut mem_reqs
);
println!("✓ Memory requirements: {} bytes, alignment: {}",
mem_reqs.size, mem_reqs.alignment);
let alloc_info = VkMemoryAllocateInfo {
sType: VkStructureType::MemoryAllocateInfo,
pNext: ptr::null(),
allocationSize: mem_reqs.size,
memoryTypeIndex: 1, };
let mut memory = VkDeviceMemory::NULL;
let result = kronos::implementation::memory::vkAllocateMemory(
device,
&alloc_info,
ptr::null(),
&mut memory
);
println!("✓ Memory allocated: {:?} (handle: {})", result, memory.as_raw());
let result = kronos::implementation::buffer::vkBindBufferMemory(
device,
buffer,
memory,
0
);
println!("✓ Buffer bound to memory: {:?}", result);
let mut data_ptr = ptr::null_mut();
let result = kronos::implementation::memory::vkMapMemory(
device,
memory,
0,
mem_reqs.size,
0,
&mut data_ptr
);
println!("✓ Memory mapped: {:?}", result);
if result == VkResult::Success && !data_ptr.is_null() {
let data = data_ptr as *mut f32;
for i in 0..256 {
*data.add(i) = i as f32;
}
println!("✓ Test data written");
}
kronos::implementation::memory::vkUnmapMemory(device, memory);
println!("✓ Memory unmapped");
let pool_info = VkCommandPoolCreateInfo {
sType: VkStructureType::CommandPoolCreateInfo,
pNext: ptr::null(),
flags: VkCommandPoolCreateFlags::empty(),
queueFamilyIndex: 0,
};
let mut command_pool = VkCommandPool::NULL;
let result = kronos::vkCreateCommandPool(
device,
&pool_info,
ptr::null(),
&mut command_pool
);
println!("✓ Command pool created: {:?} (handle: {})", result, command_pool.as_raw());
let alloc_cmd_info = VkCommandBufferAllocateInfo {
sType: VkStructureType::CommandBufferAllocateInfo,
pNext: ptr::null(),
commandPool: command_pool,
level: VkCommandBufferLevel::Primary,
commandBufferCount: 1,
};
let mut cmd_buffer = VkCommandBuffer::NULL;
let result = kronos::vkAllocateCommandBuffers(
device,
&alloc_cmd_info,
&mut cmd_buffer
);
println!("✓ Command buffer allocated: {:?} (handle: {})", result, cmd_buffer.as_raw());
let begin_info = VkCommandBufferBeginInfo {
sType: VkStructureType::CommandBufferBeginInfo,
pNext: ptr::null(),
flags: VkCommandBufferUsageFlags::ONE_TIME_SUBMIT,
pInheritanceInfo: ptr::null(),
};
let result = kronos::vkBeginCommandBuffer(
cmd_buffer,
&begin_info
);
println!("✓ Command buffer recording started: {:?}", result);
let barrier = VkBufferMemoryBarrier {
sType: VkStructureType::BufferMemoryBarrier,
pNext: ptr::null(),
srcAccessMask: VkAccessFlags::HOST_WRITE,
dstAccessMask: VkAccessFlags::SHADER_READ,
srcQueueFamilyIndex: VK_QUEUE_FAMILY_IGNORED,
dstQueueFamilyIndex: VK_QUEUE_FAMILY_IGNORED,
buffer,
offset: 0,
size: VK_WHOLE_SIZE,
};
kronos::vkCmdPipelineBarrier(
cmd_buffer,
VkPipelineStageFlags::HOST,
VkPipelineStageFlags::COMPUTE_SHADER,
VkDependencyFlags::empty(),
0, ptr::null(),
1, &barrier,
0, ptr::null()
);
println!("✓ Pipeline barrier recorded");
let result = kronos::vkEndCommandBuffer(cmd_buffer);
println!("✓ Command buffer recording ended: {:?}", result);
let submit_info = VkSubmitInfo {
sType: VkStructureType::SubmitInfo,
pNext: ptr::null(),
waitSemaphoreCount: 0,
pWaitSemaphores: ptr::null(),
pWaitDstStageMask: ptr::null(),
commandBufferCount: 1,
pCommandBuffers: &cmd_buffer,
signalSemaphoreCount: 0,
pSignalSemaphores: ptr::null(),
};
let result = kronos::implementation::device::vkQueueSubmit(
queue,
1,
&submit_info,
VkFence::NULL
);
println!("✓ Work submitted: {:?}", result);
let result = kronos::implementation::device::vkQueueWaitIdle(queue);
println!("✓ Queue idle: {:?}", result);
kronos::implementation::buffer::vkDestroyBuffer(device, buffer, ptr::null());
kronos::implementation::memory::vkFreeMemory(device, memory, ptr::null());
kronos::implementation::device::vkDestroyDevice(device, ptr::null());
kronos::implementation::instance::vkDestroyInstance(instance, ptr::null());
println!("\n✓ All resources cleaned up");
println!("\n🎉 Kronos Rust implementation test completed successfully!");
}
}