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 BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18 // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19 // OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 // SOFTWARE. 21 // 22 23 #ifndef __CORE_RESOURCE_HPP__ 24 #define __CORE_RESOURCE_HPP__ 25 26 #include <list> 27 28 #include "core/base.hpp" 29 #include "core/memory.hpp" 30 #include "core/geometry.hpp" 31 #include "pipe/p_state.h" 32 33 namespace clover { 34 class mapping; 35 36 /// 37 /// Class that represents a device-specific instance of some memory 38 /// object. 39 /// 40 class resource { 41 public: 42 typedef clover::point<size_t, 3> point; 43 44 resource(const resource &r) = delete; 45 virtual ~resource(); 46 47 void copy(command_queue &q, const point &origin, const point ®ion, 48 resource &src_resource, const point &src_origin); 49 50 void *add_map(command_queue &q, cl_map_flags flags, bool blocking, 51 const point &origin, const point ®ion); 52 void del_map(void *p); 53 unsigned map_count() const; 54 55 clover::device &dev; 56 clover::memory_obj &obj; 57 58 friend class sub_resource; 59 friend class mapping; 60 friend struct ::_cl_kernel; 61 62 protected: 63 resource(clover::device &dev, clover::memory_obj &obj); 64 65 pipe_sampler_view *bind_sampler_view(clover::command_queue &q); 66 void unbind_sampler_view(clover::command_queue &q, 67 pipe_sampler_view *st); 68 69 pipe_surface *bind_surface(clover::command_queue &q, bool rw); 70 void unbind_surface(clover::command_queue &q, pipe_surface *st); 71 72 pipe_resource *pipe; 73 point offset; 74 75 private: 76 std::list<mapping> maps; 77 }; 78 79 /// 80 /// Resource associated with its own top-level data storage 81 /// allocated in some device. 82 /// 83 class root_resource : public resource { 84 public: 85 root_resource(clover::device &dev, clover::memory_obj &obj, 86 clover::command_queue &q, const std::string &data); 87 root_resource(clover::device &dev, clover::memory_obj &obj, 88 root_resource &r); 89 virtual ~root_resource(); 90 }; 91 92 /// 93 /// Resource that reuses a portion of some other resource as data 94 /// storage. 95 /// 96 class sub_resource : public resource { 97 public: 98 sub_resource(clover::resource &r, point offset); 99 }; 100 101 /// 102 /// Class that represents a mapping of some resource into the CPU 103 /// memory space. 104 /// 105 class mapping { 106 public: 107 mapping(command_queue &q, resource &r, cl_map_flags flags, 108 bool blocking, const resource::point &origin, 109 const resource::point ®ion); 110 mapping(const mapping &m) = delete; 111 mapping(mapping &&m); 112 ~mapping(); 113 operator void*()114 operator void *() { 115 return p; 116 } 117 operator char*()118 operator char *() { 119 return (char *)p; 120 } 121 122 private: 123 pipe_context *pctx; 124 pipe_transfer *pxfer; 125 void *p; 126 }; 127 } 128 129 #endif 130