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" 2660e7b08101295099618a3c1f879440b257265253Francisco Jerez#include "util/u_format.h" 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezusing namespace clover; 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace { 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez class box { 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez box(const resource::point &origin, const resource::point &size) : 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe({ (unsigned)origin[0], (unsigned)origin[1], 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (unsigned)origin[2], (unsigned)size[0], 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (unsigned)size[1], (unsigned)size[2] }) { 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez operator const pipe_box *() { 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return &pipe; 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_box pipe; 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::resource(clover::device &dev, clover::memory_obj &obj) : 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez dev(dev), obj(obj), pipe(NULL), offset{0} { 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::~resource() { 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::copy(command_queue &q, const point &origin, const point ®ion, 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource &src_res, const point &src_origin) { 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point p = offset + origin; 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->resource_copy_region(q.pipe, pipe, 0, p[0], p[1], p[2], 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez src_res.pipe, 0, 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez box(src_res.offset + src_origin, region)); 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid * 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::add_map(command_queue &q, cl_map_flags flags, bool blocking, 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const point &origin, const point ®ion) { 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez maps.emplace_back(q, *this, flags, blocking, origin, region); 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return maps.back(); 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 73c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::del_map(void *p) { 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto it = std::find(maps.begin(), maps.end(), p); 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (it != maps.end()) 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez maps.erase(it); 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezunsigned 80c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::map_count() const { 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return maps.size(); 82c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezpipe_sampler_view * 85c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::bind_sampler_view(clover::command_queue &q) { 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_sampler_view info; 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 88c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez u_sampler_view_default_template(&info, pipe, pipe->format); 89c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return q.pipe->create_sampler_view(q.pipe, pipe, &info); 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 92c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::unbind_sampler_view(clover::command_queue &q, 94c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_sampler_view *st) { 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->sampler_view_destroy(q.pipe, st); 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 97c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezpipe_surface * 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::bind_surface(clover::command_queue &q, bool rw) { 100c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_surface info {}; 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.format = pipe->format; 103c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.usage = pipe->bind; 104c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.writable = rw; 105c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (pipe->target == PIPE_BUFFER) 107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.u.buf.last_element = pipe->width0 - 1; 108c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return q.pipe->create_surface(q.pipe, pipe, &info); 110c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezvoid 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezresource::unbind_surface(clover::command_queue &q, pipe_surface *st) { 114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.pipe->surface_destroy(q.pipe, st); 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 117c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezroot_resource::root_resource(clover::device &dev, clover::memory_obj &obj, 11860e7b08101295099618a3c1f879440b257265253Francisco Jerez clover::command_queue &q, 11960e7b08101295099618a3c1f879440b257265253Francisco Jerez const std::string &data) : 120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource(dev, obj) { 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe_resource info {}; 122c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (image *img = dynamic_cast<image *>(&obj)) { 124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.format = translate_format(img->format()); 125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.width0 = img->width(); 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.height0 = img->height(); 127c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.depth0 = img->depth(); 128c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } else { 129c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.width0 = obj.size(); 13060e7b08101295099618a3c1f879440b257265253Francisco Jerez info.height0 = 1; 13160e7b08101295099618a3c1f879440b257265253Francisco Jerez info.depth0 = 1; 132c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 133c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 134c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.target = translate_target(obj.type()); 135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez info.bind = (PIPE_BIND_SAMPLER_VIEW | 136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_COMPUTE_RESOURCE | 137c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_GLOBAL | 138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_TRANSFER_READ | 139c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez PIPE_BIND_TRANSFER_WRITE); 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe = dev.pipe->resource_create(dev.pipe, &info); 142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!pipe) 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_OUT_OF_RESOURCES); 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 14560e7b08101295099618a3c1f879440b257265253Francisco Jerez if (!data.empty()) { 14660e7b08101295099618a3c1f879440b257265253Francisco Jerez box rect { { 0, 0, 0 }, { info.width0, info.height0, info.depth0 } }; 14760e7b08101295099618a3c1f879440b257265253Francisco Jerez unsigned cpp = util_format_get_blocksize(info.format); 14860e7b08101295099618a3c1f879440b257265253Francisco Jerez 14960e7b08101295099618a3c1f879440b257265253Francisco Jerez q.pipe->transfer_inline_write(q.pipe, pipe, 0, PIPE_TRANSFER_WRITE, 15060e7b08101295099618a3c1f879440b257265253Francisco Jerez rect, data.data(), cpp * info.width0, 15160e7b08101295099618a3c1f879440b257265253Francisco Jerez cpp * info.width0 * info.height0); 15260e7b08101295099618a3c1f879440b257265253Francisco Jerez } 153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezroot_resource::root_resource(clover::device &dev, clover::memory_obj &obj, 156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez clover::root_resource &r) : 157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource(dev, obj) { 158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez assert(0); // XXX -- resource shared among dev and r.dev 159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 160c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 161c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezroot_resource::~root_resource() { 162c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez dev.pipe->resource_destroy(dev.pipe, pipe); 163c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 164c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 165c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezsub_resource::sub_resource(clover::resource &r, point offset) : 166c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez resource(r.dev, r.obj) { 167c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pipe = r.pipe; 168c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez offset = r.offset + offset; 169c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 170c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 171c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmapping::mapping(command_queue &q, resource &r, 172c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_map_flags flags, bool blocking, 173c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const resource::point &origin, 174c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const resource::point ®ion) : 175c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx(q.pipe) { 176c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez unsigned usage = ((flags & CL_MAP_WRITE ? PIPE_TRANSFER_WRITE : 0 ) | 177c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (flags & CL_MAP_READ ? PIPE_TRANSFER_READ : 0 ) | 178c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez (blocking ? PIPE_TRANSFER_UNSYNCHRONIZED : 0)); 179c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 180c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pxfer = pctx->get_transfer(pctx, r.pipe, 0, usage, 181c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez box(origin + r.offset, region)); 182c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!pxfer) 183c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_OUT_OF_RESOURCES); 184c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 185c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez p = pctx->transfer_map(pctx, pxfer); 186c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (!p) { 187c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx->transfer_destroy(pctx, pxfer); 188c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez throw error(CL_OUT_OF_RESOURCES); 189c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 190c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 191c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 192c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmapping::mapping(mapping &&m) : 193c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx(m.pctx), pxfer(m.pxfer), p(m.p) { 194c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez m.p = NULL; 195c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez m.pxfer = NULL; 196c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 197c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 198c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerezmapping::~mapping() { 199c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez if (pxfer) { 200c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx->transfer_unmap(pctx, pxfer); 201c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez pctx->transfer_destroy(pctx, pxfer); 202c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 203c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 204