[Beignet] [PATCH 20/57] Add cl_sampler define to runtime.
junyan.he at inbox.com
junyan.he at inbox.com
Sun Jun 11 05:50:06 UTC 2017
From: Junyan He <junyan.he at intel.com>
Signed-off-by: Junyan He <junyan.he at intel.com>
---
runtime/cl_sampler.c | 133 +++++++++++++++++++++++++++++++++++++++++++++++++++
runtime/cl_sampler.h | 57 ++++++++++++++++++++++
2 files changed, 190 insertions(+)
create mode 100644 runtime/cl_sampler.c
create mode 100644 runtime/cl_sampler.h
diff --git a/runtime/cl_sampler.c b/runtime/cl_sampler.c
new file mode 100644
index 0000000..f9f63ad
--- /dev/null
+++ b/runtime/cl_sampler.c
@@ -0,0 +1,133 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Benjamin Segovia <benjamin.segovia at intel.com>
+ */
+
+#include "cl_context.h"
+#include "cl_sampler.h"
+#include "cl_device_id.h"
+#include "cl_alloc.h"
+
+static uint32_t
+sampler_cl_to_clk(cl_bool normalized_coords, cl_addressing_mode address, cl_filter_mode filter)
+{
+ int clk_address = CLK_ADDRESS_NONE;
+ int clk_filter = CLK_FILTER_NEAREST;
+ switch (address) {
+ case CL_ADDRESS_NONE:
+ clk_address = CLK_ADDRESS_NONE;
+ break;
+ case CL_ADDRESS_CLAMP:
+ clk_address = CLK_ADDRESS_CLAMP;
+ break;
+ case CL_ADDRESS_CLAMP_TO_EDGE:
+ clk_address = CLK_ADDRESS_CLAMP_TO_EDGE;
+ break;
+ case CL_ADDRESS_REPEAT:
+ clk_address = CLK_ADDRESS_REPEAT;
+ break;
+ case CL_ADDRESS_MIRRORED_REPEAT:
+ clk_address = CLK_ADDRESS_MIRRORED_REPEAT;
+ break;
+ default:
+ assert(0);
+ }
+ switch (filter) {
+ case CL_FILTER_NEAREST:
+ clk_filter = CLK_FILTER_NEAREST;
+ break;
+ case CL_FILTER_LINEAR:
+ clk_filter = CLK_FILTER_LINEAR;
+ break;
+ default:
+ assert(0);
+ }
+ return (clk_address << __CLK_ADDRESS_BASE) | (normalized_coords << __CLK_NORMALIZED_BASE) | (clk_filter);
+}
+
+LOCAL cl_sampler
+cl_create_sampler(cl_context ctx, cl_bool normalized_coords, cl_addressing_mode address,
+ cl_filter_mode filter, cl_int *errcode_ret)
+{
+ cl_sampler sampler = NULL;
+ cl_int err = CL_SUCCESS;
+ cl_int i;
+
+ /* Allocate and inialize the structure itself */
+ sampler = CL_CALLOC(1, sizeof(_cl_sampler));
+ if (sampler == NULL) {
+ *errcode_ret = CL_OUT_OF_HOST_MEMORY;
+ return NULL;
+ }
+
+ sampler->each_device = CL_CALLOC(ctx->device_num, sizeof(cl_sampler_for_device));
+ if (sampler->each_device == NULL) {
+ CL_FREE(sampler);
+ *errcode_ret = CL_OUT_OF_HOST_MEMORY;
+ return NULL;
+ }
+
+ CL_OBJECT_INIT_BASE(sampler, CL_OBJECT_SAMPLER_MAGIC);
+ sampler->normalized_coords = normalized_coords;
+ sampler->address = address;
+ sampler->filter = filter;
+
+ sampler->clkSamplerValue = sampler_cl_to_clk(normalized_coords, address, filter);
+ /* Append the sampler in the context sampler list */
+ cl_context_add_sampler(ctx, sampler);
+
+ for (i = 0; i < ctx->device_num; i++) {
+ err = (ctx->devices[i]->api.sampler_create)(ctx->devices[i], sampler);
+ if (err != CL_SUCCESS) {
+ *errcode_ret = err;
+ cl_sampler_delete(sampler);
+ return NULL;
+ }
+ }
+
+ *errcode_ret = CL_SUCCESS;
+ return sampler;
+}
+
+LOCAL void
+cl_sampler_delete(cl_sampler sampler)
+{
+ cl_int i;
+
+ if (UNLIKELY(sampler == NULL))
+ return;
+ if (CL_OBJECT_DEC_REF(sampler) > 1)
+ return;
+
+ for (i = 0; i < sampler->each_device_num; i++) {
+ if (sampler->each_device[i])
+ (sampler->each_device[i]->device->api.sampler_delete)(sampler->each_device[i]->device, sampler);
+ }
+ CL_FREE(sampler->each_device);
+
+ cl_context_remove_sampler(sampler->ctx, sampler);
+
+ CL_OBJECT_DESTROY_BASE(sampler);
+ CL_FREE(sampler);
+}
+
+LOCAL void
+cl_sampler_add_ref(cl_sampler sampler)
+{
+ assert(sampler);
+ CL_OBJECT_INC_REF(sampler);
+}
diff --git a/runtime/cl_sampler.h b/runtime/cl_sampler.h
new file mode 100644
index 0000000..8ef2554
--- /dev/null
+++ b/runtime/cl_sampler.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2012 Intel Corporation
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * Author: Benjamin Segovia <benjamin.segovia at intel.com>
+ */
+
+#ifndef __CL_SAMPLER_H__
+#define __CL_SAMPLER_H__
+
+#include "cl_base_object.h"
+#include "../backend/src/ocl_common_defines.h"
+#include "CL/cl.h"
+
+typedef struct _cl_sampler_for_device {
+ cl_device_id device; /* Point to the device it belong to */
+} _cl_sampler_for_device;
+typedef _cl_sampler_for_device *cl_sampler_for_device;
+
+typedef struct _cl_sampler {
+ _cl_base_object base;
+ cl_context ctx; /* Context it belongs to */
+ cl_bool normalized_coords; /* Are coordinates normalized? */
+ cl_addressing_mode address; /* CLAMP / REPEAT and so on... */
+ cl_filter_mode filter; /* LINEAR / NEAREST mostly */
+ cl_uint clkSamplerValue;
+ cl_uint each_device_num; /* Each device number */
+ cl_sampler_for_device *each_device; /* Context content interpreted by device */
+} _cl_sampler;
+
+#define CL_OBJECT_SAMPLER_MAGIC 0x686a0ecba79ce32fLL
+#define CL_OBJECT_IS_SAMPLER(obj) ((obj && \
+ ((cl_base_object)obj)->magic == CL_OBJECT_SAMPLER_MAGIC && \
+ CL_OBJECT_GET_REF(obj) >= 1))
+
+/* Create a new sampler object */
+extern cl_sampler cl_create_sampler(cl_context, cl_bool, cl_addressing_mode, cl_filter_mode, cl_int *err);
+/* Unref the object and delete it if no more reference on it */
+extern void cl_sampler_delete(cl_sampler);
+/* Add one more reference to this object */
+extern void cl_sampler_add_ref(cl_sampler);
+/* set a sampler kernel argument */
+int cl_set_sampler_arg_slot(cl_kernel k, int index, cl_sampler sampler);
+
+#endif /* __CL_SAMPLER_H__ */
--
2.7.4
More information about the Beignet
mailing list