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 &region,
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 &region);
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 &region);
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