diff --git a/opencl/source/api/api.cpp b/opencl/source/api/api.cpp index 494c589571..409026cbf1 100644 --- a/opencl/source/api/api.cpp +++ b/opencl/source/api/api.cpp @@ -1467,7 +1467,11 @@ cl_int CL_API_CALL clBuildProgram(cl_program program, auto pProgram = castToObject(program); if (pProgram) { - retVal = pProgram->build(numDevices, deviceList, options, funcNotify, userData, clCacheEnabled); + if (pProgram->getBuildStatus() == CL_BUILD_SUCCESS) { + retVal = CL_INVALID_OPERATION; + } else { + retVal = pProgram->build(numDevices, deviceList, options, funcNotify, userData, clCacheEnabled); + } } TRACING_EXIT(clBuildProgram, &retVal); diff --git a/opencl/test/unit_test/api/cl_create_program_with_binary_tests.inl b/opencl/test/unit_test/api/cl_create_program_with_binary_tests.inl index c5aa8fc574..3a01d2debd 100644 --- a/opencl/test/unit_test/api/cl_create_program_with_binary_tests.inl +++ b/opencl/test/unit_test/api/cl_create_program_with_binary_tests.inl @@ -118,7 +118,7 @@ TEST_F(clCreateProgramWithILKHRTests, GivenCorrectParametersWhenCreatingProgramW EXPECT_EQ(CL_SUCCESS, retVal); } -TEST_F(clCreateProgramWithILKHRTests, GivenProgramCreatedWithILWhenBuildAfterBuildIsCalledThenReturnSuccess) { +TEST_F(clCreateProgramWithILKHRTests, GivenProgramCreatedWithILWhenBuildAfterBuildIsCalledThenReturnInvalidOperation) { const uint32_t spirv[16] = {0x03022307}; cl_int err = CL_INVALID_VALUE; cl_program program = clCreateProgramWithIL(pContext, spirv, sizeof(spirv), &err); @@ -127,7 +127,7 @@ TEST_F(clCreateProgramWithILKHRTests, GivenProgramCreatedWithILWhenBuildAfterBui err = clBuildProgram(program, 0, nullptr, "", nullptr, nullptr); EXPECT_EQ(CL_SUCCESS, err); err = clBuildProgram(program, 0, nullptr, "", nullptr, nullptr); - EXPECT_EQ(CL_SUCCESS, err); + EXPECT_EQ(CL_INVALID_OPERATION, err); retVal = clReleaseProgram(program); EXPECT_EQ(CL_SUCCESS, retVal); } diff --git a/opencl/test/unit_test/api/cl_get_program_build_info_tests.inl b/opencl/test/unit_test/api/cl_get_program_build_info_tests.inl index 603ae7bd48..0a267e1247 100644 --- a/opencl/test/unit_test/api/cl_get_program_build_info_tests.inl +++ b/opencl/test/unit_test/api/cl_get_program_build_info_tests.inl @@ -43,59 +43,82 @@ TEST_F(clGetProgramBuildInfoTests, givenSourceWhenclGetProgramBuildInfoIsCalledT ASSERT_NE(0u, sourceSize); ASSERT_NE(nullptr, pSource); - const char *sources[1] = {pSource.get()}; - pProgram = clCreateProgramWithSource( - pContext, - 1, - sources, - &sourceSize, - &retVal); + { + const char *sources[1] = {pSource.get()}; + pProgram = clCreateProgramWithSource( + pContext, + 1, + sources, + &sourceSize, + &retVal); - EXPECT_NE(nullptr, pProgram); - ASSERT_EQ(CL_SUCCESS, retVal); + EXPECT_NE(nullptr, pProgram); + ASSERT_EQ(CL_SUCCESS, retVal); - cl_build_status buildStatus; - retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); - EXPECT_EQ(CL_SUCCESS, retVal); - EXPECT_EQ(CL_BUILD_NONE, buildStatus); + cl_build_status buildStatus; + retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_EQ(CL_BUILD_NONE, buildStatus); - retVal = clCompileProgram( - pProgram, - num_devices, - devices, - nullptr, - 0, - nullptr, - nullptr, - nullptr, - nullptr); + retVal = clCompileProgram( + pProgram, + num_devices, + devices, + nullptr, + 0, + nullptr, + nullptr, + nullptr, + nullptr); - ASSERT_EQ(CL_SUCCESS, retVal); + ASSERT_EQ(CL_SUCCESS, retVal); - retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); - EXPECT_EQ(CL_SUCCESS, retVal); - EXPECT_EQ(CL_BUILD_SUCCESS, buildStatus); + retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_EQ(CL_BUILD_SUCCESS, buildStatus); - retVal = clBuildProgram( - pProgram, - num_devices, - devices, - nullptr, - nullptr, - nullptr); + retVal = clReleaseProgram(pProgram); + EXPECT_EQ(CL_SUCCESS, retVal); + } - ASSERT_EQ(CL_SUCCESS, retVal); + { + const char *sources[1] = {pSource.get()}; + pProgram = clCreateProgramWithSource( + pContext, + 1, + sources, + &sourceSize, + &retVal); - retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); - EXPECT_EQ(CL_SUCCESS, retVal); - EXPECT_EQ(CL_BUILD_SUCCESS, buildStatus); + EXPECT_NE(nullptr, pProgram); + ASSERT_EQ(CL_SUCCESS, retVal); + + cl_build_status buildStatus; + retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_EQ(CL_BUILD_NONE, buildStatus); + + retVal = clBuildProgram( + pProgram, + num_devices, + devices, + nullptr, + nullptr, + nullptr); + + ASSERT_EQ(CL_SUCCESS, retVal); + + retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); + EXPECT_EQ(CL_SUCCESS, retVal); + EXPECT_EQ(CL_BUILD_SUCCESS, buildStatus); + + retVal = clReleaseProgram(pProgram); + EXPECT_EQ(CL_SUCCESS, retVal); + } // try to get program build info for invalid program object - should fail retVal = clGetProgramBuildInfo(nullptr, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, 0, nullptr, nullptr); EXPECT_EQ(CL_INVALID_PROGRAM, retVal); - - retVal = clReleaseProgram(pProgram); - EXPECT_EQ(CL_SUCCESS, retVal); } TEST_F(clGetProgramBuildInfoTests, givenElfBinaryWhenclGetProgramBuildInfoIsCalledThenReturnClBuildNone) {