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 cl_command_queue_properties props); 43 ~command_queue(); 44 45 command_queue(const command_queue &q) = delete; 46 command_queue & 47 operator=(const command_queue &q) = delete; 48 49 void flush(); 50 51 cl_command_queue_properties properties() const; 52 bool profiling_enabled() const; 53 54 const intrusive_ref<clover::context> context; 55 const intrusive_ref<clover::device> device; 56 57 friend class resource; 58 friend class root_resource; 59 friend class mapping; 60 friend class hard_event; 61 friend class sampler; 62 friend class kernel; 63 friend class clover::timestamp::query; 64 friend class clover::timestamp::current; 65 66 private: 67 /// Serialize a hardware event with respect to the previous ones, 68 /// and push it to the pending list. 69 void sequence(hard_event &ev); 70 71 cl_command_queue_properties props; 72 pipe_context *pipe; 73 std::mutex queued_events_mutex; 74 std::deque<intrusive_ref<hard_event>> queued_events; 75 }; 76 } 77 78 #endif 79