Detect integrated device type on Intel iGPUs.

Fix to prevent incorrectly reporting the device type.

BUG=dawn:144

Change-Id: Ie1956d908b20649787aef785cd29f0f63f524431
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/6980
Reviewed-by: Kai Ninomiya <kainino@chromium.org>
Commit-Queue: Bryan Bernhart <bryan.bernhart@intel.com>
diff --git a/src/common/Constants.h b/src/common/Constants.h
index 7641502..7aa9039 100644
--- a/src/common/Constants.h
+++ b/src/common/Constants.h
@@ -38,4 +38,11 @@
 static constexpr float kLodMin = 0.0;
 static constexpr float kLodMax = 1000.0;
 
+static constexpr uint32_t kVendorID_AMD = 0x1002;
+static constexpr uint32_t kVendorID_ARM = 0x13B5;
+static constexpr uint32_t kVendorID_ImgTec = 0x1010;
+static constexpr uint32_t kVendorID_Intel = 0x8086;
+static constexpr uint32_t kVendorID_Nvidia = 0x10DE;
+static constexpr uint32_t kVendorID_Qualcomm = 0x5143;
+
 #endif  // COMMON_CONSTANTS_H_
diff --git a/src/dawn_native/d3d12/AdapterD3D12.cpp b/src/dawn_native/d3d12/AdapterD3D12.cpp
index a5df7e4..16fc617 100644
--- a/src/dawn_native/d3d12/AdapterD3D12.cpp
+++ b/src/dawn_native/d3d12/AdapterD3D12.cpp
@@ -14,6 +14,7 @@
 
 #include "dawn_native/d3d12/AdapterD3D12.h"
 
+#include "common/Constants.h"
 #include "dawn_native/d3d12/BackendD3D12.h"
 #include "dawn_native/d3d12/DeviceD3D12.h"
 #include "dawn_native/d3d12/PlatformFunctions.h"
@@ -46,8 +47,23 @@
         if (adapterDesc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) {
             mDeviceType = DeviceType::CPU;
         } else {
-            // TODO(cwallez@chromium.org): properly detect integrated vs. discrete.
-            mDeviceType = DeviceType::DiscreteGPU;
+            // Using DXGI_ADAPTER_DESC1 approach to determine integrated vs dedicated is
+            // vendor-specific.
+            switch (mPCIInfo.vendorId) {
+                case kVendorID_Intel: {
+                    // On Intel GPUs, dedicated video memory is always set to 128MB when the GPU is
+                    // integrated.
+                    static constexpr uint64_t kDedicatedVideoMemory = 128 * 1024 * 1024;
+                    mDeviceType = (adapterDesc.DedicatedVideoMemory == kDedicatedVideoMemory)
+                                      ? DeviceType::IntegratedGPU
+                                      : DeviceType::DiscreteGPU;
+                    break;
+                }
+                default:
+                    // TODO: Support additional GPU vendors.
+                    mDeviceType = DeviceType::Unknown;
+                    break;
+            }
         }
 
         std::wstring_convert<DeletableFacet<std::codecvt<wchar_t, char, std::mbstate_t>>> converter(
diff --git a/src/tests/DawnTest.cpp b/src/tests/DawnTest.cpp
index 1d3c8ff..b0f423b 100644
--- a/src/tests/DawnTest.cpp
+++ b/src/tests/DawnTest.cpp
@@ -78,13 +78,6 @@
         size_t slot;
     };
 
-    constexpr uint32_t kVendorID_AMD = 0x1002;
-    constexpr uint32_t kVendorID_ARM = 0x13B5;
-    constexpr uint32_t kVendorID_ImgTec = 0x1010;
-    constexpr uint32_t kVendorID_Intel = 0x8086;
-    constexpr uint32_t kVendorID_Nvidia = 0x10DE;
-    constexpr uint32_t kVendorID_Qualcomm = 0x5143;
-
     DawnTestEnvironment* gTestEnv = nullptr;
 
 }  // namespace