blob: a00d7b07fac146b34f4227a0482dc95df5141c0f [file] [log] [blame]
// 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 <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:
// 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<std::string> dlls;
std::string os;
};
class GpuInfoList {
public:
GpuInfoList() = default;
void addGpu();
GpuInfo& currGpu();
std::string dump() const;
void clear();
std::vector<GpuInfo> 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();