2017-12-21 07:45:38 +08:00
|
|
|
/*
|
2018-09-18 15:11:08 +08:00
|
|
|
* Copyright (C) 2017-2018 Intel Corporation
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
2018-09-18 15:11:08 +08:00
|
|
|
* SPDX-License-Identifier: MIT
|
2017-12-21 07:45:38 +08:00
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "runtime/helpers/options.h"
|
|
|
|
#include "runtime/device/device.h"
|
2018-01-16 01:16:50 +08:00
|
|
|
#include "runtime/platform/extensions.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
#include "runtime/sharings/sharing_factory.h"
|
2018-08-14 19:54:33 +08:00
|
|
|
#include "unit_tests/helpers/debug_manager_state_restore.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
#include "unit_tests/fixtures/platform_fixture.h"
|
|
|
|
#include "unit_tests/mocks/mock_async_event_handler.h"
|
|
|
|
#include "unit_tests/mocks/mock_csr.h"
|
2018-02-14 20:48:31 +08:00
|
|
|
#include "unit_tests/libult/create_command_stream.h"
|
2017-12-21 07:45:38 +08:00
|
|
|
#include "gtest/gtest.h"
|
|
|
|
#include "gmock/gmock.h"
|
|
|
|
|
|
|
|
using namespace OCLRT;
|
|
|
|
|
2018-03-30 03:26:25 +08:00
|
|
|
struct PlatformTest : public ::testing::Test {
|
2018-06-26 18:49:00 +08:00
|
|
|
void SetUp() override { pPlatform.reset(new Platform()); }
|
2017-12-21 07:45:38 +08:00
|
|
|
cl_int retVal = CL_SUCCESS;
|
2018-06-26 18:49:00 +08:00
|
|
|
std::unique_ptr<Platform> pPlatform;
|
2017-12-21 07:45:38 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(PlatformTest, getDevices) {
|
|
|
|
size_t devNum = pPlatform->getNumDevices();
|
|
|
|
EXPECT_EQ(0u, devNum);
|
|
|
|
|
|
|
|
Device *device = pPlatform->getDevice(0);
|
|
|
|
EXPECT_EQ(nullptr, device);
|
|
|
|
|
2018-06-21 00:25:40 +08:00
|
|
|
bool ret = pPlatform->initialize();
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_TRUE(ret);
|
|
|
|
|
|
|
|
EXPECT_TRUE(pPlatform->isInitialized());
|
|
|
|
|
|
|
|
devNum = pPlatform->getNumDevices();
|
|
|
|
EXPECT_EQ(numPlatformDevices, devNum);
|
|
|
|
|
|
|
|
device = pPlatform->getDevice(0);
|
|
|
|
EXPECT_NE(nullptr, device);
|
|
|
|
|
|
|
|
device = pPlatform->getDevice(numPlatformDevices);
|
|
|
|
EXPECT_EQ(nullptr, device);
|
|
|
|
|
|
|
|
auto allDevices = pPlatform->getDevices();
|
|
|
|
EXPECT_NE(nullptr, allDevices);
|
|
|
|
}
|
|
|
|
|
2018-01-16 01:16:50 +08:00
|
|
|
TEST_F(PlatformTest, PlatformgetAsCompilerEnabledExtensionsString) {
|
|
|
|
std::string compilerExtensions = pPlatform->peekCompilerExtensions();
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(std::string(""), compilerExtensions);
|
|
|
|
|
2018-06-21 00:25:40 +08:00
|
|
|
pPlatform->initialize();
|
2018-01-16 01:16:50 +08:00
|
|
|
compilerExtensions = pPlatform->peekCompilerExtensions();
|
2017-12-21 07:45:38 +08:00
|
|
|
|
2018-05-02 20:27:55 +08:00
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string(" -cl-ext=-all,+cl")));
|
2017-12-21 07:45:38 +08:00
|
|
|
if (std::string(pPlatform->getDevice(0)->getDeviceInfo().clVersion).find("OpenCL 2.1") != std::string::npos) {
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string("cl_khr_subgroups")));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(PlatformTest, hasAsyncEventsHandler) {
|
|
|
|
EXPECT_NE(nullptr, pPlatform->getAsyncEventsHandler());
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PlatformTestSimple, shutdownClosesAsyncEventHandlerThread) {
|
|
|
|
Platform *platform = new Platform;
|
|
|
|
|
|
|
|
MockHandler *mockAsyncHandler = new MockHandler;
|
|
|
|
|
2018-02-21 23:31:53 +08:00
|
|
|
auto oldHandler = platform->setAsyncEventsHandler(std::unique_ptr<AsyncEventsHandler>(mockAsyncHandler));
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_EQ(mockAsyncHandler, platform->getAsyncEventsHandler());
|
|
|
|
|
|
|
|
mockAsyncHandler->openThread();
|
|
|
|
delete platform;
|
2018-06-28 14:51:44 +08:00
|
|
|
EXPECT_TRUE(MockAsyncEventHandlerGlobals::destructorCalled);
|
2017-12-21 07:45:38 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
namespace OCLRT {
|
|
|
|
extern CommandStreamReceiverCreateFunc commandStreamReceiverFactory[2 * IGFX_MAX_CORE];
|
|
|
|
}
|
|
|
|
|
2018-08-08 19:49:09 +08:00
|
|
|
CommandStreamReceiver *createMockCommandStreamReceiver(const HardwareInfo &hwInfoIn, bool withAubDump, ExecutionEnvironment &executionEnvironment) {
|
2017-12-21 07:45:38 +08:00
|
|
|
return nullptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
class PlatformFailingTest : public PlatformTest {
|
|
|
|
public:
|
|
|
|
void SetUp() override {
|
|
|
|
PlatformTest::SetUp();
|
|
|
|
hwInfo = platformDevices[0];
|
|
|
|
commandStreamReceiverCreateFunc = commandStreamReceiverFactory[hwInfo->pPlatform->eRenderCoreFamily];
|
|
|
|
commandStreamReceiverFactory[hwInfo->pPlatform->eRenderCoreFamily] = createMockCommandStreamReceiver;
|
|
|
|
overrideCommandStreamReceiverCreation = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void TearDown() override {
|
|
|
|
commandStreamReceiverFactory[hwInfo->pPlatform->eRenderCoreFamily] = commandStreamReceiverCreateFunc;
|
|
|
|
PlatformTest::TearDown();
|
|
|
|
}
|
|
|
|
|
|
|
|
CommandStreamReceiverCreateFunc commandStreamReceiverCreateFunc;
|
|
|
|
const HardwareInfo *hwInfo;
|
|
|
|
};
|
|
|
|
|
|
|
|
TEST_F(PlatformFailingTest, givenPlatformInitializationWhenIncorrectHwInfoThenInitializationFails) {
|
|
|
|
Platform *platform = new Platform;
|
2018-06-21 00:25:40 +08:00
|
|
|
bool ret = platform->initialize();
|
2017-12-21 07:45:38 +08:00
|
|
|
EXPECT_FALSE(ret);
|
|
|
|
EXPECT_FALSE(platform->isInitialized());
|
|
|
|
delete platform;
|
|
|
|
}
|
2018-01-16 01:16:50 +08:00
|
|
|
|
2018-06-26 21:56:50 +08:00
|
|
|
TEST_F(PlatformTest, givenSupportingCl21WhenPlatformSupportsFp64ThenFillMatchingSubstringsAndMandatoryTrailingSpace) {
|
2018-01-16 01:16:50 +08:00
|
|
|
const HardwareInfo *hwInfo;
|
|
|
|
hwInfo = platformDevices[0];
|
|
|
|
std::string extensionsList = getExtensionsList(*hwInfo);
|
|
|
|
EXPECT_THAT(extensionsList, ::testing::HasSubstr(std::string("cl_khr_3d_image_writes")));
|
|
|
|
|
|
|
|
std::string compilerExtensions = convertEnabledExtensionsToCompilerInternalOptions(extensionsList.c_str());
|
2018-05-02 20:27:55 +08:00
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string(" -cl-ext=-all,+cl")));
|
2018-01-16 01:16:50 +08:00
|
|
|
|
|
|
|
if (hwInfo->capabilityTable.clVersionSupport > 20) {
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string("cl_khr_subgroups")));
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string("cl_khr_il_program")));
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hwInfo->capabilityTable.ftrSupportsFP64) {
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string("cl_khr_fp64")));
|
|
|
|
}
|
2018-06-26 21:56:50 +08:00
|
|
|
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::EndsWith(std::string(" ")));
|
2018-01-16 01:16:50 +08:00
|
|
|
}
|
|
|
|
|
2018-06-26 21:56:50 +08:00
|
|
|
TEST_F(PlatformTest, givenNotSupportingCl21WhenPlatformNotSupportFp64ThenNotFillMatchingSubstringAndFillMandatoryTrailingSpace) {
|
2018-01-16 01:16:50 +08:00
|
|
|
HardwareInfo TesthwInfo = *platformDevices[0];
|
|
|
|
TesthwInfo.capabilityTable.ftrSupportsFP64 = false;
|
|
|
|
TesthwInfo.capabilityTable.clVersionSupport = 10;
|
|
|
|
|
|
|
|
std::string extensionsList = getExtensionsList(TesthwInfo);
|
|
|
|
EXPECT_THAT(extensionsList, ::testing::HasSubstr(std::string("cl_khr_3d_image_writes")));
|
|
|
|
|
|
|
|
std::string compilerExtensions = convertEnabledExtensionsToCompilerInternalOptions(extensionsList.c_str());
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::HasSubstr(std::string("-cl-ext=-all,+cl")));
|
|
|
|
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::Not(::testing::HasSubstr(std::string("cl_khr_fp64"))));
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::Not(::testing::HasSubstr(std::string("cl_khr_subgroups"))));
|
2018-06-26 21:56:50 +08:00
|
|
|
|
|
|
|
EXPECT_THAT(compilerExtensions, ::testing::EndsWith(std::string(" ")));
|
2018-01-16 01:16:50 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
TEST_F(PlatformTest, testRemoveLastSpace) {
|
|
|
|
std::string emptyString = "";
|
|
|
|
removeLastSpace(emptyString);
|
|
|
|
EXPECT_EQ(std::string(""), emptyString);
|
|
|
|
|
|
|
|
std::string xString = "x";
|
|
|
|
removeLastSpace(xString);
|
|
|
|
EXPECT_EQ(std::string("x"), xString);
|
|
|
|
|
|
|
|
std::string xSpaceString = "x ";
|
|
|
|
removeLastSpace(xSpaceString);
|
|
|
|
EXPECT_EQ(std::string("x"), xSpaceString);
|
2018-03-30 03:26:25 +08:00
|
|
|
}
|
2018-06-26 22:15:48 +08:00
|
|
|
TEST(PlatformConstructionTest, givenPlatformConstructorWhenItIsCalledTwiceThenTheSamePlatformIsReturned) {
|
2018-07-23 18:23:48 +08:00
|
|
|
platformImpl.reset();
|
2018-06-26 22:15:48 +08:00
|
|
|
ASSERT_EQ(nullptr, platformImpl);
|
|
|
|
auto platform = constructPlatform();
|
|
|
|
EXPECT_EQ(platform, platformImpl.get());
|
|
|
|
auto platform2 = constructPlatform();
|
|
|
|
EXPECT_EQ(platform2, platform);
|
|
|
|
EXPECT_NE(platform, nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PlatformConstructionTest, givenPlatformConstructorWhenItIsCalledAfterResetThenNewPlatformIsConstructed) {
|
2018-07-23 18:23:48 +08:00
|
|
|
platformImpl.reset();
|
2018-06-26 22:15:48 +08:00
|
|
|
ASSERT_EQ(nullptr, platformImpl);
|
|
|
|
auto platform = constructPlatform();
|
|
|
|
std::unique_ptr<Platform> temporaryOwnership(std::move(platformImpl));
|
|
|
|
EXPECT_EQ(nullptr, platformImpl.get());
|
|
|
|
auto platform2 = constructPlatform();
|
|
|
|
EXPECT_NE(platform2, platform);
|
|
|
|
EXPECT_NE(platform, nullptr);
|
|
|
|
EXPECT_NE(platform2, nullptr);
|
|
|
|
platformImpl.reset(nullptr);
|
|
|
|
}
|
2018-06-28 14:51:44 +08:00
|
|
|
|
|
|
|
TEST(PlatformConstructionTest, givenPlatformThatIsNotInitializedWhenGetDevicesIsCalledThenNullptrIsReturned) {
|
|
|
|
Platform platform;
|
|
|
|
auto devices = platform.getDevices();
|
|
|
|
EXPECT_EQ(nullptr, devices);
|
2018-08-08 19:49:09 +08:00
|
|
|
}
|
2018-08-14 19:54:33 +08:00
|
|
|
|
|
|
|
TEST(PlatformInitLoopTests, givenPlatformWhenInitLoopHelperIsCalledThenItDoesNothing) {
|
|
|
|
struct mockPlatform : public Platform {
|
|
|
|
using Platform::initializationLoopHelper;
|
|
|
|
};
|
|
|
|
mockPlatform platform;
|
|
|
|
platform.initializationLoopHelper();
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST(PlatformInitLoopTests, givenPlatformWithDebugSettingWhenInitIsCalledThenItEntersEndlessLoop) {
|
|
|
|
DebugManagerStateRestore stateRestore;
|
|
|
|
DebugManager.flags.LoopAtPlatformInitialize.set(true);
|
|
|
|
bool called = false;
|
|
|
|
struct mockPlatform : public Platform {
|
|
|
|
mockPlatform(bool &called) : called(called){};
|
|
|
|
void initializationLoopHelper() override {
|
|
|
|
DebugManager.flags.LoopAtPlatformInitialize.set(false);
|
|
|
|
called = true;
|
|
|
|
}
|
|
|
|
bool &called;
|
|
|
|
};
|
|
|
|
mockPlatform platform(called);
|
|
|
|
platform.initialize();
|
|
|
|
EXPECT_TRUE(called);
|
|
|
|
}
|