diff --git a/runtime/api/api.cpp b/runtime/api/api.cpp index 263de63ed7..1ca97664d8 100644 --- a/runtime/api/api.cpp +++ b/runtime/api/api.cpp @@ -4506,8 +4506,6 @@ cl_mem CL_API_CALL clCreatePipe(cl_context context, "const cl_pipe_properties", properties, "cl_int", errcodeRet); - auto pPlatform = platform(); - auto pDevice = pPlatform->getDevice(0); Context *pContext = nullptr; const cl_mem_flags allValidFlags = @@ -4534,6 +4532,7 @@ cl_mem CL_API_CALL clCreatePipe(cl_context context, if (retVal != CL_SUCCESS) { break; } + auto pDevice = pContext->getDevice(0); if (pipePacketSize > pDevice->getDeviceInfo().pipeMaxPacketSize) { retVal = CL_INVALID_PIPE_SIZE; diff --git a/unit_tests/api/cl_create_pipe_tests.inl b/unit_tests/api/cl_create_pipe_tests.inl index c187764774..5cab9e4e91 100644 --- a/unit_tests/api/cl_create_pipe_tests.inl +++ b/unit_tests/api/cl_create_pipe_tests.inl @@ -1,10 +1,11 @@ /* - * Copyright (C) 2017-2019 Intel Corporation + * Copyright (C) 2017-2020 Intel Corporation * * SPDX-License-Identifier: MIT * */ +#include "core/unit_tests/utilities/base_object_utils.h" #include "runtime/context/context.h" #include "runtime/device/device.h" #include "runtime/helpers/base_object.h" @@ -161,4 +162,29 @@ TEST_F(clCreatePipeTests, GivenNullContextWhenCreatingPipeThenInvalidContextErro clReleaseMemObject(pipe); } + +TEST(clCreatePipeTest, givenPlatformWithoutDevicesWhenClCreatePipeIsCalledThenDeviceIsTakenFromContext) { + auto executionEnvironment = platform()->peekExecutionEnvironment(); + executionEnvironment->initializeMemoryManager(); + executionEnvironment->prepareRootDeviceEnvironments(1); + auto device = std::unique_ptr(Device::create(executionEnvironment, 0u)); + const DeviceInfo &devInfo = device->getDeviceInfo(); + if (devInfo.svmCapabilities == 0) { + GTEST_SKIP(); + } + cl_device_id clDevice = device.get(); + cl_int retVal; + auto context = ReleaseableObjectPtr(Context::create(nullptr, DeviceVector(&clDevice, 1), nullptr, nullptr, retVal)); + EXPECT_EQ(CL_SUCCESS, retVal); + + EXPECT_EQ(0u, platform()->getNumDevices()); + cl_uint packetSize = context->getDevice(0)->getDeviceInfo().pipeMaxPacketSize; + cl_mem_flags flags = CL_MEM_READ_WRITE; + + auto pipe = clCreatePipe(context.get(), flags, packetSize, 20, nullptr, &retVal); + EXPECT_NE(nullptr, pipe); + EXPECT_EQ(CL_SUCCESS, retVal); + + clReleaseMemObject(pipe); +} } // namespace ClCreatePipeTests