# only required in rare cases.
if (DEFINED ENV{DXSDK_DIR} AND NOT (MINGW OR MSYS OR CYGWIN))
include_directories ($ENV{DXSDK_DIR}/Include)
+ include_directories ($ENV{WDK}/km)
endif ()
else ()
+ # By default don't include OpenCL 3.0 symbol definitions (i.e. comment them
+ # out), but include them for OpenCL 3.0 builds. Once the symbols are no
+ # longer provisional then they may be included unconditionally.
+ set(ENABLE_OPENCL30_SYMBOLS_START "/*")
+ set(ENABLE_OPENCL30_SYMBOLS_END "*/")
+ if (ENABLE_OPENCL30_PROVISIONAL)
+ set(ENABLE_OPENCL30_SYMBOLS_START "")
+ set(ENABLE_OPENCL30_SYMBOLS_END "")
+ endif ()
+ configure_file(
+ ${CMAKE_CURRENT_SOURCE_DIR}/loader/linux/icd_exports.map.in
+ ${CMAKE_CURRENT_BINARY_DIR}/loader/linux/icd_exports.map)
+
list (APPEND OPENCL_ICD_LOADER_SOURCES
loader/linux/icd_linux.c
loader/linux/icd_linux_envvars.c
add_library (OpenCL ${OPENCL_ICD_LOADER_SOURCES})
set_target_properties (OpenCL PROPERTIES VERSION "1.2" SOVERSION "1")
+target_include_directories(OpenCL SYSTEM PUBLIC ${OPENCL_ICD_LOADER_HEADERS_DIR})
if (WIN32)
- target_link_libraries (OpenCL cfgmgr32.lib)
+
- if(DEFINED ENV{WDKContentRoot})
- file(GLOB D3DKMT_HEADER "$ENV{WDKContentRoot}/Include/*/km/d3dkmthk.h")
- else()
- file(GLOB D3DKMT_HEADER "$ENV{HOMEDRIVE}/Program Files */Windows Kits/10/Include/*/km/d3dkmthk.h")
- endif()
+ target_link_libraries (OpenCL cfgmgr32.lib runtimeobject.lib)
- if(D3DKMT_HEADER)
- list(GET D3DKMT_HEADER -1 LATEST_D3DKMT_HEADER)
- get_filename_component(WDK_DIRECTORY ${LATEST_D3DKMT_HEADER} DIRECTORY)
- get_filename_component(WDK_DIRECTORY ${WDK_DIRECTORY} DIRECTORY)
- message(STATUS "Found the Windows WDK in: ${WDK_DIRECTORY}")
- target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_REQUIRE_WDK)
- target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/um)
- target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/km)
- target_include_directories(OpenCL PRIVATE ${WDK_DIRECTORY}/shared)
- else()
- message(FATAL_ERROR "The Windows WDK was not found. Consider disabling OPENCL_ICD_LOADER_REQUIRE_WDK. Aborting.")
+ option (OPENCL_ICD_LOADER_DISABLE_OPENCLON12 "Disable support for OpenCLOn12. Support for OpenCLOn12 should only be disabled when building an import lib to link with, and must be enabled when building an ICD loader for distribution!" OFF)
+ if (OPENCL_ICD_LOADER_DISABLE_OPENCLON12)
+ target_compile_definitions(OpenCL PRIVATE OPENCL_ICD_LOADER_DISABLE_OPENCLON12)
endif()
if(NOT USE_DYNAMIC_VCXX_RUNTIME)
{
bool ret = false;
int result = 0;
-
-#if defined(DXGKDDI_INTERFACE_VERSION_WDDM2_4) && (DXGKDDI_INTERFACE_VERSION >= DXGKDDI_INTERFACE_VERSION_WDDM2_4)
// Get handle to GDI Runtime
HMODULE h = LoadLibrary("gdi32.dll");
if (h == NULL)
return ret;
- if(GetProcAddress((HMODULE)h, "D3DKMTSubmitPresentBltToHwQueue")) // OS Version check
+ if(GetProcAddress(h, "D3DKMTSubmitPresentBltToHwQueue")) // OS Version check
{
- D3DKMT_ADAPTERINFO* pAdapterInfo = NULL;
- D3DKMT_ENUMADAPTERS2 EnumAdapters;
+ LoaderEnumAdapters2 EnumAdapters;
++
NTSTATUS status = STATUS_SUCCESS;
char cszLibraryName[MAX_PATH] = { 0 };
}
while (1)
{
- EnumAdapters.NumAdapters = 0;
- EnumAdapters.pAdapters = NULL;
+ EnumAdapters.adapter_count = 0;
+ EnumAdapters.adapters = NULL;
++
status = pEnumAdapters2(&EnumAdapters);
if (status == STATUS_BUFFER_TOO_SMALL)
{
}
break;
}
- pAdapterInfo = (D3DKMT_ADAPTERINFO*)malloc(sizeof(D3DKMT_ADAPTERINFO)*(EnumAdapters.NumAdapters));
- if (pAdapterInfo == NULL)
+ EnumAdapters.adapters = malloc(sizeof(*EnumAdapters.adapters)*(EnumAdapters.adapter_count));
+ if (EnumAdapters.adapters == NULL)
{
- KHR_ICD_TRACE("Allocation failure for AdapterInfo buffer\n");
+ KHR_ICD_TRACE("Allocation failure for adapters buffer\n");
goto out;
}
- EnumAdapters.pAdapters = pAdapterInfo;
++
status = pEnumAdapters2(&EnumAdapters);
if (!NT_SUCCESS(status))
{
}
const char* cszOpenCLRegKeyName = getOpenCLRegKeyName();
const int szOpenCLRegKeyName = (int)(strlen(cszOpenCLRegKeyName) + 1)*sizeof(cszOpenCLRegKeyName[0]);
- PFND3DKMT_QUERYADAPTERINFO pQueryAdapterInfo = (PFND3DKMT_QUERYADAPTERINFO)GetProcAddress((HMODULE)h, "D3DKMTQueryAdapterInfo");
- if (!pQueryAdapterInfo)
- {
- KHR_ICD_TRACE("GetProcAddress failed for D3DKMT_ENUMADAPTERS2\n");
- goto out;
- }
-
- for (UINT AdapterIndex = 0; AdapterIndex < EnumAdapters.NumAdapters; AdapterIndex++)
++
+ for (UINT AdapterIndex = 0; AdapterIndex < EnumAdapters.adapter_count; AdapterIndex++)
++
{
- D3DDDI_QUERYREGISTRY_INFO queryArgs = {0};
- D3DDDI_QUERYREGISTRY_INFO* pQueryArgs = &queryArgs;
- D3DDDI_QUERYREGISTRY_INFO* pQueryBuffer = NULL;
- queryArgs.QueryType = D3DDDI_QUERYREGISTRY_ADAPTERKEY;
- queryArgs.QueryFlags.TranslatePath = TRUE;
- queryArgs.ValueType = REG_SZ;
+ LoaderQueryRegistryInfo queryArgs = {0};
+ LoaderQueryRegistryInfo* pQueryArgs = &queryArgs;
+ LoaderQueryRegistryInfo* pQueryBuffer = NULL;
+ queryArgs.query_type = LOADER_QUERY_REGISTRY_ADAPTER_KEY;
+ queryArgs.query_flags.translate_path = TRUE;
+ queryArgs.value_type = REG_SZ;
result = MultiByteToWideChar(
CP_ACP,
0,
status = pQueryAdapterInfo(&queryAdapterInfo);
if (!NT_SUCCESS(status))
{
- // Continue trying to get as much info on each adapter as possible.
- // It's too late to return FALSE and claim WDDM2_4 enumeration is not available here.
- continue;
+ // Try a different value type. Some vendors write the key as a multi-string type.
+ queryArgs.value_type = REG_MULTI_SZ;
+ status = pQueryAdapterInfo(&queryAdapterInfo);
+ if (NT_SUCCESS(status))
+ {
+ KHR_ICD_TRACE("Accepting multi-string registry key type\n");
+ }
+ else
+ {
+ // Continue trying to get as much info on each adapter as possible.
+ // It's too late to return FALSE and claim WDDM2_4 enumeration is not available here.
+ continue;
+ }
}
- if (NT_SUCCESS(status) && pQueryArgs->Status == D3DDDI_QUERYREGISTRY_STATUS_BUFFER_OVERFLOW)
++
+ if (NT_SUCCESS(status) && pQueryArgs->status == LOADER_QUERY_REGISTRY_STATUS_BUFFER_OVERFLOW)
{
- ULONG queryBufferSize = sizeof(D3DDDI_QUERYREGISTRY_INFO) + queryArgs.OutputValueSize;
- pQueryBuffer = (D3DDDI_QUERYREGISTRY_INFO*)malloc(queryBufferSize);
+ ULONG queryBufferSize = sizeof(LoaderQueryRegistryInfo) + queryArgs.output_value_size;
+ pQueryBuffer = malloc(queryBufferSize);
if (pQueryBuffer == NULL)
continue;
- memcpy(pQueryBuffer, &queryArgs, sizeof(D3DDDI_QUERYREGISTRY_INFO));
- queryAdapterInfo.pPrivateDriverData = pQueryBuffer;
- queryAdapterInfo.PrivateDriverDataSize = queryBufferSize;
+ memcpy(pQueryBuffer, &queryArgs, sizeof(LoaderQueryRegistryInfo));
+ queryAdapterInfo.private_data = pQueryBuffer;
+ queryAdapterInfo.private_data_size = queryBufferSize;
status = pQueryAdapterInfo(&queryAdapterInfo);
pQueryArgs = pQueryBuffer;
}