1*1cddb830SAndroid Build Coastguard Worker /*
2*1cddb830SAndroid Build Coastguard Worker * Copyright (c) 2017-2022 The Khronos Group Inc.
3*1cddb830SAndroid Build Coastguard Worker *
4*1cddb830SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*1cddb830SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*1cddb830SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*1cddb830SAndroid Build Coastguard Worker *
8*1cddb830SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*1cddb830SAndroid Build Coastguard Worker *
10*1cddb830SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*1cddb830SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*1cddb830SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*1cddb830SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*1cddb830SAndroid Build Coastguard Worker * limitations under the License.
15*1cddb830SAndroid Build Coastguard Worker *
16*1cddb830SAndroid Build Coastguard Worker * OpenCL is a trademark of Apple Inc. used under license by Khronos.
17*1cddb830SAndroid Build Coastguard Worker */
18*1cddb830SAndroid Build Coastguard Worker
19*1cddb830SAndroid Build Coastguard Worker #include <icd.h>
20*1cddb830SAndroid Build Coastguard Worker #include "icd_windows_apppackage.h"
21*1cddb830SAndroid Build Coastguard Worker
22*1cddb830SAndroid Build Coastguard Worker typedef _Check_return_ LONG(WINAPI *PFN_GetPackagesByPackageFamily)(
23*1cddb830SAndroid Build Coastguard Worker _In_ PCWSTR packageFamilyName,
24*1cddb830SAndroid Build Coastguard Worker _Inout_ UINT32* count,
25*1cddb830SAndroid Build Coastguard Worker _Out_writes_opt_(*count) PWSTR* packageFullNames,
26*1cddb830SAndroid Build Coastguard Worker _Inout_ UINT32* bufferLength,
27*1cddb830SAndroid Build Coastguard Worker _Out_writes_opt_(*bufferLength) WCHAR* buffer
28*1cddb830SAndroid Build Coastguard Worker );
29*1cddb830SAndroid Build Coastguard Worker
30*1cddb830SAndroid Build Coastguard Worker typedef LONG (WINAPI *PFN_GetPackagePathByFullName)(
31*1cddb830SAndroid Build Coastguard Worker _In_ PCWSTR packageFullName,
32*1cddb830SAndroid Build Coastguard Worker _Inout_ UINT32* pathLength,
33*1cddb830SAndroid Build Coastguard Worker _Out_writes_opt_(*pathLength) PWSTR path
34*1cddb830SAndroid Build Coastguard Worker );
35*1cddb830SAndroid Build Coastguard Worker
khrIcdOsVendorsEnumerateAppPackage(void)36*1cddb830SAndroid Build Coastguard Worker bool khrIcdOsVendorsEnumerateAppPackage(void)
37*1cddb830SAndroid Build Coastguard Worker {
38*1cddb830SAndroid Build Coastguard Worker bool ret = false;
39*1cddb830SAndroid Build Coastguard Worker WCHAR *buffer = NULL;
40*1cddb830SAndroid Build Coastguard Worker PWSTR *packages = NULL;
41*1cddb830SAndroid Build Coastguard Worker
42*1cddb830SAndroid Build Coastguard Worker HMODULE h = LoadLibraryA("kernel32.dll");
43*1cddb830SAndroid Build Coastguard Worker if (h == NULL)
44*1cddb830SAndroid Build Coastguard Worker return ret;
45*1cddb830SAndroid Build Coastguard Worker
46*1cddb830SAndroid Build Coastguard Worker PFN_GetPackagesByPackageFamily pGetPackagesByPackageFamily =
47*1cddb830SAndroid Build Coastguard Worker (PFN_GetPackagesByPackageFamily)GetProcAddress(h, "GetPackagesByPackageFamily");
48*1cddb830SAndroid Build Coastguard Worker if (!pGetPackagesByPackageFamily)
49*1cddb830SAndroid Build Coastguard Worker {
50*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("GetProcAddress failed for GetPackagesByPackageFamily\n");
51*1cddb830SAndroid Build Coastguard Worker goto cleanup;
52*1cddb830SAndroid Build Coastguard Worker }
53*1cddb830SAndroid Build Coastguard Worker
54*1cddb830SAndroid Build Coastguard Worker PFN_GetPackagePathByFullName pGetPackagePathByFullName =
55*1cddb830SAndroid Build Coastguard Worker (PFN_GetPackagePathByFullName)GetProcAddress(h, "GetPackagePathByFullName");
56*1cddb830SAndroid Build Coastguard Worker if (!pGetPackagePathByFullName)
57*1cddb830SAndroid Build Coastguard Worker {
58*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("GetProcAddress failed for GetPackagePathByFullName\n");
59*1cddb830SAndroid Build Coastguard Worker goto cleanup;
60*1cddb830SAndroid Build Coastguard Worker }
61*1cddb830SAndroid Build Coastguard Worker
62*1cddb830SAndroid Build Coastguard Worker UINT32 numPackages = 0, bufferLength = 0;
63*1cddb830SAndroid Build Coastguard Worker PCWSTR familyName = L"Microsoft.D3DMappingLayers_8wekyb3d8bbwe";
64*1cddb830SAndroid Build Coastguard Worker if (ERROR_INSUFFICIENT_BUFFER != pGetPackagesByPackageFamily(familyName,
65*1cddb830SAndroid Build Coastguard Worker &numPackages, NULL,
66*1cddb830SAndroid Build Coastguard Worker &bufferLength, NULL) ||
67*1cddb830SAndroid Build Coastguard Worker numPackages == 0 || bufferLength == 0)
68*1cddb830SAndroid Build Coastguard Worker {
69*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to find mapping layers packages by family name\n");
70*1cddb830SAndroid Build Coastguard Worker goto cleanup;
71*1cddb830SAndroid Build Coastguard Worker }
72*1cddb830SAndroid Build Coastguard Worker
73*1cddb830SAndroid Build Coastguard Worker buffer = malloc(sizeof(WCHAR) * bufferLength);
74*1cddb830SAndroid Build Coastguard Worker packages = malloc(sizeof(PWSTR) * numPackages);
75*1cddb830SAndroid Build Coastguard Worker if (!buffer || !packages)
76*1cddb830SAndroid Build Coastguard Worker {
77*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to allocate memory for package names\n");
78*1cddb830SAndroid Build Coastguard Worker goto cleanup;
79*1cddb830SAndroid Build Coastguard Worker }
80*1cddb830SAndroid Build Coastguard Worker
81*1cddb830SAndroid Build Coastguard Worker if (ERROR_SUCCESS != pGetPackagesByPackageFamily(familyName,
82*1cddb830SAndroid Build Coastguard Worker &numPackages, packages,
83*1cddb830SAndroid Build Coastguard Worker &bufferLength, buffer))
84*1cddb830SAndroid Build Coastguard Worker {
85*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to get mapping layers package full names\n");
86*1cddb830SAndroid Build Coastguard Worker goto cleanup;
87*1cddb830SAndroid Build Coastguard Worker }
88*1cddb830SAndroid Build Coastguard Worker
89*1cddb830SAndroid Build Coastguard Worker UINT32 pathLength = 0;
90*1cddb830SAndroid Build Coastguard Worker WCHAR path[MAX_PATH];
91*1cddb830SAndroid Build Coastguard Worker if (ERROR_INSUFFICIENT_BUFFER != pGetPackagePathByFullName(packages[0], &pathLength, NULL) ||
92*1cddb830SAndroid Build Coastguard Worker pathLength > MAX_PATH ||
93*1cddb830SAndroid Build Coastguard Worker ERROR_SUCCESS != pGetPackagePathByFullName(packages[0], &pathLength, path))
94*1cddb830SAndroid Build Coastguard Worker {
95*1cddb830SAndroid Build Coastguard Worker KHR_ICD_TRACE("Failed to get mapping layers package path length\n");
96*1cddb830SAndroid Build Coastguard Worker goto cleanup;
97*1cddb830SAndroid Build Coastguard Worker }
98*1cddb830SAndroid Build Coastguard Worker
99*1cddb830SAndroid Build Coastguard Worker #if defined(_M_AMD64)
100*1cddb830SAndroid Build Coastguard Worker #define PLATFORM_PATH L"x64"
101*1cddb830SAndroid Build Coastguard Worker #elif defined(_M_ARM)
102*1cddb830SAndroid Build Coastguard Worker #define PLATFORM_PATH L"arm"
103*1cddb830SAndroid Build Coastguard Worker #elif defined(_M_ARM64)
104*1cddb830SAndroid Build Coastguard Worker #define PLATFORM_PATH L"arm64"
105*1cddb830SAndroid Build Coastguard Worker #elif defined(_M_IX86)
106*1cddb830SAndroid Build Coastguard Worker #define PLATFORM_PATH L"x86"
107*1cddb830SAndroid Build Coastguard Worker #endif
108*1cddb830SAndroid Build Coastguard Worker
109*1cddb830SAndroid Build Coastguard Worker wchar_t dllPath[MAX_PATH];
110*1cddb830SAndroid Build Coastguard Worker wcscpy_s(dllPath, MAX_PATH, path);
111*1cddb830SAndroid Build Coastguard Worker wcscat_s(dllPath, MAX_PATH, L"\\" PLATFORM_PATH L"\\OpenCLOn12.dll");
112*1cddb830SAndroid Build Coastguard Worker
113*1cddb830SAndroid Build Coastguard Worker char narrowDllPath[MAX_PATH];
114*1cddb830SAndroid Build Coastguard Worker WideCharToMultiByte(CP_UTF8, 0, dllPath, -1, narrowDllPath, MAX_PATH, NULL, NULL);
115*1cddb830SAndroid Build Coastguard Worker
116*1cddb830SAndroid Build Coastguard Worker ret = adapterAdd(narrowDllPath, ZeroLuid);
117*1cddb830SAndroid Build Coastguard Worker
118*1cddb830SAndroid Build Coastguard Worker cleanup:
119*1cddb830SAndroid Build Coastguard Worker FreeLibrary(h);
120*1cddb830SAndroid Build Coastguard Worker free(buffer);
121*1cddb830SAndroid Build Coastguard Worker free(packages);
122*1cddb830SAndroid Build Coastguard Worker return ret;
123*1cddb830SAndroid Build Coastguard Worker }
124