clover: implement clSetKernelArgSVMPointer
authorKarol Herbst <kherbst@redhat.com>
Mon, 12 Mar 2018 10:04:53 +0000 (11:04 +0100)
committerMarge Bot <eric+marge@anholt.net>
Wed, 15 Apr 2020 11:08:13 +0000 (11:08 +0000)
it is pretty much identical to a clSetKernelArg for a scalar field, except
it is only valid for global and constant memory pointers.

Also the type equals void* on the Host, so we can just check the size of it.

v2: prefer using target_size to extend the pointer value
v3: handle more corner cases in combiation to clSetKernelArg

Signed-off-by: Karol Herbst <kherbst@redhat.com>
Reviewed-by: Pierre Moreau <dev@pmoreau.org>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/2076>

src/gallium/state_trackers/clover/api/kernel.cpp
src/gallium/state_trackers/clover/core/kernel.cpp
src/gallium/state_trackers/clover/core/kernel.hpp

index 35b2f5450f7b262f61bbe9edac1a4927a1b56598..38a5cc10454dba0fb870591aef26b3e50859cf57 100644 (file)
@@ -337,9 +337,15 @@ clEnqueueNativeKernel(cl_command_queue d_q, void (*func)(void *),
 CLOVER_API cl_int
 clSetKernelArgSVMPointer(cl_kernel d_kern,
                          cl_uint arg_index,
-                         const void *arg_value) {
-   CLOVER_NOT_SUPPORTED_UNTIL("2.0");
-   return CL_INVALID_VALUE;
+                         const void *arg_value) try {
+   obj(d_kern).args().at(arg_index).set_svm(arg_value);
+   return CL_SUCCESS;
+
+} catch (std::out_of_range &e) {
+   return CL_INVALID_ARG_INDEX;
+
+} catch (error &e) {
+   return e.get();
 }
 
 CLOVER_API cl_int
index 3cffec320e1fc1c583f395359011875b652df14a..7d839767aa096167964006e5623b5c80b1ec8985 100644 (file)
@@ -410,6 +410,14 @@ kernel::global_argument::set(size_t size, const void *value) {
       throw error(CL_INVALID_ARG_SIZE);
 
    buf = pobj<buffer>(value ? *(cl_mem *)value : NULL);
+   svm = nullptr;
+   _set = true;
+}
+
+void
+kernel::global_argument::set_svm(const void *value) {
+   svm = value;
+   buf = nullptr;
    _set = true;
 }
 
@@ -430,6 +438,11 @@ kernel::global_argument::bind(exec_context &ctx,
       extend(v, marg.ext_type, marg.target_size);
       byteswap(v, ctx.q->device().endianness());
       insert(ctx.input, v);
+   } else if (svm) {
+      auto v = bytes(svm);
+      extend(v, marg.ext_type, marg.target_size);
+      byteswap(v, ctx.q->device().endianness());
+      insert(ctx.input, v);
    } else {
       // Null pointer.
       allocate(ctx.input, marg.target_size);
index 5d46854d6794f797fc6a0c85eb2c80a84d7cf3af..4441091f3004eb177becef1d105086f0b37c7464 100644 (file)
@@ -85,6 +85,11 @@ namespace clover {
          /// Set this argument to some object.
          virtual void set(size_t size, const void *value) = 0;
 
+         /// Set this argument to an SVM pointer.
+         virtual void set_svm(const void *value) {
+            throw error(CL_INVALID_ARG_INDEX);
+         };
+
          /// Allocate the necessary resources to bind the specified
          /// object to this argument, and update \a ctx accordingly.
          virtual void bind(exec_context &ctx,
@@ -158,12 +163,14 @@ namespace clover {
       class global_argument : public argument {
       public:
          virtual void set(size_t size, const void *value);
+         virtual void set_svm(const void *value);
          virtual void bind(exec_context &ctx,
                            const module::argument &marg);
          virtual void unbind(exec_context &ctx);
 
       private:
          buffer *buf;
+         const void *svm;
       };
 
       class local_argument : public argument {