jayce 12.1.0

jayce is a tokenizer 🌌
Documentation
use anyhow::Result;

use vulkanalia::prelude::v1_0::*;

use crate::{
    app::AppData,
    vertex::InstanceData,
    vertex_buffer::{copy_buffer, create_buffer},
};

pub(crate) unsafe fn create_instance_buffer(
    instance_data: &InstanceData,
    instance: &Instance,
    device: &Device,
    data: &mut AppData,
) -> Result<(vk::Buffer, vk::DeviceMemory)> {
    let size =
        (std::mem::size_of::<cgmath::Matrix4<f32>>() * instance_data.model_matrix.len()) as u64;

    let (staging_buffer, staging_buffer_memory) = create_buffer(
        instance,
        device,
        data,
        size,
        vk::BufferUsageFlags::TRANSFER_SRC,
        vk::MemoryPropertyFlags::HOST_COHERENT | vk::MemoryPropertyFlags::HOST_VISIBLE,
    )?;

    let memory = device.map_memory(staging_buffer_memory, 0, size, vk::MemoryMapFlags::empty())?;

    std::ptr::copy_nonoverlapping(
        instance_data.model_matrix.as_ptr(),
        memory.cast(),
        instance_data.model_matrix.len(),
    );

    device.unmap_memory(staging_buffer_memory);

    let (instance_buffer, instance_buffer_memory) = create_buffer(
        instance,
        device,
        data,
        size,
        vk::BufferUsageFlags::TRANSFER_DST | vk::BufferUsageFlags::VERTEX_BUFFER,
        vk::MemoryPropertyFlags::DEVICE_LOCAL,
    )?;

    copy_buffer(device, data, staging_buffer, instance_buffer, size)?;
    device.destroy_buffer(staging_buffer, None);
    device.free_memory(staging_buffer_memory, None);

    Ok((instance_buffer, instance_buffer_memory))
}