1 // 2 // Copyright 2012 Francisco Jerez 3 // 4 // Permission is hereby granted, free of charge, to any person obtaining a 5 // copy of this software and associated documentation files (the "Software"), 6 // to deal in the Software without restriction, including without limitation 7 // the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 // and/or sell copies of the Software, and to permit persons to whom the 9 // Software is furnished to do so, subject to the following conditions: 10 // 11 // The above copyright notice and this permission notice shall be included in 12 // all copies or substantial portions of the Software. 13 // 14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 // OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 // ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 // OTHER DEALINGS IN THE SOFTWARE. 21 // 22 23 #ifndef CLOVER_CORE_QUEUE_HPP 24 #define CLOVER_CORE_QUEUE_HPP 25 26 #include <deque> 27 #include <mutex> 28 29 #include "core/object.hpp" 30 #include "core/context.hpp" 31 #include "core/timestamp.hpp" 32 #include "pipe/p_context.h" 33 34 namespace clover { 35 class resource; 36 class mapping; 37 class hard_event; 38 39 class command_queue : public ref_counter, public _cl_command_queue { 40 public: 41 command_queue(clover::context &ctx, clover::device &dev, 42 std::vector<cl_queue_properties> properties); 43 command_queue(clover::context &ctx, clover::device &dev, 44 cl_command_queue_properties props); 45 ~command_queue(); 46 47 command_queue(const command_queue &q) = delete; 48 command_queue & 49 operator=(const command_queue &q) = delete; 50 51 void flush(); 52 void svm_migrate(const std::vector<void const *> &svm_pointers, 53 const std::vector<size_t> &sizes, cl_mem_migration_flags flags); 54 55 cl_command_queue_properties props() const; 56 57 std::vector<cl_queue_properties> properties() const; 58 bool profiling_enabled() const; 59 60 const intrusive_ref<clover::context> context; 61 const intrusive_ref<clover::device> device; 62 63 friend class resource; 64 friend class root_resource; 65 friend class mapping; 66 friend class hard_event; 67 friend class sampler; 68 friend class kernel; 69 friend class clover::timestamp::query; 70 friend class clover::timestamp::current; 71 72 private: 73 /// Serialize a hardware event with respect to the previous ones, 74 /// and push it to the pending list. 75 void sequence(hard_event &ev); 76 // Use this instead of flush() if `queued_events_mutex` is acquired. 77 void flush_unlocked(); 78 79 std::vector<cl_queue_properties> _properties; 80 cl_command_queue_properties _props; 81 pipe_context *pipe; 82 std::mutex queued_events_mutex; 83 std::deque<intrusive_ref<hard_event>> queued_events; 84 }; 85 } 86 87 #endif 88