Merge branch 'master' into master
authorNikhil Joshi <nikhilj@nvidia.com>
Mon, 28 Sep 2020 04:24:46 +0000 (09:54 +0530)
committerGitHub <noreply@github.com>
Mon, 28 Sep 2020 04:24:46 +0000 (09:54 +0530)
1  2 
CMakeLists.txt
loader/windows/OpenCL.rc
loader/windows/icd_windows.c
loader/windows/icd_windows_dxgk.c
loader/windows/icd_windows_hkr.c

diff --cc CMakeLists.txt
index a0da4d332f4e8fa1a5d0ac4c6f1c4c3a2613ed2f,66a526964960dddbabc460f50c527e9b73c724f4..1cf4013773c5f21a4e2328a879d046049618d231
@@@ -84,21 -64,9 +84,22 @@@ if (WIN32
      # 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
@@@ -109,14 -77,27 +110,15 @@@ set (OPENCL_ICD_LOADER_HEADERS_DIR ${CM
  
  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)
Simple merge
index 25f1b9b6f846a078c68954c77e602e3b84050efa,3fec0977c96b167b32906de3ba1c79a0f3e966b9..da884f6ac63a5214f7703d9c140841d7c9b5eb9b
@@@ -20,9 -20,7 +20,8 @@@
  #include "icd_windows.h"
  #include "icd_windows_hkr.h"
  #include "icd_windows_dxgk.h"
 +#include "icd_windows_apppackage.h"
  #include <stdio.h>
- #include <windows.h>
  #include <winreg.h>
  
  #include <initguid.h>
index 6f1568e41dc4b4586d32089ce116d1db2a91bfc8,660dbb6045d9af3e063b7d655bcaf1f7a84eb7b0..65e896a467dbbbe004af1b9737e441e4f7f1388f
@@@ -33,15 -36,16 +33,15 @@@ bool khrIcdOsVendorsEnumerateDXGK(void
  {
      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 };
@@@ -61,8 -59,8 +61,9 @@@
          }
          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;
              }
index 58d5c0c51860e4b67d7d6d533d6c5ed6f0076bf8,b383f2b2f6eccff1a1d73538549e65812678cd18..cc575749b06143f4d048e0dd5006c61f9023282c
@@@ -129,17 -128,10 +128,17 @@@ static bool ReadOpenCLKey(DEVINST dnDev
              goto out;
          }
  
-         if (REG_SZ != dwLibraryNameType)
+         if (REG_MULTI_SZ != dwLibraryNameType)
          {
 -            KHR_ICD_TRACE("Unexpected registry entry 0x%x! continuing\n", dwLibraryNameType);
 -            goto out;
 +            if (REG_MULTI_SZ == dwLibraryNameType)
 +            {
 +                KHR_ICD_TRACE("Accepting multi-string registry key type\n");
 +            }
 +            else
 +            {
 +                KHR_ICD_TRACE("Unexpected registry entry 0x%x! continuing\n", dwLibraryNameType);
 +                goto out;
 +            }
          }
  
          KHR_ICD_TRACE("    Path: %s\n", cszOclPath);