| // Copyright 2016 The Android Open Source Project |
| // |
| // This software is licensed under the terms of the GNU General Public |
| // License version 2, as published by the Free Software Foundation, and |
| // may be copied, distributed, and modified under those terms. |
| // |
| // This program is distributed in the hope that it will be useful, |
| // but WITHOUT ANY WARRANTY; without even the implied warranty of |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| // GNU General Public License for more details. |
| |
| #include "android/base/Compiler.h" |
| |
| #include <stdbool.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string> |
| #include <string.h> |
| #include <vector> |
| |
| // gpuinfo is designed to collect information about the GPUs |
| // installed on the host system for the purposes of |
| // automatically determining which renderer to select, |
| // in the cases where the GPU drivers are known to have issues |
| // running the emulator. |
| |
| // The main entry points: |
| |
| // load_gpu_info() queries the host system |
| // and returns a platform-specific string |
| // describing all GPU's on the system. |
| std::string load_gpu_info(); |
| |
| // parse_and_query_blacklist() takes the string |
| // describing GPU information, attempts to parse it, |
| // and returns true or false depending on |
| // whether the GPU information provided |
| // matches a known unreliable GPU/GPU driver. |
| bool parse_and_query_blacklist(const std::string& contents); |
| |
| // host_gpu_blacklisted_async() does the two steps above, |
| // but on a different thread, with a timeout in case |
| // the started processes hang or what not. |
| bool async_query_host_gpu_blacklisted(); |
| |
| // Below is the implementation. |
| |
| // We keep a blacklist of known crashy GPU drivers |
| // as a static const list with items of this type: |
| struct BlacklistEntry { |
| const char* make; |
| const char* model; |
| const char* device_id; |
| const char* revision_id; |
| const char* version; |
| const char* renderer; |
| }; |
| |
| // GpuInfo/GpuInfoList are the representation of parsed information |
| // about the system's GPU.s |
| class GpuInfo { |
| public: |
| GpuInfo() : current_gpu(false) { } |
| |
| bool current_gpu; |
| |
| void addDll(std::string dll_str); |
| |
| std::string make; |
| std::string model; |
| std::string device_id; |
| std::string revision_id; |
| std::string version; |
| std::string renderer; |
| |
| std::vector<std::string> dlls; |
| }; |
| |
| class GpuInfoList { |
| public: |
| GpuInfoList() : blacklist_status(false) { } |
| void addGpu(); |
| GpuInfo& currGpu(); |
| std::string dump() const; |
| void clear(); |
| |
| static GpuInfoList* get(); // For the global GpuInfoList |
| std::vector<GpuInfo> infos; |
| bool blacklist_status; |
| DISALLOW_COPY_ASSIGN_AND_MOVE(GpuInfoList); |
| }; |
| |
| // Below are helper functions that can be useful in various |
| // contexts (e.g., unit testing). |
| |
| // gpuinfo_query_blacklist(): |
| // Function to query a given blacklist of GPU's. |
| // The blacklist |list| (of length |size|) attempts |
| // to match all non-NULL entry fields exactly against |
| // info of all GPU's in |gpulist|. If there is any match, |
| // the host system is considered on the blacklist. |
| // (Null blacklist entry fields are ignored and |
| // essentially act as wildcards). |
| bool gpuinfo_query_blacklist(GpuInfoList* gpulist, |
| const BlacklistEntry* list, |
| int size); |
| |
| // Main function to parse GPU information. |
| void parse_gpu_info_list(const std::string& contents, GpuInfoList* gpulist); |
| |
| // Platform-specific information parsing functions. |
| void parse_gpu_info_list_osx(const std::string& contents, GpuInfoList* gpulist); |
| void parse_gpu_info_list_linux(const std::string& contents, GpuInfoList* gpulist); |
| void parse_gpu_info_list_windows(const std::string& contents, GpuInfoList* gpulist); |