59 static bool probe()
noexcept;
86 void updateSources(
const std::vector<RayTracingSource> &sources)
override;
89 void updateDiffuseRadiation(
const std::vector<float> &flux,
const std::vector<float> &extinction,
const std::vector<helios::vec3> &peak_dir,
const std::vector<float> &dist_norm,
const std::vector<float> &sky_energy)
override;
91 void updateSkyModel(
const std::vector<helios::vec4> &sky_radiance_params,
const std::vector<float> &camera_sky_radiance,
const helios::vec3 &sun_direction,
const std::vector<float> &solar_disk_radiance,
float solar_disk_cos_angle,
92 const std::vector<float> &camera_diffuse_flux,
const std::vector<uint32_t> &band_emission_flag)
override;
102 void getCameraResults(std::vector<float> &pixel_data, std::vector<uint> &pixel_labels, std::vector<float> &pixel_depths,
uint camera_id,
const helios::int2 &resolution)
override;
109 void uploadRadiationOut(
const std::vector<float> &radiation_out_top,
const std::vector<float> &radiation_out_bottom)
override;
110 void uploadCameraScatterBuffers(
const std::vector<float> &scatter_top_cam,
const std::vector<float> &scatter_bottom_cam)
override;
118 return "Vulkan Compute (software BVH)";
128 std::vector<BVHNode> bvh_nodes;
132 VkBuffer buffer = VK_NULL_HANDLE;
133 VmaAllocation allocation = VK_NULL_HANDLE;
134 VkDeviceSize size = 0;
139 Buffer primitive_indices_buffer;
140 Buffer transform_matrices_buffer;
141 Buffer primitive_types_buffer;
142 Buffer primitive_uuids_buffer;
143 Buffer primitive_positions_buffer;
144 Buffer object_subdivisions_buffer;
145 Buffer twosided_flag_buffer;
146 Buffer patch_vertices_buffer;
147 Buffer triangle_vertices_buffer;
148 Buffer normal_buffer;
149 Buffer mask_data_buffer;
150 Buffer mask_sizes_buffer;
151 Buffer mask_offsets_buffer;
152 Buffer mask_IDs_buffer;
153 Buffer uv_data_buffer;
154 Buffer uv_IDs_buffer;
155 Buffer bbox_vertices_buffer;
158 Buffer source_positions_buffer;
159 Buffer source_types_buffer;
160 Buffer source_rotations_buffer;
161 Buffer source_widths_buffer;
162 Buffer source_fluxes_buffer;
163 Buffer reflectivity_buffer;
164 Buffer transmissivity_buffer;
165 Buffer specular_exponent_buffer;
166 Buffer specular_scale_buffer;
167 Buffer source_fluxes_cam_buffer;
168 Buffer band_map_buffer;
169 Buffer is_glass_buffer;
170 Buffer glass_n_buffer;
171 Buffer glass_KL_buffer;
174 Buffer radiation_in_buffer;
175 Buffer radiation_out_top_buffer;
176 Buffer radiation_out_bottom_buffer;
177 Buffer scatter_top_buffer;
178 Buffer scatter_bottom_buffer;
179 Buffer camera_radiation_buffer;
180 Buffer camera_pixel_label_buffer;
181 Buffer camera_pixel_depth_buffer;
182 Buffer camera_scatter_top_buffer;
183 Buffer camera_scatter_bottom_buffer;
184 Buffer radiation_specular_buffer;
187 Buffer diffuse_flux_buffer;
188 Buffer diffuse_peak_dir_buffer;
189 Buffer diffuse_extinction_buffer;
190 Buffer diffuse_dist_norm_buffer;
191 Buffer sky_radiance_params_buffer;
192 Buffer camera_sky_radiance_buffer;
193 Buffer solar_disk_radiance_buffer;
194 Buffer camera_diffuse_flux_buffer;
195 Buffer band_emission_flag_buffer;
198 Buffer debug_counters_buffer;
201 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
202 VkDescriptorSetLayout set_layout_geometry = VK_NULL_HANDLE;
203 VkDescriptorSetLayout set_layout_materials = VK_NULL_HANDLE;
204 VkDescriptorSetLayout set_layout_results = VK_NULL_HANDLE;
205 VkDescriptorSetLayout set_layout_sky = VK_NULL_HANDLE;
206 VkDescriptorSetLayout set_layout_debug = VK_NULL_HANDLE;
207 VkDescriptorSet set_geometry = VK_NULL_HANDLE;
208 VkDescriptorSet set_materials = VK_NULL_HANDLE;
209 VkDescriptorSet set_results = VK_NULL_HANDLE;
210 VkDescriptorSet set_sky = VK_NULL_HANDLE;
211 VkDescriptorSet set_debug = VK_NULL_HANDLE;
215 float cached_solar_disk_cos_angle = 0.0f;
218 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
219 VkPipeline pipeline_direct = VK_NULL_HANDLE;
220 VkPipeline pipeline_diffuse = VK_NULL_HANDLE;
221 VkPipeline pipeline_camera = VK_NULL_HANDLE;
222 VkPipeline pipeline_pixel_label = VK_NULL_HANDLE;
225 VkCommandPool command_pool = VK_NULL_HANDLE;
226 VkCommandBuffer transfer_command_buffer = VK_NULL_HANDLE;
227 VkCommandBuffer compute_command_buffer = VK_NULL_HANDLE;
228 VkFence transfer_fence = VK_NULL_HANDLE;
229 VkFence compute_fence = VK_NULL_HANDLE;
232 VkQueryPool timestamp_query_pool = VK_NULL_HANDLE;
233 float timestamp_period = 1.0f;
236 size_t primitive_count = 0;
237 size_t band_count = 0;
238 size_t source_count = 0;
241 uint32_t bbox_count = 0;
242 float periodic_flag_x = 0;
243 float periodic_flag_y = 0;
244 float domain_bounds[4] = {};
247 uint32_t launch_band_count = 0;
248 std::vector<uint32_t> launch_to_global_band;
251 bool descriptors_dirty =
false;
256 Buffer createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VmaMemoryUsage mem_usage);
261 void destroyBuffer(Buffer &buffer);
266 void uploadBufferData(Buffer &buffer,
const void *data,
size_t size);
271 void downloadBufferData(
const Buffer &buffer,
void *data,
size_t size);
276 void zeroBuffer(Buffer &buffer);
281 void createDescriptorSets();
286 void createPipelines();
291 VkShaderModule loadShader(
const std::string &filename);
296 void createCommandResources();
301 void updateDescriptorSets();