MCPcopy Create free account
hub / github.com/a2flo/floor / execute

Method execute

compute/vulkan/vulkan_kernel.cpp:240–465  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

238}
239
240void vulkan_kernel::execute(const compute_queue& cqueue,
241 vulkan_command_buffer* external_cmd_buffer,
242 const bool& is_cooperative,
243 const bool& wait_until_completion,
244 const uint32_t& dim floor_unused,
245 const uint3& global_work_size,
246 const uint3& local_work_size_,
247 const vector<compute_kernel_arg>& args,
248 const vector<const compute_fence*>& wait_fences_,
249 const vector<compute_fence*>& signal_fences_,
250 const char* debug_label,
251 kernel_completion_handler_f&& completion_handler) const {
252 // no cooperative support yet
253 if (is_cooperative) {
254 log_error("cooperative kernel execution is not supported for Vulkan");
255 return;
256 }
257
258 // find entry for queue device
259 const auto kernel_iter = get_kernel(cqueue);
260 if (kernel_iter == kernels.cend()) {
261 log_error("no kernel for this compute queue/device exists!");
262 return;
263 }
264
265 const auto& vk_dev = kernel_iter->first.get();
266 const auto& vk_queue = (const vulkan_queue&)cqueue;
267 const auto& vk_ctx = *(vulkan_compute*)vk_dev.context;
268
269 // check work size
270 const uint3 block_dim = check_local_work_size(kernel_iter->second, local_work_size_);
271 if (kernel_iter->second.info->has_valid_required_local_size() &&
272 (kernel_iter->second.info->required_local_size != local_work_size_.maxed(1u)).any()) {
273 log_error("kernel $ has fixed compiled required local size of $, it may not be executed with a different local size of $",
274 kernel_iter->second.info->name, kernel_iter->second.info->required_local_size, local_work_size_);
275 return;
276 }
277
278 const uint3 grid_dim_overflow {
279 global_work_size.x > 0 ? std::min(uint32_t(global_work_size.x % block_dim.x), 1u) : 0u,
280 global_work_size.y > 0 ? std::min(uint32_t(global_work_size.y % block_dim.y), 1u) : 0u,
281 global_work_size.z > 0 ? std::min(uint32_t(global_work_size.z % block_dim.z), 1u) : 0u
282 };
283 uint3 grid_dim { (global_work_size / block_dim) + grid_dim_overflow };
284 grid_dim.max(1u);
285
286 // create command buffer ("encoder") for this kernel execution
287 const vector<const vulkan_kernel_entry*> shader_entries {
288 &kernel_iter->second
289 };
290 bool encoder_success = false;
291 auto encoder = create_encoder(cqueue, external_cmd_buffer,
292 get_pipeline_spec(vk_dev, kernel_iter->second, block_dim),
293 kernel_iter->second.pipeline_layout,
294 shader_entries, debug_label, encoder_success);
295 if (!encoder_success) {
296 log_error("failed to create vulkan encoder / command buffer for kernel \"$\"", kernel_iter->second.info->name);
297 return;

Callers

nothing calls this directly

Tested by

no test coverage detected