| 353 | |
| 354 | template <auto backend_name, typename backend_queue_type, typename shared_buffer_type> |
| 355 | static inline bool release_sync_buffer(const compute_queue* cqueue_, const backend_queue_type* rqueue, const compute_device& dev, |
| 356 | const aligned_ptr<uint8_t>& buffer, shared_buffer_type* shared_buffer_ptr, |
| 357 | bool& shared_object_state, const size_t& buffer_size, |
| 358 | const COMPUTE_MEMORY_FLAG& flags) { |
| 359 | if (!shared_buffer_ptr || !buffer) { |
| 360 | return false; |
| 361 | } |
| 362 | if (shared_object_state) { |
| 363 | // -> buffer has already been released for use with the render backend |
| 364 | return true; |
| 365 | } |
| 366 | |
| 367 | if (needs_sync_from_host(flags)) { |
| 368 | const auto cqueue = (cqueue_ != nullptr ? cqueue_ : dev.context->get_device_default_queue(dev)); |
| 369 | #if defined(FLOOR_DEBUG) |
| 370 | // validate host queue |
| 371 | if (const auto hst_queue = dynamic_cast<const host_queue*>(cqueue); hst_queue == nullptr) { |
| 372 | log_error("specified host queue is not a Host-Compute queue"); |
| 373 | return false; |
| 374 | } |
| 375 | #endif |
| 376 | |
| 377 | const auto comp_rqueue = (rqueue != nullptr ? (const compute_queue*)rqueue : |
| 378 | compute_memory::get_default_queue_for_memory(*shared_buffer_ptr)); |
| 379 | |
| 380 | // full sync |
| 381 | cqueue->finish(); |
| 382 | comp_rqueue->finish(); |
| 383 | |
| 384 | // write/copy the host data to the shared buffer |
| 385 | shared_buffer_ptr->write(*comp_rqueue, buffer.get(), buffer_size, 0); |
| 386 | |
| 387 | // finish write |
| 388 | comp_rqueue->finish(); |
| 389 | } |
| 390 | |
| 391 | shared_object_state = true; |
| 392 | return true; |
| 393 | } |
| 394 | |
| 395 | template <auto backend_name, typename backend_queue_type, typename shared_buffer_type> |
| 396 | static inline bool sync_shared_buffer(const compute_queue* cqueue_, const backend_queue_type* rqueue, const compute_device& dev, |
nothing calls this directly
no test coverage detected