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#include "core/kernel.hpp"
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "core/resource.hpp"
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_context.h"
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgusing namespace clover;
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::_cl_kernel(clover::program &prog,
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const std::string &name,
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const std::vector<clover::module::argument> &args) :
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prog(prog), __name(name), exec(*this) {
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (auto arg : args) {
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (arg.type == module::argument::scalar)
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new scalar_argument(arg.size));
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.type == module::argument::global)
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new global_argument(arg.size));
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.type == module::argument::local)
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new local_argument());
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.type == module::argument::constant)
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new constant_argument());
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.type == module::argument::image2d_rd ||
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               arg.type == module::argument::image3d_rd)
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new image_rd_argument());
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.type == module::argument::image2d_wr ||
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               arg.type == module::argument::image3d_wr)
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new image_wr_argument());
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (arg.type == module::argument::sampler)
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         this->args.emplace_back(new sampler_argument());
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         throw error(CL_INVALID_KERNEL_DEFINITION);
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtemplate<typename T, typename V>
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline std::vector<T>
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgpad_vector(clover::command_queue &q, const V &v, T x) {
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   std::vector<T> w { v.begin(), v.end() };
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   w.resize(q.dev.max_block_size().size(), x);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return w;
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::launch(clover::command_queue &q,
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const std::vector<size_t> &grid_offset,
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const std::vector<size_t> &grid_size,
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   const std::vector<size_t> &block_size) {
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   void *st = exec.bind(&q);
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   auto g_handles = map([&](size_t h) { return (uint32_t *)&exec.input[h]; },
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        exec.g_handles.begin(), exec.g_handles.end());
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->bind_compute_state(q.pipe, st);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->bind_compute_sampler_states(q.pipe, 0, exec.samplers.size(),
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                       exec.samplers.data());
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->set_compute_sampler_views(q.pipe, 0, exec.sviews.size(),
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     exec.sviews.data());
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->set_compute_resources(q.pipe, 0, exec.resources.size(),
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                     exec.resources.data());
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(),
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              exec.g_buffers.data(), g_handles.data());
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->launch_grid(q.pipe,
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       pad_vector<uint>(q, block_size, 1).data(),
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       pad_vector<uint>(q, grid_size, 1).data(),
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       module(q).sym(__name).offset,
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       exec.input.data());
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->set_global_binding(q.pipe, 0, exec.g_buffers.size(), NULL, NULL);
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->set_compute_resources(q.pipe, 0, exec.resources.size(), NULL);
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->set_compute_sampler_views(q.pipe, 0, exec.sviews.size(), NULL);
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   q.pipe->bind_compute_sampler_states(q.pipe, 0, exec.samplers.size(), NULL);
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   exec.unbind();
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsize_t
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::mem_local() const {
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t sz = 0;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (auto &arg : args) {
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (dynamic_cast<local_argument *>(arg.get()))
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sz += arg->storage();
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return sz;
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsize_t
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::mem_private() const {
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsize_t
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::max_block_size() const {
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return SIZE_MAX;
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst std::string &
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::name() const {
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return __name;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstd::vector<size_t>
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::block_size() const {
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return { 0, 0, 0 };
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgconst clover::module &
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::module(const clover::command_queue &q) const {
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return prog.binaries().find(&q.dev)->second;
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::exec_context::exec_context(clover::kernel &kern) :
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   kern(kern), q(NULL), mem_local(0), st(NULL) {
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::exec_context::~exec_context() {
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (st)
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      q->pipe->delete_compute_state(q->pipe, st);
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid *
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::exec_context::bind(clover::command_queue *__q) {
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   std::swap(q, __q);
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (auto &arg : kern.args)
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arg->bind(*this);
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   // Create a new compute state if anything changed.
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!st || q != __q ||
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       cs.req_local_mem != mem_local ||
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       cs.req_input_mem != input.size()) {
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (st)
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         __q->pipe->delete_compute_state(__q->pipe, st);
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cs.prog = kern.module(*q).sec(module::section::text).data.begin();
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cs.req_local_mem = mem_local;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cs.req_input_mem = input.size();
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      st = q->pipe->create_compute_state(q->pipe, &cs);
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return st;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::exec_context::unbind() {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (auto &arg : kern.args)
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arg->unbind(*this);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   input.clear();
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   samplers.clear();
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   sviews.clear();
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   resources.clear();
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   g_buffers.clear();
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   g_handles.clear();
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   mem_local = 0;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::argument::argument(size_t size) :
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __size(size), __set(false) {
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbool
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::argument::set() const {
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return __set;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsize_t
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::argument::storage() const {
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::scalar_argument::scalar_argument(size_t size) :
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(size) {
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::scalar_argument::set(size_t size, const void *value) {
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size != __size)
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_SIZE);
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   v = { (uint8_t *)value, (uint8_t *)value + size };
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::scalar_argument::bind(exec_context &ctx) {
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.input.insert(ctx.input.end(), v.begin(), v.end());
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::scalar_argument::unbind(exec_context &ctx) {
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::global_argument::global_argument(size_t size) :
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(size) {
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::global_argument::set(size_t size, const void *value) {
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size != sizeof(cl_mem))
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_SIZE);
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj = dynamic_cast<clover::buffer *>(*(cl_mem *)value);
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::global_argument::bind(exec_context &ctx) {
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t offset = ctx.input.size();
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t idx = ctx.g_buffers.size();
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.input.resize(offset + __size);
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.g_buffers.resize(idx + 1);
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.g_buffers[idx] = obj->resource(ctx.q).pipe;
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.g_handles.resize(idx + 1);
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.g_handles[idx] = offset;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::global_argument::unbind(exec_context &ctx) {
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::local_argument::local_argument() :
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(sizeof(uint32_t)) {
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsize_t
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::local_argument::storage() const {
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return __storage;
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::local_argument::set(size_t size, const void *value) {
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (value)
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_VALUE);
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __storage = size;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::local_argument::bind(exec_context &ctx) {
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t offset = ctx.input.size();
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t ptr = ctx.mem_local;
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.input.resize(offset + sizeof(uint32_t));
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *(uint32_t *)&ctx.input[offset] = ptr;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.mem_local += __storage;
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::local_argument::unbind(exec_context &ctx) {
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::constant_argument::constant_argument() :
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(sizeof(uint32_t)) {
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::constant_argument::set(size_t size, const void *value) {
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size != sizeof(cl_mem))
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_SIZE);
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj = dynamic_cast<clover::buffer *>(*(cl_mem *)value);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::constant_argument::bind(exec_context &ctx) {
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t offset = ctx.input.size();
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t idx = ctx.resources.size();
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.input.resize(offset + sizeof(uint32_t));
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *(uint32_t *)&ctx.input[offset] = idx << 24;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.resources.resize(idx + 1);
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.resources[idx] = st = obj->resource(ctx.q).bind_surface(*ctx.q, false);
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::constant_argument::unbind(exec_context &ctx) {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj->resource(ctx.q).unbind_surface(*ctx.q, st);
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_rd_argument::image_rd_argument() :
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(sizeof(uint32_t)) {
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_rd_argument::set(size_t size, const void *value) {
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size != sizeof(cl_mem))
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_SIZE);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj = dynamic_cast<clover::image *>(*(cl_mem *)value);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_rd_argument::bind(exec_context &ctx) {
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t offset = ctx.input.size();
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t idx = ctx.sviews.size();
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.input.resize(offset + sizeof(uint32_t));
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *(uint32_t *)&ctx.input[offset] = idx;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.sviews.resize(idx + 1);
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.sviews[idx] = st = obj->resource(ctx.q).bind_sampler_view(*ctx.q);
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_rd_argument::unbind(exec_context &ctx) {
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj->resource(ctx.q).unbind_sampler_view(*ctx.q, st);
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_wr_argument::image_wr_argument() :
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(sizeof(uint32_t)) {
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_wr_argument::set(size_t size, const void *value) {
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size != sizeof(cl_mem))
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_SIZE);
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj = dynamic_cast<clover::image *>(*(cl_mem *)value);
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_wr_argument::bind(exec_context &ctx) {
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t offset = ctx.input.size();
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t idx = ctx.resources.size();
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.input.resize(offset + sizeof(uint32_t));
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *(uint32_t *)&ctx.input[offset] = idx;
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.resources.resize(idx + 1);
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.resources[idx] = st = obj->resource(ctx.q).bind_surface(*ctx.q, true);
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::image_wr_argument::unbind(exec_context &ctx) {
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj->resource(ctx.q).unbind_surface(*ctx.q, st);
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::sampler_argument::sampler_argument() :
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   argument(0) {
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::sampler_argument::set(size_t size, const void *value) {
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (size != sizeof(cl_sampler))
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      throw error(CL_INVALID_ARG_SIZE);
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj = *(cl_sampler *)value;
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   __set = true;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::sampler_argument::bind(exec_context &ctx) {
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   size_t idx = ctx.samplers.size();
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.samplers.resize(idx + 1);
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.samplers[idx] = st = obj->bind(*ctx.q);
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_cl_kernel::sampler_argument::unbind(exec_context &ctx) {
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   obj->unbind(*ctx.q, st);
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
394