|
| 1 | +// RUN: %{build} -o %t.out |
| 2 | +// RUN: %{run} %t.out |
| 3 | + |
| 4 | +// This test verifies that we can use scoped enum types as arguments in free |
| 5 | +// function kernels. |
| 6 | + |
| 7 | +#include "helpers.hpp" |
| 8 | +#include <cassert> |
| 9 | +#include <sycl/ext/oneapi/free_function_queries.hpp> |
| 10 | + |
| 11 | +using namespace sycl; |
| 12 | +using rAccType = sycl::accessor<int, 1, sycl::access::mode::read>; |
| 13 | +using wAccType = sycl::accessor<int, 1, sycl::access::mode::write>; |
| 14 | +using rwAccType = sycl::accessor<int, 1, sycl::access::mode::read_write>; |
| 15 | + |
| 16 | +using flagType = sycl::accessor<bool, 1>; |
| 17 | + |
| 18 | +template <typename T, int Dims, access::mode modeT> |
| 19 | +bool hasAccessorMode(sycl::accessor<T, Dims, modeT> acc, access::mode mode) { |
| 20 | + return modeT == mode; |
| 21 | +} |
| 22 | + |
| 23 | +template <typename AccType> |
| 24 | +SYCL_EXT_ONEAPI_FUNCTION_PROPERTY((syclexp::single_task_kernel)) |
| 25 | +void verifyAccessorMode(AccType acc, access::mode accMode, flagType flagAcc) { |
| 26 | + flagAcc[0] = hasAccessorMode(acc, accMode); |
| 27 | +} |
| 28 | + |
| 29 | +int main() { |
| 30 | + sycl::queue Queue; |
| 31 | + sycl::context Context = Queue.get_context(); |
| 32 | + sycl::kernel Kernel1 = getKernel<verifyAccessorMode<rAccType>>(Context); |
| 33 | + sycl::kernel Kernel2 = getKernel<verifyAccessorMode<wAccType>>(Context); |
| 34 | + sycl::kernel Kernel3 = getKernel<verifyAccessorMode<rwAccType>>(Context); |
| 35 | + |
| 36 | + const auto rMode = sycl::access::mode::read; |
| 37 | + const auto wMode = sycl::access::mode::write; |
| 38 | + const auto rwMode = sycl::access::mode::read_write; |
| 39 | + |
| 40 | + bool flag1, flag2, flag3; |
| 41 | + flag1 = (flag2 = (flag3 = false)); |
| 42 | + { |
| 43 | + sycl::buffer<bool, 1> flagBuffer1(&flag1, 1); |
| 44 | + sycl::buffer<bool, 1> flagBuffer2(&flag2, 1); |
| 45 | + sycl::buffer<bool, 1> flagBuffer3(&flag3, 1); |
| 46 | + Queue.submit([&](sycl::handler &Handler) { |
| 47 | + flagType flagAcc1{flagBuffer1, Handler}; |
| 48 | + rAccType acc1; |
| 49 | + |
| 50 | + Handler.set_args(acc1, rMode, flagAcc1); |
| 51 | + Handler.single_task(Kernel1); |
| 52 | + }); |
| 53 | + |
| 54 | + Queue.submit([&](sycl::handler &Handler) { |
| 55 | + flagType flagAcc2{flagBuffer2, Handler}; |
| 56 | + wAccType acc2; |
| 57 | + |
| 58 | + Handler.set_args(acc2, wMode, flagAcc2); |
| 59 | + Handler.single_task(Kernel2); |
| 60 | + }); |
| 61 | + |
| 62 | + Queue.submit([&](sycl::handler &Handler) { |
| 63 | + flagType flagAcc3{flagBuffer3, Handler}; |
| 64 | + rwAccType acc3; |
| 65 | + |
| 66 | + Handler.set_args(acc3, rwMode, flagAcc3); |
| 67 | + Handler.single_task(Kernel3); |
| 68 | + }); |
| 69 | + } |
| 70 | + assert(flag1 && flag2 && flag3); |
| 71 | +} |
0 commit comments