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