// Copyright 2020 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include "aemu/base/Compiler.h" #include #include #include #include #include #include // 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: // 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. void async_query_host_gpu_start(); bool async_query_host_gpu_blacklisted(); bool async_query_host_gpu_AngleWhitelisted(); bool async_query_host_gpu_SyncBlacklisted(); bool async_query_host_gpu_VulkanBlacklisted(); // Below is the implementation. struct GpuInfoView{ const char* make; const char* model; const char* device_id; const char* revision_id; const char* version; const char* renderer; const char* os; }; // We keep a blacklist of known crashy GPU drivers // as a static const list with items of this type: using BlacklistEntry = GpuInfoView; // We keep a whitelist to use Angle for buggy // GPU drivers using WhitelistEntry = GpuInfoView; // GpuInfo/GpuInfoList are the representation of parsed information // about the system's GPU.s class GpuInfo { public: GpuInfo() : current_gpu(false) { } GpuInfo(const std::string& _make, const std::string& _model, const std::string& _device_id, const std::string& _revision_id, const std::string& _version, const std::string& _renderer) : current_gpu(false), make(_make), model(_model), device_id(_device_id), revision_id(_revision_id), version(_version), renderer(_renderer) { } 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 dlls; std::string os; }; class GpuInfoList { public: GpuInfoList() = default; void addGpu(); GpuInfo& currGpu(); std::string dump() const; void clear(); std::vector infos; bool blacklist_status = false; bool Anglelist_status = false; bool SyncBlacklist_status = false; bool VulkanBlacklist_status = false; 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); // Platform-specific information parsing functions. void parse_gpu_info_list_linux(const std::string& contents, GpuInfoList* gpulist); void parse_gpu_info_list_windows(const std::string& contents, GpuInfoList* gpulist); // If we actually switched to software, call this. void setGpuBlacklistStatus(bool switchedToSoftware); // Return a fully loaded global GPU info list. const GpuInfoList& globalGpuInfoList();