@@ -65,100 +65,6 @@ vector<GPUInfo> getAvailableGPUs() {
6565 return gpus;
6666}
6767
68- // Find the integrated GPU (iGPU) from available adapters
69- // Returns optional LUID if iGPU is found, nullopt otherwise
70- inline std::optional<LUID> findiGPU () {
71- auto gpus = getAvailableGPUs ();
72- if (gpus.empty ()) {
73- return std::nullopt ;
74- }
75-
76- // iGPU detection criteria:
77- // 1. Not a software adapter (has dedicated video memory > 0)
78- // 2. Low dedicated video memory (typically < 512MB for integrated)
79- // 3. Usually Intel HD/UHD graphics (Vendor ID 0x8086) or AMD APU (Vendor ID 0x1002)
80- // 4. Often the GPU with least dedicated memory (excluding software adapters)
81-
82- const UINT64 iGPUMemoryThreshold = 512ULL * 1024ULL * 1024ULL ; // 512MB threshold
83- const UINT intelVendorId = 0x8086 ; // Intel
84- const UINT amdVendorId = 0x1002 ; // AMD (for APUs)
85-
86- std::optional<LUID> iGPULuid = std::nullopt ;
87- UINT64 minDedicatedMemory = UINT64_MAX;
88- const GPUInfo* candidateGPU = nullptr ;
89-
90- // First pass: Look for Intel or AMD integrated graphics with low memory
91- for (const auto & gpu : gpus) {
92- const auto & desc = gpu.desc ;
93-
94- // Skip software adapters (zero dedicated memory)
95- if (desc.DedicatedVideoMemory == 0 ) {
96- continue ;
97- }
98-
99- // Check for integrated GPU characteristics
100- bool isLikelyiGPU = false ;
101-
102- // Check by vendor ID (Intel or AMD APU)
103- if (desc.VendorId == intelVendorId || desc.VendorId == amdVendorId) {
104- // Intel HD/UHD graphics typically have specific naming patterns
105- wstring name = desc.Description ;
106- if (name.find (L" Intel" ) != wstring::npos &&
107- (name.find (L" HD" ) != wstring::npos || name.find (L" UHD" ) != wstring::npos)) {
108- isLikelyiGPU = true ;
109- }
110- // Check if it has low dedicated memory (typical for iGPU)
111- if (desc.DedicatedVideoMemory < iGPUMemoryThreshold) {
112- isLikelyiGPU = true ;
113- }
114- }
115-
116- // Track the GPU with least dedicated memory (usually iGPU)
117- if (desc.DedicatedVideoMemory < minDedicatedMemory) {
118- minDedicatedMemory = desc.DedicatedVideoMemory ;
119- // Prioritize Intel/AMD candidates, but also consider low memory GPUs
120- if (isLikelyiGPU || desc.DedicatedVideoMemory < iGPUMemoryThreshold) {
121- candidateGPU = &gpu;
122- }
123- }
124- }
125-
126- // If we found a candidate with Intel/AMD or low memory, return it
127- if (candidateGPU != nullptr ) {
128- return candidateGPU->desc .AdapterLuid ;
129- }
130-
131- // Fallback: If no clear iGPU found by vendor, return the GPU with least memory
132- // (assuming discrete GPUs typically have more memory)
133- if (minDedicatedMemory != UINT64_MAX && minDedicatedMemory < iGPUMemoryThreshold) {
134- for (const auto & gpu : gpus) {
135- if (gpu.desc .DedicatedVideoMemory == minDedicatedMemory) {
136- return gpu.desc .AdapterLuid ;
137- }
138- }
139- }
140-
141- return std::nullopt ;
142- }
143-
144- // Get iGPU name if available
145- inline wstring getiGPUName () {
146- auto luidOpt = findiGPU ();
147- if (!luidOpt.has_value ()) {
148- return L" " ;
149- }
150-
151- auto gpus = getAvailableGPUs ();
152- for (const auto & gpu : gpus) {
153- if (gpu.desc .AdapterLuid .LowPart == luidOpt.value ().LowPart &&
154- gpu.desc .AdapterLuid .HighPart == luidOpt.value ().HighPart ) {
155- return gpu.name ;
156- }
157- }
158-
159- return L" " ;
160- }
161-
16268// Resolve an adapter LUID from a PCI bus number by enumerating display devices (SetupAPI).
16369// Returns nullopt if no match is found or if the system doesn't expose the LUID property.
16470inline std::optional<LUID> ResolveAdapterLuidFromPciBus (uint32_t targetBusIndex) {
@@ -226,12 +132,6 @@ class AdapterOption {
226132 bool hasTargetAdapter{}; // Indicates if a target adapter is selected
227133 LUID adapterLuid{}; // Adapter's unique identifier (LUID)
228134 wstring target_name{}; // Target adapter name
229-
230- // --- iGPU SUPPORT ---
231- bool hasiGPU{}; // Indicates if an iGPU was detected
232- LUID iGPULuid{}; // Integrated GPU's unique identifier (LUID)
233- wstring iGPU_name{}; // Integrated GPU name
234- // --- END iGPU SUPPORT ---
235135
236136 // Select the best GPU based on dedicated video memory
237137 wstring selectBestGPU () {
@@ -287,40 +187,6 @@ class AdapterOption {
287187 }
288188 }
289189
290- // --- iGPU DETECTION METHODS ---
291- // Detect and select the integrated GPU (iGPU)
292- // Returns true if iGPU is found and set, false otherwise
293- bool selectiGPU () {
294- auto luidOpt = findiGPU ();
295- if (luidOpt.has_value ()) {
296- iGPULuid = luidOpt.value ();
297- iGPU_name = getiGPUName ();
298- hasiGPU = true ;
299- return true ;
300- }
301- hasiGPU = false ;
302- return false ;
303- }
304-
305- // Get the iGPU LUID if available
306- std::optional<LUID> getiGPULuid () const {
307- if (hasiGPU) {
308- return iGPULuid;
309- }
310- return std::nullopt ;
311- }
312-
313- // Check if iGPU is available
314- bool hasIntegratedGPU () const {
315- return hasiGPU;
316- }
317-
318- // Get iGPU name
319- wstring getiGPUName () const {
320- return iGPU_name;
321- }
322- // --- END iGPU DETECTION METHODS ---
323-
324190private:
325191 // Find and set the adapter by name, optionally using "name,bus" where bus is the PCI bus number.
326192 bool findAndSetAdapter (const wstring& adapterSpec) {
0 commit comments