/* * Copyright (c) 2017 - 2018, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ #include "runtime/context/context.h" #include "runtime/helpers/base_object.h" #include "runtime/helpers/get_info.h" #include "runtime/helpers/validators.h" #include "program.h" namespace OCLRT { cl_int Program::getInfo(cl_program_info paramName, size_t paramValueSize, void *paramValue, size_t *paramValueSizeRet) { cl_int retVal = CL_SUCCESS; const void *pSrc = nullptr; size_t srcSize = 0; size_t retSize = 0; std::string kernelNamesString; cl_device_id device_id = pDevice; cl_uint refCount = 0; size_t numKernels; cl_context clContext = context; switch (paramName) { case CL_PROGRAM_CONTEXT: pSrc = &clContext; retSize = srcSize = sizeof(clContext); break; case CL_PROGRAM_BINARIES: resolveProgramBinary(); pSrc = elfBinary.data(); retSize = sizeof(void **); srcSize = elfBinarySize; if (paramValue != nullptr) { if (paramValueSize < retSize) { retVal = CL_INVALID_VALUE; break; } paramValueSize = srcSize; paramValue = *(void **)paramValue; } break; case CL_PROGRAM_BINARY_SIZES: resolveProgramBinary(); pSrc = &elfBinarySize; retSize = srcSize = sizeof(size_t *); break; case CL_PROGRAM_KERNEL_NAMES: kernelNamesString = getKernelNamesString(); pSrc = kernelNamesString.c_str(); retSize = srcSize = kernelNamesString.length() + 1; if (buildStatus != CL_BUILD_SUCCESS) { retVal = CL_INVALID_PROGRAM_EXECUTABLE; } break; case CL_PROGRAM_NUM_KERNELS: numKernels = kernelInfoArray.size(); pSrc = &numKernels; retSize = srcSize = sizeof(numKernels); if (buildStatus != CL_BUILD_SUCCESS) { retVal = CL_INVALID_PROGRAM_EXECUTABLE; } break; case CL_PROGRAM_NUM_DEVICES: pSrc = &numDevices; retSize = srcSize = sizeof(cl_uint); break; case CL_PROGRAM_DEVICES: pSrc = &device_id; retSize = srcSize = sizeof(cl_device_id); break; case CL_PROGRAM_REFERENCE_COUNT: refCount = static_cast(this->getReference()); retSize = srcSize = sizeof(refCount); pSrc = &refCount; break; case CL_PROGRAM_SOURCE: pSrc = sourceCode.c_str(); retSize = srcSize = strlen(sourceCode.c_str()) + 1; break; case CL_PROGRAM_IL: pSrc = sourceCode.data(); retSize = srcSize = sourceCode.size(); if (!Program::isValidSpirvBinary(pSrc, srcSize)) { if (paramValueSizeRet) { *paramValueSizeRet = 0; } return CL_SUCCESS; } break; case CL_PROGRAM_DEBUG_INFO_SIZES_INTEL: resolveProgramBinary(); retSize = srcSize = sizeof(debugDataSize); pSrc = &debugDataSize; break; case CL_PROGRAM_DEBUG_INFO_INTEL: resolveProgramBinary(); pSrc = debugData; retSize = numDevices * sizeof(void **); srcSize = debugDataSize; if (paramValue != nullptr) { if (paramValueSize < retSize) { retVal = CL_INVALID_VALUE; break; } paramValueSize = srcSize; paramValue = *(void **)paramValue; } break; default: retVal = CL_INVALID_VALUE; break; } retVal = (retVal == CL_SUCCESS) ? ::getInfo(paramValue, paramValueSize, pSrc, srcSize) : retVal; if (paramValueSizeRet) { *paramValueSizeRet = retSize; } return retVal; } cl_int Program::getBuildInfo(cl_device_id device, cl_program_build_info paramName, size_t paramValueSize, void *paramValue, size_t *paramValueSizeRet) const { cl_int retVal = CL_SUCCESS; const void *pSrc = nullptr; size_t srcSize = 0; size_t retSize = 0; cl_device_id device_id = pDevice; if (device != device_id) { return CL_INVALID_DEVICE; } retVal = validateObjects(device); if (retVal != CL_SUCCESS) { return CL_INVALID_DEVICE; } auto pDev = castToObject(device); switch (paramName) { case CL_PROGRAM_BUILD_STATUS: srcSize = retSize = sizeof(cl_build_status); pSrc = &buildStatus; break; case CL_PROGRAM_BUILD_OPTIONS: srcSize = retSize = strlen(options.c_str()) + 1; pSrc = options.c_str(); break; case CL_PROGRAM_BUILD_LOG: { const char *pBuildLog = getBuildLog(pDev); if (pBuildLog != nullptr) { pSrc = pBuildLog; srcSize = retSize = strlen(pBuildLog) + 1; } else { pSrc = ""; srcSize = retSize = 1; } } break; case CL_PROGRAM_BINARY_TYPE: srcSize = retSize = sizeof(cl_program_binary_type); pSrc = &programBinaryType; break; case CL_PROGRAM_BUILD_GLOBAL_VARIABLE_TOTAL_SIZE: pSrc = &globalVarTotalSize; retSize = srcSize = sizeof(size_t); break; default: retVal = CL_INVALID_VALUE; break; } retVal = (retVal == CL_SUCCESS) ? ::getInfo(paramValue, paramValueSize, pSrc, srcSize) : retVal; if (paramValueSizeRet) { *paramValueSizeRet = retSize; } return retVal; } } // namespace OCLRT