Merge branch 'origin/pghafari/opencl' into lmoriche/amd-master-next
This commit is contained in:
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2019 The Khronos Group Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
OPENCL_1.0 {
|
||||
global:
|
||||
clBuildProgram;
|
||||
clCreateBuffer;
|
||||
clCreateCommandQueue;
|
||||
clCreateContext;
|
||||
clCreateContextFromType;
|
||||
clCreateFromGLBuffer;
|
||||
clCreateFromGLRenderbuffer;
|
||||
clCreateFromGLTexture2D;
|
||||
clCreateFromGLTexture3D;
|
||||
clCreateImage2D;
|
||||
clCreateImage3D;
|
||||
clCreateKernel;
|
||||
clCreateKernelsInProgram;
|
||||
clCreateProgramWithBinary;
|
||||
clCreateProgramWithSource;
|
||||
clCreateSampler;
|
||||
clEnqueueAcquireGLObjects;
|
||||
clEnqueueBarrier;
|
||||
clEnqueueCopyBuffer;
|
||||
clEnqueueCopyBufferToImage;
|
||||
clEnqueueCopyImage;
|
||||
clEnqueueCopyImageToBuffer;
|
||||
clEnqueueMapBuffer;
|
||||
clEnqueueMapImage;
|
||||
clEnqueueMarker;
|
||||
clEnqueueNDRangeKernel;
|
||||
clEnqueueNativeKernel;
|
||||
clEnqueueReadBuffer;
|
||||
clEnqueueReadImage;
|
||||
clEnqueueReleaseGLObjects;
|
||||
clEnqueueTask;
|
||||
clEnqueueUnmapMemObject;
|
||||
clEnqueueWaitForEvents;
|
||||
clEnqueueWriteBuffer;
|
||||
clEnqueueWriteImage;
|
||||
clFinish;
|
||||
clFlush;
|
||||
clGetCommandQueueInfo;
|
||||
clGetContextInfo;
|
||||
clGetDeviceIDs;
|
||||
clGetDeviceInfo;
|
||||
clGetEventInfo;
|
||||
clGetEventProfilingInfo;
|
||||
clGetExtensionFunctionAddress;
|
||||
clGetGLObjectInfo;
|
||||
clGetGLTextureInfo;
|
||||
clGetImageInfo;
|
||||
clGetKernelInfo;
|
||||
clGetKernelWorkGroupInfo;
|
||||
clGetMemObjectInfo;
|
||||
clGetPlatformIDs;
|
||||
clGetPlatformInfo;
|
||||
clGetProgramBuildInfo;
|
||||
clGetProgramInfo;
|
||||
clGetSamplerInfo;
|
||||
clGetSupportedImageFormats;
|
||||
clReleaseCommandQueue;
|
||||
clReleaseContext;
|
||||
clReleaseEvent;
|
||||
clReleaseKernel;
|
||||
clReleaseMemObject;
|
||||
clReleaseProgram;
|
||||
clReleaseSampler;
|
||||
clRetainCommandQueue;
|
||||
clRetainContext;
|
||||
clRetainEvent;
|
||||
clRetainKernel;
|
||||
clRetainMemObject;
|
||||
clRetainProgram;
|
||||
clRetainSampler;
|
||||
clSetCommandQueueProperty;
|
||||
clSetKernelArg;
|
||||
clUnloadCompiler;
|
||||
clWaitForEvents;
|
||||
|
||||
local:
|
||||
/* Everything else is local to ICD. */
|
||||
*;
|
||||
};
|
||||
|
||||
OPENCL_1.1 {
|
||||
global:
|
||||
clCreateSubBuffer;
|
||||
clCreateUserEvent;
|
||||
clEnqueueCopyBufferRect;
|
||||
clEnqueueReadBufferRect;
|
||||
clEnqueueWriteBufferRect;
|
||||
clSetEventCallback;
|
||||
clSetMemObjectDestructorCallback;
|
||||
clSetUserEventStatus;
|
||||
} OPENCL_1.0;
|
||||
|
||||
OPENCL_1.2 {
|
||||
global:
|
||||
clCompileProgram;
|
||||
clCreateFromGLTexture;
|
||||
clCreateImage;
|
||||
clCreateProgramWithBuiltInKernels;
|
||||
clCreateSubDevices;
|
||||
clEnqueueBarrierWithWaitList;
|
||||
clEnqueueFillBuffer;
|
||||
clEnqueueFillImage;
|
||||
clEnqueueMarkerWithWaitList;
|
||||
clEnqueueMigrateMemObjects;
|
||||
clGetExtensionFunctionAddressForPlatform;
|
||||
clGetKernelArgInfo;
|
||||
clLinkProgram;
|
||||
clReleaseDevice;
|
||||
clRetainDevice;
|
||||
clUnloadPlatformCompiler;
|
||||
} OPENCL_1.1;
|
||||
|
||||
OPENCL_2.0 {
|
||||
global:
|
||||
clCreateCommandQueueWithProperties;
|
||||
clCreatePipe;
|
||||
clGetPipeInfo;
|
||||
clSVMAlloc;
|
||||
clSVMFree;
|
||||
clEnqueueSVMFree;
|
||||
clEnqueueSVMMemcpy;
|
||||
clEnqueueSVMMemFill;
|
||||
clEnqueueSVMMap;
|
||||
clEnqueueSVMUnmap;
|
||||
clCreateSamplerWithProperties;
|
||||
clSetKernelArgSVMPointer;
|
||||
clSetKernelExecInfo;
|
||||
} OPENCL_1.2;
|
||||
|
||||
OPENCL_2.1 {
|
||||
global:
|
||||
clCloneKernel;
|
||||
clCreateProgramWithIL;
|
||||
clEnqueueSVMMigrateMem;
|
||||
clGetDeviceAndHostTimer;
|
||||
clGetHostTimer;
|
||||
clGetKernelSubGroupInfo;
|
||||
clSetDefaultDeviceCommandQueue;
|
||||
} OPENCL_2.0;
|
||||
|
||||
OPENCL_2.2 {
|
||||
global:
|
||||
clSetProgramReleaseCallback;
|
||||
clSetProgramSpecializationConstant;
|
||||
} OPENCL_2.1;
|
||||
@@ -0,0 +1,175 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2019 The Khronos Group Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
#include "icd.h"
|
||||
#include "icd_envvars.h"
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <dirent.h>
|
||||
#include <pthread.h>
|
||||
|
||||
static pthread_once_t initialized = PTHREAD_ONCE_INIT;
|
||||
|
||||
/*
|
||||
*
|
||||
* Vendor enumeration functions
|
||||
*
|
||||
*/
|
||||
|
||||
// go through the list of vendors in the two configuration files
|
||||
void khrIcdOsVendorsEnumerate(void)
|
||||
{
|
||||
DIR *dir = NULL;
|
||||
struct dirent *dirEntry = NULL;
|
||||
char* vendorPath = ICD_VENDOR_PATH;
|
||||
char* envPath = NULL;
|
||||
|
||||
khrIcdVendorsEnumerateEnv();
|
||||
|
||||
envPath = khrIcd_secure_getenv("OCL_ICD_VENDORS");
|
||||
if (NULL != envPath)
|
||||
{
|
||||
vendorPath = envPath;
|
||||
}
|
||||
|
||||
dir = opendir(vendorPath);
|
||||
if (NULL == dir)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed to open path %s, continuing\n", vendorPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
// attempt to load all files in the directory
|
||||
for (dirEntry = readdir(dir); dirEntry; dirEntry = readdir(dir) )
|
||||
{
|
||||
switch(dirEntry->d_type)
|
||||
{
|
||||
case DT_UNKNOWN:
|
||||
case DT_REG:
|
||||
case DT_LNK:
|
||||
{
|
||||
const char* extension = ".icd";
|
||||
FILE *fin = NULL;
|
||||
char* fileName = NULL;
|
||||
char* buffer = NULL;
|
||||
long bufferSize = 0;
|
||||
|
||||
// make sure the file name ends in .icd
|
||||
if (strlen(extension) > strlen(dirEntry->d_name) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
if (strcmp(dirEntry->d_name + strlen(dirEntry->d_name) - strlen(extension), extension) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// allocate space for the full path of the vendor library name
|
||||
fileName = malloc(strlen(dirEntry->d_name) + strlen(vendorPath) + 1);
|
||||
if (!fileName)
|
||||
{
|
||||
KHR_ICD_TRACE("Failed allocate space for ICD file path\n");
|
||||
break;
|
||||
}
|
||||
sprintf(fileName, "%s%s", vendorPath, dirEntry->d_name);
|
||||
|
||||
// open the file and read its contents
|
||||
fin = fopen(fileName, "r");
|
||||
if (!fin)
|
||||
{
|
||||
free(fileName);
|
||||
break;
|
||||
}
|
||||
fseek(fin, 0, SEEK_END);
|
||||
bufferSize = ftell(fin);
|
||||
|
||||
buffer = malloc(bufferSize+1);
|
||||
if (!buffer)
|
||||
{
|
||||
free(fileName);
|
||||
fclose(fin);
|
||||
break;
|
||||
}
|
||||
memset(buffer, 0, bufferSize+1);
|
||||
fseek(fin, 0, SEEK_SET);
|
||||
if (bufferSize != (long)fread(buffer, 1, bufferSize, fin) )
|
||||
{
|
||||
free(fileName);
|
||||
free(buffer);
|
||||
fclose(fin);
|
||||
break;
|
||||
}
|
||||
// ignore a newline at the end of the file
|
||||
if (buffer[bufferSize-1] == '\n') buffer[bufferSize-1] = '\0';
|
||||
|
||||
// load the string read from the file
|
||||
khrIcdVendorAdd(buffer);
|
||||
|
||||
free(fileName);
|
||||
free(buffer);
|
||||
fclose(fin);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dir);
|
||||
}
|
||||
|
||||
if (NULL != envPath)
|
||||
{
|
||||
khrIcd_free_getenv(envPath);
|
||||
}
|
||||
}
|
||||
|
||||
// go through the list of vendors only once
|
||||
void khrIcdOsVendorsEnumerateOnce(void)
|
||||
{
|
||||
pthread_once(&initialized, khrIcdOsVendorsEnumerate);
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
* Dynamic library loading functions
|
||||
*
|
||||
*/
|
||||
|
||||
// dynamically load a library. returns NULL on failure
|
||||
void *khrIcdOsLibraryLoad(const char *libraryName)
|
||||
{
|
||||
return dlopen (libraryName, RTLD_NOW);
|
||||
}
|
||||
|
||||
// get a function pointer from a loaded library. returns NULL on failure.
|
||||
void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
|
||||
{
|
||||
return dlsym(library, functionName);
|
||||
}
|
||||
|
||||
// unload a library
|
||||
void khrIcdOsLibraryUnload(void *library)
|
||||
{
|
||||
dlclose(library);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright (c) 2016-2019 The Khronos Group Inc.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||||
*/
|
||||
|
||||
// for secure_getenv():
|
||||
#ifndef _GNU_SOURCE
|
||||
#define _GNU_SOURCE
|
||||
#endif
|
||||
|
||||
#include "icd_cmake_config.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
char *khrIcd_getenv(const char *name) {
|
||||
// No allocation of memory necessary for Linux.
|
||||
return getenv(name);
|
||||
}
|
||||
|
||||
char *khrIcd_secure_getenv(const char *name) {
|
||||
#if defined(__APPLE__)
|
||||
// Apple does not appear to have a secure getenv implementation.
|
||||
// The main difference between secure getenv and getenv is that secure getenv
|
||||
// returns NULL if the process is being run with elevated privileges by a normal user.
|
||||
// The idea is to prevent the reading of malicious environment variables by a process
|
||||
// that can do damage.
|
||||
// This algorithm is derived from glibc code that sets an internal
|
||||
// variable (__libc_enable_secure) if the process is running under setuid or setgid.
|
||||
return geteuid() != getuid() || getegid() != getgid() ? NULL : khrIcd_getenv(name);
|
||||
#else
|
||||
// Linux
|
||||
#ifdef HAVE_SECURE_GETENV
|
||||
return secure_getenv(name);
|
||||
#elif defined(HAVE___SECURE_GETENV)
|
||||
return __secure_getenv(name);
|
||||
#else
|
||||
#pragma message( \
|
||||
"Warning: Falling back to non-secure getenv for environmental lookups! Consider" \
|
||||
" updating to a different libc.")
|
||||
return khrIcd_getenv(name);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void khrIcd_free_getenv(char *val) {
|
||||
// No freeing of memory necessary for Linux, but we should at least touch
|
||||
// val to get rid of compiler warnings.
|
||||
(void)val;
|
||||
}
|
||||
Reference in New Issue
Block a user