blob: eb41fdcf06022d09ffc504823e413bd6b35b2a29 [file] [log] [blame]
/*
* Copyright (c) 2021 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 "dlopen_fuchsia.h"
#include "loader_service.h"
#include <dlfcn.h>
#include <lib/syslog/global.h>
#include <pthread.h>
extern "C" {
#include "icd.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)
{
auto &loader_svc = opencl_loader::get_opencl_loader_service();
if (!loader_svc.is_valid()) {
FX_LOGF(ERROR, opencl_loader::kTag, "no connection to loader svc");
return;
}
// TODO(fxbug.dev/91413): Get the library name from the loader_service.
khrIcdVendorAdd("libopencl_fake.so");
}
// 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_fuchsia(libraryName, RTLD_NOW, true);
}
// 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);
}