Forbid to rebuild program

Change-Id: I0fe5d8c9b39b3fc857bba0bde77ed4d9a4bb95af
Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
Lukasz Jobczyk
2020-04-20 10:52:26 +02:00
committed by sys_ocldev
parent 22831f40e9
commit aa957370da
3 changed files with 71 additions and 44 deletions

View File

@@ -1467,7 +1467,11 @@ cl_int CL_API_CALL clBuildProgram(cl_program program,
auto pProgram = castToObject<Program>(program); auto pProgram = castToObject<Program>(program);
if (pProgram) { 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); TRACING_EXIT(clBuildProgram, &retVal);

View File

@@ -118,7 +118,7 @@ TEST_F(clCreateProgramWithILKHRTests, GivenCorrectParametersWhenCreatingProgramW
EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(CL_SUCCESS, retVal);
} }
TEST_F(clCreateProgramWithILKHRTests, GivenProgramCreatedWithILWhenBuildAfterBuildIsCalledThenReturnSuccess) { TEST_F(clCreateProgramWithILKHRTests, GivenProgramCreatedWithILWhenBuildAfterBuildIsCalledThenReturnInvalidOperation) {
const uint32_t spirv[16] = {0x03022307}; const uint32_t spirv[16] = {0x03022307};
cl_int err = CL_INVALID_VALUE; cl_int err = CL_INVALID_VALUE;
cl_program program = clCreateProgramWithIL(pContext, spirv, sizeof(spirv), &err); cl_program program = clCreateProgramWithIL(pContext, spirv, sizeof(spirv), &err);
@@ -127,7 +127,7 @@ TEST_F(clCreateProgramWithILKHRTests, GivenProgramCreatedWithILWhenBuildAfterBui
err = clBuildProgram(program, 0, nullptr, "", nullptr, nullptr); err = clBuildProgram(program, 0, nullptr, "", nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, err); EXPECT_EQ(CL_SUCCESS, err);
err = clBuildProgram(program, 0, nullptr, "", nullptr, nullptr); err = clBuildProgram(program, 0, nullptr, "", nullptr, nullptr);
EXPECT_EQ(CL_SUCCESS, err); EXPECT_EQ(CL_INVALID_OPERATION, err);
retVal = clReleaseProgram(program); retVal = clReleaseProgram(program);
EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(CL_SUCCESS, retVal);
} }

View File

@@ -43,59 +43,82 @@ TEST_F(clGetProgramBuildInfoTests, givenSourceWhenclGetProgramBuildInfoIsCalledT
ASSERT_NE(0u, sourceSize); ASSERT_NE(0u, sourceSize);
ASSERT_NE(nullptr, pSource); ASSERT_NE(nullptr, pSource);
const char *sources[1] = {pSource.get()}; {
pProgram = clCreateProgramWithSource( const char *sources[1] = {pSource.get()};
pContext, pProgram = clCreateProgramWithSource(
1, pContext,
sources, 1,
&sourceSize, sources,
&retVal); &sourceSize,
&retVal);
EXPECT_NE(nullptr, pProgram); EXPECT_NE(nullptr, pProgram);
ASSERT_EQ(CL_SUCCESS, retVal); ASSERT_EQ(CL_SUCCESS, retVal);
cl_build_status buildStatus; cl_build_status buildStatus;
retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL); retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL);
EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(CL_BUILD_NONE, buildStatus); EXPECT_EQ(CL_BUILD_NONE, buildStatus);
retVal = clCompileProgram( retVal = clCompileProgram(
pProgram, pProgram,
num_devices, num_devices,
devices, devices,
nullptr, nullptr,
0, 0,
nullptr, nullptr,
nullptr, nullptr,
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); retVal = clGetProgramBuildInfo(pProgram, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, sizeof(buildStatus), &buildStatus, NULL);
EXPECT_EQ(CL_SUCCESS, retVal); EXPECT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(CL_BUILD_SUCCESS, buildStatus); EXPECT_EQ(CL_BUILD_SUCCESS, buildStatus);
retVal = clBuildProgram( retVal = clReleaseProgram(pProgram);
pProgram, EXPECT_EQ(CL_SUCCESS, retVal);
num_devices, }
devices,
nullptr,
nullptr,
nullptr);
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_NE(nullptr, pProgram);
EXPECT_EQ(CL_SUCCESS, retVal); ASSERT_EQ(CL_SUCCESS, retVal);
EXPECT_EQ(CL_BUILD_SUCCESS, 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 = 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 // try to get program build info for invalid program object - should fail
retVal = clGetProgramBuildInfo(nullptr, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, 0, nullptr, nullptr); retVal = clGetProgramBuildInfo(nullptr, devices[testedRootDeviceIndex], CL_PROGRAM_BUILD_STATUS, 0, nullptr, nullptr);
EXPECT_EQ(CL_INVALID_PROGRAM, retVal); EXPECT_EQ(CL_INVALID_PROGRAM, retVal);
retVal = clReleaseProgram(pProgram);
EXPECT_EQ(CL_SUCCESS, retVal);
} }
TEST_F(clGetProgramBuildInfoTests, givenElfBinaryWhenclGetProgramBuildInfoIsCalledThenReturnClBuildNone) { TEST_F(clGetProgramBuildInfoTests, givenElfBinaryWhenclGetProgramBuildInfoIsCalledThenReturnClBuildNone) {