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)
override;
101 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;
108 void uploadRadiationOut(
const std::vector<float> &radiation_out_top,
const std::vector<float> &radiation_out_bottom)
override;
109 void uploadCameraScatterBuffers(
const std::vector<float> &scatter_top_cam,
const std::vector<float> &scatter_bottom_cam)
override;
117 return "Vulkan Compute (software BVH)";
127 std::vector<BVHNode> bvh_nodes;
131 VkBuffer buffer = VK_NULL_HANDLE;
132 VmaAllocation allocation = VK_NULL_HANDLE;
133 VkDeviceSize size = 0;
138 Buffer primitive_indices_buffer;
139 Buffer transform_matrices_buffer;
140 Buffer primitive_types_buffer;
141 Buffer primitive_uuids_buffer;
142 Buffer primitive_positions_buffer;
143 Buffer object_subdivisions_buffer;
144 Buffer twosided_flag_buffer;
145 Buffer patch_vertices_buffer;
146 Buffer triangle_vertices_buffer;
147 Buffer normal_buffer;
148 Buffer mask_data_buffer;
149 Buffer mask_sizes_buffer;
150 Buffer mask_offsets_buffer;
151 Buffer mask_IDs_buffer;
152 Buffer uv_data_buffer;
153 Buffer uv_IDs_buffer;
154 Buffer bbox_vertices_buffer;
157 Buffer source_positions_buffer;
158 Buffer source_types_buffer;
159 Buffer source_rotations_buffer;
160 Buffer source_widths_buffer;
161 Buffer source_fluxes_buffer;
162 Buffer reflectivity_buffer;
163 Buffer transmissivity_buffer;
164 Buffer specular_exponent_buffer;
165 Buffer specular_scale_buffer;
166 Buffer source_fluxes_cam_buffer;
167 Buffer band_map_buffer;
170 Buffer radiation_in_buffer;
171 Buffer radiation_out_top_buffer;
172 Buffer radiation_out_bottom_buffer;
173 Buffer scatter_top_buffer;
174 Buffer scatter_bottom_buffer;
175 Buffer camera_radiation_buffer;
176 Buffer camera_pixel_label_buffer;
177 Buffer camera_pixel_depth_buffer;
178 Buffer camera_scatter_top_buffer;
179 Buffer camera_scatter_bottom_buffer;
180 Buffer radiation_specular_buffer;
183 Buffer diffuse_flux_buffer;
184 Buffer diffuse_peak_dir_buffer;
185 Buffer diffuse_extinction_buffer;
186 Buffer diffuse_dist_norm_buffer;
187 Buffer sky_radiance_params_buffer;
188 Buffer camera_sky_radiance_buffer;
189 Buffer solar_disk_radiance_buffer;
192 Buffer debug_counters_buffer;
195 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
196 VkDescriptorSetLayout set_layout_geometry = VK_NULL_HANDLE;
197 VkDescriptorSetLayout set_layout_materials = VK_NULL_HANDLE;
198 VkDescriptorSetLayout set_layout_results = VK_NULL_HANDLE;
199 VkDescriptorSetLayout set_layout_sky = VK_NULL_HANDLE;
200 VkDescriptorSetLayout set_layout_debug = VK_NULL_HANDLE;
201 VkDescriptorSet set_geometry = VK_NULL_HANDLE;
202 VkDescriptorSet set_materials = VK_NULL_HANDLE;
203 VkDescriptorSet set_results = VK_NULL_HANDLE;
204 VkDescriptorSet set_sky = VK_NULL_HANDLE;
205 VkDescriptorSet set_debug = VK_NULL_HANDLE;
209 float cached_solar_disk_cos_angle = 0.0f;
212 VkPipelineLayout pipeline_layout = VK_NULL_HANDLE;
213 VkPipeline pipeline_direct = VK_NULL_HANDLE;
214 VkPipeline pipeline_diffuse = VK_NULL_HANDLE;
215 VkPipeline pipeline_camera = VK_NULL_HANDLE;
216 VkPipeline pipeline_pixel_label = VK_NULL_HANDLE;
219 VkCommandPool command_pool = VK_NULL_HANDLE;
220 VkCommandBuffer transfer_command_buffer = VK_NULL_HANDLE;
221 VkCommandBuffer compute_command_buffer = VK_NULL_HANDLE;
222 VkFence transfer_fence = VK_NULL_HANDLE;
223 VkFence compute_fence = VK_NULL_HANDLE;
226 VkQueryPool timestamp_query_pool = VK_NULL_HANDLE;
227 float timestamp_period = 1.0f;
230 size_t primitive_count = 0;
231 size_t band_count = 0;
232 size_t source_count = 0;
235 uint32_t bbox_count = 0;
236 float periodic_flag_x = 0;
237 float periodic_flag_y = 0;
238 float domain_bounds[4] = {};
241 uint32_t launch_band_count = 0;
242 std::vector<uint32_t> launch_to_global_band;
245 bool descriptors_dirty =
false;
250 Buffer createBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VmaMemoryUsage mem_usage);
255 void destroyBuffer(Buffer &buffer);
260 void uploadBufferData(Buffer &buffer,
const void *data,
size_t size);
265 void downloadBufferData(
const Buffer &buffer,
void *data,
size_t size);
270 void zeroBuffer(Buffer &buffer);
275 void createDescriptorSets();
280 void createPipelines();
285 VkShaderModule loadShader(
const std::string &filename);
290 void createCommandResources();
295 void updateDescriptorSets();