From 510ba83e1ebec2bdfbd329b8024bdf993c7b3aaf Mon Sep 17 00:00:00 2001 From: Maciej Dziuban Date: Wed, 16 Dec 2020 14:54:39 +0000 Subject: [PATCH] OpenCL Queue Families extension 8/n Check capabilities for image to buffer and buffer to image copies Signed-off-by: Maciej Dziuban Related-To: NEO-5120 --- opencl/source/api/api.cpp | 12 ++++++++ .../cl_enqueue_copy_buffer_to_image_tests.inl | 28 +++++++++++++++++++ .../cl_enqueue_copy_image_to_buffer_tests.inl | 25 +++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index f791be1f11..e9d2194508 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -3038,6 +3038,12 @@ cl_int CL_API_CALL clEnqueueCopyImageToBuffer(cl_command_queue commandQueue, return retVal; } + if (!pCommandQueue->validateCapabilityForOperation(CL_QUEUE_CAPABILITY_TRANSFER_IMAGE_BUFFER_INTEL, eventWaitList, event)) { + retVal = CL_INVALID_OPERATION; + TRACING_EXIT(clEnqueueCopyImageToBuffer, &retVal); + return retVal; + } + retVal = pCommandQueue->enqueueCopyImageToBuffer( pSrcImage, pDstBuffer, @@ -3097,6 +3103,12 @@ cl_int CL_API_CALL clEnqueueCopyBufferToImage(cl_command_queue commandQueue, return retVal; } + if (!pCommandQueue->validateCapabilityForOperation(CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_IMAGE_INTEL, eventWaitList, event)) { + retVal = CL_INVALID_OPERATION; + TRACING_EXIT(clEnqueueCopyBufferToImage, &retVal); + return retVal; + } + retVal = pCommandQueue->enqueueCopyBufferToImage( pSrcBuffer, pDstImage, diff --git a/opencl/test/unit_test/api/cl_enqueue_copy_buffer_to_image_tests.inl b/opencl/test/unit_test/api/cl_enqueue_copy_buffer_to_image_tests.inl index cccbfb69e6..f665d4b504 100644 --- a/opencl/test/unit_test/api/cl_enqueue_copy_buffer_to_image_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_copy_buffer_to_image_tests.inl @@ -111,6 +111,34 @@ TEST_F(clEnqueueCopyBufferToImageTests, GivenValidParametersWhenCopyingBufferToI EXPECT_EQ(CL_SUCCESS, retVal); } +TEST_F(clEnqueueCopyBufferToImageTests, GivenQueueIncapableWhenCopyingBufferToImageThenInvalidOperationIsReturned) { + + imageFormat.image_channel_order = CL_RGBA; + cl_mem dstImage = ImageFunctions::validateAndCreateImage(pContext, nullptr, CL_MEM_READ_WRITE, 0, &imageFormat, &imageDesc, + nullptr, retVal); + ASSERT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, dstImage); + auto srcBuffer = std::unique_ptr(BufferHelper>::create(pContext)); + size_t dstOrigin[] = {0, 0, 0}; + size_t region[] = {10, 10, 1}; + + this->disableQueueCapabilities(CL_QUEUE_CAPABILITY_TRANSFER_BUFFER_IMAGE_INTEL); + auto retVal = clEnqueueCopyBufferToImage( + pCommandQueue, + srcBuffer.get(), + dstImage, + 0u, //src_offset + dstOrigin, + region, + 0, //numEventsInWaitList + nullptr, + nullptr); + + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + retVal = clReleaseMemObject(dstImage); + EXPECT_EQ(CL_SUCCESS, retVal); +} + typedef clEnqueueCopyBufferToImageTests clEnqueueCopyBufferToImageYUV; TEST_F(clEnqueueCopyBufferToImageYUV, GivenValidYuvDstImageWhenCopyingBufferToImageThenSuccessIsReturned) { diff --git a/opencl/test/unit_test/api/cl_enqueue_copy_image_to_buffer_tests.inl b/opencl/test/unit_test/api/cl_enqueue_copy_image_to_buffer_tests.inl index 7f8e2cd90d..2f1e570d3d 100644 --- a/opencl/test/unit_test/api/cl_enqueue_copy_image_to_buffer_tests.inl +++ b/opencl/test/unit_test/api/cl_enqueue_copy_image_to_buffer_tests.inl @@ -109,6 +109,31 @@ TEST_F(clEnqueueCopyImageToBufferTests, GivenValidParametersWhenCopyingImageToBu EXPECT_EQ(CL_SUCCESS, retVal); } +TEST_F(clEnqueueCopyImageToBufferTests, GivenQueueIncapableWhenCopyingImageToBufferThenInvalidOperationIsReturned) { + imageFormat.image_channel_order = CL_RGBA; + auto srcImage = Image::validateAndCreateImage(pContext, nullptr, CL_MEM_READ_WRITE, 0, &imageFormat, &imageDesc, nullptr, retVal); + ASSERT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, srcImage); + auto dstBuffer = std::unique_ptr(BufferHelper>::create(pContext)); + size_t srcOrigin[] = {0, 0, 0}; + size_t region[] = {10, 10, 1}; + this->disableQueueCapabilities(CL_QUEUE_CAPABILITY_TRANSFER_IMAGE_BUFFER_INTEL); + auto retVal = clEnqueueCopyImageToBuffer( + pCommandQueue, + srcImage, + dstBuffer.get(), + srcOrigin, + region, + 0, //dstOffset + 0, //numEventsInWaitList + nullptr, + nullptr); + + EXPECT_EQ(CL_INVALID_OPERATION, retVal); + retVal = clReleaseMemObject(srcImage); + EXPECT_EQ(CL_SUCCESS, retVal); +} + typedef clEnqueueCopyImageToBufferTests clEnqueueCopyImageToBufferYUVTests; TEST_F(clEnqueueCopyImageToBufferYUVTests, GivenValidParametersWhenCopyingYuvImageToBufferThenSuccessIsReturned) {