uniformly garbage
parent
10a748e3b3
commit
d629e9d752
|
@ -25,3 +25,10 @@ pub fn vertices() -> [Vertex; 4] {
|
|||
pub fn indices() -> [u16; 6] {
|
||||
[0, 1, 2, 2, 3, 0]
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
pub struct UniformBufferObject {
|
||||
pub model: cgm::Matrix4<f32>,
|
||||
pub view: cgm::Matrix4<f32>,
|
||||
pub proj: cgm::Matrix4<f32>,
|
||||
}
|
||||
|
|
|
@ -1,12 +1,15 @@
|
|||
use std::sync::Arc;
|
||||
use std::sync::Mutex;
|
||||
use std::time;
|
||||
use log;
|
||||
|
||||
use vulkano::command_buffer as vc;
|
||||
use cgmath as cgm;
|
||||
use vulkano::buffer as vb;
|
||||
use vulkano::command_buffer as vc;
|
||||
use vulkano::descriptor::descriptor_set as vdd;
|
||||
use vulkano::instance as vi;
|
||||
use vulkano::swapchain as vs;
|
||||
use vulkano::pipeline as vp;
|
||||
use vulkano::swapchain as vs;
|
||||
use vulkano::sync::{FenceSignalFuture, GpuFuture};
|
||||
|
||||
mod binding;
|
||||
|
@ -30,6 +33,8 @@ pub struct Instance<WT> {
|
|||
surface_binding: Option<binding::SurfaceBinding<WT>>,
|
||||
swapchain_binding: Option<swapchains::SwapchainBinding<WT>>,
|
||||
command_buffers: Vec<Arc<vc::AutoCommandBuffer>>,
|
||||
uniform_buffers: Vec<Arc<vb::CpuAccessibleBuffer<data::UniformBufferObject>>>,
|
||||
descriptor_sets: Vec<Arc<vdd::FixedSizeDescriptorSet<Arc<dyn vp::GraphicsPipelineAbstract + Send + Sync>, ((), vdd::PersistentDescriptorSetBuf<Arc<vb::CpuAccessibleBuffer<data::UniformBufferObject>>>)>>>,
|
||||
|
||||
armed: bool,
|
||||
previous_frame_end: Option<Box<FlipFuture<WT>>>,
|
||||
|
@ -61,6 +66,8 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
|||
surface_binding: None,
|
||||
swapchain_binding: None,
|
||||
command_buffers: vec![],
|
||||
uniform_buffers: vec![],
|
||||
descriptor_sets: vec![],
|
||||
|
||||
previous_frame_end: None,
|
||||
armed: false,
|
||||
|
@ -110,7 +117,9 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
|||
).unwrap();
|
||||
future.flush().unwrap();
|
||||
|
||||
self.create_command_buffers(pipeline, vbuffer, ibuffer);
|
||||
self.create_uniform_buffers();
|
||||
self.create_descriptor_sets(pipeline.clone());
|
||||
self.create_command_buffers(pipeline.clone(), vbuffer, ibuffer);
|
||||
|
||||
self.previous_frame_end = None;
|
||||
self.armed = true;
|
||||
|
@ -166,16 +175,85 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
|||
}
|
||||
}
|
||||
|
||||
fn create_descriptor_sets(
|
||||
&mut self,
|
||||
pipeline: Arc<dyn vp::GraphicsPipelineAbstract + Send + Sync>
|
||||
) {
|
||||
let pool = Arc::new(
|
||||
Mutex::new(
|
||||
vdd::FixedSizeDescriptorSetsPool::new(pipeline.clone(), 0)
|
||||
)
|
||||
);
|
||||
|
||||
self.descriptor_sets = self.uniform_buffers
|
||||
.iter()
|
||||
.map(|uniform_buffer|
|
||||
Arc::new(
|
||||
pool
|
||||
.lock()
|
||||
.unwrap()
|
||||
.next()
|
||||
.add_buffer(uniform_buffer.clone())
|
||||
.unwrap()
|
||||
.build()
|
||||
.unwrap()
|
||||
)
|
||||
)
|
||||
.collect();
|
||||
}
|
||||
|
||||
fn dimensions(&self) -> [f32; 2] {
|
||||
let dimensions_u32 = self.swapchain_binding().chain.dimensions();
|
||||
[dimensions_u32[0] as f32, dimensions_u32[1] as f32]
|
||||
}
|
||||
|
||||
fn build_uniform_buffer(&self) -> data::UniformBufferObject {
|
||||
let elapsed = 400.0 as f32;
|
||||
let dimensions = self.dimensions();
|
||||
|
||||
let model = cgm::Matrix4::from_angle_z(cgm::Rad::from(cgm::Deg(elapsed as f32 * 0.180)));
|
||||
let view = cgm::Matrix4::look_at(
|
||||
cgm::Point3::new(2.0, 2.0, 2.0),
|
||||
cgm::Point3::new(0.0, 0.0, 0.0),
|
||||
cgm::Vector3::new(0.0, 0.0, 1.0)
|
||||
);
|
||||
let mut proj = cgm::perspective(
|
||||
cgm::Rad::from(cgm::Deg(45.0)),
|
||||
dimensions[0] as f32 / dimensions[1] as f32,
|
||||
0.1,
|
||||
10.0
|
||||
);
|
||||
proj.y.y *= -1.0;
|
||||
data::UniformBufferObject { model, view, proj }
|
||||
}
|
||||
|
||||
fn create_uniform_buffers(&mut self) {
|
||||
let mut buffers = Vec::new();
|
||||
|
||||
let uniform_buffer = self.build_uniform_buffer();
|
||||
for _ in 0..self.swapchain_binding().images.len() {
|
||||
let buffer = vb::CpuAccessibleBuffer::from_data(
|
||||
self.surface_binding().device.clone(),
|
||||
vb::BufferUsage::uniform_buffer_transfer_destination(),
|
||||
uniform_buffer,
|
||||
).unwrap();
|
||||
buffers.push(buffer);
|
||||
}
|
||||
|
||||
self.uniform_buffers = buffers;
|
||||
}
|
||||
|
||||
fn create_command_buffers(
|
||||
&mut self,
|
||||
pipeline: Arc<dyn vp::GraphicsPipelineAbstract + Send + Sync>,
|
||||
vertex_buffer: Arc<dyn vb::BufferAccess + Send + Sync>,
|
||||
index_buffer: Arc<vb::TypedBufferAccess<Content=[u16]> + Send + Sync>,
|
||||
index_buffer: Arc<dyn vb::TypedBufferAccess<Content=[u16]> + Send + Sync>,
|
||||
) {
|
||||
let device = self.surface_binding().device.clone();
|
||||
let qf = self.surface_binding().graphics_queue.family();
|
||||
self.command_buffers = self.swapchain_binding().framebuffers.iter()
|
||||
.map(|framebuffer| {
|
||||
.enumerate()
|
||||
.map(|(i, framebuffer)| {
|
||||
Arc::new(vc::AutoCommandBufferBuilder::primary_simultaneous_use(device.clone(), qf)
|
||||
.unwrap()
|
||||
.begin_render_pass(framebuffer.clone(), false, vec![[0.0, 0.0, 0.0, 1.0].into()])
|
||||
|
@ -183,7 +261,8 @@ impl<WT: 'static + Send + Sync> Instance<WT> {
|
|||
.draw_indexed(pipeline.clone(), &vc::DynamicState::none(),
|
||||
vec![vertex_buffer.clone()],
|
||||
index_buffer.clone(),
|
||||
(), ())
|
||||
self.descriptor_sets[i].clone(),
|
||||
())
|
||||
.unwrap()
|
||||
.end_render_pass()
|
||||
.unwrap()
|
||||
|
|
|
@ -139,9 +139,33 @@ impl LoadedShader {
|
|||
struct ShaderLayout(vdd::ShaderStages);
|
||||
|
||||
unsafe impl vdp::PipelineLayoutDesc for ShaderLayout {
|
||||
fn num_sets(&self) -> usize { 0 }
|
||||
fn num_bindings_in_set(&self, _set: usize) -> Option<usize> { None }
|
||||
fn descriptor(&self, _set: usize, _binding: usize) -> Option<vdd::DescriptorDesc> { None }
|
||||
fn num_sets(&self) -> usize { 1 }
|
||||
fn num_bindings_in_set(&self, set: usize) -> Option<usize> {
|
||||
match set {
|
||||
0 => Some(1),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
fn descriptor(&self, set: usize, binding: usize) -> Option<vdd::DescriptorDesc> {
|
||||
match set {
|
||||
0 => match binding {
|
||||
0 => Some(vdd::DescriptorDesc {
|
||||
ty: vdd::DescriptorDescTy::Buffer(vdd::DescriptorBufferDesc {
|
||||
dynamic: Some(false),
|
||||
storage: false,
|
||||
}),
|
||||
array_count: 1,
|
||||
readonly: true,
|
||||
stages: vdd::ShaderStages {
|
||||
vertex: true,
|
||||
..vdd::ShaderStages::none()
|
||||
},
|
||||
}),
|
||||
_ => None,
|
||||
},
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
fn num_push_constants_ranges(&self) -> usize { 0 }
|
||||
fn push_constants_range(&self, _num: usize) -> Option<vdp::PipelineLayoutDescPcRange> { None }
|
||||
}
|
||||
|
|
|
@ -123,14 +123,15 @@ impl<WT: 'static + Send + Sync> SwapchainBinding<WT> {
|
|||
}
|
||||
|
||||
fn choose_swap_present_mode(available_present_modes: vs::SupportedPresentModes) -> vs::PresentMode {
|
||||
if available_present_modes.mailbox {
|
||||
vs::PresentMode::Mailbox
|
||||
} else if available_present_modes.immediate {
|
||||
vs::PresentMode::Immediate
|
||||
} else {
|
||||
//if available_present_modes.mailbox {
|
||||
// vs::PresentMode::Mailbox
|
||||
//} else if available_present_modes.immediate {
|
||||
// vs::PresentMode::Immediate
|
||||
//} else {
|
||||
// vs::PresentMode::Fifo
|
||||
//}
|
||||
vs::PresentMode::Fifo
|
||||
}
|
||||
}
|
||||
|
||||
fn choose_swap_extent(capabilities: &vs::Capabilities) -> [u32; 2] {
|
||||
capabilities.current_extent.expect("could not get current extent")
|
||||
|
|
Loading…
Reference in New Issue