| 737 | } |
| 738 | |
| 739 | std::shared_ptr<device_queue> opencl_context::create_queue(const device& dev) const { |
| 740 | // has a default queue already been created for this device? |
| 741 | bool has_default_queue = false; |
| 742 | std::shared_ptr<device_queue> dev_default_queue; |
| 743 | for (auto&& default_queue : default_queues) { |
| 744 | if(default_queue.first == &dev) { |
| 745 | has_default_queue = true; |
| 746 | dev_default_queue = default_queue.second; |
| 747 | break; |
| 748 | } |
| 749 | } |
| 750 | |
| 751 | // has the user already created a queue for this device (i.e. accessed the default queue)? |
| 752 | bool user_accessed = false; |
| 753 | if(has_default_queue) { |
| 754 | const auto iter = default_queues_user_accessed.find(&dev); |
| 755 | if(iter != std::end(default_queues_user_accessed)) { |
| 756 | user_accessed = iter->second; |
| 757 | } |
| 758 | |
| 759 | // default queue exists and the user is creating a queue for this device for the first time |
| 760 | // -> return the default queue |
| 761 | if(!user_accessed) { |
| 762 | // signal that the user has accessed the default queue, any subsequent create_queue calls will actually create a new queue |
| 763 | default_queues_user_accessed.emplace(&dev, 1u); |
| 764 | floor_return_no_nrvo(dev_default_queue); |
| 765 | } |
| 766 | } |
| 767 | |
| 768 | // create the queue |
| 769 | cl_int create_err = CL_SUCCESS; |
| 770 | #if /*defined(CL_VERSION_2_0) ||*/ 0 // TODO: should only be enabled if platform (and device?) support OpenCL 2.0+ |
| 771 | const cl_queue_properties properties[] { 0 }; |
| 772 | cl_command_queue cl_queue = clCreateCommandQueueWithProperties(ctx, ((const opencl_device&)dev).device_id, |
| 773 | properties, &create_err); |
| 774 | #else |
| 775 | |
| 776 | FLOOR_PUSH_WARNINGS() // silence "clCreateCommandQueue" is deprecated warning |
| 777 | FLOOR_IGNORE_WARNING(deprecated-declarations) |
| 778 | |
| 779 | cl_command_queue cl_queue = clCreateCommandQueue(ctx, ((const opencl_device&)dev).device_id, 0, &create_err); |
| 780 | |
| 781 | FLOOR_POP_WARNINGS() |
| 782 | #endif |
| 783 | if(create_err != CL_SUCCESS) { |
| 784 | log_error("failed to create command queue: $: $", create_err, cl_error_to_string(create_err)); |
| 785 | return {}; |
| 786 | } |
| 787 | |
| 788 | auto ret = std::make_shared<opencl_queue>(dev, cl_queue); |
| 789 | queues.push_back(ret); |
| 790 | |
| 791 | // set the default queue if it hasn't been set yet |
| 792 | if(!has_default_queue) { |
| 793 | default_queues.emplace(&dev, ret); |
| 794 | } |
| 795 | |
| 796 | return ret; |
nothing calls this directly
no test coverage detected