| // |
| // Copyright 2022 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // system_info_util.h: |
| // Implementation of common test utilities for operating with SystemInfo. |
| // |
| |
| #include "system_info_util.h" |
| |
| #include "common/debug.h" |
| #include "common/string_utils.h" |
| #include "gpu_info_util/SystemInfo.h" |
| #include "util/util_gl.h" |
| |
| using namespace angle; |
| |
| namespace |
| { |
| |
| size_t findGPU(const SystemInfo &systemInfo, bool lowPower) |
| { |
| if (systemInfo.gpus.size() < 2) |
| { |
| return 0; |
| } |
| for (size_t i = 0; i < systemInfo.gpus.size(); ++i) |
| { |
| if (lowPower && IsIntel(systemInfo.gpus[i].vendorId)) |
| { |
| return i; |
| } |
| // Return the high power GPU, i.e any non-intel GPU |
| else if (!lowPower && !IsIntel(systemInfo.gpus[i].vendorId)) |
| { |
| return i; |
| } |
| } |
| // Can't find GPU |
| ASSERT(false); |
| return 0; |
| } |
| |
| } // namespace |
| |
| size_t FindLowPowerGPU(const SystemInfo &systemInfo) |
| { |
| return findGPU(systemInfo, true); |
| } |
| |
| size_t FindHighPowerGPU(const SystemInfo &systemInfo) |
| { |
| return findGPU(systemInfo, false); |
| } |
| |
| size_t FindActiveOpenGLGPU(const SystemInfo &systemInfo) |
| { |
| char *renderer = (char *)glGetString(GL_RENDERER); |
| std::string rendererString(renderer); |
| for (size_t i = 0; i < systemInfo.gpus.size(); ++i) |
| { |
| std::vector<std::string> vendorTokens; |
| angle::SplitStringAlongWhitespace(VendorName(systemInfo.gpus[i].vendorId), &vendorTokens); |
| for (std::string &token : vendorTokens) |
| { |
| if (rendererString.find(token) != std::string::npos) |
| { |
| return i; |
| } |
| } |
| } |
| // Can't find active GPU |
| ASSERT(false); |
| return 0; |
| } |