Correct clCreateProgramWithBinary

store proper devices
validate input devices, lengths and binary
return correct binaries

Related-To: NEO-5001
Change-Id: I3822c291a4430e64afe54f1486b0014f16de3d64
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2020-10-21 10:25:03 +02:00
committed by sys_ocldev
parent 4c2d92890f
commit 8afdb2d981
18 changed files with 383 additions and 105 deletions

View File

@@ -31,8 +31,8 @@ cl_int Program::getInfo(cl_program_info paramName, size_t paramValueSize,
size_t numKernels;
cl_context clContext = context;
cl_uint clFalse = CL_FALSE;
auto rootDeviceIndex = pDevice->getRootDeviceIndex();
std::vector<cl_device_id> devicesToExpose;
StackVec<size_t, 1> binarySizes;
switch (paramName) {
case CL_PROGRAM_CONTEXT:
@@ -40,25 +40,39 @@ cl_int Program::getInfo(cl_program_info paramName, size_t paramValueSize,
retSize = srcSize = sizeof(clContext);
break;
case CL_PROGRAM_BINARIES:
packDeviceBinary(rootDeviceIndex);
pSrc = buildInfos[rootDeviceIndex].packedDeviceBinary.get();
retSize = sizeof(void **);
srcSize = buildInfos[rootDeviceIndex].packedDeviceBinarySize;
if (paramValue != nullptr) {
if (paramValueSize < retSize) {
retVal = CL_INVALID_VALUE;
break;
}
paramValueSize = srcSize;
paramValue = *(void **)paramValue;
case CL_PROGRAM_BINARIES: {
auto requiredSize = clDevices.size() * sizeof(const unsigned char **);
if (!paramValue) {
retSize = requiredSize;
srcSize = 0u;
break;
}
break;
if (paramValueSize < requiredSize) {
retVal = CL_INVALID_VALUE;
break;
}
auto outputBinaries = reinterpret_cast<unsigned char **>(paramValue);
for (auto i = 0u; i < clDevices.size(); i++) {
if (outputBinaries[i] == nullptr) {
continue;
}
auto rootDeviceIndex = clDevices[i]->getRootDeviceIndex();
auto binarySize = buildInfos[rootDeviceIndex].packedDeviceBinarySize;
memcpy_s(outputBinaries[i], binarySize, buildInfos[rootDeviceIndex].packedDeviceBinary.get(), binarySize);
}
GetInfo::setParamValueReturnSize(paramValueSizeRet, requiredSize, GetInfoStatus::SUCCESS);
return CL_SUCCESS;
} break;
case CL_PROGRAM_BINARY_SIZES:
packDeviceBinary(rootDeviceIndex);
pSrc = &buildInfos[rootDeviceIndex].packedDeviceBinarySize;
retSize = srcSize = sizeof(size_t *);
for (auto i = 0u; i < clDevices.size(); i++) {
auto rootDeviceIndex = clDevices[i]->getRootDeviceIndex();
packDeviceBinary(rootDeviceIndex);
binarySizes.push_back(buildInfos[rootDeviceIndex].packedDeviceBinarySize);
}
pSrc = binarySizes.data();
retSize = srcSize = binarySizes.size() * sizeof(cl_device_id);
break;
case CL_PROGRAM_KERNEL_NAMES: