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 17f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20f0cb66b69904b0a3e4083aa8874af63cf1c14321Kenneth Graunke// OTHER DEALINGS IN THE SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23099d281b38fae791300984964fab1124b0eb14d2Francisco Jerez#ifndef CLOVER_CORE_MEMORY_HPP 24099d281b38fae791300984964fab1124b0eb14d2Francisco Jerez#define CLOVER_CORE_MEMORY_HPP 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <functional> 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <map> 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <memory> 29c6d980140913307d48648058ec24da42a31fc37cTom Stellard#include <stack> 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 31bff60c894a290260ab3dd2086445b44622a2800eFrancisco Jerez#include "core/object.hpp" 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include "core/queue.hpp" 33c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez#include "core/resource.hpp" 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover { 36d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class memory_obj : public ref_counter, public _cl_mem { 37d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez protected: 38c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez memory_obj(clover::context &ctx, cl_mem_flags flags, 39d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez size_t size, void *host_ptr); 405226eacf8d4ea395062bf594079acc747bcd6e97Francisco Jerez 41d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez memory_obj(const memory_obj &obj) = delete; 425226eacf8d4ea395062bf594079acc747bcd6e97Francisco Jerez memory_obj & 435226eacf8d4ea395062bf594079acc747bcd6e97Francisco Jerez operator=(const memory_obj &obj) = delete; 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 45d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez public: 46d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez virtual ~memory_obj(); 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 48369419f761f26dffd61fd614e5e28bb4cd02e867Francisco Jerez bool 49369419f761f26dffd61fd614e5e28bb4cd02e867Francisco Jerez operator==(const memory_obj &obj) const; 50369419f761f26dffd61fd614e5e28bb4cd02e867Francisco Jerez 51d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez virtual cl_mem_object_type type() const = 0; 52d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez virtual clover::resource &resource(command_queue &q) = 0; 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 54d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez void destroy_notify(std::function<void ()> f); 55d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez cl_mem_flags flags() const; 56d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez size_t size() const; 57d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez void *host_ptr() const; 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 59c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez const intrusive_ref<clover::context> context; 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 61d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez private: 62d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez cl_mem_flags _flags; 63d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez size_t _size; 64d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez void *_host_ptr; 65c6d980140913307d48648058ec24da42a31fc37cTom Stellard std::stack<std::function<void ()>> _destroy_notify; 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 67d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez protected: 68d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::string data; 69d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez }; 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 71d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class buffer : public memory_obj { 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 73c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez buffer(clover::context &ctx, cl_mem_flags flags, 74c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *host_ptr); 75c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 76c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 77c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const; 78c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 79c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 80d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class root_buffer : public buffer { 81c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 82c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez root_buffer(clover::context &ctx, cl_mem_flags flags, 83c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t size, void *host_ptr); 84c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 85d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez virtual clover::resource &resource(command_queue &q); 86c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 87c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez private: 88d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::map<device *, 89d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::unique_ptr<root_resource>> resources; 90c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 91c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 92d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class sub_buffer : public buffer { 93c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 94d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez sub_buffer(root_buffer &parent, cl_mem_flags flags, 95c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t offset, size_t size); 96c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 97d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez virtual clover::resource &resource(command_queue &q); 98c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t offset() const; 99c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 100c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez const intrusive_ref<root_buffer> parent; 101c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 102c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez private: 1038e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez size_t _offset; 104d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::map<device *, 105d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::unique_ptr<sub_resource>> resources; 106c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 107c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 108d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class image : public memory_obj { 109c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 110c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez image(clover::context &ctx, cl_mem_flags flags, 111c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, 112c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width, size_t height, size_t depth, 113c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch, size_t slice_pitch, size_t size, 114c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr); 115c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 116c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 117d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez virtual clover::resource &resource(command_queue &q); 118c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez cl_image_format format() const; 119c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width() const; 120c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t height() const; 121c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t depth() const; 122adefa84d66b13a4892bbc544194bacdc410fcc4eFrancisco Jerez size_t pixel_size() const; 123c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch() const; 124c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t slice_pitch() const; 125c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 126c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez private: 1278e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez cl_image_format _format; 1288e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez size_t _width; 1298e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez size_t _height; 1308e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez size_t _depth; 1318e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez size_t _row_pitch; 1328e14b82fd2c561cac3e0d5f84d5f67815ad53867Francisco Jerez size_t _slice_pitch; 133d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::map<device *, 134d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez std::unique_ptr<root_resource>> resources; 135c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 136c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 137d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class image2d : public image { 138c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 139c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez image2d(clover::context &ctx, cl_mem_flags flags, 140c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, size_t width, 141c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t height, size_t row_pitch, 142c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr); 143c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 144c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const; 145c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 146c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 147d6f7afc3ed41a94175a0fdf9cf9651750104974cFrancisco Jerez class image3d : public image { 148c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 149c4578d2277155c50c8680849763850cddb8e8ec2Francisco Jerez image3d(clover::context &ctx, cl_mem_flags flags, 150c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const cl_image_format *format, 151c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t width, size_t height, size_t depth, 152c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez size_t row_pitch, size_t slice_pitch, 153c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez void *host_ptr); 154c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 155c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez virtual cl_mem_object_type type() const; 156c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 157c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 158c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 159c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#endif 160