You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
4.7 KiB
153 lines
4.7 KiB
10 years ago
|
/*
|
||
|
* Copyright (c) 2012 The Khronos Group Inc.
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
|
* of this software source and associated documentation files (the "Materials"),
|
||
|
* to use, copy, modify and compile the Materials to create a binary under the
|
||
|
* following terms and conditions:
|
||
|
*
|
||
|
* 1. The Materials shall NOT be distributed to any third party;
|
||
|
*
|
||
|
* 2. The binary may be distributed without restriction, including without
|
||
|
* limitation the rights to use, copy, merge, publish, distribute, sublicense,
|
||
|
* and/or sell copies, and to permit persons to whom the binary is furnished to
|
||
|
* do so;
|
||
|
*
|
||
|
* 3. All modifications to the Materials used to create a binary that is
|
||
|
* distributed to third parties shall be provided to Khronos with an
|
||
|
* unrestricted license to use for the purposes of implementing bug fixes and
|
||
|
* enhancements to the Materials;
|
||
|
*
|
||
|
* 4. If the binary is used as part of an OpenCL(TM) implementation, whether
|
||
|
* binary is distributed together with or separately to that implementation,
|
||
|
* then recipient must become an OpenCL Adopter and follow the published OpenCL
|
||
|
* conformance process for that implementation, details at:
|
||
|
* http://www.khronos.org/conformance/;
|
||
|
*
|
||
|
* 5. The above copyright notice and this permission notice shall be included in
|
||
|
* all copies or substantial portions of the Materials.
|
||
|
*
|
||
|
* THE MATERIALS ARE 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 MATERIALS OR THE USE OR OTHER DEALINGS IN
|
||
|
* THE MATERIALS.
|
||
|
*
|
||
|
* OpenCL is a trademark of Apple Inc. used under license by Khronos.
|
||
|
*/
|
||
|
|
||
|
#include "icd.h"
|
||
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <winreg.h>
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
* Vendor enumeration functions
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
// go through the list of vendors in the registry and call khrIcdVendorAdd
|
||
|
// for each vendor encountered
|
||
|
void khrIcdOsVendorsEnumerate()
|
||
|
{
|
||
|
LONG result;
|
||
|
const char* platformsName = "SOFTWARE\\Khronos\\OpenCL\\Vendors";
|
||
|
HKEY platformsKey = NULL;
|
||
|
DWORD dwIndex;
|
||
|
|
||
|
KHR_ICD_TRACE("Opening key HKLM\\%s...\n", platformsName);
|
||
|
result = RegOpenKeyExA(
|
||
|
HKEY_LOCAL_MACHINE,
|
||
|
platformsName,
|
||
|
0,
|
||
|
KEY_READ,
|
||
|
&platformsKey);
|
||
|
if (ERROR_SUCCESS != result)
|
||
|
{
|
||
|
KHR_ICD_TRACE("Failed to open platforms key %s, continuing\n", platformsName);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// for each value
|
||
|
for (dwIndex = 0;; ++dwIndex)
|
||
|
{
|
||
|
char cszLibraryName[1024] = {0};
|
||
|
DWORD dwLibraryNameSize = sizeof(cszLibraryName);
|
||
|
DWORD dwLibraryNameType = 0;
|
||
|
DWORD dwValue = 0;
|
||
|
DWORD dwValueSize = sizeof(dwValue);
|
||
|
|
||
|
// read the value name
|
||
|
KHR_ICD_TRACE("Reading value %d...\n", dwIndex);
|
||
|
result = RegEnumValueA(
|
||
|
platformsKey,
|
||
|
dwIndex,
|
||
|
cszLibraryName,
|
||
|
&dwLibraryNameSize,
|
||
|
NULL,
|
||
|
&dwLibraryNameType,
|
||
|
(LPBYTE)&dwValue,
|
||
|
&dwValueSize);
|
||
|
// if RegEnumKeyEx fails, we are done with the enumeration
|
||
|
if (ERROR_SUCCESS != result)
|
||
|
{
|
||
|
KHR_ICD_TRACE("Failed to read value %d, done reading key.\n", dwIndex);
|
||
|
break;
|
||
|
}
|
||
|
KHR_ICD_TRACE("Value %s found...\n", cszLibraryName);
|
||
|
|
||
|
// Require that the value be a DWORD and equal zero
|
||
|
if (REG_DWORD != dwLibraryNameType)
|
||
|
{
|
||
|
KHR_ICD_TRACE("Value not a DWORD, skipping\n");
|
||
|
continue;
|
||
|
}
|
||
|
if (dwValue)
|
||
|
{
|
||
|
KHR_ICD_TRACE("Value not zero, skipping\n");
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// add the library
|
||
|
khrIcdVendorAdd(cszLibraryName);
|
||
|
}
|
||
|
|
||
|
result = RegCloseKey(platformsKey);
|
||
|
if (ERROR_SUCCESS != result)
|
||
|
{
|
||
|
KHR_ICD_TRACE("Failed to close platforms key %s, ignoring\n", platformsName);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
*
|
||
|
* Dynamic library loading functions
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
// dynamically load a library. returns NULL on failure
|
||
|
void *khrIcdOsLibraryLoad(const char *libraryName)
|
||
|
{
|
||
|
return (void *)LoadLibraryA(libraryName);
|
||
|
}
|
||
|
|
||
|
// get a function pointer from a loaded library. returns NULL on failure.
|
||
|
void *khrIcdOsLibraryGetFunctionAddress(void *library, const char *functionName)
|
||
|
{
|
||
|
if (!library || !functionName)
|
||
|
{
|
||
|
return NULL;
|
||
|
}
|
||
|
return GetProcAddress( (HMODULE)library, functionName);
|
||
|
}
|
||
|
|
||
|
// unload a library.
|
||
|
void khrIcdOsLibraryUnload(void *library)
|
||
|
{
|
||
|
FreeLibrary( (HMODULE)library);
|
||
|
}
|
||
|
|