Eliminates redundant calls to GetDeviceCaps
TRAC #12283
Signed-off-by: Daniel Koch

Author:    Shannon Woods

git-svn-id: https://angleproject.googlecode.com/svn/trunk@339 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/libEGL/Display.cpp b/src/libEGL/Display.cpp
index f36eba2..287d8da 100644
--- a/src/libEGL/Display.cpp
+++ b/src/libEGL/Display.cpp
@@ -60,15 +60,14 @@
         //  UNIMPLEMENTED();   // FIXME: Determine which adapter index the device context corresponds to
         }
 
-        D3DCAPS9 caps;
-        HRESULT result = mD3d9->GetDeviceCaps(mAdapter, mDeviceType, &caps);
+        HRESULT result = mD3d9->GetDeviceCaps(mAdapter, mDeviceType, &mDeviceCaps);
 
         if (result == D3DERR_OUTOFVIDEOMEMORY || result == E_OUTOFMEMORY)
         {
             return error(EGL_BAD_ALLOC, false);
         }
 
-        if (caps.PixelShaderVersion < D3DPS_VERSION(2, 0))
+        if (mDeviceCaps.PixelShaderVersion < D3DPS_VERSION(2, 0))
         {
             mD3d9->Release();
             mD3d9 = NULL;
@@ -78,11 +77,11 @@
             mMinSwapInterval = 4;
             mMaxSwapInterval = 0;
 
-            if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) {mMinSwapInterval = std::min(mMinSwapInterval, 0); mMaxSwapInterval = std::max(mMaxSwapInterval, 0);}
-            if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE)       {mMinSwapInterval = std::min(mMinSwapInterval, 1); mMaxSwapInterval = std::max(mMaxSwapInterval, 1);}
-            if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO)       {mMinSwapInterval = std::min(mMinSwapInterval, 2); mMaxSwapInterval = std::max(mMaxSwapInterval, 2);}
-            if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_THREE)     {mMinSwapInterval = std::min(mMinSwapInterval, 3); mMaxSwapInterval = std::max(mMaxSwapInterval, 3);}
-            if (caps.PresentationIntervals & D3DPRESENT_INTERVAL_FOUR)      {mMinSwapInterval = std::min(mMinSwapInterval, 4); mMaxSwapInterval = std::max(mMaxSwapInterval, 4);}
+            if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_IMMEDIATE) {mMinSwapInterval = std::min(mMinSwapInterval, 0); mMaxSwapInterval = std::max(mMaxSwapInterval, 0);}
+            if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_ONE)       {mMinSwapInterval = std::min(mMinSwapInterval, 1); mMaxSwapInterval = std::max(mMaxSwapInterval, 1);}
+            if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_TWO)       {mMinSwapInterval = std::min(mMinSwapInterval, 2); mMaxSwapInterval = std::max(mMaxSwapInterval, 2);}
+            if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_THREE)     {mMinSwapInterval = std::min(mMinSwapInterval, 3); mMaxSwapInterval = std::max(mMaxSwapInterval, 3);}
+            if (mDeviceCaps.PresentationIntervals & D3DPRESENT_INTERVAL_FOUR)      {mMinSwapInterval = std::min(mMinSwapInterval, 4); mMaxSwapInterval = std::max(mMaxSwapInterval, 4);}
 
             const D3DFORMAT renderTargetFormats[] =
             {
@@ -464,4 +463,9 @@
 {
     return mDevice;
 }
+
+D3DCAPS9 Display::getDeviceCaps()
+{
+    return mDeviceCaps;
+}
 }
diff --git a/src/libEGL/Display.h b/src/libEGL/Display.h
index 14341d5..02c9fde 100644
--- a/src/libEGL/Display.h
+++ b/src/libEGL/Display.h
@@ -59,6 +59,7 @@
     static DWORD convertInterval(GLint interval);
 
     virtual IDirect3DDevice9 *getDevice();
+    virtual D3DCAPS9 getDeviceCaps();
 
   private:
     DISALLOW_COPY_AND_ASSIGN(Display);
@@ -68,6 +69,7 @@
     D3DDEVTYPE mDeviceType;
     IDirect3D9 *mD3d9;
     IDirect3DDevice9 *mDevice;
+    D3DCAPS9 mDeviceCaps;
 
     bool mSceneStarted;
     GLint mSwapInterval;
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index ac12d29..fb6a69e 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -222,9 +222,9 @@
 
     if (!mHasBeenCurrent)
     {
-        device->GetDeviceCaps(&mDeviceCaps);
+        mDeviceCaps = display->getDeviceCaps();
 
-        mBufferBackEnd = new Dx9BackEnd(device);
+        mBufferBackEnd = new Dx9BackEnd(this, device);
         mVertexDataManager = new VertexDataManager(this, mBufferBackEnd);
         mIndexDataManager = new IndexDataManager(this, mBufferBackEnd);
         mBlit = new Blit(this);
@@ -268,11 +268,8 @@
     {
         depthStencil->Release();
     }
-
-    D3DCAPS9 capabilities;
-    device->GetDeviceCaps(&capabilities);
     
-    if (capabilities.PixelShaderVersion == D3DPS_VERSION(3, 0))
+    if (mDeviceCaps.PixelShaderVersion == D3DPS_VERSION(3, 0))
     {
         mPsProfile = "ps_3_0";
         mVsProfile = "vs_3_0";
diff --git a/src/libGLESv2/geometry/dx9.cpp b/src/libGLESv2/geometry/dx9.cpp
index f3b48ff..e51befb 100644
--- a/src/libGLESv2/geometry/dx9.cpp
+++ b/src/libGLESv2/geometry/dx9.cpp
@@ -16,6 +16,7 @@
 #include "common/debug.h"
 
 #include "libGLESv2/Context.h"
+#include "libGLESv2/main.h"
 #include "libGLESv2/geometry/vertexconversion.h"
 #include "libGLESv2/geometry/IndexDataManager.h"
 
@@ -194,7 +195,7 @@
 
 namespace gl
 {
-Dx9BackEnd::Dx9BackEnd(IDirect3DDevice9 *d3ddevice)
+Dx9BackEnd::Dx9BackEnd(Context *context, IDirect3DDevice9 *d3ddevice)
     : mDevice(d3ddevice)
 {
     mDevice->AddRef();
@@ -207,18 +208,18 @@
 
     mStreamFrequency[MAX_VERTEX_ATTRIBS] = STREAM_FREQUENCY_UNINSTANCED;
 
-    D3DCAPS9 caps;
-    mDevice->GetDeviceCaps(&caps);
+    D3DCAPS9 caps = context->getDeviceCaps();
 
-    IDirect3D9 *mD3D;
-    mDevice->GetDirect3D(&mD3D);
+    IDirect3D9 *d3dObject;
+    mDevice->GetDirect3D(&d3dObject);
 
     D3DADAPTER_IDENTIFIER9 ident;
-    mD3D->GetAdapterIdentifier(caps.AdapterOrdinal, 0, &ident);
-    mD3D->Release();
+    d3dObject->GetAdapterIdentifier(caps.AdapterOrdinal, 0, &ident);
+    d3dObject->Release();
 
     // Instancing is mandatory for all HW with SM3 vertex shaders, but avoid hardware where it does not work.
     mUseInstancingForStrideZero = (caps.VertexShaderVersion >= D3DVS_VERSION(3, 0) && ident.VendorId != 0x8086);
+    mSupportIntIndices = (caps.MaxVertexIndex >= (1 << 16));
 
     checkVertexCaps(caps.DeclTypes);
 }
@@ -230,10 +231,7 @@
 
 bool Dx9BackEnd::supportIntIndices()
 {
-    D3DCAPS9 caps;
-    mDevice->GetDeviceCaps(&caps);
-
-    return (caps.MaxVertexIndex >= (1 << 16));
+    return mSupportIntIndices;
 }
 
 // Initialise a TranslationInfo
diff --git a/src/libGLESv2/geometry/dx9.h b/src/libGLESv2/geometry/dx9.h
index 32587c9..6068dd6 100644
--- a/src/libGLESv2/geometry/dx9.h
+++ b/src/libGLESv2/geometry/dx9.h
@@ -20,7 +20,7 @@
 class Dx9BackEnd : public BufferBackEnd
 {
   public:
-    explicit Dx9BackEnd(IDirect3DDevice9 *d3ddevice);
+    explicit Dx9BackEnd(Context *context, IDirect3DDevice9 *d3ddevice);
     ~Dx9BackEnd();
 
     virtual bool supportIntIndices();
@@ -39,6 +39,7 @@
     IDirect3DDevice9 *mDevice;
 
     bool mUseInstancingForStrideZero;
+    bool mSupportIntIndices;
 
     bool mAppliedAttribEnabled[MAX_VERTEX_ATTRIBS];