ugga ugga. Lifetime problems with the Canvas
This commit is contained in:
140
src/canvas.rs
140
src/canvas.rs
@@ -2,7 +2,7 @@ use crate::vertex_2d::{ColoredVertex2D, Vertex2D};
|
|||||||
use vulkano::command_buffer::{AutoCommandBufferBuilder, DynamicState};
|
use vulkano::command_buffer::{AutoCommandBufferBuilder, DynamicState};
|
||||||
use crate::Sprite;
|
use crate::Sprite;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use vulkano::buffer::{BufferAccess, CpuAccessibleBuffer, BufferUsage};
|
use vulkano::buffer::{BufferAccess, CpuAccessibleBuffer, BufferUsage, ImmutableBuffer};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use vulkano::format::{ClearValue, Format};
|
use vulkano::format::{ClearValue, Format};
|
||||||
use vulkano::framebuffer::FramebufferAbstract;
|
use vulkano::framebuffer::FramebufferAbstract;
|
||||||
@@ -111,13 +111,14 @@ pub trait Drawable {
|
|||||||
|
|
||||||
|
|
||||||
// Need three types of shaders. Solid, Textured, Compute
|
// Need three types of shaders. Solid, Textured, Compute
|
||||||
#[derive(PartialEq, Eq, Hash)]
|
#[derive(PartialEq, Eq, Hash, Clone)]
|
||||||
pub enum ShaderType {
|
pub enum ShaderType {
|
||||||
SOLID = 0,
|
SOLID = 0,
|
||||||
TEXTURED = 1,
|
TEXTURED = 1,
|
||||||
COMPUTE = 2
|
COMPUTE = 2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct Canvas {
|
pub struct Canvas {
|
||||||
|
|
||||||
colored_drawables : Vec<ColoredVertex2D>,
|
colored_drawables : Vec<ColoredVertex2D>,
|
||||||
@@ -126,9 +127,6 @@ pub struct Canvas {
|
|||||||
textured_drawables: HashMap<String, Vec<Vertex2D>>,
|
textured_drawables: HashMap<String, Vec<Vertex2D>>,
|
||||||
textured_vertex_buffer: HashMap<String, Arc<(dyn BufferAccess + std::marker::Send + std::marker::Sync + 'static)>>,
|
textured_vertex_buffer: HashMap<String, Arc<(dyn BufferAccess + std::marker::Send + std::marker::Sync + 'static)>>,
|
||||||
|
|
||||||
|
|
||||||
vertex_buffers: Vec<Arc<(dyn BufferAccess + std::marker::Send + std::marker::Sync + 'static)>>,
|
|
||||||
|
|
||||||
shader_kernels: HashMap<ShaderType, ShaderKernels>,
|
shader_kernels: HashMap<ShaderType, ShaderKernels>,
|
||||||
|
|
||||||
texture_store: HashMap<String, Arc<ImmutableImage<Format>>>,
|
texture_store: HashMap<String, Arc<ImmutableImage<Format>>>,
|
||||||
@@ -161,8 +159,6 @@ impl Canvas {
|
|||||||
textured_drawables: Default::default(),
|
textured_drawables: Default::default(),
|
||||||
textured_vertex_buffer: Default::default(),
|
textured_vertex_buffer: Default::default(),
|
||||||
|
|
||||||
vertex_buffers: vec![],
|
|
||||||
|
|
||||||
shader_kernels: shader_kernels,
|
shader_kernels: shader_kernels,
|
||||||
texture_store: Default::default(),
|
texture_store: Default::default(),
|
||||||
|
|
||||||
@@ -235,8 +231,15 @@ impl Canvas {
|
|||||||
|
|
||||||
match drawable.get_texture_id() {
|
match drawable.get_texture_id() {
|
||||||
Some(id) => {
|
Some(id) => {
|
||||||
// This dont work
|
self.textured_drawables
|
||||||
self.textured_drawables.get(&id).unwrap();
|
.entry(id)
|
||||||
|
.or_insert(Vec::new())
|
||||||
|
.extend(drawable.get_vertices().iter().map(|n|
|
||||||
|
Vertex2D {
|
||||||
|
position: [n.0, n.1],
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
},
|
},
|
||||||
None => {
|
None => {
|
||||||
let colors = drawable.get_color();
|
let colors = drawable.get_color();
|
||||||
@@ -254,74 +257,58 @@ impl Canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fn get_texture(&mut self, texture_id: String) -> Arc<ImmutableImage<Format>> {
|
fn get_texture(&self, texture_id: String) -> Arc<ImmutableImage<Format>> {
|
||||||
|
|
||||||
if let Some(i) = self.texture_store.get(&texture_id) {
|
if let Some(i) = self.texture_store.get(&texture_id) {
|
||||||
return i.clone();
|
return i.clone();
|
||||||
} else {
|
} else {
|
||||||
self.load_texture_from_filename(texture_id)
|
panic!("{} : Texture not loaded", texture_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn allocate_vertex_buffers(&mut self, device: Arc<Device>) {
|
||||||
|
|
||||||
pub fn allocate_colored_vertex_buffers(&mut self, device: Arc<Device>) {
|
|
||||||
|
|
||||||
self.vertex_buffers.clear();
|
|
||||||
self.colored_vertex_buffer.clear();
|
self.colored_vertex_buffer.clear();
|
||||||
|
self.textured_vertex_buffer.clear();
|
||||||
self.vertex_buffers.push(
|
|
||||||
CpuAccessibleBuffer::from_iter(
|
|
||||||
device.clone(),
|
|
||||||
BufferUsage::vertex_buffer(),
|
|
||||||
self.colored_drawables.iter().cloned()
|
|
||||||
).unwrap()
|
|
||||||
);
|
|
||||||
|
|
||||||
self.colored_vertex_buffer.push(
|
self.colored_vertex_buffer.push(
|
||||||
CpuAccessibleBuffer::from_iter(
|
ImmutableBuffer::from_iter(
|
||||||
device.clone(),
|
self.colored_drawables.iter().cloned(),
|
||||||
BufferUsage::vertex_buffer(),
|
BufferUsage::vertex_buffer(),
|
||||||
self.colored_drawables.iter().cloned()
|
self.queue.clone(),
|
||||||
).unwrap()
|
).unwrap().0
|
||||||
|
);
|
||||||
|
|
||||||
|
for (k, v) in self.textured_drawables.iter() {
|
||||||
|
self.textured_vertex_buffer.insert(
|
||||||
|
k.clone(),
|
||||||
|
ImmutableBuffer::from_iter(
|
||||||
|
self.textured_drawables.get(k).iter().cloned(),
|
||||||
|
BufferUsage::vertex_buffer(),
|
||||||
|
self.queue.clone(),
|
||||||
|
).unwrap().0
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// I guess these go out as an array. So I can add multiple descriptor sets
|
fn get_solid_color_descriptor_set(&self) -> Box<dyn DescriptorSet + Send + Sync> {
|
||||||
|
|
||||||
// So probably needs to know which shaders are for textures
|
|
||||||
// needs to associate this descriptor set to a texture (key-pair, tuple)
|
|
||||||
//
|
|
||||||
|
|
||||||
// So this is fine for now. But I want to be able to:
|
|
||||||
// Choose which texture I want to add to this descriptor set.
|
|
||||||
// Add multiple textures
|
|
||||||
// Choose which shader and pipeline it should run on
|
|
||||||
|
|
||||||
fn get_descriptor_set(&mut self,
|
|
||||||
shader_type: &ShaderType,
|
|
||||||
texture_id: String) -> Box<dyn DescriptorSet + Send + Sync> {
|
|
||||||
|
|
||||||
match shader_type {
|
|
||||||
ShaderType::SOLID => {
|
|
||||||
let o: Box<dyn DescriptorSet + Send + Sync> = Box::new(
|
let o: Box<dyn DescriptorSet + Send + Sync> = Box::new(
|
||||||
PersistentDescriptorSet::start(
|
PersistentDescriptorSet::start(
|
||||||
self.shader_kernels.get(&shader_type).unwrap().clone().get_pipeline().clone(), 0
|
self.shader_kernels.get(&ShaderType::SOLID).unwrap().clone().get_pipeline().clone(), 0
|
||||||
).build().unwrap());
|
).build().unwrap());
|
||||||
o
|
o
|
||||||
},
|
}
|
||||||
ShaderType::TEXTURED => {
|
|
||||||
|
fn get_textured_descriptor_set(&self, texture_id: String)
|
||||||
|
-> Box<dyn DescriptorSet + Send + Sync> {
|
||||||
|
|
||||||
let o: Box<dyn DescriptorSet + Send + Sync> = Box::new(
|
let o: Box<dyn DescriptorSet + Send + Sync> = Box::new(
|
||||||
PersistentDescriptorSet::start(
|
PersistentDescriptorSet::start(
|
||||||
self.shader_kernels.get(&shader_type).unwrap().clone().get_pipeline().clone(), 0
|
self.shader_kernels.get(&ShaderType::TEXTURED).unwrap().clone().get_pipeline().clone(), 0
|
||||||
)
|
)
|
||||||
.add_sampled_image(self.get_texture(texture_id), self.sampler.clone()).unwrap()
|
.add_sampled_image(self.get_texture(texture_id), self.sampler.clone()).unwrap()
|
||||||
.build().unwrap());
|
.build().unwrap());
|
||||||
o
|
o
|
||||||
},
|
|
||||||
ShaderType::COMPUTE => {
|
|
||||||
unimplemented!("Compute dont work here");
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This is the image which is written to by the write compute buffer
|
// This is the image which is written to by the write compute buffer
|
||||||
@@ -345,10 +332,7 @@ impl Canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
|
|
||||||
So I need the image set in order to get my texture or compute texture
|
So I need the image set in order to get my texture or compute texture
|
||||||
Done
|
Done
|
||||||
|
|
||||||
@@ -369,14 +353,13 @@ impl Canvas {
|
|||||||
|
|
||||||
|
|
||||||
I just need to add a third option on sprite and allow it to have a swap buffer
|
I just need to add a third option on sprite and allow it to have a swap buffer
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
pub fn draw_commands(&mut self,
|
pub fn draw_commands(&self,
|
||||||
command_buffer: AutoCommandBufferBuilder,
|
command_buffer: &mut AutoCommandBufferBuilder,
|
||||||
framebuffers: Vec<Arc<dyn FramebufferAbstract + Send + Sync>>,
|
framebuffers: Vec<Arc<dyn FramebufferAbstract + Send + Sync>>,
|
||||||
image_num: usize) -> AutoCommandBufferBuilder {
|
image_num: usize) {
|
||||||
|
|
||||||
// Specify the color to clear the framebuffer with i.e. blue
|
// Specify the color to clear the framebuffer with i.e. blue
|
||||||
let clear_values = vec!(ClearValue::Float([0.0, 0.0, 1.0, 1.0]));
|
let clear_values = vec!(ClearValue::Float([0.0, 0.0, 1.0, 1.0]));
|
||||||
@@ -388,34 +371,29 @@ impl Canvas {
|
|||||||
).unwrap();
|
).unwrap();
|
||||||
|
|
||||||
|
|
||||||
// So I need to do this without borrowing self from the shader_kernels....
|
for (shader_type, kernel) in self.shader_kernels.clone().iter() {
|
||||||
// Maybe self referential struct issue cropping up
|
match shader_type {
|
||||||
//
|
ShaderType::SOLID => {
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
for (shader_type, kernel) in self.shader_kernels.iter() {
|
|
||||||
command_buffer = command_buffer.draw(
|
command_buffer = command_buffer.draw(
|
||||||
kernel.clone().get_pipeline().clone(),
|
kernel.clone().get_pipeline().clone(),
|
||||||
&dynamic_state.clone(), self.vertex_buffers.clone(),
|
&dynamic_state.clone(), self.colored_vertex_buffer.clone(),
|
||||||
vec![self.get_descriptor_set(shader_type, String::from("texture"))], ()
|
vec![self.get_solid_color_descriptor_set()], ()
|
||||||
).unwrap();
|
).unwrap();
|
||||||
|
},
|
||||||
|
ShaderType::TEXTURED => {
|
||||||
|
command_buffer = command_buffer.draw(
|
||||||
|
kernel.clone().get_pipeline().clone(),
|
||||||
|
&dynamic_state.clone(), self.colored_vertex_buffer.clone(),
|
||||||
|
vec![self.get_textured_descriptor_set(String::from("funky-bird"))], ()
|
||||||
|
).unwrap();
|
||||||
|
},
|
||||||
|
ShaderType::COMPUTE => {},
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
command_buffer = command_buffer
|
||||||
// .draw(self.shader_kernels.clone().unwrap().get_pipeline(),
|
|
||||||
// &dynamic_state.clone(), self.vertex_buffers,
|
|
||||||
// vec![self.get_gui_image_set()], ())
|
|
||||||
// .unwrap();
|
|
||||||
//
|
|
||||||
command_buffer
|
|
||||||
.end_render_pass()
|
.end_render_pass()
|
||||||
.unwrap()
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ use winit::{EventsLoop, WindowBuilder, WindowEvent, Event, DeviceEvent, VirtualK
|
|||||||
use winit::dpi::LogicalSize;
|
use winit::dpi::LogicalSize;
|
||||||
use vulkano_win::VkSurfaceBuild;
|
use vulkano_win::VkSurfaceBuild;
|
||||||
use sprite::Sprite;
|
use sprite::Sprite;
|
||||||
|
use crate::canvas::Canvas;
|
||||||
|
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
@@ -138,7 +139,7 @@ fn main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
frame_future = processor.run(&surface, frame_future);
|
(frame_future) = processor.run(&surface, frame_future);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ use crate::util::compute_image::ComputeImage;
|
|||||||
|
|
||||||
use vulkano::descriptor::descriptor::DescriptorDesc;
|
use vulkano::descriptor::descriptor::DescriptorDesc;
|
||||||
use crate::vertex_2d::ColoredVertex2D;
|
use crate::vertex_2d::ColoredVertex2D;
|
||||||
|
use crate::canvas::Canvas;
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
|
|
||||||
/// This method is called once during initialization, then again whenever the window is resized
|
/// This method is called once during initialization, then again whenever the window is resized
|
||||||
@@ -99,7 +100,8 @@ pub struct VkProcessor<'a> {
|
|||||||
|
|
||||||
swapchain_recreate_needed: bool,
|
swapchain_recreate_needed: bool,
|
||||||
|
|
||||||
capabilities: Capabilities
|
capabilities: Capabilities,
|
||||||
|
canvas: Canvas,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -107,8 +109,6 @@ impl<'a> VkProcessor<'a> {
|
|||||||
|
|
||||||
pub fn new(instance: &'a Arc<Instance>, surface: &'a Arc<Surface<Window>>) -> VkProcessor<'a> {
|
pub fn new(instance: &'a Arc<Instance>, surface: &'a Arc<Surface<Window>>) -> VkProcessor<'a> {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
let physical = PhysicalDevice::enumerate(instance).next().unwrap();
|
let physical = PhysicalDevice::enumerate(instance).next().unwrap();
|
||||||
|
|
||||||
let queue_family = physical.queue_families().find(|&q| {
|
let queue_family = physical.queue_families().find(|&q| {
|
||||||
@@ -126,11 +126,13 @@ impl<'a> VkProcessor<'a> {
|
|||||||
[(queue_family, 0.5)].iter().cloned()).unwrap();
|
[(queue_family, 0.5)].iter().cloned()).unwrap();
|
||||||
let queue = queues.next().unwrap();
|
let queue = queues.next().unwrap();
|
||||||
|
|
||||||
|
let capabilities = surface.capabilities(physical).unwrap();
|
||||||
|
|
||||||
VkProcessor {
|
VkProcessor {
|
||||||
instance: instance.clone(),
|
instance: instance.clone(),
|
||||||
physical: physical.clone(),
|
physical: physical.clone(),
|
||||||
device: device.clone(),
|
device: device.clone(),
|
||||||
queue: queue,
|
queue: queue.clone(),
|
||||||
queues: queues,
|
queues: queues,
|
||||||
dynamic_state: DynamicState { line_width: None, viewports: None, scissors: None },
|
dynamic_state: DynamicState { line_width: None, viewports: None, scissors: None },
|
||||||
shader_kernels: None,
|
shader_kernels: None,
|
||||||
@@ -142,7 +144,8 @@ impl<'a> VkProcessor<'a> {
|
|||||||
swapchain: None,
|
swapchain: None,
|
||||||
swapchain_images: None,
|
swapchain_images: None,
|
||||||
swapchain_recreate_needed: false,
|
swapchain_recreate_needed: false,
|
||||||
capabilities: surface.capabilities(physical).unwrap()
|
capabilities: capabilities.clone(),
|
||||||
|
canvas: Canvas::new(queue, device, physical, capabilities)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,7 +349,10 @@ impl<'a> VkProcessor<'a> {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
pub fn run(&mut self, surface: &'a Arc<Surface<Window>>, mut frame_future: Box<dyn GpuFuture>) -> Box<dyn GpuFuture> {
|
pub fn run(&mut self,
|
||||||
|
surface: &'a Arc<Surface<Window>>,
|
||||||
|
mut frame_future: Box<dyn GpuFuture>,
|
||||||
|
) -> Box<dyn GpuFuture> {
|
||||||
|
|
||||||
let mut framebuffers = window_size_dependent_setup(&self.swapchain_images.clone().unwrap().clone(),
|
let mut framebuffers = window_size_dependent_setup(&self.swapchain_images.clone().unwrap().clone(),
|
||||||
self.shader_kernels.clone().unwrap().render_pass.clone(),
|
self.shader_kernels.clone().unwrap().render_pass.clone(),
|
||||||
@@ -397,26 +403,20 @@ impl<'a> VkProcessor<'a> {
|
|||||||
.get_descriptor_set(self.compute_kernel.clone().unwrap().clone().get_pipeline()).clone(), ()).unwrap()
|
.get_descriptor_set(self.compute_kernel.clone().unwrap().clone().get_pipeline()).clone(), ()).unwrap()
|
||||||
|
|
||||||
.copy_buffer_to_image(self.compute_image.clone().unwrap().clone().rw_buffers.get(0).unwrap().clone(),
|
.copy_buffer_to_image(self.compute_image.clone().unwrap().clone().rw_buffers.get(0).unwrap().clone(),
|
||||||
self.compute_image.clone().unwrap().clone().get_swap_buffer().clone()).unwrap()
|
self.compute_image.clone().unwrap().clone().get_swap_buffer().clone()).unwrap();
|
||||||
|
|
||||||
.begin_render_pass(framebuffers[image_num].clone(), false, clear_values.clone())
|
|
||||||
.unwrap()
|
|
||||||
|
|
||||||
.draw(self.shader_kernels.clone().unwrap().get_pipeline(),
|
/*
|
||||||
&self.dynamic_state.clone(), v,
|
Fuck. So this is a problem...
|
||||||
vec![self.get_image_set()], ())
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
command_buffer = command_buffer.draw(self.shader_kernels.clone().unwrap().get_pipeline(),
|
I can't replace canvas.
|
||||||
&self.dynamic_state.clone(), v2,
|
*/
|
||||||
vec![self.get_gui_image_set()], ())
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let command_buffer = command_buffer
|
self.canvas.draw_commands(&mut command_buffer, framebuffers, image_num);
|
||||||
.end_render_pass()
|
|
||||||
.unwrap()
|
|
||||||
|
|
||||||
.build().unwrap();
|
//self.canvas = mem::replace(&mut self.canvas,
|
||||||
|
|
||||||
|
let command_buffer = command_buffer.build().unwrap();
|
||||||
|
|
||||||
// Wait on the previous frame, then execute the command buffer and present the image
|
// Wait on the previous frame, then execute the command buffer and present the image
|
||||||
let future = frame_future.join(acquire_future)
|
let future = frame_future.join(acquire_future)
|
||||||
|
|||||||
Reference in New Issue
Block a user