diff --git a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp index af04c1abb2..ea71ddf192 100644 --- a/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp +++ b/opencl/test/unit_test/offline_compiler/offline_compiler_tests.cpp @@ -236,49 +236,51 @@ TEST_F(OfflineCompilerTests, GoodArgTest) { delete pOfflineCompiler; } -TEST_F(OfflineCompilerTests, WhenCompilingSourceThenCorrectExtensionsArePassed) { - std::vector argv = { - "ocloc", - "-file", - "test_files/copybuffer.cl", - "-device", - gEnvironment->devicePrefix.c_str()}; - auto mockOfflineCompiler = std::unique_ptr(new MockOfflineCompiler()); - ASSERT_NE(nullptr, mockOfflineCompiler); - mockOfflineCompiler->initialize(argv.size(), argv); +TEST_F(OfflineCompilerTests, givenVariousClStdValuesWhenCompilingSourceThenCorrectExtensionsArePassed) { + std::string clStdOptionValues[] = {"", "-cl-std=CL1.2", "-cl-std=CL2.0", "-cl-std=CL3.0"}; - std::string internalOptions = mockOfflineCompiler->internalOptions; - std::string oclVersionOption = getOclVersionCompilerInternalOption(DEFAULT_PLATFORM::hwInfo.capabilityTable.clVersionSupport); - EXPECT_THAT(internalOptions, ::testing::HasSubstr(oclVersionOption)); + for (auto &clStdOptionValue : clStdOptionValues) { + std::vector argv = { + "ocloc", + "-file", + "test_files/copybuffer.cl", + "-device", + gEnvironment->devicePrefix.c_str()}; - OpenClCFeaturesContainer openclCFeatures; - getOpenclCFeaturesList(DEFAULT_PLATFORM::hwInfo, openclCFeatures); - for (auto &feature : openclCFeatures) { - EXPECT_THAT(internalOptions, ::testing::Not(::testing::HasSubstr(std::string{feature.name}))); + if (!clStdOptionValue.empty()) { + argv.push_back("-options"); + argv.push_back(clStdOptionValue); + } + + auto mockOfflineCompiler = std::unique_ptr(new MockOfflineCompiler()); + ASSERT_NE(nullptr, mockOfflineCompiler); + mockOfflineCompiler->initialize(argv.size(), argv); + + std::string internalOptions = mockOfflineCompiler->internalOptions; + std::string oclVersionOption = getOclVersionCompilerInternalOption(DEFAULT_PLATFORM::hwInfo.capabilityTable.clVersionSupport); + EXPECT_THAT(internalOptions, ::testing::HasSubstr(oclVersionOption)); + + if (clStdOptionValue == "-cl-std=CL2.0") { + auto expectedRegex = std::string{"cl_khr_3d_image_writes"}; + if (DEFAULT_PLATFORM::hwInfo.capabilityTable.supportsImages) { + expectedRegex += ".+" + std::string{"cl_khr_3d_image_writes"}; + } + EXPECT_THAT(internalOptions, ::testing::ContainsRegex(expectedRegex)); + } + + OpenClCFeaturesContainer openclCFeatures; + getOpenclCFeaturesList(DEFAULT_PLATFORM::hwInfo, openclCFeatures); + for (auto &feature : openclCFeatures) { + if (clStdOptionValue == "-cl-std=CL3.0") { + EXPECT_THAT(internalOptions, ::testing::HasSubstr(std::string{feature.name})); + } else { + EXPECT_THAT(internalOptions, ::testing::Not(::testing::HasSubstr(std::string{feature.name}))); + } + } } } -TEST_F(OfflineCompilerTests, givenClStd30OptionWhenCompilingSourceThenCorrectExtensionsArePassed) { - std::vector argv = { - "ocloc", - "-file", - "test_files/copybuffer.cl", - "-device", - gEnvironment->devicePrefix.c_str(), - "-options", - "-cl-std=CL3.0"}; - auto mockOfflineCompiler = std::unique_ptr(new MockOfflineCompiler()); - ASSERT_NE(nullptr, mockOfflineCompiler); - mockOfflineCompiler->initialize(argv.size(), argv); - - std::string internalOptions = mockOfflineCompiler->internalOptions; - OpenClCFeaturesContainer openclCFeatures; - getOpenclCFeaturesList(DEFAULT_PLATFORM::hwInfo, openclCFeatures); - for (auto &feature : openclCFeatures) { - EXPECT_THAT(internalOptions, ::testing::HasSubstr(std::string{feature.name})); - } -} TEST_F(OfflineCompilerTests, GoodBuildTest) { std::vector argv = { "ocloc", diff --git a/shared/offline_compiler/source/offline_compiler.cpp b/shared/offline_compiler/source/offline_compiler.cpp index dfaaa693a8..22a18f5132 100644 --- a/shared/offline_compiler/source/offline_compiler.cpp +++ b/shared/offline_compiler/source/offline_compiler.cpp @@ -361,8 +361,8 @@ int OfflineCompiler::initialize(size_t numArgs, const std::vector & } } - retVal = deviceName.empty() ? 0 : getHardwareInfo(deviceName.c_str()); - if (retVal != 0) { + retVal = deviceName.empty() ? SUCCESS : getHardwareInfo(deviceName.c_str()); + if (retVal != SUCCESS) { argHelper->printf("Error: Cannot get HW Info for device %s.\n", deviceName.c_str()); return retVal; } @@ -373,6 +373,9 @@ int OfflineCompiler::initialize(size_t numArgs, const std::vector & CompilerOptions::concatenateAppend(internalOptions, oclVersion); std::string extensionsList = getExtensionsList(hwInfo); + if (requiresAdditionalExtensions(options)) { + extensionsList += "cl_khr_3d_image_writes "; + } OpenClCFeaturesContainer openclCFeatures; if (requiresOpenClCFeatures(options)) { getOpenclCFeaturesList(hwInfo, openclCFeatures); diff --git a/shared/source/helpers/compiler_options_parser.cpp b/shared/source/helpers/compiler_options_parser.cpp index f486f837a5..3dce3f253e 100644 --- a/shared/source/helpers/compiler_options_parser.cpp +++ b/shared/source/helpers/compiler_options_parser.cpp @@ -14,15 +14,23 @@ namespace NEO { const std::string clStdOptionName = "-cl-std=CL"; -bool requiresOpenClCFeatures(const std::string &compileOptions) { +uint32_t getMajorVersion(const std::string &compileOptions) { auto clStdValuePosition = compileOptions.find(clStdOptionName); if (clStdValuePosition == std::string::npos) { - return false; + return 0; } std::stringstream ss{compileOptions.c_str() + clStdValuePosition + clStdOptionName.size()}; uint32_t majorVersion; ss >> majorVersion; - return (majorVersion >= 3); + return majorVersion; +} + +bool requiresOpenClCFeatures(const std::string &compileOptions) { + return (getMajorVersion(compileOptions) >= 3); +} + +bool requiresAdditionalExtensions(const std::string &compileOptions) { + return (getMajorVersion(compileOptions) == 2); } } // namespace NEO diff --git a/shared/source/helpers/compiler_options_parser.h b/shared/source/helpers/compiler_options_parser.h index db9cd3daa6..ee5b4b7c90 100644 --- a/shared/source/helpers/compiler_options_parser.h +++ b/shared/source/helpers/compiler_options_parser.h @@ -14,5 +14,6 @@ namespace NEO { extern const std::string clStdOptionName; bool requiresOpenClCFeatures(const std::string &compileOptions); +bool requiresAdditionalExtensions(const std::string &compileOptions); } // namespace NEO