mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-24 21:18:24 +08:00
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:
committed by
sys_ocldev
parent
4c2d92890f
commit
8afdb2d981
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user