start of combine shader
This commit is contained in:
parent
8902c2a0e3
commit
37d816fc98
8 changed files with 106 additions and 3 deletions
3
build.rs
3
build.rs
|
@ -17,6 +17,8 @@ fn main() {
|
||||||
println!("cargo::rerun-if-changed=shaders/rt_compute_rasterize.comp");
|
println!("cargo::rerun-if-changed=shaders/rt_compute_rasterize.comp");
|
||||||
println!("cargo::rerun-if-changed=shaders/rt_compute_grow_one.comp");
|
println!("cargo::rerun-if-changed=shaders/rt_compute_grow_one.comp");
|
||||||
println!("cargo::rerun-if-changed=shaders/rt_compute_grow_two.comp");
|
println!("cargo::rerun-if-changed=shaders/rt_compute_grow_two.comp");
|
||||||
|
println!("cargo::rerun-if-changed=shaders/rt_compute_grow_three.comp");
|
||||||
|
println!("cargo::rerun-if-changed=shaders/rt_compute_combine.comp");
|
||||||
|
|
||||||
std::fs::remove_file("shaders/compiled/geo_cube.spv").unwrap_or(());
|
std::fs::remove_file("shaders/compiled/geo_cube.spv").unwrap_or(());
|
||||||
std::fs::remove_file("shaders/compiled/frag_cube.spv").unwrap_or(());
|
std::fs::remove_file("shaders/compiled/frag_cube.spv").unwrap_or(());
|
||||||
|
@ -30,6 +32,7 @@ fn main() {
|
||||||
std::fs::remove_file("shaders/compiled/rt_compute_grow_one.spv").unwrap_or(());
|
std::fs::remove_file("shaders/compiled/rt_compute_grow_one.spv").unwrap_or(());
|
||||||
std::fs::remove_file("shaders/compiled/rt_compute_grow_two.spv").unwrap_or(());
|
std::fs::remove_file("shaders/compiled/rt_compute_grow_two.spv").unwrap_or(());
|
||||||
std::fs::remove_file("shaders/compiled/rt_compute_grow_three.spv").unwrap_or(());
|
std::fs::remove_file("shaders/compiled/rt_compute_grow_three.spv").unwrap_or(());
|
||||||
|
std::fs::remove_file("shaders/compiled/rt_compute_combine.spv").unwrap_or(());
|
||||||
|
|
||||||
if std::env::consts::OS == "windows" {
|
if std::env::consts::OS == "windows" {
|
||||||
let mut command = Command::new("./shaders/compile.bat");
|
let mut command = Command::new("./shaders/compile.bat");
|
||||||
|
|
|
@ -12,4 +12,5 @@ C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_quad.frag -o shaders/compiled/fr
|
||||||
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_rasterize.comp -o shaders/compiled/rt_compute_rasterize.spv
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_rasterize.comp -o shaders/compiled/rt_compute_rasterize.spv
|
||||||
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_grow_one.comp -o shaders/compiled/rt_compute_grow_one.spv
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_grow_one.comp -o shaders/compiled/rt_compute_grow_one.spv
|
||||||
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_grow_two.comp -o shaders/compiled/rt_compute_grow_two.spv
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_grow_two.comp -o shaders/compiled/rt_compute_grow_two.spv
|
||||||
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_grow_three.comp -o shaders/compiled/rt_compute_grow_three.spv
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_grow_three.comp -o shaders/compiled/rt_compute_grow_three.spv
|
||||||
|
C:/VulkanSDK/1.3.280.0/Bin/glslc.exe shaders/rt_compute_combine.comp -o shaders/compiled/rt_compute_combine.spv
|
|
@ -13,4 +13,5 @@ glslc shaders/rt_quad.frag -o shaders/compiled/frag_rt_quad.spv
|
||||||
glslc shaders/rt_compute_rasterize.comp -o shaders/compiled/rt_compute_rasterize.spv
|
glslc shaders/rt_compute_rasterize.comp -o shaders/compiled/rt_compute_rasterize.spv
|
||||||
glslc shaders/rt_compute_grow_one.comp -o shaders/compiled/rt_compute_grow_one.spv
|
glslc shaders/rt_compute_grow_one.comp -o shaders/compiled/rt_compute_grow_one.spv
|
||||||
glslc shaders/rt_compute_grow_two.comp -o shaders/compiled/rt_compute_grow_two.spv
|
glslc shaders/rt_compute_grow_two.comp -o shaders/compiled/rt_compute_grow_two.spv
|
||||||
glslc shaders/rt_compute_grow_three.comp -o shaders/compiled/rt_compute_grow_three.spv
|
glslc shaders/rt_compute_grow_three.comp -o shaders/compiled/rt_compute_grow_three.spv
|
||||||
|
glslc shaders/rt_compute_combine.comp -o shaders/compiled/rt_compute_combine.spv
|
BIN
shaders/compiled/rt_compute_combine.spv
Normal file
BIN
shaders/compiled/rt_compute_combine.spv
Normal file
Binary file not shown.
51
shaders/rt_compute_combine.comp
Normal file
51
shaders/rt_compute_combine.comp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#version 450
|
||||||
|
|
||||||
|
layout(binding = 0) uniform UniformBufferObject {
|
||||||
|
mat4 model;
|
||||||
|
mat4 geom_rot;
|
||||||
|
mat4 view;
|
||||||
|
mat4 proj;
|
||||||
|
vec3 camera_pos;
|
||||||
|
bool[16] use_geom_shader;
|
||||||
|
} ubo;
|
||||||
|
|
||||||
|
layout(binding = 3) readonly buffer CompoundBuffer {
|
||||||
|
uint compounds[];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 4) readonly buffer ColorBuffer {
|
||||||
|
uint grid_in[];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 9) readonly buffer TransparentBuffer {
|
||||||
|
bool transparent_grid[];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout(binding = 8) buffer SizeBuffer3D {
|
||||||
|
uint grid_size_in[];
|
||||||
|
};
|
||||||
|
|
||||||
|
layout (local_size_x = 16, local_size_y = 1, local_size_z = 1) in;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
uint index = gl_GlobalInvocationID.x;
|
||||||
|
uint output_offset = 0;
|
||||||
|
uint compound_start = 0;
|
||||||
|
// iterate over the compounds and find the work index inside of it
|
||||||
|
while (index > compounds[compound_start] * compounds[compound_start]) {
|
||||||
|
output_offset += compounds[compound_start] * compounds[compound_start] * compounds[compound_start] * 2;
|
||||||
|
index -= compounds[compound_start] * compounds[compound_start];
|
||||||
|
compound_start = compounds[compound_start + 2];
|
||||||
|
}
|
||||||
|
// grid pos in the task
|
||||||
|
uint compound_grid_size = compounds[compound_start];
|
||||||
|
float compound_scale = uintBitsToFloat(compounds[compound_start + 1]);
|
||||||
|
vec3 mid_offset = vec3(compound_scale * 0.5, compound_scale * 0.5, compound_scale * 0.5);
|
||||||
|
uint x = index % compound_grid_size;
|
||||||
|
uint y = ((index) % (compound_grid_size * compound_grid_size) - x) / (compound_grid_size);
|
||||||
|
uint z = (index - x - y * compound_grid_size) / (compound_grid_size * compound_grid_size);
|
||||||
|
|
||||||
|
uint size_x = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3];
|
||||||
|
uint size_y = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3 + 1];
|
||||||
|
uint size_z = grid_size_in[output_offset + (x * compound_grid_size * compound_grid_size + y * compound_grid_size + z) * 3 + 2];
|
||||||
|
}
|
|
@ -27,6 +27,7 @@ pub struct AppData {
|
||||||
pub pipeline_compute_grow_one: vk::Pipeline,
|
pub pipeline_compute_grow_one: vk::Pipeline,
|
||||||
pub pipeline_compute_grow_two: vk::Pipeline,
|
pub pipeline_compute_grow_two: vk::Pipeline,
|
||||||
pub pipeline_compute_grow_three: vk::Pipeline,
|
pub pipeline_compute_grow_three: vk::Pipeline,
|
||||||
|
pub pipeline_compute_combine: vk::Pipeline,
|
||||||
|
|
||||||
pub framebuffers: Vec<vk::Framebuffer>,
|
pub framebuffers: Vec<vk::Framebuffer>,
|
||||||
pub command_pool: vk::CommandPool,
|
pub command_pool: vk::CommandPool,
|
||||||
|
|
|
@ -200,6 +200,35 @@ pub unsafe fn create_command_buffers(device: &Device, data: &mut app_data::AppDa
|
||||||
&[] as &[vk::MemoryBarrier],
|
&[] as &[vk::MemoryBarrier],
|
||||||
&[buffer_memory_barrier_out],
|
&[buffer_memory_barrier_out],
|
||||||
&[] as &[vk::ImageMemoryBarrier]);
|
&[] as &[vk::ImageMemoryBarrier]);
|
||||||
|
|
||||||
|
// combine element
|
||||||
|
device.cmd_bind_pipeline(
|
||||||
|
*command_buffer, vk::PipelineBindPoint::COMPUTE, data.pipeline_compute_combine);
|
||||||
|
|
||||||
|
device.cmd_bind_descriptor_sets(
|
||||||
|
*command_buffer,
|
||||||
|
vk::PipelineBindPoint::COMPUTE,
|
||||||
|
data.pipeline_layout,
|
||||||
|
0,
|
||||||
|
&[data.descriptor_sets[i]],
|
||||||
|
&[]);
|
||||||
|
|
||||||
|
device.cmd_dispatch(*command_buffer, (data.compute_task_one_size as f64 / 16.0).ceil() as u32, 1, 1);
|
||||||
|
|
||||||
|
let buffer_memory_barrier_out = vk::BufferMemoryBarrier::builder()
|
||||||
|
.buffer(data.render_storage_buffers[i])
|
||||||
|
.src_access_mask(vk::AccessFlags::SHADER_WRITE)
|
||||||
|
.dst_access_mask(vk::AccessFlags::SHADER_READ)
|
||||||
|
.size(vk::WHOLE_SIZE as u64)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
device.cmd_pipeline_barrier(*command_buffer,
|
||||||
|
vk::PipelineStageFlags::COMPUTE_SHADER,
|
||||||
|
vk::PipelineStageFlags::FRAGMENT_SHADER,
|
||||||
|
vk::DependencyFlags::DEVICE_GROUP,
|
||||||
|
&[] as &[vk::MemoryBarrier],
|
||||||
|
&[buffer_memory_barrier_out],
|
||||||
|
&[] as &[vk::ImageMemoryBarrier]);
|
||||||
}
|
}
|
||||||
// start render pass
|
// start render pass
|
||||||
let clear_values = &[color_clear_value, depth_clear_value];
|
let clear_values = &[color_clear_value, depth_clear_value];
|
||||||
|
|
19
src/main.rs
19
src/main.rs
|
@ -474,6 +474,7 @@ impl App {
|
||||||
self.device.destroy_pipeline(self.data.pipeline_compute_grow_one, None);
|
self.device.destroy_pipeline(self.data.pipeline_compute_grow_one, None);
|
||||||
self.device.destroy_pipeline(self.data.pipeline_compute_grow_two, None);
|
self.device.destroy_pipeline(self.data.pipeline_compute_grow_two, None);
|
||||||
self.device.destroy_pipeline(self.data.pipeline_compute_grow_three, None);
|
self.device.destroy_pipeline(self.data.pipeline_compute_grow_three, None);
|
||||||
|
self.device.destroy_pipeline(self.data.pipeline_compute_combine, None);
|
||||||
|
|
||||||
self.device.destroy_pipeline_layout(self.data.pipeline_layout, None);
|
self.device.destroy_pipeline_layout(self.data.pipeline_layout, None);
|
||||||
self.device.destroy_render_pass(self.data.render_pass, None);
|
self.device.destroy_render_pass(self.data.render_pass, None);
|
||||||
|
@ -895,6 +896,16 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
.module(compute_shader_module_grow_three)
|
.module(compute_shader_module_grow_three)
|
||||||
.name(b"main\0");
|
.name(b"main\0");
|
||||||
|
|
||||||
|
// load the byte data
|
||||||
|
let compute_bytes = include_bytes!("../shaders/compiled/rt_compute_combine.spv");
|
||||||
|
// create the shaders
|
||||||
|
let compute_shader_module_combine = create_shader_module(device, &compute_bytes[..])?;
|
||||||
|
//create the shader stage for the compute shader
|
||||||
|
let compute_stage_combine = vk::PipelineShaderStageCreateInfo::builder()
|
||||||
|
.stage(vk::ShaderStageFlags::COMPUTE)
|
||||||
|
.module(compute_shader_module_combine)
|
||||||
|
.name(b"main\0");
|
||||||
|
|
||||||
// define input assembly and object type. This is altered when using geometry shader
|
// define input assembly and object type. This is altered when using geometry shader
|
||||||
let mut topology = vk::PrimitiveTopology::TRIANGLE_LIST;
|
let mut topology = vk::PrimitiveTopology::TRIANGLE_LIST;
|
||||||
if data.use_geometry_shader {
|
if data.use_geometry_shader {
|
||||||
|
@ -1051,7 +1062,11 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
.stage(compute_stage_grow_three)
|
.stage(compute_stage_grow_three)
|
||||||
.layout(data.pipeline_layout);
|
.layout(data.pipeline_layout);
|
||||||
|
|
||||||
let compute_pipelines = device.create_compute_pipelines(vk::PipelineCache::null(), &[info_compute_rasterize, info_compute_grow_one, info_compute_grow_two, info_compute_grow_three], None)?.0;
|
let info_compute_combine = vk::ComputePipelineCreateInfo::builder()
|
||||||
|
.stage(compute_stage_combine)
|
||||||
|
.layout(data.pipeline_layout);
|
||||||
|
|
||||||
|
let compute_pipelines = device.create_compute_pipelines(vk::PipelineCache::null(), &[info_compute_rasterize, info_compute_grow_one, info_compute_grow_two, info_compute_grow_three, info_compute_combine], None)?.0;
|
||||||
|
|
||||||
data.pipeline_cube = pipelines[0];
|
data.pipeline_cube = pipelines[0];
|
||||||
data.pipeline_cuboid = pipelines[1];
|
data.pipeline_cuboid = pipelines[1];
|
||||||
|
@ -1061,6 +1076,7 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
data.pipeline_compute_grow_one = compute_pipelines[1];
|
data.pipeline_compute_grow_one = compute_pipelines[1];
|
||||||
data.pipeline_compute_grow_two = compute_pipelines[2];
|
data.pipeline_compute_grow_two = compute_pipelines[2];
|
||||||
data.pipeline_compute_grow_three = compute_pipelines[3];
|
data.pipeline_compute_grow_three = compute_pipelines[3];
|
||||||
|
data.pipeline_compute_combine = compute_pipelines[4];
|
||||||
|
|
||||||
device.destroy_shader_module(vert_shader_module_cube, None);
|
device.destroy_shader_module(vert_shader_module_cube, None);
|
||||||
device.destroy_shader_module(geo_shader_module_cube, None);
|
device.destroy_shader_module(geo_shader_module_cube, None);
|
||||||
|
@ -1077,6 +1093,7 @@ unsafe fn create_pipeline(device: &Device, data: &mut app_data::AppData) -> Resu
|
||||||
device.destroy_shader_module(compute_shader_module_grow_one, None);
|
device.destroy_shader_module(compute_shader_module_grow_one, None);
|
||||||
device.destroy_shader_module(compute_shader_module_grow_two, None);
|
device.destroy_shader_module(compute_shader_module_grow_two, None);
|
||||||
device.destroy_shader_module(compute_shader_module_grow_three, None);
|
device.destroy_shader_module(compute_shader_module_grow_three, None);
|
||||||
|
device.destroy_shader_module(compute_shader_module_combine, None);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue