OpenGL: use vendor name to get PCI vendor id
OpenGL doesn't allow to query PCI information, but we can get vendor name through glGetString(GL_VENDOR), then match it with vendor id.
BUG=dawn:184
Change-Id: Icdcdc6bfdb5cd561b5057e8b2eab06df2dd5cea1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/8940
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Hao Li <hao.x.li@intel.com>
diff --git a/src/dawn_native/opengl/BackendGL.cpp b/src/dawn_native/opengl/BackendGL.cpp
index 1e5c671..94fc2fa 100644
--- a/src/dawn_native/opengl/BackendGL.cpp
+++ b/src/dawn_native/opengl/BackendGL.cpp
@@ -14,11 +14,41 @@
#include "dawn_native/opengl/BackendGL.h"
+#include "common/Constants.h"
#include "dawn_native/OpenGLBackend.h"
#include "dawn_native/opengl/DeviceGL.h"
+#include <cstring>
+
namespace dawn_native { namespace opengl {
+ namespace {
+
+ struct Vendor {
+ const char* vendorName;
+ uint32_t vendorId;
+ };
+
+ const Vendor kVendors[] = {{"ATI", kVendorID_AMD},
+ {"ARM", kVendorID_ARM},
+ {"Imagination", kVendorID_ImgTec},
+ {"Intel", kVendorID_Intel},
+ {"NVIDIA", kVendorID_Nvidia},
+ {"Qualcomm", kVendorID_Qualcomm}};
+
+ uint32_t GetVendorIdFromVendors(const char* vendor) {
+ uint32_t vendorId = 0;
+ for (const auto& it : kVendors) {
+ // Matching vendor name with vendor string
+ if (strstr(vendor, it.vendorName) != nullptr) {
+ vendorId = it.vendorId;
+ break;
+ }
+ }
+ return vendorId;
+ }
+ } // namespace
+
// The OpenGL backend's Adapter.
class Adapter : public AdapterBase {
@@ -38,6 +68,10 @@
mPCIInfo.name = reinterpret_cast<const char*>(mFunctions.GetString(GL_RENDERER));
+ // Workaroud to find vendor id from vendor name
+ const char* vendor = reinterpret_cast<const char*>(mFunctions.GetString(GL_VENDOR));
+ mPCIInfo.vendorId = GetVendorIdFromVendors(vendor);
+
return {};
}
diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp
index ab5d0dd..1a665ed 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -114,7 +114,7 @@
continue;
}
- if (strstr(argv[i], "--adapter-vendor-id") != 0) {
+ if (strstr(argv[i], "--adapter-vendor-id") != nullptr) {
const char* value = strchr(argv[i], '=');
if (value != nullptr) {
mVendorIdFilter = strtoul(value + 1, nullptr, 16);
@@ -343,9 +343,7 @@
for (const dawn_native::Adapter& adapter : adapters) {
if (adapter.GetBackendType() == backendType) {
- // TODO(hao.x.li@intel.com): Filter adapter for OpenGL backend once
- // https://bugs.chromium.org/p/dawn/issues/detail?id=184 is resolved.
- if (HasVendorIdFilter() && backendType != dawn_native::BackendType::OpenGL) {
+ if (HasVendorIdFilter()) {
if (adapter.GetPCIInfo().vendorId == GetVendorIdFilter()) {
backendAdapter = adapter;
break;