Three pass gbuffer

This commit is contained in:
2025-07-01 20:26:49 +01:00
parent 3331e12441
commit 28ae452866
7 changed files with 346 additions and 460 deletions
+2
View File
@@ -2,3 +2,5 @@
pipeline_cache.bin pipeline_cache.bin
log.log log.log
out.spv out.spv
*.recompiled.spv
*.spv-dis
+9 -2
View File
@@ -1,6 +1,13 @@
glslangValidator --spirv-val --spirv-dis -g0 -S frag --target-env vulkan1.4 --quiet src/trace.frag.glsl > src/trace.spv-dis glslangValidator --spirv-val --spirv-dis -g0 -S frag --target-env vulkan1.3 --quiet src/trace.frag.glsl > src/trace.spv-dis
sed -i '/%11 =/,/OpFunctionEnd/d' src/trace.spv-dis sed -i '/%11 =/,/OpFunctionEnd/d' src/trace.spv-dis
sed -i 's/%11\b/%1000/g' src/trace.spv-dis sed -i 's/%11\b/%1000/g' src/trace.spv-dis
spirv-as --preserve-numeric-ids --target-env vulkan1.4 -o src/recompiled.spv src/trace.spv-dis spirv-as --preserve-numeric-ids --target-env vulkan1.3 -o src/trace.recompiled.spv src/trace.spv-dis
rm frag.spv rm frag.spv
# rm src/trace.spv-dis # rm src/trace.spv-dis
glslangValidator --spirv-val --spirv-dis -g0 -S frag --target-env vulkan1.3 --quiet src/normals.frag.glsl > src/normals.spv-dis
sed -i '/%11 =/,/OpFunctionEnd/d' src/normals.spv-dis
sed -i 's/%11\b/%1000/g' src/normals.spv-dis
spirv-as --preserve-numeric-ids --target-env vulkan1.3 -o src/normals.recompiled.spv src/normals.spv-dis
rm frag.spv
# rm src/normals.spv-dis
+245 -30
View File
@@ -192,7 +192,8 @@ struct App {
previous_debug: PreviousDebug, previous_debug: PreviousDebug,
cstate: CState, cstate: CState,
vertex_buffer: Subbuffer<[IVertex; VERTEX_COUNT]>, vertex_buffer: Subbuffer<[IVertex; VERTEX_COUNT]>,
base_module: Module, trace_module: Module,
normals_module: Module,
rcx: Option<RenderContext>, rcx: Option<RenderContext>,
} }
@@ -201,6 +202,7 @@ struct ShaderModules {
implicit_fs: Arc<ShaderModule>, implicit_fs: Arc<ShaderModule>,
lighting_vs: Arc<ShaderModule>, lighting_vs: Arc<ShaderModule>,
lighting_fs: Arc<ShaderModule>, lighting_fs: Arc<ShaderModule>,
normals_fs: Arc<ShaderModule>,
} }
struct RenderContext { struct RenderContext {
@@ -213,6 +215,7 @@ struct RenderContext {
depth_buffer: Arc<ImageView>, depth_buffer: Arc<ImageView>,
shader_modules: ShaderModules, shader_modules: ShaderModules,
implicit_pipeline: Arc<GraphicsPipeline>, implicit_pipeline: Arc<GraphicsPipeline>,
normals_pipeline: Arc<GraphicsPipeline>,
lighting_pipeline: Arc<GraphicsPipeline>, lighting_pipeline: Arc<GraphicsPipeline>,
viewport: Viewport, viewport: Viewport,
recreate_swapchain: bool, recreate_swapchain: bool,
@@ -547,14 +550,23 @@ impl App {
*vertex_buffer.write().unwrap() = CUBE_VERTEX; *vertex_buffer.write().unwrap() = CUBE_VERTEX;
let spv_code = include_bytes!("recompiled.spv"); let trace_spv_code = include_bytes!("trace.recompiled.spv");
let spv_code_u32 = spv_code let trace_spv_code_u32 = trace_spv_code
.array_chunks::<4>() .array_chunks::<4>()
.map(|u| u32::from_le_bytes(*u)) .map(|u| u32::from_le_bytes(*u))
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let mut loader = rspirv::dr::Loader::new(); let mut loader = rspirv::dr::Loader::new();
rspirv::binary::parse_words(spv_code_u32, &mut loader).unwrap(); rspirv::binary::parse_words(trace_spv_code_u32, &mut loader).unwrap();
let base_module = loader.module(); let trace_module = loader.module();
let normals_spv_code = include_bytes!("normals.recompiled.spv");
let normals_spv_code_u32 = normals_spv_code
.array_chunks::<4>()
.map(|u| u32::from_le_bytes(*u))
.collect::<Vec<_>>();
let mut loader = rspirv::dr::Loader::new();
rspirv::binary::parse_words(normals_spv_code_u32, &mut loader).unwrap();
let normals_module = loader.module();
App { App {
instance, instance,
@@ -570,7 +582,8 @@ impl App {
previous_debug: PreviousDebug::default(), previous_debug: PreviousDebug::default(),
cstate, cstate,
vertex_buffer, vertex_buffer,
base_module, trace_module,
normals_module,
rcx: None, rcx: None,
} }
} }
@@ -720,9 +733,10 @@ impl ApplicationHandler for App {
.map(|load| load(self.device.clone()).unwrap()) .map(|load| load(self.device.clone()).unwrap())
.collect::<Vec<_>>(); .collect::<Vec<_>>();
let trace_module = {
let new_module = self.gstate.csg[0] let new_module = self.gstate.csg[0]
.parts .parts
.compile_to_spirv(Some(self.base_module.clone())); .compile_to_spirv(Some(self.trace_module.clone()));
let assembled_module = new_module.assemble(); let assembled_module = new_module.assemble();
let module_as_bytes = assembled_module let module_as_bytes = assembled_module
@@ -733,25 +747,56 @@ impl ApplicationHandler for App {
.collect::<Vec<_>>(); .collect::<Vec<_>>();
if DUMP_SPV_TO_FILE { if DUMP_SPV_TO_FILE {
File::create("out.spv") File::create("trace.out.spv")
.unwrap() .unwrap()
.write(&module_as_bytes) .write(&module_as_bytes)
.unwrap(); .unwrap();
} }
let smodule = unsafe { unsafe {
::vulkano::shader::ShaderModule::new( ::vulkano::shader::ShaderModule::new(
self.device.clone(), self.device.clone(),
ShaderModuleCreateInfo::new(&assembled_module), ShaderModuleCreateInfo::new(&assembled_module),
) )
.unwrap() .unwrap()
}
};
let normals_module = {
let new_module = self.gstate.csg[0]
.parts
.compile_to_spirv(Some(self.normals_module.clone()));
let assembled_module = new_module.assemble();
let module_as_bytes = assembled_module
.iter()
.cloned()
.map(u32::to_le_bytes)
.flatten()
.collect::<Vec<_>>();
if DUMP_SPV_TO_FILE {
File::create("normals.out.spv")
.unwrap()
.write(&module_as_bytes)
.unwrap();
}
unsafe {
::vulkano::shader::ShaderModule::new(
self.device.clone(),
ShaderModuleCreateInfo::new(&assembled_module),
)
.unwrap()
}
}; };
let shader_modules = ShaderModules { let shader_modules = ShaderModules {
implicit_vs: pariter[0].clone(), implicit_vs: pariter[0].clone(),
implicit_fs: smodule, implicit_fs: trace_module,
lighting_vs: pariter[1].clone(), lighting_vs: pariter[1].clone(),
lighting_fs: pariter[2].clone(), lighting_fs: pariter[2].clone(),
normals_fs: normals_module,
}; };
drop(pariter); drop(pariter);
@@ -785,10 +830,15 @@ impl ApplicationHandler for App {
}, },
}, },
passes: [{ passes: [{
color: [color, normals], color: [],
depth_stencil: {depth}, depth_stencil: {depth},
input: [], input: [],
}, },
{
color: [color, normals],
depth_stencil: {},
input: [depth],
},
{ {
color: [final_color], color: [final_color],
depth_stencil: {}, depth_stencil: {},
@@ -811,7 +861,7 @@ impl ApplicationHandler for App {
let (framebuffers, color_buffer, normal_buffer, depth_buffer) = let (framebuffers, color_buffer, normal_buffer, depth_buffer) =
framebuffer_generation(&images, &render_pass, &self.memory_allocator); framebuffer_generation(&images, &render_pass, &self.memory_allocator);
let (implicit_pipeline, lighting_pipeline) = deferred_pipeline_recompile( let (implicit_pipeline, normals_pipeline, lighting_pipeline) = deferred_pipeline_recompile(
&render_pass, &render_pass,
&self.pipeline_cache, &self.pipeline_cache,
&shader_modules, &shader_modules,
@@ -826,7 +876,7 @@ impl ApplicationHandler for App {
event_loop, event_loop,
surface.clone(), surface.clone(),
self.graphics_queue.clone(), self.graphics_queue.clone(),
Subpass::from(render_pass.clone(), 2).unwrap(), Subpass::from(render_pass.clone(), 3).unwrap(),
images[0].format(), images[0].format(),
GuiConfig { GuiConfig {
allow_srgb_render_target: true, allow_srgb_render_target: true,
@@ -845,6 +895,7 @@ impl ApplicationHandler for App {
depth_buffer, depth_buffer,
shader_modules, shader_modules,
implicit_pipeline, implicit_pipeline,
normals_pipeline,
lighting_pipeline, lighting_pipeline,
viewport, viewport,
recreate_swapchain: false, recreate_swapchain: false,
@@ -1010,9 +1061,11 @@ impl App {
if rcx.recreate_shaders { if rcx.recreate_shaders {
rcx.new_object_start = Some(Instant::now()); rcx.new_object_start = Some(Instant::now());
let trace_module = {
let new_module = self.gstate.csg[0] let new_module = self.gstate.csg[0]
.parts .parts
.compile_to_spirv(Some(self.base_module.clone())); .compile_to_spirv(Some(self.trace_module.clone()));
let assembled_module = new_module.assemble(); let assembled_module = new_module.assemble();
let module_as_bytes = assembled_module let module_as_bytes = assembled_module
@@ -1023,28 +1076,63 @@ impl App {
.collect::<Vec<_>>(); .collect::<Vec<_>>();
if DUMP_SPV_TO_FILE { if DUMP_SPV_TO_FILE {
File::create("out.spv") File::create("trace.out.spv")
.unwrap() .unwrap()
.write(&module_as_bytes) .write(&module_as_bytes)
.unwrap(); .unwrap();
} }
let smodule = unsafe { unsafe {
::vulkano::shader::ShaderModule::new( ::vulkano::shader::ShaderModule::new(
self.device.clone(), self.device.clone(),
ShaderModuleCreateInfo::new(&assembled_module), ShaderModuleCreateInfo::new(&assembled_module),
) )
.unwrap() .unwrap()
}
}; };
rcx.shader_modules.implicit_fs = smodule; let normals_module = {
let new_module = self.gstate.csg[0]
.parts
.compile_to_spirv(Some(self.normals_module.clone()));
let assembled_module = new_module.assemble();
let module_as_bytes = assembled_module
.iter()
.cloned()
.map(u32::to_le_bytes)
.flatten()
.collect::<Vec<_>>();
if DUMP_SPV_TO_FILE {
File::create("normals.out.spv")
.unwrap()
.write(&module_as_bytes)
.unwrap();
}
unsafe {
::vulkano::shader::ShaderModule::new(
self.device.clone(),
ShaderModuleCreateInfo::new(&assembled_module),
)
.unwrap()
}
};
rcx.shader_modules.implicit_fs = trace_module;
rcx.shader_modules.normals_fs = normals_module;
rcx.recreate_shaders = false; rcx.recreate_shaders = false;
rcx.recreate_pipelines = true; rcx.recreate_pipelines = true;
} }
if rcx.recreate_pipelines { if rcx.recreate_pipelines {
(rcx.implicit_pipeline, rcx.lighting_pipeline) = deferred_pipeline_recompile( (
rcx.implicit_pipeline,
rcx.normals_pipeline,
rcx.lighting_pipeline,
) = deferred_pipeline_recompile(
&rcx.render_pass, &rcx.render_pass,
&self.pipeline_cache, &self.pipeline_cache,
&rcx.shader_modules, &rcx.shader_modules,
@@ -1184,14 +1272,41 @@ impl App {
//assert!(rcx.lighting_pipeline.layout().set_layouts().len() == 2); //assert!(rcx.lighting_pipeline.layout().set_layouts().len() == 2);
let normals_layout1 = &rcx.normals_pipeline.layout().set_layouts()[0];
let normals_set1 = DescriptorSet::new(
self.descriptor_set_allocator.clone(),
normals_layout1.clone(),
[
//WriteDescriptorSet::buffer(0, uniform_buffer_subbuffer.clone()),
WriteDescriptorSet::buffer(1, cam_set.clone()),
],
[],
)
.unwrap();
let normals_layout2 = &rcx.normals_pipeline.layout().set_layouts()[1];
let normals_set2 = DescriptorSet::new(
self.descriptor_set_allocator.clone(),
normals_layout2.clone(),
[WriteDescriptorSet::image_view(0, rcx.depth_buffer.clone())],
[],
)
.unwrap();
let lighting_layout2 = &rcx.lighting_pipeline.layout().set_layouts()[1];
let lighting_set2 = DescriptorSet::new(
self.descriptor_set_allocator.clone(),
lighting_layout2.clone(),
[
WriteDescriptorSet::image_view(0, rcx.color_buffer.clone()),
WriteDescriptorSet::image_view(1, rcx.normal_buffer.clone()),
WriteDescriptorSet::image_view(2, rcx.depth_buffer.clone()),
],
[],
)
.unwrap();
let lighting_layout1 = &rcx.lighting_pipeline.layout().set_layouts()[0]; let lighting_layout1 = &rcx.lighting_pipeline.layout().set_layouts()[0];
//println!(
// "Descriptor counts: {:?}",
// lighting_layout1
// .descriptor_counts()
// .iter()
// .collect::<Vec<_>>()
//);
let lighting_set1 = DescriptorSet::new( let lighting_set1 = DescriptorSet::new(
self.descriptor_set_allocator.clone(), self.descriptor_set_allocator.clone(),
lighting_layout1.clone(), lighting_layout1.clone(),
@@ -1308,6 +1423,45 @@ impl App {
} }
} }
builder
.next_subpass(
Default::default(),
SubpassBeginInfo {
contents: SubpassContents::Inline,
..Default::default()
},
)
.unwrap();
builder
.bind_pipeline_graphics(rcx.normals_pipeline.clone())
.unwrap()
.bind_descriptor_sets(
PipelineBindPoint::Graphics,
rcx.normals_pipeline.layout().clone(),
0,
vec![normals_set1, normals_set2],
)
.unwrap();
for csg in &self.gstate.csg {
push_constants.world = (Mat4::from_translation(csg.pos * 0.01)
* Mat4::from_euler(
EulerRot::XYZ,
csg.rot.x.to_radians(),
csg.rot.y.to_radians(),
csg.rot.z.to_radians(),
)
* Mat4::from_scale(csg.scale * 2.0))
.to_cols_array_2d();
builder
.push_constants(rcx.normals_pipeline.layout().clone(), 0, push_constants)
.unwrap();
unsafe { builder.draw(3, 1, 0, 0) }.unwrap();
}
builder builder
.next_subpass( .next_subpass(
Default::default(), Default::default(),
@@ -1474,7 +1628,11 @@ fn deferred_pipeline_recompile(
shader_modules: &ShaderModules, shader_modules: &ShaderModules,
debug: &PreviousDebug, debug: &PreviousDebug,
viewport: Option<&Viewport>, viewport: Option<&Viewport>,
) -> (Arc<GraphicsPipeline>, Arc<GraphicsPipeline>) { ) -> (
Arc<GraphicsPipeline>,
Arc<GraphicsPipeline>,
Arc<GraphicsPipeline>,
) {
let device = cache.device(); let device = cache.device();
const SPEC_BOUNDING_BOXES: u32 = 0; const SPEC_BOUNDING_BOXES: u32 = 0;
@@ -1592,11 +1750,68 @@ fn deferred_pipeline_recompile(
..Default::default() ..Default::default()
}), }),
multisample_state: Some(MultisampleState::default()), multisample_state: Some(MultisampleState::default()),
color_blend_state: None,
subpass: Some(deferred_subpass.into()),
..GraphicsPipelineCreateInfo::layout(layout.clone())
},
)
.unwrap()
};
let lighting_vs_entry = shader_modules
.lighting_vs
.specialize(specs.clone())
.unwrap()
.single_entry_point()
.unwrap();
let vertex_input_state = VertexInputState::new();
let lighting_vs_info = PipelineShaderStageCreateInfo::new(lighting_vs_entry);
let normals_fs_info = PipelineShaderStageCreateInfo::new(
shader_modules
.normals_fs
.specialize(specs.clone())
.unwrap()
.single_entry_point()
.unwrap(),
);
let layout = PipelineLayout::new(
device.clone(),
PipelineDescriptorSetLayoutCreateInfo::from_stages([&lighting_vs_info, &normals_fs_info])
.into_pipeline_layout_create_info(device.clone())
.unwrap(),
)
.unwrap();
let stages = [lighting_vs_info, normals_fs_info].into_iter().collect();
let normals_subpass = Subpass::from(render_pass.clone(), 1).unwrap();
let normals_pipeline = {
GraphicsPipeline::new(
device.clone(),
Some(cache.clone()),
GraphicsPipelineCreateInfo {
flags: PipelineCreateFlags::DISABLE_OPTIMIZATION,
stages,
vertex_input_state: Some(vertex_input_state),
input_assembly_state: Some(InputAssemblyState::default()),
dynamic_state: dynamic_state.clone(),
viewport_state: Some(viewport_state.clone()),
rasterization_state: Some(RasterizationState {
front_face: FrontFace::Clockwise,
cull_mode: CullMode::Back,
polygon_mode: PolygonMode::Fill,
..RasterizationState::default()
}),
depth_stencil_state: None,
multisample_state: Some(MultisampleState::default()),
color_blend_state: Some(ColorBlendState::with_attachment_states( color_blend_state: Some(ColorBlendState::with_attachment_states(
deferred_subpass.num_color_attachments(), normals_subpass.num_color_attachments(),
ColorBlendAttachmentState::default(), ColorBlendAttachmentState::default(),
)), )),
subpass: Some(deferred_subpass.into()), subpass: Some(normals_subpass.into()),
..GraphicsPipelineCreateInfo::layout(layout.clone()) ..GraphicsPipelineCreateInfo::layout(layout.clone())
}, },
) )
@@ -1631,7 +1846,7 @@ fn deferred_pipeline_recompile(
.unwrap(); .unwrap();
let stages = [lighting_vs_info, lighting_fs_info].into_iter().collect(); let stages = [lighting_vs_info, lighting_fs_info].into_iter().collect();
let lighting_subpass = Subpass::from(render_pass.clone(), 1).unwrap(); let lighting_subpass = Subpass::from(render_pass.clone(), 2).unwrap();
let lighting_pipeline = { let lighting_pipeline = {
GraphicsPipeline::new( GraphicsPipeline::new(
@@ -1673,7 +1888,7 @@ fn deferred_pipeline_recompile(
dump_pipeline_cache(cache.clone()); dump_pipeline_cache(cache.clone());
(implicit_pipeline, lighting_pipeline) (implicit_pipeline, normals_pipeline, lighting_pipeline)
} }
fn gpu_buffer<T>( fn gpu_buffer<T>(
+52
View File
@@ -0,0 +1,52 @@
// global fragment shader
#version 460
#extension GL_GOOGLE_include_directive:require
#include "include.glsl"
layout(location = 0) in vec2 v_pos;
layout(input_attachment_index = 0, set = 1, binding = 0) uniform subpassInput u_depth;
layout(location = 0) out vec4 f_color;
layout(location = 1) out vec4 f_normal;
float scene(vec3 p) {
return length(p) - 1.0;
}
vec3 WorldPosFromDepth(float depth) {
vec4 clipSpacePosition = vec4(v_pos, depth, 1.0);
vec4 worldSpacePosition = inverse(camera_uniforms.proj * camera_uniforms.view) * clipSpacePosition;
return worldSpacePosition.xyz /= worldSpacePosition.w;
}
const float EPSILON = .0001;
vec3 getNormal(vec3 p) {
vec3 n;
n.x = scene(vec3(p.x + EPSILON, p.y, p.z)).x;
n.y = scene(vec3(p.x, p.y + EPSILON, p.z)).x;
n.z = scene(vec3(p.x, p.y, p.z + EPSILON)).x;
return normalize(n - (scene(p)));
}
//Implicit Surface Entrypoint
void main() {
float depth = subpassLoad(u_depth).x;
if (depth == 1.0) {
discard;
}
vec3 position = (inverse(pc.world) * vec4(WorldPosFromDepth(depth), 1.0)).xyz;
vec3 n = getNormal(position);
f_color = vec4(0.5, 0.5, 0.5, 1.0);
mat3 rotation = mat3(pc.world[0].xyz, pc.world[1].xyz, pc.world[2].xyz);
f_normal = vec4(normalize(rotation * n), 1.0);
return;
}
Binary file not shown.
+1 -20
View File
@@ -8,26 +8,14 @@ layout(location = 0) in vec4 pos;
layout(depth_greater) out float gl_FragDepth; layout(depth_greater) out float gl_FragDepth;
layout(location = 0) out vec4 f_color;
layout(location = 1) out vec4 f_normal;
float scene(vec3 p) { float scene(vec3 p) {
return length(p) - 1.0; return length(p) - 1.0;
} }
const float EPSILON = .0001; const float EPSILON = .0001;
const uint MAX_STEPS = 50; const uint MAX_STEPS = 50;
#define NEARPLANE 0. const float NEARPLANE = 0.;
float FARPLANE = length(pc.dimensions / 8.); float FARPLANE = length(pc.dimensions / 8.);
#define gl_GlobalInvocationID uvec3(1)
vec3 getNormal(vec3 p, float dens) {
vec3 n;
n.x = scene(vec3(p.x + EPSILON, p.y, p.z)).x;
n.y = scene(vec3(p.x, p.y + EPSILON, p.z)).x;
n.z = scene(vec3(p.x, p.y, p.z + EPSILON)).x;
return normalize(n - (scene(p)));
}
vec2 spheretracing(vec3 ori, vec3 dir, out vec3 p) { vec2 spheretracing(vec3 ori, vec3 dir, out vec3 p) {
vec2 td = vec2(NEARPLANE, 1.); vec2 td = vec2(NEARPLANE, 1.);
@@ -54,13 +42,6 @@ void main() {
if (td.y < EPSILON) if (td.y < EPSILON)
{ {
vec3 n = getNormal(p, td.y);
f_color = vec4(0.5, 0.5, 0.5, 1.0);
mat3 rotation = mat3(pc.world[0].xyz, pc.world[1].xyz, pc.world[2].xyz);
f_normal = vec4(normalize(rotation * n), 1.0);
vec4 tpoint = camera_uniforms.proj * camera_uniforms.view * pc.world * vec4(p, 1); vec4 tpoint = camera_uniforms.proj * camera_uniforms.view * pc.world * vec4(p, 1);
gl_FragDepth = (tpoint.z / tpoint.w); gl_FragDepth = (tpoint.z / tpoint.w);
} }
-371
View File
@@ -1,371 +0,0 @@
; SPIR-V
; Version: 1.6
; Generator: Khronos Glslang Reference Front End; 11
; Bound: 289
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %4 "main" %27 %35 %171 %182 %217 %246 %gl_FragDepth %288
OpExecutionMode %4 OriginUpperLeft
OpExecutionMode %4 DepthReplacing
OpExecutionMode %4 DepthGreater
OpDecorate %_arr_uint_uint_16 ArrayStride 4
OpDecorate %_struct_33 Block
OpMemberDecorate %_struct_33 0 ColMajor
OpMemberDecorate %_struct_33 0 MatrixStride 16
OpMemberDecorate %_struct_33 0 Offset 0
OpMemberDecorate %_struct_33 1 Offset 64
OpMemberDecorate %_struct_33 2 Offset 80
OpMemberDecorate %_struct_33 3 Offset 92
OpDecorate %171 Location 0
OpDecorate %_struct_180 Block
OpMemberDecorate %_struct_180 0 ColMajor
OpMemberDecorate %_struct_180 0 MatrixStride 16
OpMemberDecorate %_struct_180 0 Offset 0
OpMemberDecorate %_struct_180 1 ColMajor
OpMemberDecorate %_struct_180 1 MatrixStride 16
OpMemberDecorate %_struct_180 1 Offset 64
OpMemberDecorate %_struct_180 2 Offset 128
OpDecorate %182 Binding 1
OpDecorate %182 DescriptorSet 0
OpDecorate %217 Location 0
OpDecorate %246 Location 1
OpDecorate %gl_FragDepth BuiltIn FragDepth
OpDecorate %_arr_v4float_uint_32 ArrayStride 16
OpDecorate %_arr_v4float_uint_32_0 ArrayStride 16
OpDecorate %_struct_286 Block
OpMemberDecorate %_struct_286 0 Offset 0
OpMemberDecorate %_struct_286 1 Offset 512
OpMemberDecorate %_struct_286 2 Offset 1024
OpDecorate %288 Binding 0
OpDecorate %288 DescriptorSet 0
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v3float = OpTypeVector %float 3
%_ptr_Function_v3float = OpTypePointer Function %v3float
%9 = OpTypeFunction %float %_ptr_Function_v3float
%_ptr_Function_float = OpTypePointer Function %float
%14 = OpTypeFunction %v3float %_ptr_Function_v3float %_ptr_Function_float
%v2float = OpTypeVector %float 2
%20 = OpTypeFunction %v2float %_ptr_Function_v3float %_ptr_Function_v3float %_ptr_Function_v3float
%_ptr_Private_float = OpTypePointer Private %float
%27 = OpVariable %_ptr_Private_float Private
%v4float = OpTypeVector %float 4
%mat4v4float = OpTypeMatrix %v4float 4
%uint = OpTypeInt 32 0
%uint_16 = OpConstant %uint 16
%_arr_uint_uint_16 = OpTypeArray %uint %uint_16
%_struct_33 = OpTypeStruct %mat4v4float %v3float %v3float %_arr_uint_uint_16
%_ptr_PushConstant__struct_33 = OpTypePointer PushConstant %_struct_33
%35 = OpVariable %_ptr_PushConstant__struct_33 PushConstant
%int = OpTypeInt 32 1
%int_1 = OpConstant %int 1
%_ptr_PushConstant_v3float = OpTypePointer PushConstant %v3float
%float_8 = OpConstant %float 8
%float_1 = OpConstant %float 1
%uint_0 = OpConstant %uint 0
%float_9_99999975en05 = OpConstant %float 9.99999975e-05
%uint_1 = OpConstant %uint 1
%uint_2 = OpConstant %uint 2
%_ptr_Function_v2float = OpTypePointer Function %v2float
%float_0 = OpConstant %float 0
%101 = OpConstantComposite %v2float %float_0 %float_1
%float_0_899999976 = OpConstant %float 0.899999976
%_ptr_Function_int = OpTypePointer Function %int
%int_0 = OpConstant %int 0
%bool = OpTypeBool
%uint_50 = OpConstant %uint 50
%_ptr_Input_v4float = OpTypePointer Input %v4float
%171 = OpVariable %_ptr_Input_v4float Input
%_ptr_PushConstant_mat4v4float = OpTypePointer PushConstant %mat4v4float
%_struct_180 = OpTypeStruct %mat4v4float %mat4v4float %v3float
%_ptr_Uniform__struct_180 = OpTypePointer Uniform %_struct_180
%182 = OpVariable %_ptr_Uniform__struct_180 Uniform
%int_2 = OpConstant %int 2
%_ptr_Uniform_v3float = OpTypePointer Uniform %v3float
%_ptr_Output_v4float = OpTypePointer Output %v4float
%217 = OpVariable %_ptr_Output_v4float Output
%float_0_5 = OpConstant %float 0.5
%219 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_1
%mat3v3float = OpTypeMatrix %v3float 3
%_ptr_Function_mat3v3float = OpTypePointer Function %mat3v3float
%_ptr_PushConstant_v4float = OpTypePointer PushConstant %v4float
%246 = OpVariable %_ptr_Output_v4float Output
%_ptr_Function_v4float = OpTypePointer Function %v4float
%_ptr_Uniform_mat4v4float = OpTypePointer Uniform %mat4v4float
%_ptr_Output_float = OpTypePointer Output %float
%gl_FragDepth = OpVariable %_ptr_Output_float Output
%uint_3 = OpConstant %uint 3
%uint_32 = OpConstant %uint 32
%_arr_v4float_uint_32 = OpTypeArray %v4float %uint_32
%_arr_v4float_uint_32_0 = OpTypeArray %v4float %uint_32
%_struct_286 = OpTypeStruct %_arr_v4float_uint_32 %_arr_v4float_uint_32_0 %uint
%_ptr_Uniform__struct_286 = OpTypePointer Uniform %_struct_286
%288 = OpVariable %_ptr_Uniform__struct_286 Uniform
%4 = OpFunction %void None %3
%5 = OpLabel
%169 = OpVariable %_ptr_Function_v3float Function
%174 = OpVariable %_ptr_Function_v3float Function
%195 = OpVariable %_ptr_Function_v2float Function
%196 = OpVariable %_ptr_Function_v3float Function
%197 = OpVariable %_ptr_Function_v3float Function
%199 = OpVariable %_ptr_Function_v3float Function
%201 = OpVariable %_ptr_Function_v3float Function
%209 = OpVariable %_ptr_Function_v3float Function
%210 = OpVariable %_ptr_Function_v3float Function
%212 = OpVariable %_ptr_Function_float Function
%222 = OpVariable %_ptr_Function_mat3v3float Function
%256 = OpVariable %_ptr_Function_v4float Function
%39 = OpAccessChain %_ptr_PushConstant_v3float %35 %int_1
%40 = OpLoad %v3float %39
%42 = OpCompositeConstruct %v3float %float_8 %float_8 %float_8
%43 = OpFDiv %v3float %40 %42
%44 = OpExtInst %float %1 Length %43
OpStore %27 %44
%172 = OpLoad %v4float %171
%173 = OpVectorShuffle %v3float %172 %172 0 1 2
OpStore %169 %173
%175 = OpLoad %v3float %169
%177 = OpAccessChain %_ptr_PushConstant_mat4v4float %35 %int_0
%178 = OpLoad %mat4v4float %177
%179 = OpExtInst %mat4v4float %1 MatrixInverse %178
%185 = OpAccessChain %_ptr_Uniform_v3float %182 %int_2
%186 = OpLoad %v3float %185
%187 = OpCompositeExtract %float %186 0
%188 = OpCompositeExtract %float %186 1
%189 = OpCompositeExtract %float %186 2
%190 = OpCompositeConstruct %v4float %187 %188 %189 %float_1
%191 = OpMatrixTimesVector %v4float %179 %190
%192 = OpVectorShuffle %v3float %191 %191 0 1 2
%193 = OpFSub %v3float %175 %192
%194 = OpExtInst %v3float %1 Normalize %193
OpStore %174 %194
%198 = OpLoad %v3float %169
OpStore %197 %198
%200 = OpLoad %v3float %174
OpStore %199 %200
%202 = OpFunctionCall %v2float %24 %197 %199 %201
%203 = OpLoad %v3float %201
OpStore %196 %203
OpStore %195 %202
%204 = OpAccessChain %_ptr_Function_float %195 %uint_1
%205 = OpLoad %float %204
%206 = OpFOrdLessThan %bool %205 %float_9_99999975en05
OpSelectionMerge %208 None
OpBranchConditional %206 %207 %280
%207 = OpLabel
%211 = OpLoad %v3float %196
OpStore %210 %211
%213 = OpAccessChain %_ptr_Function_float %195 %uint_1
%214 = OpLoad %float %213
OpStore %212 %214
%215 = OpFunctionCall %v3float %17 %210 %212
OpStore %209 %215
OpStore %217 %219
%224 = OpAccessChain %_ptr_PushConstant_v4float %35 %int_0 %int_0
%225 = OpLoad %v4float %224
%226 = OpVectorShuffle %v3float %225 %225 0 1 2
%227 = OpAccessChain %_ptr_PushConstant_v4float %35 %int_0 %int_1
%228 = OpLoad %v4float %227
%229 = OpVectorShuffle %v3float %228 %228 0 1 2
%230 = OpAccessChain %_ptr_PushConstant_v4float %35 %int_0 %int_2
%231 = OpLoad %v4float %230
%232 = OpVectorShuffle %v3float %231 %231 0 1 2
%233 = OpCompositeExtract %float %226 0
%234 = OpCompositeExtract %float %226 1
%235 = OpCompositeExtract %float %226 2
%236 = OpCompositeExtract %float %229 0
%237 = OpCompositeExtract %float %229 1
%238 = OpCompositeExtract %float %229 2
%239 = OpCompositeExtract %float %232 0
%240 = OpCompositeExtract %float %232 1
%241 = OpCompositeExtract %float %232 2
%242 = OpCompositeConstruct %v3float %233 %234 %235
%243 = OpCompositeConstruct %v3float %236 %237 %238
%244 = OpCompositeConstruct %v3float %239 %240 %241
%245 = OpCompositeConstruct %mat3v3float %242 %243 %244
OpStore %222 %245
%247 = OpLoad %mat3v3float %222
%248 = OpLoad %v3float %209
%249 = OpMatrixTimesVector %v3float %247 %248
%250 = OpExtInst %v3float %1 Normalize %249
%251 = OpCompositeExtract %float %250 0
%252 = OpCompositeExtract %float %250 1
%253 = OpCompositeExtract %float %250 2
%254 = OpCompositeConstruct %v4float %251 %252 %253 %float_1
OpStore %246 %254
%258 = OpAccessChain %_ptr_Uniform_mat4v4float %182 %int_1
%259 = OpLoad %mat4v4float %258
%260 = OpAccessChain %_ptr_Uniform_mat4v4float %182 %int_0
%261 = OpLoad %mat4v4float %260
%262 = OpMatrixTimesMatrix %mat4v4float %259 %261
%263 = OpAccessChain %_ptr_PushConstant_mat4v4float %35 %int_0
%264 = OpLoad %mat4v4float %263
%265 = OpMatrixTimesMatrix %mat4v4float %262 %264
%266 = OpLoad %v3float %196
%267 = OpCompositeExtract %float %266 0
%268 = OpCompositeExtract %float %266 1
%269 = OpCompositeExtract %float %266 2
%270 = OpCompositeConstruct %v4float %267 %268 %269 %float_1
%271 = OpMatrixTimesVector %v4float %265 %270
OpStore %256 %271
%274 = OpAccessChain %_ptr_Function_float %256 %uint_2
%275 = OpLoad %float %274
%277 = OpAccessChain %_ptr_Function_float %256 %uint_3
%278 = OpLoad %float %277
%279 = OpFDiv %float %275 %278
OpStore %gl_FragDepth %279
OpBranch %208
%280 = OpLabel
OpTerminateInvocation
%208 = OpLabel
OpReturn
OpFunctionEnd
%17 = OpFunction %v3float None %14
%15 = OpFunctionParameter %_ptr_Function_v3float
%16 = OpFunctionParameter %_ptr_Function_float
%18 = OpLabel
%51 = OpVariable %_ptr_Function_v3float Function
%64 = OpVariable %_ptr_Function_v3float Function
%75 = OpVariable %_ptr_Function_v3float Function
%86 = OpVariable %_ptr_Function_v3float Function
%90 = OpVariable %_ptr_Function_v3float Function
%53 = OpAccessChain %_ptr_Function_float %15 %uint_0
%54 = OpLoad %float %53
%56 = OpFAdd %float %54 %float_9_99999975en05
%58 = OpAccessChain %_ptr_Function_float %15 %uint_1
%59 = OpLoad %float %58
%61 = OpAccessChain %_ptr_Function_float %15 %uint_2
%62 = OpLoad %float %61
%63 = OpCompositeConstruct %v3float %56 %59 %62
OpStore %64 %63
%65 = OpFunctionCall %float %1000 %64
%66 = OpAccessChain %_ptr_Function_float %51 %uint_0
OpStore %66 %65
%67 = OpAccessChain %_ptr_Function_float %15 %uint_0
%68 = OpLoad %float %67
%69 = OpAccessChain %_ptr_Function_float %15 %uint_1
%70 = OpLoad %float %69
%71 = OpFAdd %float %70 %float_9_99999975en05
%72 = OpAccessChain %_ptr_Function_float %15 %uint_2
%73 = OpLoad %float %72
%74 = OpCompositeConstruct %v3float %68 %71 %73
OpStore %75 %74
%76 = OpFunctionCall %float %1000 %75
%77 = OpAccessChain %_ptr_Function_float %51 %uint_1
OpStore %77 %76
%78 = OpAccessChain %_ptr_Function_float %15 %uint_0
%79 = OpLoad %float %78
%80 = OpAccessChain %_ptr_Function_float %15 %uint_1
%81 = OpLoad %float %80
%82 = OpAccessChain %_ptr_Function_float %15 %uint_2
%83 = OpLoad %float %82
%84 = OpFAdd %float %83 %float_9_99999975en05
%85 = OpCompositeConstruct %v3float %79 %81 %84
OpStore %86 %85
%87 = OpFunctionCall %float %1000 %86
%88 = OpAccessChain %_ptr_Function_float %51 %uint_2
OpStore %88 %87
%89 = OpLoad %v3float %51
%91 = OpLoad %v3float %15
OpStore %90 %91
%92 = OpFunctionCall %float %1000 %90
%93 = OpCompositeConstruct %v3float %92 %92 %92
%94 = OpFSub %v3float %89 %93
%95 = OpExtInst %v3float %1 Normalize %94
OpReturnValue %95
OpFunctionEnd
%24 = OpFunction %v2float None %20
%21 = OpFunctionParameter %_ptr_Function_v3float
%22 = OpFunctionParameter %_ptr_Function_v3float
%23 = OpFunctionParameter %_ptr_Function_v3float
%25 = OpLabel
%99 = OpVariable %_ptr_Function_v2float Function
%103 = OpVariable %_ptr_Function_v3float Function
%122 = OpVariable %_ptr_Function_int Function
%147 = OpVariable %_ptr_Function_v3float Function
OpStore %99 %101
%102 = OpLoad %v3float %21
OpStore %23 %102
%104 = OpLoad %v3float %23
OpStore %103 %104
%105 = OpFunctionCall %float %1000 %103
%107 = OpFMul %float %105 %float_0_899999976
%108 = OpAccessChain %_ptr_Function_float %99 %uint_1
OpStore %108 %107
%109 = OpAccessChain %_ptr_Function_float %99 %uint_1
%110 = OpLoad %float %109
%111 = OpAccessChain %_ptr_Function_float %99 %uint_0
%112 = OpLoad %float %111
%113 = OpFAdd %float %112 %110
%114 = OpAccessChain %_ptr_Function_float %99 %uint_0
OpStore %114 %113
%115 = OpLoad %v3float %21
%116 = OpLoad %v3float %22
%117 = OpAccessChain %_ptr_Function_float %99 %uint_0
%118 = OpLoad %float %117
%119 = OpVectorTimesScalar %v3float %116 %118
%120 = OpFAdd %v3float %115 %119
OpStore %23 %120
OpStore %122 %int_0
OpBranch %124
%124 = OpLabel
OpLoopMerge %126 %127 None
OpBranch %128
%128 = OpLabel
%130 = OpLoad %int %122
%131 = OpBitcast %uint %130
%133 = OpULessThan %bool %131 %uint_50
OpSelectionMerge %135 None
OpBranchConditional %133 %134 %135
%134 = OpLabel
%136 = OpAccessChain %_ptr_Function_float %99 %uint_1
%137 = OpLoad %float %136
%138 = OpFOrdGreaterThan %bool %137 %float_9_99999975en05
OpBranch %135
%135 = OpLabel
%139 = OpPhi %bool %133 %128 %138 %134
OpSelectionMerge %141 None
OpBranchConditional %139 %140 %141
%140 = OpLabel
%142 = OpAccessChain %_ptr_Function_float %99 %uint_0
%143 = OpLoad %float %142
%144 = OpLoad %float %27
%145 = OpFOrdLessThan %bool %143 %144
OpBranch %141
%141 = OpLabel
%146 = OpPhi %bool %139 %135 %145 %140
OpBranchConditional %146 %125 %126
%125 = OpLabel
%148 = OpLoad %v3float %23
OpStore %147 %148
%149 = OpFunctionCall %float %1000 %147
%150 = OpFMul %float %149 %float_0_899999976
%151 = OpAccessChain %_ptr_Function_float %99 %uint_1
OpStore %151 %150
%152 = OpAccessChain %_ptr_Function_float %99 %uint_1
%153 = OpLoad %float %152
%154 = OpAccessChain %_ptr_Function_float %99 %uint_0
%155 = OpLoad %float %154
%156 = OpFAdd %float %155 %153
%157 = OpAccessChain %_ptr_Function_float %99 %uint_0
OpStore %157 %156
%158 = OpLoad %v3float %21
%159 = OpLoad %v3float %22
%160 = OpAccessChain %_ptr_Function_float %99 %uint_0
%161 = OpLoad %float %160
%162 = OpVectorTimesScalar %v3float %159 %161
%163 = OpFAdd %v3float %158 %162
OpStore %23 %163
OpBranch %127
%127 = OpLabel
%164 = OpLoad %int %122
%165 = OpIAdd %int %164 %int_1
OpStore %122 %165
OpBranch %124
%126 = OpLabel
%166 = OpLoad %v2float %99
OpReturnValue %166
OpFunctionEnd