Mesa (master): clover: add cl 3.0 SVM invalid support
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Mon Nov 16 19:55:34 UTC 2020
Module: Mesa
Branch: master
Commit: 39940ee8d6a18f4b19d98ca7ffcba137d8b33a62
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=39940ee8d6a18f4b19d98ca7ffcba137d8b33a62
Author: Dave Airlie <airlied at redhat.com>
Date: Thu Oct 8 04:44:46 2020 +1000
clover: add cl 3.0 SVM invalid support
Reviewed-by: Karol Herbst <kherbst at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7642>
---
src/gallium/frontends/clover/api/kernel.cpp | 7 +++++++
src/gallium/frontends/clover/api/memory.cpp | 8 +++++++
src/gallium/frontends/clover/api/transfer.cpp | 30 +++++++++++++++++++++++----
3 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/src/gallium/frontends/clover/api/kernel.cpp b/src/gallium/frontends/clover/api/kernel.cpp
index 773d8e185bd..d172750481e 100644
--- a/src/gallium/frontends/clover/api/kernel.cpp
+++ b/src/gallium/frontends/clover/api/kernel.cpp
@@ -379,6 +379,8 @@ CLOVER_API cl_int
clSetKernelArgSVMPointer(cl_kernel d_kern,
cl_uint arg_index,
const void *arg_value) try {
+ if (!any_of(std::mem_fn(&device::svm_support), obj(d_kern).program().devices()))
+ return CL_INVALID_OPERATION;
obj(d_kern).args().at(arg_index).set_svm(arg_value);
return CL_SUCCESS;
@@ -394,7 +396,12 @@ clSetKernelExecInfo(cl_kernel d_kern,
cl_kernel_exec_info param_name,
size_t param_value_size,
const void *param_value) try {
+
+ if (!any_of(std::mem_fn(&device::svm_support), obj(d_kern).program().devices()))
+ return CL_INVALID_OPERATION;
+
auto &kern = obj(d_kern);
+
const bool has_system_svm = all_of(std::mem_fn(&device::has_system_svm),
kern.program().context().devices());
diff --git a/src/gallium/frontends/clover/api/memory.cpp b/src/gallium/frontends/clover/api/memory.cpp
index def2f800c52..cfd0aa26d7f 100644
--- a/src/gallium/frontends/clover/api/memory.cpp
+++ b/src/gallium/frontends/clover/api/memory.cpp
@@ -481,6 +481,10 @@ clSVMAlloc(cl_context d_ctx,
size_t size,
unsigned int alignment) try {
auto &ctx = obj(d_ctx);
+
+ if (!any_of(std::mem_fn(&device::svm_support), ctx.devices()))
+ return NULL;
+
validate_flags(NULL, flags, true);
if (!size ||
@@ -515,6 +519,10 @@ CLOVER_API void
clSVMFree(cl_context d_ctx,
void *svm_pointer) try {
auto &ctx = obj(d_ctx);
+
+ if (!any_of(std::mem_fn(&device::svm_support), ctx.devices()))
+ return;
+
bool can_emulate = all_of(std::mem_fn(&device::has_system_svm), ctx.devices());
if (can_emulate)
diff --git a/src/gallium/frontends/clover/api/transfer.cpp b/src/gallium/frontends/clover/api/transfer.cpp
index bb9133c8285..d1da88fae44 100644
--- a/src/gallium/frontends/clover/api/transfer.cpp
+++ b/src/gallium/frontends/clover/api/transfer.cpp
@@ -953,6 +953,10 @@ clover::EnqueueSVMFree(cl_command_queue d_q,
return CL_INVALID_VALUE;
auto &q = obj(d_q);
+
+ if (!q.device().svm_support())
+ return CL_INVALID_OPERATION;
+
bool can_emulate = q.device().has_system_svm();
auto deps = objs<wait_list_tag>(event_wait_list, num_events_in_wait_list);
@@ -1012,6 +1016,10 @@ clover::EnqueueSVMMemcpy(cl_command_queue d_q,
const cl_event *event_wait_list,
cl_event *event,
cl_int cmd) try {
+ auto &q = obj(d_q);
+
+ if (!q.device().svm_support())
+ return CL_INVALID_OPERATION;
if (dst_ptr == nullptr || src_ptr == nullptr)
return CL_INVALID_VALUE;
@@ -1020,7 +1028,7 @@ clover::EnqueueSVMMemcpy(cl_command_queue d_q,
reinterpret_cast<ptrdiff_t>(src_ptr))) < size)
return CL_MEM_COPY_OVERLAP;
- auto &q = obj(d_q);
+
bool can_emulate = q.device().has_system_svm();
auto deps = objs<wait_list_tag>(event_wait_list, num_events_in_wait_list);
@@ -1070,6 +1078,10 @@ clover::EnqueueSVMMemFill(cl_command_queue d_q,
const cl_event *event_wait_list,
cl_event *event,
cl_int cmd) try {
+ auto &q = obj(d_q);
+
+ if (!q.device().svm_support())
+ return CL_INVALID_OPERATION;
if (svm_ptr == nullptr || pattern == nullptr ||
!util_is_power_of_two_nonzero(pattern_size) ||
@@ -1078,7 +1090,6 @@ clover::EnqueueSVMMemFill(cl_command_queue d_q,
size % pattern_size)
return CL_INVALID_VALUE;
- auto &q = obj(d_q);
bool can_emulate = q.device().has_system_svm();
auto deps = objs<wait_list_tag>(event_wait_list, num_events_in_wait_list);
@@ -1130,11 +1141,14 @@ clover::EnqueueSVMMap(cl_command_queue d_q,
const cl_event *event_wait_list,
cl_event *event,
cl_int cmd) try {
+ auto &q = obj(d_q);
+
+ if (!q.device().svm_support())
+ return CL_INVALID_OPERATION;
if (svm_ptr == nullptr || size == 0)
return CL_INVALID_VALUE;
- auto &q = obj(d_q);
bool can_emulate = q.device().has_system_svm();
auto deps = objs<wait_list_tag>(event_wait_list, num_events_in_wait_list);
@@ -1177,11 +1191,14 @@ clover::EnqueueSVMUnmap(cl_command_queue d_q,
const cl_event *event_wait_list,
cl_event *event,
cl_int cmd) try {
+ auto &q = obj(d_q);
+
+ if (!q.device().svm_support())
+ return CL_INVALID_OPERATION;
if (svm_ptr == nullptr)
return CL_INVALID_VALUE;
- auto &q = obj(d_q);
bool can_emulate = q.device().has_system_svm();
auto deps = objs<wait_list_tag>(event_wait_list, num_events_in_wait_list);
@@ -1222,6 +1239,11 @@ clEnqueueSVMMigrateMem(cl_command_queue d_q,
cl_uint num_events_in_wait_list,
const cl_event *event_wait_list,
cl_event *event) {
+ auto &q = obj(d_q);
+
+ if (!q.device().svm_support())
+ return CL_INVALID_OPERATION;
+
CLOVER_NOT_SUPPORTED_UNTIL("2.1");
return CL_INVALID_VALUE;
}
More information about the mesa-commit
mailing list