More spirv compile shit

This commit is contained in:
2021-02-22 15:58:46 +01:00
parent f209666144
commit 26871da22b
8 changed files with 76 additions and 21 deletions

View File

@@ -1,6 +1,6 @@
use std::sync::Arc;
use std::{convert::TryInto, io::{Read, Write}, sync::Arc};
use vulkano::{command_buffer::AutoCommandBufferBuilder, descriptor::descriptor_set::PersistentDescriptorSet};
use vulkano::{command_buffer::AutoCommandBufferBuilder, descriptor::{descriptor::ShaderStages, descriptor_set::PersistentDescriptorSet}};
use vulkano::command_buffer::DynamicState;
use vulkano::device::Device;
use vulkano::framebuffer::RenderPassAbstract;
@@ -52,20 +52,45 @@ impl DefaultShader {
fn create_pipeline(device: Arc<Device>, render_pass: RP) -> GP {
let sub_pass = Subpass::from(render_pass.clone(), 0).unwrap();
let vertex_shader = vs::Shader::load(device.clone()).unwrap();
let fragment_shader = fs::Shader::load(device.clone()).unwrap();
Arc::new(GraphicsPipeline::start()
.vertex_input_single_buffer::<Vertex>()
.vertex_shader(vertex_shader.main_entry_point(), ())
.triangle_list()
.viewports_dynamic_scissors_irrelevant(1)
.depth_stencil_simple_depth()
.fragment_shader(fragment_shader.main_entry_point(), ())
.blend_alpha_blending()
.cull_mode_back()
.render_pass(sub_pass.clone())
.build(device.clone())
.unwrap())
#[cfg(debug_assertions)]
{
println!("Compiling shaders...");
let output = std::process::Command::new("cmd.exe")
.arg("/c")
.arg("compile.bat")
.current_dir("shaders")
.output().unwrap();
std::io::stdout().write_all(&output.stdout).unwrap();
}
unsafe {
let mut fs_file = std::fs::File::open("shaders/triangle.frag.spv").unwrap();
let mut fs_buf = vec![];
fs_file.read_to_end(&mut fs_buf).unwrap();
let fs_words: Vec<u32> = fs_buf.chunks_exact(4).map(|c| u32::from_ne_bytes(c.try_into().unwrap())).collect();
let fs_module = vulkano::pipeline::shader::ShaderModule::from_words(device.clone(), &fs_words).unwrap();
let fs_layout = fs::Layout(ShaderStages {
fragment: true,
..ShaderStages::none()
});
static FS_NAME: [u8; 5usize] = [109u8, 97u8, 105u8, 110u8, 0];
let fs_name_c = std::ffi::CStr::from_ptr(FS_NAME.as_ptr() as *const _);
let fs_entry = fs_module.graphics_entry_point(fs_name_c, fs::MainInput, fs::MainOutput, fs_layout, vulkano::pipeline::shader::GraphicsShaderType::Fragment);
Arc::new(GraphicsPipeline::start()
.vertex_input_single_buffer::<Vertex>()
.vertex_shader(vertex_shader.main_entry_point(), ())
.triangle_list()
.viewports_dynamic_scissors_irrelevant(1)
.depth_stencil_simple_depth()
.fragment_shader(fs_entry, ())
.blend_alpha_blending()
.cull_mode_back()
.render_pass(sub_pass.clone())
.build(device.clone())
.unwrap())
}
}
}