1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Copyright 2012 Francisco Jerez 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// The above copyright notice and this permission notice shall be included in 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// all copies or substantial portions of the Software. 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// SOFTWARE. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org// 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef __CORE_RESOURCE_HPP__ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define __CORE_RESOURCE_HPP__ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <list> 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "core/base.hpp" 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "core/memory.hpp" 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "core/geometry.hpp" 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_state.h" 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgnamespace clover { 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class mapping; 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// Class that represents a device-specific instance of some memory 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// object. 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class resource { 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org typedef clover::point<size_t, 3> point; 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource(const resource &r) = delete; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ~resource(); 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void copy(command_queue &q, const point &origin, const point ®ion, 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource &src_resource, const point &src_origin); 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *add_map(command_queue &q, cl_map_flags flags, bool blocking, 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const point &origin, const point ®ion); 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void del_map(void *p); 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned map_count() const; 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clover::device &dev; 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clover::memory_obj &obj; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org friend class sub_resource; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org friend class mapping; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org friend struct ::_cl_kernel; 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org protected: 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org resource(clover::device &dev, clover::memory_obj &obj); 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view *bind_sampler_view(clover::command_queue &q); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void unbind_sampler_view(clover::command_queue &q, 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_sampler_view *st); 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_surface *bind_surface(clover::command_queue &q, bool rw); 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void unbind_surface(clover::command_queue &q, pipe_surface *st); 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_resource *pipe; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org point offset; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org private: 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org std::list<mapping> maps; 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// Resource associated with its own top-level data storage 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// allocated in some device. 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class root_resource : public resource { 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org root_resource(clover::device &dev, clover::memory_obj &obj, 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clover::command_queue &q, const std::string &data); 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org root_resource(clover::device &dev, clover::memory_obj &obj, 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org root_resource &r); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org virtual ~root_resource(); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// Resource that reuses a portion of some other resource as data 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// storage. 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class sub_resource : public resource { 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sub_resource(clover::resource &r, point offset); 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// Class that represents a mapping of some resource into the CPU 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// memory space. 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /// 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org class mapping { 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org public: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mapping(command_queue &q, resource &r, cl_map_flags flags, 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool blocking, const resource::point &origin, 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const resource::point ®ion); 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mapping(const mapping &m) = delete; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mapping(mapping &&m); 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~mapping(); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org operator void *() { 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return p; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org operator char *() { 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (char *)p; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org private: 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_context *pctx; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_transfer *pxfer; 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *p; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 130