have the api of the compu somewhat figured out. Need to weigh my options on texture, buffer, and image handles and how I'm going to get them from the vkprocessor
parent
e0e9218d6e
commit
9b8d5cd828
@ -0,0 +1,184 @@
|
|||||||
|
use vulkano::buffer::{CpuAccessibleBuffer, BufferUsage};
|
||||||
|
use std::sync::Arc;
|
||||||
|
use crate::canvas::Drawable;
|
||||||
|
use vulkano::framebuffer::RenderPassAbstract;
|
||||||
|
use vulkano::pipeline::{GraphicsPipelineAbstract, ComputePipeline};
|
||||||
|
use vulkano::device::Device;
|
||||||
|
use crate::util::compute_kernel::ComputeKernel;
|
||||||
|
use image::{ImageBuffer};
|
||||||
|
use image::GenericImageView;
|
||||||
|
use crate::util::compute_image::ComputeImage;
|
||||||
|
use vulkano::image::{ImageUsage, AttachmentImage};
|
||||||
|
use vulkano::descriptor::descriptor_set::{PersistentDescriptorSetBuf, PersistentDescriptorSet};
|
||||||
|
use vulkano::format::Format;
|
||||||
|
use vulkano::descriptor::pipeline_layout::PipelineLayout;
|
||||||
|
|
||||||
|
|
||||||
|
pub struct CompuSprite {
|
||||||
|
vertices: [(f32, f32); 6],
|
||||||
|
position: (f32, f32),
|
||||||
|
size: (f32, f32),
|
||||||
|
color: (f32, f32, f32, f32),
|
||||||
|
image_handle: Arc<u32>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CompuSprite {
|
||||||
|
|
||||||
|
pub fn new(position: (f32, f32),
|
||||||
|
size: (f32, f32),
|
||||||
|
image_handle: Arc<u32>) -> CompuSprite {
|
||||||
|
|
||||||
|
let fsize = (size.0 as f32, size.1 as f32);
|
||||||
|
|
||||||
|
CompuSprite {
|
||||||
|
vertices: [
|
||||||
|
(position.0, position.1 ), // top left
|
||||||
|
(position.0, position.1 + fsize.1), // bottom left
|
||||||
|
(position.0 + fsize.0, position.1 + fsize.1 ), // bottom right
|
||||||
|
(position.0, position.1 ), // top left
|
||||||
|
(position.0 + fsize.0, position.1 + fsize.1 ), // bottom right
|
||||||
|
(position.0 + fsize.0, position.1 ), // top right
|
||||||
|
],
|
||||||
|
|
||||||
|
position: position,
|
||||||
|
size: size,
|
||||||
|
color: (0.0,0.0,0.0,0.0),
|
||||||
|
image_handle: image_handle.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_vertices(&self) -> Vec<(f32, f32)> {
|
||||||
|
self.vertices.to_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_color(&self) -> (f32, f32, f32, f32) {
|
||||||
|
self.color.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_image_handle(&self) -> Arc<u32> {
|
||||||
|
self.image_handle.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub struct CompuBuffers {
|
||||||
|
dimensions: (u32, u32),
|
||||||
|
device: Arc<Device>,
|
||||||
|
|
||||||
|
io_buffers: Vec<Arc<CpuAccessibleBuffer<[u8]>>>,
|
||||||
|
settings_buffer: Arc<CpuAccessibleBuffer<[u32]>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CompuBuffers {
|
||||||
|
|
||||||
|
pub fn new(device: Arc<Device>, data: Vec<u8>, dimensions: (u32, u32), stride: u32) -> CompuBuffers {
|
||||||
|
|
||||||
|
let data_length = dimensions.0 * dimensions.1 * stride;
|
||||||
|
|
||||||
|
let input_buffer = {
|
||||||
|
let mut buff = data.iter();
|
||||||
|
let data_iter = (0..data_length).map(|n| *(buff.next().unwrap()));
|
||||||
|
CpuAccessibleBuffer::from_iter(device.clone(), BufferUsage::all(), data_iter).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
let output_buffer = {
|
||||||
|
let mut buff = data.iter();
|
||||||
|
let data_iter = (0..data_length).map(|n| *(buff.next().unwrap()));
|
||||||
|
CpuAccessibleBuffer::from_iter(device.clone(), BufferUsage::all(), data_iter).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
// Settings buffer which holds i32's
|
||||||
|
// Compile macros into the kernel eventually to index them
|
||||||
|
let settings_buffer = {
|
||||||
|
let vec = vec![dimensions.0, dimensions.1];
|
||||||
|
let mut buff = vec.iter();
|
||||||
|
let data_iter =
|
||||||
|
(0..2).map(|n| *(buff.next().unwrap()));
|
||||||
|
CpuAccessibleBuffer::from_iter(device.clone(),
|
||||||
|
BufferUsage::all(),
|
||||||
|
data_iter).unwrap()
|
||||||
|
};
|
||||||
|
|
||||||
|
CompuBuffers{
|
||||||
|
dimensions: dimensions,
|
||||||
|
device: device.clone(),
|
||||||
|
|
||||||
|
io_buffers: vec![input_buffer, output_buffer],
|
||||||
|
settings_buffer: settings_buffer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn get_size(&self) -> (u32, u32) {
|
||||||
|
self.dimensions
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pub fn get_descriptor_set(&self, compute_pipeline: std::sync::Arc<ComputePipeline<PipelineLayout<shade_runner::layouts::ComputeLayout>>>)
|
||||||
|
-> Arc<PersistentDescriptorSet<std::sync::Arc<ComputePipeline<PipelineLayout<shade_runner::layouts::ComputeLayout>>>, ((((),
|
||||||
|
PersistentDescriptorSetBuf<std::sync::Arc<vulkano::buffer::cpu_access::CpuAccessibleBuffer<[u8]>>>),
|
||||||
|
PersistentDescriptorSetBuf<std::sync::Arc<vulkano::buffer::cpu_access::CpuAccessibleBuffer<[u8]>>>),
|
||||||
|
PersistentDescriptorSetBuf<std::sync::Arc<vulkano::buffer::cpu_access::CpuAccessibleBuffer<[u32]>>>)>> {
|
||||||
|
|
||||||
|
Arc::new(PersistentDescriptorSet::start(compute_pipeline.clone(), 0)
|
||||||
|
.add_buffer(self.io_buffers.get(0).unwrap().clone()).unwrap()
|
||||||
|
.add_buffer(self.io_buffers.get(1).unwrap().clone()).unwrap()
|
||||||
|
.add_buffer(self.settings_buffer.clone()).unwrap()
|
||||||
|
.build().unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Canvas analog
|
||||||
|
pub struct CompuState {
|
||||||
|
compute_buffers: Vec<CompuBuffers>,
|
||||||
|
compute_buffer_handles: Vec<Arc<u32>>,
|
||||||
|
|
||||||
|
kernels: Vec<ComputeKernel>,
|
||||||
|
kernel_handles: Vec<Arc<u32>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CompuState {
|
||||||
|
fn new_compute_buffer() -> Arc<u32> {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new_kernel(&mut self,
|
||||||
|
filename: String,
|
||||||
|
device: &Arc<Device>) -> Arc<u32> {
|
||||||
|
|
||||||
|
let kernel = ComputeKernel::new(filename, device.clone());
|
||||||
|
|
||||||
|
self.kernels.push(kernel);
|
||||||
|
|
||||||
|
let id = Arc::new(self.kernels.len() as u32);
|
||||||
|
|
||||||
|
self.kernel_handles.push(id.clone());
|
||||||
|
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
ComputeFrame accumulates combos of :
|
||||||
|
Buffers and Kernels
|
||||||
|
Buffers, Images and Kernels
|
||||||
|
Buffers, Buffers and Kernels
|
||||||
|
|
||||||
|
It will need to convert these into a logical list of command_buffer commands
|
||||||
|
*/
|
||||||
|
pub struct ComputeFrame {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ComputeFrame {
|
||||||
|
fn add() {
|
||||||
|
|
||||||
|
}
|
||||||
|
fn add_chained(output_buffer_id: Arc<u32>, input_buffer_id: Arc<u32>, kernel_id: Arc<u32> ) {
|
||||||
|
|
||||||
|
}
|
||||||
|
fn add_with_image_swap(buffer_id: Arc<u32>, sprite: CompuSprite, ) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue