diff --git a/opencl/source/cl_device/cl_device_info.cpp b/opencl/source/cl_device/cl_device_info.cpp index 4bf6379748..1f8e3fa94b 100644 --- a/opencl/source/cl_device/cl_device_info.cpp +++ b/opencl/source/cl_device/cl_device_info.cpp @@ -325,13 +325,21 @@ cl_int ClDevice::getDeviceInfo(cl_device_info paramName, retSize = srcSize = sizeof(cl_bool); break; case CL_DEVICE_LUID_KHR: - memcpy_s(luid.data(), CL_LUID_SIZE_KHR, paramValue, CL_LUID_SIZE_KHR); + if (paramValue != nullptr) { + memcpy_s(luid.data(), CL_LUID_SIZE_KHR, paramValue, CL_LUID_SIZE_KHR); + } else { + luid = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}; + } device.getAdapterLuid(luid); src = luid.data(); retSize = srcSize = CL_LUID_SIZE_KHR; break; case CL_DEVICE_NODE_MASK_KHR: - memcpy_s(¶m.uint, sizeof(cl_uint), paramValue, paramValueSize); + if (paramValue != nullptr) { + memcpy_s(¶m.uint, sizeof(cl_uint), paramValue, sizeof(cl_uint)); + } else { + param.uint = 0; + } device.getAdapterMask(param.uint); src = ¶m.uint; retSize = srcSize = sizeof(cl_uint); diff --git a/opencl/test/unit_test/device/get_device_info_tests.cpp b/opencl/test/unit_test/device/get_device_info_tests.cpp index 7b7af06270..1356799b20 100644 --- a/opencl/test/unit_test/device/get_device_info_tests.cpp +++ b/opencl/test/unit_test/device/get_device_info_tests.cpp @@ -987,8 +987,7 @@ cl_device_info deviceInfoParams[] = { CL_DEVICE_VENDOR_ID, CL_DEVICE_VERSION, CL_DRIVER_VERSION, - CL_DRIVER_UUID_KHR, -}; + CL_DRIVER_UUID_KHR}; INSTANTIATE_TEST_CASE_P( Device_, diff --git a/opencl/test/unit_test/device/linux/device_linux_tests.cpp b/opencl/test/unit_test/device/linux/device_linux_tests.cpp index 475848d85f..7e3e0bc182 100644 --- a/opencl/test/unit_test/device/linux/device_linux_tests.cpp +++ b/opencl/test/unit_test/device/linux/device_linux_tests.cpp @@ -14,6 +14,16 @@ using namespace NEO; namespace ULT { +TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoLuidSizeThenCorrectLuidSizeIsReturned) { + size_t sizeReturned = std::numeric_limits::max(); + size_t expectedSize = CL_LUID_SIZE_KHR; + auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + auto retVal = clDevice->getDeviceInfo(CL_DEVICE_LUID_KHR, 0, nullptr, &sizeReturned); + + ASSERT_EQ(retVal, CL_SUCCESS); + EXPECT_EQ(sizeReturned, expectedSize); +} + TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoThenBadAdapterLuidIsReturned) { std::array deviceLuidKHR, expectLuid = {0, 1, 2, 3, 4, 5, 6, 7}; deviceLuidKHR = expectLuid; @@ -33,6 +43,15 @@ TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoThenLuidIsInvalid) { EXPECT_FALSE(isValid); } +TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoNodeMaskSizeThenCorrectNodeMaskSizeIsReturned) { + size_t sizeReturned = std::numeric_limits::max(); + auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + auto retVal = clDevice->getDeviceInfo(CL_DEVICE_NODE_MASK_KHR, 0, nullptr, &sizeReturned); + + ASSERT_EQ(retVal, CL_SUCCESS); + EXPECT_EQ(sizeReturned, sizeof(cl_uint)); +} + TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoThenNodeMaskIsUnchanged) { cl_uint nodeMask = 0x1234u; auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); diff --git a/opencl/test/unit_test/device/windows/device_windows_tests.cpp b/opencl/test/unit_test/device/windows/device_windows_tests.cpp index 63c967d462..0ea2aeb96a 100644 --- a/opencl/test/unit_test/device/windows/device_windows_tests.cpp +++ b/opencl/test/unit_test/device/windows/device_windows_tests.cpp @@ -16,6 +16,20 @@ using namespace NEO; namespace ULT { +TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoLuidSizeThenCorrectAdapterLuidSizeIsReturned) { + auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + clDevice->executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(new NEO::OSInterface); + auto mockWddm = new WddmMock(*clDevice->executionEnvironment->rootDeviceEnvironments[0]); + clDevice->executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(mockWddm)); + + size_t sizeReturned = std::numeric_limits::max(); + size_t expectedSize = CL_LUID_SIZE_KHR; + auto retVal = clDevice->getDeviceInfo(CL_DEVICE_LUID_KHR, 0, nullptr, &sizeReturned); + + ASSERT_EQ(retVal, CL_SUCCESS); + EXPECT_EQ(sizeReturned, expectedSize); +} + TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoThenCorrectAdapterLuidIsReturned) { auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); clDevice->executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(new NEO::OSInterface); @@ -43,6 +57,19 @@ TEST(GetDeviceInfo, givenClDeviceWhenVerifyAdapterLuidThenGetTrue) { EXPECT_TRUE(isValid); } +TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoNodeMaskSizeThenCorrectNodeMaskSizeIsReturned) { + auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + clDevice->executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(new NEO::OSInterface); + auto mockWddm = new WddmMock(*clDevice->executionEnvironment->rootDeviceEnvironments[0]); + clDevice->executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(mockWddm)); + + size_t sizeReturned = std::numeric_limits::max(); + auto retVal = clDevice->getDeviceInfo(CL_DEVICE_NODE_MASK_KHR, 0, nullptr, &sizeReturned); + + ASSERT_EQ(retVal, CL_SUCCESS); + EXPECT_EQ(sizeReturned, sizeof(cl_uint)); +} + TEST(GetDeviceInfo, givenClDeviceWhenGettingDeviceInfoThenGetNodeMask) { auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); clDevice->executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(new NEO::OSInterface);