| 243 | |
| 244 | template <auto backend_name, typename backend_queue_type, typename shared_buffer_type> |
| 245 | static inline bool acquire_sync_buffer(const device_queue* cqueue_, const backend_queue_type* rqueue, const device& dev, |
| 246 | aligned_ptr<uint8_t>& buffer, shared_buffer_type* shared_buffer_ptr, |
| 247 | bool& shared_object_state, const size_t& buffer_size, |
| 248 | const MEMORY_FLAG& flags) { |
| 249 | if (!shared_buffer_ptr || !buffer) { |
| 250 | return false; |
| 251 | } |
| 252 | if (!shared_object_state) { |
| 253 | // -> buffer has already been acquired for use with Host-Compute |
| 254 | return true; |
| 255 | } |
| 256 | |
| 257 | if (needs_sync_to_host(flags)) { |
| 258 | const auto cqueue = (cqueue_ != nullptr ? cqueue_ : dev.context->get_device_default_queue(dev)); |
| 259 | #if defined(FLOOR_DEBUG) |
| 260 | // validate host queue |
| 261 | if (const auto hst_queue = dynamic_cast<const host_queue*>(cqueue); hst_queue == nullptr) { |
| 262 | log_error("specified host queue is not a Host-Compute queue"); |
| 263 | return false; |
| 264 | } |
| 265 | #endif |
| 266 | |
| 267 | const auto comp_rqueue = (rqueue != nullptr ? (const device_queue*)rqueue : |
| 268 | device_memory::get_default_queue_for_memory(*shared_buffer_ptr)); |
| 269 | |
| 270 | // full sync |
| 271 | cqueue->finish(); |
| 272 | comp_rqueue->finish(); |
| 273 | |
| 274 | // read/copy shared buffer data to host memory |
| 275 | shared_buffer_ptr->read(*comp_rqueue, buffer.get(), buffer_size, 0); |
| 276 | |
| 277 | // finish read |
| 278 | comp_rqueue->finish(); |
| 279 | } |
| 280 | |
| 281 | shared_object_state = false; |
| 282 | return true; |
| 283 | } |
| 284 | |
| 285 | template <auto backend_name, typename backend_queue_type, typename shared_buffer_type> |
| 286 | static inline bool release_sync_buffer(const device_queue* cqueue_, const backend_queue_type* rqueue, const device& dev, |
nothing calls this directly
no test coverage detected