Add adapter LUID to EGL vendor string.

This is so Chrome can create another D3D device on the same adapter that can
share resources with ANGLE's D3D device.
Review URL: https://codereview.appspot.com/9225046
SVN URL: https://code.google.com/p/angleproject/source/detail?r=2210
TRAC #23166

Signed-off-by: Shannon Woods
Signed-off-by: Geoff Lang
Merged-by: Jamie Madill
Author: apatrick@chromium.org

git-svn-id: https://angleproject.googlecode.com/svn/branches/dx11proto@2253 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libEGL/Display.cpp b/src/libEGL/Display.cpp
index 73dc3c5..8f2af79 100644
--- a/src/libEGL/Display.cpp
+++ b/src/libEGL/Display.cpp
@@ -113,6 +113,7 @@
     }
 
     initExtensionString();
+    initVendorString();
 
     return true;
 }
@@ -513,5 +514,24 @@
     return mExtensionString.c_str();
 }
 
+void Display::initVendorString()
+{
+    mVendorString = "Google Inc.";
+
+    LUID adapterLuid = {0};
+
+    if (mRenderer && mRenderer->getLUID(&adapterLuid))
+    {
+        char adapterLuidString[64];
+        sprintf_s(adapterLuidString, sizeof(adapterLuidString), " (adapter LUID: %08x%08x)", adapterLuid.HighPart, adapterLuid.LowPart);
+
+        mVendorString += adapterLuidString;
+    }
+}
+
+const char *Display::getVendorString() const
+{
+    return mVendorString.c_str();
+}
 
 }
diff --git a/src/libEGL/Display.h b/src/libEGL/Display.h
index 8e83b1c..58c3940 100644
--- a/src/libEGL/Display.h
+++ b/src/libEGL/Display.h
@@ -60,6 +60,7 @@
     virtual void recreateSwapChains();
 
     const char *getExtensionString() const;
+    const char *getVendorString() const;
 
   private:
     DISALLOW_COPY_AND_ASSIGN(Display);
@@ -84,7 +85,9 @@
     rx::Renderer *mRenderer;
 
     void initExtensionString();
+    void initVendorString();
     std::string mExtensionString;
+    std::string mVendorString;
 };
 }
 
diff --git a/src/libEGL/libEGL.cpp b/src/libEGL/libEGL.cpp
index 7fca456..bcba43f 100644
--- a/src/libEGL/libEGL.cpp
+++ b/src/libEGL/libEGL.cpp
@@ -180,9 +180,9 @@
           case EGL_CLIENT_APIS:
             return egl::success("OpenGL_ES");
           case EGL_EXTENSIONS:
-            return display->getExtensionString();
+            return egl::success(display->getExtensionString());
           case EGL_VENDOR:
-            return egl::success("Google Inc.");
+            return egl::success(display->getVendorString());
           case EGL_VERSION:
             return egl::success("1.4 (ANGLE " VERSION_STRING ")");
         }
diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h
index 2132c71..04e877b 100644
--- a/src/libGLESv2/renderer/Renderer.h
+++ b/src/libGLESv2/renderer/Renderer.h
@@ -225,6 +225,8 @@
     virtual QueryImpl *createQuery(GLenum type) = 0;
     virtual FenceImpl *createFence() = 0;
 
+    virtual bool getLUID(LUID *adapterLuid) const = 0;
+
   protected:
     bool initializeCompiler();
     ShaderBlob *compileToBinary(gl::InfoLog &infoLog, const char *hlsl, const char *profile, UINT optimizationFlags, bool alternateFlags);
diff --git a/src/libGLESv2/renderer/Renderer11.cpp b/src/libGLESv2/renderer/Renderer11.cpp
index d54af15..e7fe03a 100644
--- a/src/libGLESv2/renderer/Renderer11.cpp
+++ b/src/libGLESv2/renderer/Renderer11.cpp
@@ -3491,4 +3491,24 @@
     }
 }
 
+bool Renderer11::getLUID(LUID *adapterLuid) const
+{
+    adapterLuid->HighPart = 0;
+    adapterLuid->LowPart = 0;
+
+    if (!mDxgiAdapter)
+    {
+        return false;
+    }
+
+    DXGI_ADAPTER_DESC adapterDesc;
+    if (FAILED(mDxgiAdapter->GetDesc(&adapterDesc)))
+    {
+        return false;
+    }
+
+    *adapterLuid = adapterDesc.AdapterLuid;
+    return true;
+}
+
 }
diff --git a/src/libGLESv2/renderer/Renderer11.h b/src/libGLESv2/renderer/Renderer11.h
index 719eb1f..b3b742c 100644
--- a/src/libGLESv2/renderer/Renderer11.h
+++ b/src/libGLESv2/renderer/Renderer11.h
@@ -182,6 +182,8 @@
     void unapplyRenderTargets();
     void setOneTimeRenderTarget(ID3D11RenderTargetView *renderTargetView);
 
+    virtual bool getLUID(LUID *adapterLuid) const;
+
   private:
     DISALLOW_COPY_AND_ASSIGN(Renderer11);
 
diff --git a/src/libGLESv2/renderer/Renderer9.cpp b/src/libGLESv2/renderer/Renderer9.cpp
index 525f68f..696bcca 100644
--- a/src/libGLESv2/renderer/Renderer9.cpp
+++ b/src/libGLESv2/renderer/Renderer9.cpp
@@ -3187,4 +3187,18 @@
     return new TextureStorage9_Cube(this, levels, internalformat, usage, forceRenderable, size);
 }
 
-}
\ No newline at end of file
+bool Renderer9::getLUID(LUID *adapterLuid) const
+{
+    adapterLuid->HighPart = 0;
+    adapterLuid->LowPart = 0;
+
+    if (mD3d9Ex)
+    {
+        mD3d9Ex->GetAdapterLUID(mAdapter, adapterLuid);
+        return true;
+    }
+
+    return false;
+}
+
+}
diff --git a/src/libGLESv2/renderer/Renderer9.h b/src/libGLESv2/renderer/Renderer9.h
index 527a501..2873e61 100644
--- a/src/libGLESv2/renderer/Renderer9.h
+++ b/src/libGLESv2/renderer/Renderer9.h
@@ -193,6 +193,8 @@
 
     D3DPOOL getTexturePool(DWORD usage) const;
 
+    virtual bool getLUID(LUID *adapterLuid) const;
+
   private:
     DISALLOW_COPY_AND_ASSIGN(Renderer9);