resource.cpp revision c6db1b3396384186aab5b685fe1fd540e17b3a62
1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez 3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a 5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"), 6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation 7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the 9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions: 10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in 12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software. 13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/resource.hpp" 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "pipe/p_screen.h" 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "util/u_sampler.h" 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace { 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez class box { 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez box(const resource::point &origin, const resource::point &size) : 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe({ (unsigned)origin[0], (unsigned)origin[1], 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (unsigned)origin[2], (unsigned)size[0], 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (unsigned)size[1], (unsigned)size[2] }) { 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez operator const pipe_box *() { 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return &pipe; 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_box pipe; 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::resource(clover::device &dev, clover::memory_obj &obj) : 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez dev(dev), obj(obj), pipe(NULL), offset{0} { 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::~resource() { 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::copy(command_queue &q, const point &origin, const point ®ion, 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource &src_res, const point &src_origin) { 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point p = offset + origin; 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->resource_copy_region(q.pipe, pipe, 0, p[0], p[1], p[2], 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez src_res.pipe, 0, 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez box(src_res.offset + src_origin, region)); 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid * 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::add_map(command_queue &q, cl_map_flags flags, bool blocking, 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const point &origin, const point ®ion) { 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez maps.emplace_back(q, *this, flags, blocking, origin, region); 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return maps.back(); 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::del_map(void *p) { 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto it = std::find(maps.begin(), maps.end(), p); 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (it != maps.end()) 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez maps.erase(it); 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezunsigned 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::map_count() const { 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return maps.size(); 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezpipe_sampler_view * 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::bind_sampler_view(clover::command_queue &q) { 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_sampler_view info; 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez u_sampler_view_default_template(&info, pipe, pipe->format); 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return q.pipe->create_sampler_view(q.pipe, pipe, &info); 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::unbind_sampler_view(clover::command_queue &q, 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_sampler_view *st) { 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->sampler_view_destroy(q.pipe, st); 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezpipe_surface * 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::bind_surface(clover::command_queue &q, bool rw) { 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_surface info {}; 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.format = pipe->format; 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.usage = pipe->bind; 103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.writable = rw; 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (pipe->target == PIPE_BUFFER) 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.u.buf.last_element = pipe->width0 - 1; 107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return q.pipe->create_surface(q.pipe, pipe, &info); 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::unbind_surface(clover::command_queue &q, pipe_surface *st) { 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->surface_destroy(q.pipe, st); 114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezroot_resource::root_resource(clover::device &dev, clover::memory_obj &obj, 117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::string data) : 118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource(dev, obj) { 119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_resource info {}; 120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (image *img = dynamic_cast<image *>(&obj)) { 122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.format = translate_format(img->format()); 123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.width0 = img->width(); 124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.height0 = img->height(); 125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.depth0 = img->depth(); 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } else { 127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.width0 = obj.size(); 128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 130c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.target = translate_target(obj.type()); 131c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.bind = (PIPE_BIND_SAMPLER_VIEW | 132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_COMPUTE_RESOURCE | 133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_GLOBAL | 134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_TRANSFER_READ | 135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_TRANSFER_WRITE); 136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 137c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe = dev.pipe->resource_create(dev.pipe, &info); 138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!pipe) 139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_OUT_OF_RESOURCES); 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez assert(data.empty()); // XXX -- initialize it with the supplied data 142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezroot_resource::root_resource(clover::device &dev, clover::memory_obj &obj, 145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::root_resource &r) : 146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource(dev, obj) { 147c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez assert(0); // XXX -- resource shared among dev and r.dev 148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 149c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezroot_resource::~root_resource() { 151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez dev.pipe->resource_destroy(dev.pipe, pipe); 152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezsub_resource::sub_resource(clover::resource &r, point offset) : 155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource(r.dev, r.obj) { 156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe = r.pipe; 157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez offset = r.offset + offset; 158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmapping::mapping(command_queue &q, resource &r, 161c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_map_flags flags, bool blocking, 162c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const resource::point &origin, 163c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const resource::point ®ion) : 164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx(q.pipe) { 165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez unsigned usage = ((flags & CL_MAP_WRITE ? PIPE_TRANSFER_WRITE : 0 ) | 166c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (flags & CL_MAP_READ ? PIPE_TRANSFER_READ : 0 ) | 167c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (blocking ? PIPE_TRANSFER_UNSYNCHRONIZED : 0)); 168c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pxfer = pctx->get_transfer(pctx, r.pipe, 0, usage, 170c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez box(origin + r.offset, region)); 171c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!pxfer) 172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_OUT_OF_RESOURCES); 173c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez p = pctx->transfer_map(pctx, pxfer); 175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!p) { 176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx->transfer_destroy(pctx, pxfer); 177c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_OUT_OF_RESOURCES); 178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 181c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmapping::mapping(mapping &&m) : 182c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx(m.pctx), pxfer(m.pxfer), p(m.p) { 183c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez m.p = NULL; 184c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez m.pxfer = NULL; 185c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 186c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 187c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmapping::~mapping() { 188c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (pxfer) { 189c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx->transfer_unmap(pctx, pxfer); 190c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx->transfer_destroy(pctx, pxfer); 191c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 192c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 193