xref: /aosp_15_r20/external/OpenCL-ICD-Loader/loader/windows/icd_windows_apppackage.c (revision 1cddb830dba8aa7c1cc1039338e56b3b9fa24952)
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