diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index 8440cefca0..8c326b333b 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -4621,6 +4621,12 @@ cl_int CL_API_CALL clEnqueueSVMMemcpy(cl_command_queue commandQueue, return retVal; } + if (!pCommandQueue->validateCapabilityForOperation(CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_INTEL, numEventsInWaitList, eventWaitList, event)) { + retVal = CL_INVALID_OPERATION; + TRACING_EXIT(clEnqueueSVMMemcpy, &retVal); + return retVal; + } + retVal = pCommandQueue->enqueueSVMMemcpy( blockingCopy, dstPtr, @@ -4679,6 +4685,12 @@ cl_int CL_API_CALL clEnqueueSVMMemFill(cl_command_queue commandQueue, return retVal; } + if (!pCommandQueue->validateCapabilityForOperation(CL_QUEUE_CAPABILITY_FILL_BUFFER_INTEL, numEventsInWaitList, eventWaitList, event)) { + retVal = CL_INVALID_OPERATION; + TRACING_EXIT(clEnqueueSVMMemFill, &retVal); + return retVal; + } + retVal = pCommandQueue->enqueueSVMMemFill( svmPtr, pattern, @@ -4735,6 +4747,12 @@ cl_int CL_API_CALL clEnqueueSVMMap(cl_command_queue commandQueue, return retVal; } + if (!pCommandQueue->validateCapabilityForOperation(CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL, numEventsInWaitList, eventWaitList, event)) { + retVal = CL_INVALID_OPERATION; + TRACING_EXIT(clEnqueueSVMMap, &retVal); + return retVal; + } + retVal = pCommandQueue->enqueueSVMMap( blockingMap, mapFlags, @@ -4783,6 +4801,12 @@ cl_int CL_API_CALL clEnqueueSVMUnmap(cl_command_queue commandQueue, return retVal; } + if (!pCommandQueue->validateCapabilityForOperation(CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL, numEventsInWaitList, eventWaitList, event)) { + retVal = CL_INVALID_OPERATION; + TRACING_EXIT(clEnqueueSVMUnmap, &retVal); + return retVal; + } + retVal = pCommandQueue->enqueueSVMUnmap( svmPtr, numEventsInWaitList, diff --git a/opencl/test/unit_test/api/cl_enqueue_svm_map_tests.inl b/opencl/test/unit_test/api/cl_enqueue_svm_map_tests.inl index 9206eef4e4..4f0661af68 100644 --- a/opencl/test/unit_test/api/cl_enqueue_svm_map_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_svm_map_tests.inl @@ -11,6 +11,7 @@ #include "opencl/source/command_queue/command_queue.h" #include "opencl/source/context/context.h" #include "opencl/test/unit_test/mocks/mock_cl_device.h" +#include "opencl/test/unit_test/test_macros/test_checks_ocl.h" #include "cl_api_tests.h" @@ -125,6 +126,29 @@ TEST_F(clEnqueueSVMMapTests, GivenValidParametersWhenMappingSVMThenSuccessIsRetu } } +TEST_F(clEnqueueSVMMapTests, GivenQueueIncapableWhenMappingSvmBufferThenInvalidOperationIsReturned) { + REQUIRE_SVM_OR_SKIP(pDevice); + + disableQueueCapabilities(CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL); + + void *ptrSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); + EXPECT_NE(nullptr, ptrSvm); + + auto retVal = clEnqueueSVMMap( + pCommandQueue, // cl_command_queue command_queue + CL_FALSE, // cl_bool blocking_map + CL_MAP_READ, // cl_map_flags map_flags + ptrSvm, // void *svm_ptr + 256, // size_t size + 0, // cl_uint num_events_in_wait_list + nullptr, // const cL_event *event_wait_list + nullptr // cl_event *event + ); + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + + clSVMFree(pContext, ptrSvm); +} + TEST_F(clEnqueueSVMMapTests, GivenDeviceNotSupportingSvmWhenEnqueuingSVMMapThenInvalidOperationErrorIsReturned) { auto hwInfo = *defaultHwInfo; hwInfo.capabilityTable.ftrSvm = false; diff --git a/opencl/test/unit_test/api/cl_enqueue_svm_mem_fill_tests.inl b/opencl/test/unit_test/api/cl_enqueue_svm_mem_fill_tests.inl index 39d577c23b..9d737a4930 100644 --- a/opencl/test/unit_test/api/cl_enqueue_svm_mem_fill_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_svm_mem_fill_tests.inl @@ -11,6 +11,7 @@ #include "opencl/source/command_queue/command_queue.h" #include "opencl/source/context/context.h" #include "opencl/test/unit_test/mocks/mock_cl_device.h" +#include "opencl/test/unit_test/test_macros/test_checks_ocl.h" #include "cl_api_tests.h" @@ -125,6 +126,29 @@ TEST_F(clEnqueueSVMMemFillTests, GivenValidParametersWhenFillingSVMMemoryThenSuc } } +TEST_F(clEnqueueSVMMemFillTests, GivenQueueIncapableWhenFillingSvmBufferThenInvalidOperationIsReturned) { + REQUIRE_SVM_OR_SKIP(pDevice); + + disableQueueCapabilities(CL_QUEUE_CAPABILITY_FILL_BUFFER_INTEL); + + void *ptrSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); + EXPECT_NE(nullptr, ptrSvm); + + auto retVal = clEnqueueSVMMemFill( + pCommandQueue, // cl_command_queue command_queue + ptrSvm, // void *svm_ptr + nullptr, // const void *pattern + 0, // size_t pattern_size + 256, // size_t size + 0, // cl_uint num_events_in_wait_list + nullptr, // cl_evebt *event_wait_list + nullptr // cL_event *event + ); + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + + clSVMFree(pContext, ptrSvm); +} + TEST_F(clEnqueueSVMMemFillTests, GivenDeviceNotSupportingSvmWhenEnqueuingSVMMemFillThenInvalidOperationErrorIsReturned) { auto hwInfo = *defaultHwInfo; hwInfo.capabilityTable.ftrSvm = false; diff --git a/opencl/test/unit_test/api/cl_enqueue_svm_memcpy_tests.inl b/opencl/test/unit_test/api/cl_enqueue_svm_memcpy_tests.inl index 5f59d3aff0..86571b7d88 100644 --- a/opencl/test/unit_test/api/cl_enqueue_svm_memcpy_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_svm_memcpy_tests.inl @@ -11,6 +11,7 @@ #include "opencl/source/command_queue/command_queue.h" #include "opencl/source/context/context.h" #include "opencl/test/unit_test/mocks/mock_cl_device.h" +#include "opencl/test/unit_test/test_macros/test_checks_ocl.h" #include "cl_api_tests.h" @@ -133,6 +134,32 @@ TEST_F(clEnqueueSVMMemcpyTests, GivenNonZeroSizeWhenCopyingSVMMemoryThenSuccessI } } +TEST_F(clEnqueueSVMMemcpyTests, GivenQueueIncapableWhenCopyingSvmBufferThenInvalidOperationIsReturned) { + REQUIRE_SVM_OR_SKIP(pDevice); + + disableQueueCapabilities(CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_INTEL); + + void *pDstSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); + EXPECT_NE(nullptr, pDstSvm); + void *pSrcSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); + EXPECT_NE(nullptr, pSrcSvm); + + auto retVal = clEnqueueSVMMemcpy( + pCommandQueue, // cl_command_queue command_queue + CL_FALSE, // cl_bool blocking_copy + pDstSvm, // void *dst_ptr + pSrcSvm, // const void *src_ptr + 256, // size_t size + 0, // cl_uint num_events_in_wait_list + nullptr, // const cl_event *event_wait_list + nullptr // cl_event *event + ); + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + + clSVMFree(pContext, pDstSvm); + clSVMFree(pContext, pSrcSvm); +} + TEST_F(clEnqueueSVMMemcpyTests, GivenZeroSizeWhenCopyingSVMMemoryThenSuccessIsReturned) { const ClDeviceInfo &devInfo = pDevice->getDeviceInfo(); if (devInfo.svmCapabilities != 0) { diff --git a/opencl/test/unit_test/api/cl_enqueue_svm_unmap_tests.inl b/opencl/test/unit_test/api/cl_enqueue_svm_unmap_tests.inl index bad0cf89b2..6905c607de 100644 --- a/opencl/test/unit_test/api/cl_enqueue_svm_unmap_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_svm_unmap_tests.inl @@ -11,6 +11,7 @@ #include "opencl/source/command_queue/command_queue.h" #include "opencl/source/context/context.h" #include "opencl/test/unit_test/mocks/mock_cl_device.h" +#include "opencl/test/unit_test/test_macros/test_checks_ocl.h" #include "cl_api_tests.h" @@ -97,6 +98,38 @@ TEST_F(clEnqueueSVMUnmapTests, GivenValidParametersWhenUnmappingSvmThenSuccessIs } } +TEST_F(clEnqueueSVMUnmapTests, GivenQueueIncapableWhenUnmappingSvmBufferThenInvalidOperationIsReturned) { + REQUIRE_SVM_OR_SKIP(pDevice); + + void *ptrSvm = clSVMAlloc(pContext, CL_MEM_READ_WRITE, 256, 4); + EXPECT_NE(nullptr, ptrSvm); + + auto retVal = clEnqueueSVMMap( + pCommandQueue, // cl_command_queue command_queue + CL_FALSE, // cl_bool blocking_map + CL_MAP_READ, // cl_map_flags map_flags + ptrSvm, // void *svm_ptr + 256, // size_t size + 0, // cl_uint num_events_in_wait_list + nullptr, // const cL_event *event_wait_list + nullptr // cl_event *event + ); + EXPECT_EQ(CL_SUCCESS, retVal); + + disableQueueCapabilities(CL_QUEUE_CAPABILITY_MAP_BUFFER_INTEL); + + retVal = clEnqueueSVMUnmap( + pCommandQueue, // cl_command_queue command_queue + ptrSvm, // void *svm_ptr + 0, // cl_uint num_events_in_wait_list + nullptr, // const cL_event *event_wait_list + nullptr // cl_event *event + ); + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + + clSVMFree(pContext, ptrSvm); +} + TEST_F(clEnqueueSVMUnmapTests, GivenDeviceNotSupportingSvmWhenEnqueuingSVMUnmapThenInvalidOperationErrorIsReturned) { auto hwInfo = *defaultHwInfo; hwInfo.capabilityTable.ftrSvm = false;