diff --git a/opencl/source/program/program.cpp b/opencl/source/program/program.cpp index afb426601c..173e0f1bb6 100644 --- a/opencl/source/program/program.cpp +++ b/opencl/source/program/program.cpp @@ -186,8 +186,8 @@ cl_int Program::createProgramFromBinary( this->debugData = makeCopy(reinterpret_cast(singleDeviceBinary.debugData.begin()), singleDeviceBinary.debugData.size()); this->debugDataSize = singleDeviceBinary.debugData.size(); } - - if ((false == singleDeviceBinary.deviceBinary.empty()) && (false == DebugManager.flags.RebuildPrecompiledKernels.get())) { + bool forceRebuildBuiltInFromIr = isBuiltIn && DebugManager.flags.RebuildPrecompiledKernels.get(); + if ((false == singleDeviceBinary.deviceBinary.empty()) && (false == forceRebuildBuiltInFromIr)) { this->buildInfos[rootDeviceIndex].unpackedDeviceBinary = makeCopy(reinterpret_cast(singleDeviceBinary.deviceBinary.begin()), singleDeviceBinary.deviceBinary.size()); this->buildInfos[rootDeviceIndex].unpackedDeviceBinarySize = singleDeviceBinary.deviceBinary.size(); this->buildInfos[rootDeviceIndex].packedDeviceBinary = makeCopy(reinterpret_cast(archive.begin()), archive.size()); diff --git a/opencl/test/unit_test/program/program_tests.cpp b/opencl/test/unit_test/program/program_tests.cpp index dcd228db98..bbaef6a0d0 100644 --- a/opencl/test/unit_test/program/program_tests.cpp +++ b/opencl/test/unit_test/program/program_tests.cpp @@ -2723,7 +2723,7 @@ TEST_F(ProgramTests, givenProgramWhenBuiltThenAdditionalOptionsAreApplied) { EXPECT_EQ(1u, program.applyAdditionalOptionsCalled); } -TEST(CreateProgramFromBinaryTests, givenBinaryProgramWhenKernelRebulildIsForcedThenDeviceBinaryIsNotUsed) { +TEST(CreateProgramFromBinaryTests, givenBinaryProgramBuiltInWhenKernelRebulildIsForcedThenDeviceBinaryIsNotUsed) { DebugManagerStateRestore dbgRestorer; DebugManager.flags.RebuildPrecompiledKernels.set(true); cl_int retVal = CL_INVALID_BINARY; @@ -2732,7 +2732,6 @@ TEST(CreateProgramFromBinaryTests, givenBinaryProgramWhenKernelRebulildIsForcedT auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); std::unique_ptr pProgram(Program::createBuiltInFromGenBinary(nullptr, toClDeviceVector(*clDevice), programTokens.storage.data(), programTokens.storage.size(), &retVal)); - pProgram->pDevice = &clDevice->getDevice(); ASSERT_NE(nullptr, pProgram.get()); EXPECT_EQ(CL_SUCCESS, retVal); @@ -2744,6 +2743,31 @@ TEST(CreateProgramFromBinaryTests, givenBinaryProgramWhenKernelRebulildIsForcedT EXPECT_EQ(nullptr, pProgram->buildInfos[rootDeviceIndex].packedDeviceBinary); EXPECT_EQ(0U, pProgram->buildInfos[rootDeviceIndex].packedDeviceBinarySize); } +TEST(CreateProgramFromBinaryTests, givenBinaryProgramNotBuiltInWhenBuiltInKernelRebulildIsForcedThenDeviceBinaryIsUsed) { + DebugManagerStateRestore dbgRestorer; + DebugManager.flags.RebuildPrecompiledKernels.set(true); + cl_int retVal = CL_INVALID_BINARY; + + PatchTokensTestData::ValidEmptyProgram programTokens; + const unsigned char *binaries[] = {programTokens.storage.data()}; + size_t lengths[] = {programTokens.storage.size()}; + auto clDevice = std::make_unique(MockDevice::createWithNewExecutionEnvironment(nullptr)); + std::unique_ptr pProgram(Program::create( + nullptr, + toClDeviceVector(*clDevice), + lengths, + binaries, + nullptr, + retVal)); + ASSERT_NE(nullptr, pProgram.get()); + EXPECT_EQ(CL_SUCCESS, retVal); + + auto rootDeviceIndex = clDevice->getRootDeviceIndex(); + EXPECT_NE(nullptr, pProgram->buildInfos[rootDeviceIndex].unpackedDeviceBinary.get()); + EXPECT_LT(0U, pProgram->buildInfos[rootDeviceIndex].unpackedDeviceBinarySize); + EXPECT_NE(nullptr, pProgram->buildInfos[rootDeviceIndex].packedDeviceBinary); + EXPECT_LT(0U, pProgram->buildInfos[rootDeviceIndex].packedDeviceBinarySize); +} TEST(CreateProgramFromBinaryTests, givenBinaryProgramWhenKernelRebulildIsNotForcedThenDeviceBinaryIsUsed) { cl_int retVal = CL_INVALID_BINARY;