mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-26 02:00:12 +01:00
clover: implement clSetKernelArgSVMPointer
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>
This commit is contained in:
parent
035e882819
commit
d6754eb920
3 changed files with 29 additions and 3 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue