Skip to content

Commit

Permalink
Make scene textures the last descriptor + free DDGI resources upon exit
Browse files Browse the repository at this point in the history
  • Loading branch information
yuphin committed Nov 27, 2022
1 parent b7719df commit 94385a0
Show file tree
Hide file tree
Showing 17 changed files with 77 additions and 42 deletions.
3 changes: 3 additions & 0 deletions src/Framework/Shader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -589,6 +589,9 @@ int Shader::compile(RenderPass* pass) {
std::cout << "SPIR-V assembly:" << std::endl << assembly <<
std::endl;*/
binary = compile_file(filename, mstages[get_ext(filename)], str);
if (filename == "src/shaders/integrators/path/path.rgen") {
int a = 4;
}
/* std::cout << "Compiled to a binary module with " << binary.size()
<< " words." << std::endl;*/
}
Expand Down
1 change: 1 addition & 0 deletions src/Framework/VkUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ VkImageLayout get_image_layout(VkDescriptorType type) {
switch (type) {
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
case VK_DESCRIPTOR_TYPE_SAMPLER:
return VK_IMAGE_LAYOUT_READ_ONLY_OPTIMAL;
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
return VK_IMAGE_LAYOUT_GENERAL;
Expand Down
2 changes: 1 addition & 1 deletion src/RayTracer/BDPT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,8 @@ void BDPT::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
//.finalize();

Expand Down
30 changes: 28 additions & 2 deletions src/RayTracer/DDGI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,8 +166,8 @@ void DDGI::render() {
.push_constants(&pc_ray)
.zero(g_buffer)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Trace rays from probes
uint32_t grid_size = probe_counts.x * probe_counts.y * probe_counts.z;
Expand All @@ -182,8 +182,8 @@ void DDGI::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind({mesh_lights_buffer, ddgi_ubo_buffer, rt.radiance_tex, rt.dir_depth_tex})
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Classify
uint32_t wg_x = (probe_counts.x * probe_counts.y * probe_counts.z + 31) / 32;
Expand Down Expand Up @@ -282,8 +282,34 @@ void DDGI::destroy() {
Integrator::destroy();
std::vector<Buffer*> buffer_list = {
&g_buffer,
&direct_lighting_buffer,
&ddgi_ubo_buffer,
&probe_offsets_buffer
};

std::vector<Texture*> tex_list = {
&rt.radiance_tex,
&rt.dir_depth_tex,
&output.tex
};

for (auto b : buffer_list) {
b->destroy();
}

for (auto t : tex_list) {
t->destroy();
}

vkDestroySampler(instance->vkb.ctx.device, bilinear_sampler, nullptr);
vkDestroySampler(instance->vkb.ctx.device, nearest_sampler, nullptr);

for (auto& irr_tex : irr_texes) {
irr_tex.destroy();
}

for (auto& depth_tex : depth_texes) {
depth_tex.destroy();
}

}
10 changes: 5 additions & 5 deletions src/RayTracer/Integrator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,15 +129,15 @@ void Integrator::init() {

auto add_default_texture = [this, instance]() {
std::array<uint8_t, 4> nil = {0, 0, 0, 0};
diffuse_textures.resize(1);
scene_textures.resize(1);
auto ci = make_img2d_ci(VkExtent2D{1, 1});
diffuse_textures[0].load_from_data(&instance->vkb.ctx, nil.data(), 4, ci, texture_sampler);
scene_textures[0].load_from_data(&instance->vkb.ctx, nil.data(), 4, ci, texture_sampler);
};

if (!lumen_scene->textures.size()) {
add_default_texture();
} else {
diffuse_textures.resize(lumen_scene->textures.size());
scene_textures.resize(lumen_scene->textures.size());
int i = 0;
for (const auto& texture_path : lumen_scene->textures) {
int x, y, n;
Expand All @@ -146,7 +146,7 @@ void Integrator::init() {
auto size = x * y * 4;
auto img_dims = VkExtent2D{(uint32_t)x, (uint32_t)y};
auto ci = make_img2d_ci(img_dims, VK_FORMAT_R8G8B8A8_SRGB, VK_IMAGE_USAGE_SAMPLED_BIT, false);
diffuse_textures[i].load_from_data(&instance->vkb.ctx, data, size, ci, texture_sampler, false);
scene_textures[i].load_from_data(&instance->vkb.ctx, data, size, ci, texture_sampler, false);
stbi_image_free(data);
i++;
}
Expand Down Expand Up @@ -299,7 +299,7 @@ void Integrator::destroy() {
b->destroy();
}
output_tex.destroy();
for (auto& tex : diffuse_textures) {
for (auto& tex : scene_textures) {
tex.destroy();
}
vkDestroySampler(instance->vkb.ctx.device, texture_sampler, nullptr);
Expand Down
2 changes: 1 addition & 1 deletion src/RayTracer/Integrator.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ class Integrator {
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_PIPELINE_PROPERTIES_KHR};
LumenInstance* instance;
std::vector<Light> lights;
std::vector<Texture2D> diffuse_textures;
std::vector<Texture2D> scene_textures;
uint32_t total_light_triangle_cnt = 0;
float total_light_area = 0;
LumenScene* lumen_scene;
Expand Down
6 changes: 3 additions & 3 deletions src/RayTracer/PSSMLT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -225,8 +225,8 @@ void PSSMLT::render() {
.push_constants(&pc_ray)
.zero({light_path_buffer, camera_path_buffer})
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

int counter = 0;
Expand Down Expand Up @@ -295,8 +295,8 @@ void PSSMLT::render() {
.push_constants(&pc_ray)
.zero({light_path_buffer, camera_path_buffer})
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

instance->vkb.rg->run_and_submit(cmd);
Expand All @@ -316,8 +316,8 @@ void PSSMLT::render() {
.push_constants(&pc_ray)
.zero({light_path_buffer, camera_path_buffer})
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
};
const uint32_t iter_cnt = 100;
Expand Down
2 changes: 1 addition & 1 deletion src/RayTracer/Path.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ void Path::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
//.write(output_tex) // Needed if the automatic shader inference is disabled
.bind_tlas(instance->vkb.tlas);
instance->vkb.rg->run_and_submit(cmd);
Expand Down
6 changes: 3 additions & 3 deletions src/RayTracer/ReSTIR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ void ReSTIR::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Spatial pass
instance->vkb.rg
Expand All @@ -116,8 +116,8 @@ void ReSTIR::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

// Output
Expand All @@ -136,8 +136,8 @@ void ReSTIR::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

if (!do_spatiotemporal) {
Expand Down
6 changes: 3 additions & 3 deletions src/RayTracer/ReSTIRGI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@ void ReSTIRGI::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas)
.copy(restir_samples_buffer, restir_samples_old_buffer);

Expand All @@ -119,8 +119,8 @@ void ReSTIRGI::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

// Spatial reuse
Expand All @@ -139,8 +139,8 @@ void ReSTIRGI::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Output
instance->vkb.rg
Expand Down
12 changes: 6 additions & 6 deletions src/RayTracer/SMLT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,8 @@ void SMLT::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Eye
instance->vkb.rg
Expand All @@ -271,8 +271,8 @@ void SMLT::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
}
int counter = 0;
Expand Down Expand Up @@ -339,8 +339,8 @@ void SMLT::render() {
.push_constants(&pc_ray)
.zero(mlt_samplers_buffer)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Eye
instance->vkb.rg
Expand All @@ -354,8 +354,8 @@ void SMLT::render() {
.push_constants(&pc_ray)
.zero(mlt_samplers_buffer)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
}
instance->vkb.rg->run_and_submit(cmd);
Expand All @@ -376,8 +376,8 @@ void SMLT::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Eye
instance->vkb.rg
Expand All @@ -390,8 +390,8 @@ void SMLT::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
};
const uint32_t iter_cnt = 100;
Expand Down
6 changes: 3 additions & 3 deletions src/RayTracer/SPPM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@ void SPPM::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Calculate scene bbox given the calculated radius
op_reduce("OpReduce: Max", "src/shaders/integrators/sppm/max.comp", "OpReduce: Reduce Max",
Expand All @@ -143,8 +143,8 @@ void SPPM::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Gather
instance->vkb.rg
Expand All @@ -153,7 +153,7 @@ void SPPM::render() {
.dims = {(uint32_t)std::ceil(instance->width * instance->height / float(1024.0f)), 1, 1}})
.push_constants(&pc_ray)
.bind(scene_desc_buffer)
.bind_texture_array(diffuse_textures);
.bind_texture_array(scene_textures);
// Composite
instance->vkb.rg
->add_compute("Composite",
Expand Down
8 changes: 4 additions & 4 deletions src/RayTracer/VCM.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,8 @@ void VCM::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

// Check resampling
Expand Down Expand Up @@ -202,8 +202,8 @@ void VCM::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
pc_ray.random_num = rand() % UINT_MAX;
// Trace spawned rays
Expand All @@ -222,8 +222,8 @@ void VCM::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Select a reservoir sample
instance->vkb.rg
Expand Down Expand Up @@ -256,8 +256,8 @@ void VCM::render() {
scene_ubo_buffer,
scene_desc_buffer,
})
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);

if (!do_spatiotemporal) {
Expand Down
8 changes: 4 additions & 4 deletions src/RayTracer/VCMMLT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -297,8 +297,8 @@ void VCMMLT::render() {
.zero({chain_stats_buffer, mlt_atomicsum_buffer})
.zero(photon_buffer, use_vm)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Start bootstrap sampling
pipeline_name = "VCMMLT - Bootstrap " + pipeline_postfix;
Expand All @@ -313,8 +313,8 @@ void VCMMLT::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
int counter = 0;
prefix_scan(0, lumen_scene->config.num_bootstrap_samples, counter, instance->vkb.rg.get());
Expand Down Expand Up @@ -347,8 +347,8 @@ void VCMMLT::render() {
.accel = instance->vkb.tlas.accel})
.push_constants(&pc_ray)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
// Sum up chain stats
sum_up_chain_data();
Expand Down Expand Up @@ -378,8 +378,8 @@ void VCMMLT::render() {
.push_constants(&pc_ray)
.zero(mlt_atomicsum_buffer)
.bind(rt_bindings)
.bind_texture_array(diffuse_textures)
.bind(mesh_lights_buffer)
.bind_texture_array(scene_textures)
.bind_tlas(instance->vkb.tlas);
sum_up_chain_data();
// Normalization
Expand Down
Loading

0 comments on commit 94385a0

Please sign in to comment.