From c83087ea723671e789c20a6b5814ae912059cd29 Mon Sep 17 00:00:00 2001 From: Filip Hazubski Date: Thu, 3 Dec 2020 18:00:10 +0000 Subject: [PATCH] Correct generating extensions list for compiler in Program Signed-off-by: Filip Hazubski --- opencl/source/program/build.cpp | 10 +++-- opencl/source/program/compile.cpp | 10 +++-- .../test/unit_test/program/program_tests.cpp | 43 ++++++++++++++++++- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/opencl/source/program/build.cpp b/opencl/source/program/build.cpp index a59e8e54a4..46a1af5ce1 100644 --- a/opencl/source/program/build.cpp +++ b/opencl/source/program/build.cpp @@ -108,11 +108,13 @@ cl_int Program::build( } } - if (requiresOpenClCFeatures(options)) { - CompilerOptions::concatenateAppend(internalOptions, defaultClDevice->peekCompilerExtensionsWithFeatures()); - } else { - CompilerOptions::concatenateAppend(internalOptions, defaultClDevice->peekCompilerExtensions()); + std::string extensions = requiresOpenClCFeatures(options) ? defaultClDevice->peekCompilerExtensionsWithFeatures() + : defaultClDevice->peekCompilerExtensions(); + if (requiresAdditionalExtensions(options)) { + extensions.erase(extensions.length() - 1); + extensions += ",+cl_khr_3d_image_writes "; } + CompilerOptions::concatenateAppend(internalOptions, extensions); inputArgs.apiOptions = ArrayRef(options.c_str(), options.length()); inputArgs.internalOptions = ArrayRef(internalOptions.c_str(), internalOptions.length()); diff --git a/opencl/source/program/compile.cpp b/opencl/source/program/compile.cpp index d814d5c1cb..aa3b44b7c3 100644 --- a/opencl/source/program/compile.cpp +++ b/opencl/source/program/compile.cpp @@ -116,11 +116,13 @@ cl_int Program::compile( TranslationInput inputArgs = {IGC::CodeType::elf, IGC::CodeType::undefined}; // set parameters for compilation - if (requiresOpenClCFeatures(options)) { - CompilerOptions::concatenateAppend(internalOptions, defaultClDevice->peekCompilerExtensionsWithFeatures()); - } else { - CompilerOptions::concatenateAppend(internalOptions, defaultClDevice->peekCompilerExtensions()); + std::string extensions = requiresOpenClCFeatures(options) ? defaultClDevice->peekCompilerExtensionsWithFeatures() + : defaultClDevice->peekCompilerExtensions(); + if (requiresAdditionalExtensions(options)) { + extensions.erase(extensions.length() - 1); + extensions += ",+cl_khr_3d_image_writes "; } + CompilerOptions::concatenateAppend(internalOptions, extensions); if (isKernelDebugEnabled()) { for (const auto &device : deviceVector) { diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index 1eff61bb13..a406940ae3 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -771,7 +771,7 @@ TEST_F(ProgramFromSourceTest, CreateWithSource_Build_Options_Duplicate) { EXPECT_EQ(CL_SUCCESS, retVal); } -TEST_F(ProgramFromSourceTest, WhenBuildingProgramThenFeaturesAreNotAdded) { +TEST_F(ProgramFromSourceTest, WhenBuildingProgramThenFeaturesAndExtraExtensionsAreNotAdded) { auto cip = new MockCompilerInterfaceCaptureBuildOptions(); auto pClDevice = pContext->getDevice(0); pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pClDevice->getRootDeviceIndex()]->compilerInterface.reset(cip); @@ -780,10 +780,32 @@ TEST_F(ProgramFromSourceTest, WhenBuildingProgramThenFeaturesAreNotAdded) { auto extensionsWithFeaturesOption = static_cast(devices[0])->peekCompilerExtensionsWithFeatures(); EXPECT_THAT(cip->buildInternalOptions, testing::Not(testing::HasSubstr(extensionsOption))); EXPECT_THAT(cip->buildInternalOptions, testing::Not(testing::HasSubstr(extensionsWithFeaturesOption))); + EXPECT_THAT(cip->buildInternalOptions, testing::Not(testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "}))); retVal = pProgram->build(pProgram->getDevices(), nullptr, false); EXPECT_THAT(cip->buildInternalOptions, testing::HasSubstr(extensionsOption)); EXPECT_THAT(cip->buildInternalOptions, testing::Not(testing::HasSubstr(extensionsWithFeaturesOption))); + EXPECT_THAT(cip->buildInternalOptions, testing::Not(testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "}))); +} + +TEST_F(ProgramFromSourceTest, WhenBuildingProgramWithOpenClC20ThenExtraExtensionsAreAdded) { + auto cip = new MockCompilerInterfaceCaptureBuildOptions(); + auto pClDevice = pContext->getDevice(0); + pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pClDevice->getRootDeviceIndex()]->compilerInterface.reset(cip); + auto pProgram = std::make_unique(toClDeviceVector(*pClDevice)); + pProgram->sourceCode = "__kernel mock() {}"; + pProgram->createdFrom = Program::CreatedFrom::SOURCE; + + MockProgram::initInternalOptionsCalled = 0; + + auto extensionsOption = static_cast(devices[0])->peekCompilerExtensions(); + auto extensionsWithFeaturesOption = static_cast(devices[0])->peekCompilerExtensionsWithFeatures(); + EXPECT_THAT(cip->buildInternalOptions, testing::Not(testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "}))); + + retVal = pProgram->build(pProgram->getDevices(), "-cl-std=CL2.0", false); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_THAT(cip->buildInternalOptions, testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "})); + EXPECT_EQ(1, MockProgram::initInternalOptionsCalled); } TEST_F(ProgramFromSourceTest, WhenBuildingProgramWithOpenClC30ThenFeaturesAreAdded) { @@ -830,7 +852,7 @@ TEST_F(ProgramFromSourceTest, WhenBuildingProgramWithOpenClC30ThenFeaturesAreAdd EXPECT_EQ(std::string::npos, pos); } -TEST_F(ProgramFromSourceTest, WhenCompilingProgramThenFeaturesAreNotAdded) { +TEST_F(ProgramFromSourceTest, WhenCompilingProgramThenFeaturesAndExtraExtensionsAreNotAdded) { auto pCompilerInterface = new MockCompilerInterfaceCaptureBuildOptions(); auto pClDevice = static_cast(devices[0]); pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pClDevice->getRootDeviceIndex()]->compilerInterface.reset(pCompilerInterface); @@ -838,12 +860,29 @@ TEST_F(ProgramFromSourceTest, WhenCompilingProgramThenFeaturesAreNotAdded) { auto extensionsWithFeaturesOption = pClDevice->peekCompilerExtensionsWithFeatures(); EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::Not(testing::HasSubstr(extensionsOption))); EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::Not(testing::HasSubstr(extensionsWithFeaturesOption))); + EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::Not(testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "}))); MockProgram::initInternalOptionsCalled = 0; retVal = pProgram->compile(pProgram->getDevices(), nullptr, 0, nullptr, nullptr); EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::HasSubstr(extensionsOption)); EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::Not(testing::HasSubstr(extensionsWithFeaturesOption))); + EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::Not(testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "}))); + EXPECT_EQ(1, MockProgram::initInternalOptionsCalled); +} + +TEST_F(ProgramFromSourceTest, WhenCompilingProgramWithOpenClC20ThenExtraExtensionsAreAdded) { + auto pCompilerInterface = new MockCompilerInterfaceCaptureBuildOptions(); + auto pClDevice = static_cast(devices[0]); + pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pClDevice->getRootDeviceIndex()]->compilerInterface.reset(pCompilerInterface); + auto extensionsOption = pClDevice->peekCompilerExtensions(); + auto extensionsWithFeaturesOption = pClDevice->peekCompilerExtensionsWithFeatures(); + EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::Not(testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "}))); + + MockProgram::initInternalOptionsCalled = 0; + retVal = pProgram->compile(pProgram->getDevices(), "-cl-std=CL2.0", 0, nullptr, nullptr); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_THAT(pCompilerInterface->buildInternalOptions, testing::HasSubstr(std::string{"+cl_khr_3d_image_writes "})); EXPECT_EQ(1, MockProgram::initInternalOptionsCalled); }