Remove Renderer pointer from FBO attachments.

Removing the Renderer pointer is one step towards making FBO
attachments a minimal state object. Eventually we will be able
to store them as arrays instead of arrays of pointers.

BUG=angle:660

Change-Id: Idce34e06c339ecb18c60fef12d2ed911d0c4e0f6
Reviewed-on: https://chromium-review.googlesource.com/201835
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
diff --git a/src/libGLESv2/Context.cpp b/src/libGLESv2/Context.cpp
index 93f3ae2..342ac28 100644
--- a/src/libGLESv2/Context.cpp
+++ b/src/libGLESv2/Context.cpp
@@ -1849,10 +1849,10 @@
             {
                 switch (pname)
                 {
-                  case GL_RED_BITS:   *params = colorbuffer->getRedSize();      break;
-                  case GL_GREEN_BITS: *params = colorbuffer->getGreenSize();    break;
-                  case GL_BLUE_BITS:  *params = colorbuffer->getBlueSize();     break;
-                  case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize();    break;
+                  case GL_RED_BITS:   *params = colorbuffer->getRedSize(mClientVersion);      break;
+                  case GL_GREEN_BITS: *params = colorbuffer->getGreenSize(mClientVersion);    break;
+                  case GL_BLUE_BITS:  *params = colorbuffer->getBlueSize(mClientVersion);     break;
+                  case GL_ALPHA_BITS: *params = colorbuffer->getAlphaSize(mClientVersion);    break;
                 }
             }
             else
@@ -1868,7 +1868,7 @@
 
             if (depthbuffer)
             {
-                *params = depthbuffer->getDepthSize();
+                *params = depthbuffer->getDepthSize(mClientVersion);
             }
             else
             {
@@ -1883,7 +1883,7 @@
 
             if (stencilbuffer)
             {
-                *params = stencilbuffer->getStencilSize();
+                *params = stencilbuffer->getStencilSize(mClientVersion);
             }
             else
             {
diff --git a/src/libGLESv2/Framebuffer.cpp b/src/libGLESv2/Framebuffer.cpp
index 1fba656..806c9a0 100644
--- a/src/libGLESv2/Framebuffer.cpp
+++ b/src/libGLESv2/Framebuffer.cpp
@@ -132,7 +132,7 @@
     FramebufferAttachmentImpl *attachmentImpl = createAttachmentImpl(type, colorbuffer, level, layer);
     if (attachmentImpl)
     {
-        FramebufferAttachment *newAttachment = new FramebufferAttachment(mRenderer, colorbuffer, attachmentImpl);
+        FramebufferAttachment *newAttachment = new FramebufferAttachment(colorbuffer, attachmentImpl);
         mColorbuffers[colorAttachment].set(newAttachment, type, level, layer);
     }
     else
@@ -146,7 +146,7 @@
     FramebufferAttachmentImpl *attachmentImpl = createAttachmentImpl(type, depthbuffer, level, layer);
     if (attachmentImpl)
     {
-        FramebufferAttachment *newAttachment = new FramebufferAttachment(mRenderer, depthbuffer, attachmentImpl);
+        FramebufferAttachment *newAttachment = new FramebufferAttachment(depthbuffer, attachmentImpl);
         mDepthbuffer.set(newAttachment, type, level, layer);
     }
     else
@@ -160,7 +160,7 @@
     FramebufferAttachmentImpl *attachmentImpl = createAttachmentImpl(type, stencilbuffer, level, layer);
     if (attachmentImpl)
     {
-        FramebufferAttachment *newAttachment = new FramebufferAttachment(mRenderer, stencilbuffer, attachmentImpl);
+        FramebufferAttachment *newAttachment = new FramebufferAttachment(stencilbuffer, attachmentImpl);
         mStencilbuffer.set(newAttachment, type, level, layer);
     }
     else
@@ -177,8 +177,9 @@
     FramebufferAttachmentImpl *attachmentImpl = createAttachmentImpl(type, depthStencilBuffer, level, layer);
     if (attachmentImpl)
     {
-        FramebufferAttachment *newAttachment = new FramebufferAttachment(mRenderer, depthStencilBuffer, attachmentImpl);
-        if (newAttachment->getDepthSize() > 0 && newAttachment->getStencilSize() > 0)
+        FramebufferAttachment *newAttachment = new FramebufferAttachment(depthStencilBuffer, attachmentImpl);
+        int clientVersion = mRenderer->getCurrentClientVersion();
+        if (newAttachment->getDepthSize(clientVersion) > 0 && newAttachment->getStencilSize(clientVersion) > 0)
         {
             mDepthbuffer.set(newAttachment, type, level, layer);
             mStencilbuffer.set(newAttachment, type, level, layer);
@@ -445,7 +446,8 @@
 
         if (stencilbufferObject)
         {
-            return stencilbufferObject->getStencilSize() > 0;
+            int clientVersion = mRenderer->getCurrentClientVersion();
+            return stencilbufferObject->getStencilSize(clientVersion) > 0;
         }
     }
 
@@ -717,11 +719,11 @@
     : Framebuffer(renderer)
 {
     Renderbuffer *colorRenderbuffer = new Renderbuffer(mRenderer, 0, colorbuffer);
-    FramebufferAttachment *colorAttachment = new FramebufferAttachment(mRenderer, 0, new RenderbufferAttachment(colorRenderbuffer));
+    FramebufferAttachment *colorAttachment = new FramebufferAttachment(0, new RenderbufferAttachment(colorRenderbuffer));
     mColorbuffers[0].set(colorAttachment, GL_RENDERBUFFER, 0, 0);
 
     Renderbuffer *depthStencilRenderbuffer = new Renderbuffer(mRenderer, 0, depthStencil);
-    FramebufferAttachment *depthStencilAttachment = new FramebufferAttachment(mRenderer, 0, new RenderbufferAttachment(depthStencilRenderbuffer));
+    FramebufferAttachment *depthStencilAttachment = new FramebufferAttachment(0, new RenderbufferAttachment(depthStencilRenderbuffer));
     mDepthbuffer.set(depthStencilAttachment, (depthStencilRenderbuffer->getDepthSize() != 0) ? GL_RENDERBUFFER : GL_NONE, 0, 0);
     mStencilbuffer.set(depthStencilAttachment, (depthStencilRenderbuffer->getStencilSize() != 0) ? GL_RENDERBUFFER : GL_NONE, 0, 0);
 
diff --git a/src/libGLESv2/FramebufferAttachment.cpp b/src/libGLESv2/FramebufferAttachment.cpp
index b9e4728..bdafc2f 100644
--- a/src/libGLESv2/FramebufferAttachment.cpp
+++ b/src/libGLESv2/FramebufferAttachment.cpp
@@ -355,12 +355,10 @@
 
 ////// FramebufferAttachment Implementation //////
 
-FramebufferAttachment::FramebufferAttachment(rx::Renderer *renderer, GLuint id, FramebufferAttachmentImpl *instance)
+FramebufferAttachment::FramebufferAttachment(GLuint id, FramebufferAttachmentImpl *instance)
   : RefCountObject(id),
-    mRenderer(renderer),
     mImpl(instance)
 {
-    ASSERT(mRenderer != NULL);
     ASSERT(mImpl != NULL);
 }
 
@@ -420,11 +418,11 @@
     return mImpl->getActualFormat();
 }
 
-GLuint FramebufferAttachment::getRedSize() const
+GLuint FramebufferAttachment::getRedSize(int clientVersion) const
 {
-    if (gl::GetRedBits(getInternalFormat(), mRenderer->getCurrentClientVersion()) > 0)
+    if (gl::GetRedBits(getInternalFormat(), clientVersion) > 0)
     {
-        return gl::GetRedBits(getActualFormat(), mRenderer->getCurrentClientVersion());
+        return gl::GetRedBits(getActualFormat(), clientVersion);
     }
     else
     {
@@ -432,11 +430,11 @@
     }
 }
 
-GLuint FramebufferAttachment::getGreenSize() const
+GLuint FramebufferAttachment::getGreenSize(int clientVersion) const
 {
-    if (gl::GetGreenBits(getInternalFormat(), mRenderer->getCurrentClientVersion()) > 0)
+    if (gl::GetGreenBits(getInternalFormat(), clientVersion) > 0)
     {
-        return gl::GetGreenBits(getActualFormat(), mRenderer->getCurrentClientVersion());
+        return gl::GetGreenBits(getActualFormat(), clientVersion);
     }
     else
     {
@@ -444,11 +442,11 @@
     }
 }
 
-GLuint FramebufferAttachment::getBlueSize() const
+GLuint FramebufferAttachment::getBlueSize(int clientVersion) const
 {
-    if (gl::GetBlueBits(getInternalFormat(), mRenderer->getCurrentClientVersion()) > 0)
+    if (gl::GetBlueBits(getInternalFormat(), clientVersion) > 0)
     {
-        return gl::GetBlueBits(getActualFormat(), mRenderer->getCurrentClientVersion());
+        return gl::GetBlueBits(getActualFormat(), clientVersion);
     }
     else
     {
@@ -456,11 +454,11 @@
     }
 }
 
-GLuint FramebufferAttachment::getAlphaSize() const
+GLuint FramebufferAttachment::getAlphaSize(int clientVersion) const
 {
-    if (gl::GetAlphaBits(getInternalFormat(), mRenderer->getCurrentClientVersion()) > 0)
+    if (gl::GetAlphaBits(getInternalFormat(), clientVersion) > 0)
     {
-        return gl::GetAlphaBits(getActualFormat(), mRenderer->getCurrentClientVersion());
+        return gl::GetAlphaBits(getActualFormat(), clientVersion);
     }
     else
     {
@@ -468,11 +466,11 @@
     }
 }
 
-GLuint FramebufferAttachment::getDepthSize() const
+GLuint FramebufferAttachment::getDepthSize(int clientVersion) const
 {
-    if (gl::GetDepthBits(getInternalFormat(), mRenderer->getCurrentClientVersion()) > 0)
+    if (gl::GetDepthBits(getInternalFormat(), clientVersion) > 0)
     {
-        return gl::GetDepthBits(getActualFormat(), mRenderer->getCurrentClientVersion());
+        return gl::GetDepthBits(getActualFormat(), clientVersion);
     }
     else
     {
@@ -480,11 +478,11 @@
     }
 }
 
-GLuint FramebufferAttachment::getStencilSize() const
+GLuint FramebufferAttachment::getStencilSize(int clientVersion) const
 {
-    if (gl::GetStencilBits(getInternalFormat(), mRenderer->getCurrentClientVersion()) > 0)
+    if (gl::GetStencilBits(getInternalFormat(), clientVersion) > 0)
     {
-        return gl::GetStencilBits(getActualFormat(), mRenderer->getCurrentClientVersion());
+        return gl::GetStencilBits(getActualFormat(), clientVersion);
     }
     else
     {
@@ -492,14 +490,14 @@
     }
 }
 
-GLenum FramebufferAttachment::getComponentType() const
+GLenum FramebufferAttachment::getComponentType(int clientVersion) const
 {
-    return gl::GetComponentType(getActualFormat(), mRenderer->getCurrentClientVersion());
+    return gl::GetComponentType(getActualFormat(), clientVersion);
 }
 
-GLenum FramebufferAttachment::getColorEncoding() const
+GLenum FramebufferAttachment::getColorEncoding(int clientVersion) const
 {
-    return gl::GetColorEncoding(getActualFormat(), mRenderer->getCurrentClientVersion());
+    return gl::GetColorEncoding(getActualFormat(), clientVersion);
 }
 
 GLsizei FramebufferAttachment::getSamples() const
diff --git a/src/libGLESv2/FramebufferAttachment.h b/src/libGLESv2/FramebufferAttachment.h
index 40553db..207b2fc 100644
--- a/src/libGLESv2/FramebufferAttachment.h
+++ b/src/libGLESv2/FramebufferAttachment.h
@@ -42,7 +42,7 @@
 class FramebufferAttachment : public RefCountObject
 {
   public:
-    FramebufferAttachment(rx::Renderer *renderer, GLuint id, FramebufferAttachmentImpl *storage);
+    FramebufferAttachment(GLuint id, FramebufferAttachmentImpl *storage);
 
     virtual ~FramebufferAttachment();
 
@@ -61,14 +61,14 @@
     GLsizei getHeight() const;
     GLenum getInternalFormat() const;
     GLenum getActualFormat() const;
-    GLuint getRedSize() const;
-    GLuint getGreenSize() const;
-    GLuint getBlueSize() const;
-    GLuint getAlphaSize() const;
-    GLuint getDepthSize() const;
-    GLuint getStencilSize() const;
-    GLenum getComponentType() const;
-    GLenum getColorEncoding() const;
+    GLuint getRedSize(int clientVersion) const;
+    GLuint getGreenSize(int clientVersion) const;
+    GLuint getBlueSize(int clientVersion) const;
+    GLuint getAlphaSize(int clientVersion) const;
+    GLuint getDepthSize(int clientVersion) const;
+    GLuint getStencilSize(int clientVersion) const;
+    GLenum getComponentType(int clientVersion) const;
+    GLenum getColorEncoding(int clientVersion) const;
     GLsizei getSamples() const;
 
     unsigned int getSerial() const;
@@ -81,7 +81,6 @@
   private:
     DISALLOW_COPY_AND_ASSIGN(FramebufferAttachment);
 
-    rx::Renderer const *mRenderer;
     FramebufferAttachmentImpl *mImpl;
 };
 
diff --git a/src/libGLESv2/Texture.cpp b/src/libGLESv2/Texture.cpp
index 605823d..2a2f673 100644
--- a/src/libGLESv2/Texture.cpp
+++ b/src/libGLESv2/Texture.cpp
@@ -1032,7 +1032,7 @@
     FramebufferAttachment *attachment = mRenderbufferProxies.get(level, 0);
     if (!attachment)
     {
-        attachment = new FramebufferAttachment(mRenderer, id(), new Texture2DAttachment(this, level));
+        attachment = new FramebufferAttachment(id(), new Texture2DAttachment(this, level));
         mRenderbufferProxies.add(level, 0, attachment);
     }
 
@@ -1670,7 +1670,7 @@
     FramebufferAttachment *attachment = mRenderbufferProxies.get(level, faceIndex);
     if (!attachment)
     {
-        attachment = new FramebufferAttachment(mRenderer, id(), new TextureCubeMapAttachment(this, target, level));
+        attachment = new FramebufferAttachment(id(), new TextureCubeMapAttachment(this, target, level));
         mRenderbufferProxies.add(level, faceIndex, attachment);
     }
 
@@ -2047,7 +2047,7 @@
     FramebufferAttachment *attachment = mRenderbufferProxies.get(level, layer);
     if (!attachment)
     {
-        attachment = new FramebufferAttachment(mRenderer, id(), new Texture3DAttachment(this, level, layer));
+        attachment = new FramebufferAttachment(id(), new Texture3DAttachment(this, level, layer));
         mRenderbufferProxies.add(level, 0, attachment);
     }
 
@@ -2598,7 +2598,7 @@
     FramebufferAttachment *attachment = mRenderbufferProxies.get(level, layer);
     if (!attachment)
     {
-        attachment = new FramebufferAttachment(mRenderer, id(), new Texture2DArrayAttachment(this, level, layer));
+        attachment = new FramebufferAttachment(id(), new Texture2DArrayAttachment(this, level, layer));
         mRenderbufferProxies.add(level, 0, attachment);
     }
 
diff --git a/src/libGLESv2/libGLESv2.cpp b/src/libGLESv2/libGLESv2.cpp
index 70179cc..d2d14c1 100644
--- a/src/libGLESv2/libGLESv2.cpp
+++ b/src/libGLESv2/libGLESv2.cpp
@@ -2537,6 +2537,8 @@
                 return gl::error(GL_INVALID_ENUM);
             }
 
+            int clientVersion = context->getClientVersion();
+
             switch (pname)
             {
               case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE:
@@ -2553,7 +2555,7 @@
               case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
               case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
               case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
-                if (context->getClientVersion() >= 3)
+                if (clientVersion >= 3)
                 {
                     break;
                 }
@@ -2569,7 +2571,7 @@
               case GL_DEPTH:
               case GL_STENCIL:
               case GL_DEPTH_STENCIL_ATTACHMENT:
-                if (context->getClientVersion() < 3)
+                if (clientVersion < 3)
                 {
                     return gl::error(GL_INVALID_ENUM);
                 }
@@ -2600,7 +2602,7 @@
 
             if (framebufferHandle == 0)
             {
-                if (context->getClientVersion() < 3)
+                if (clientVersion < 3)
                 {
                     return gl::error(GL_INVALID_OPERATION);
                 }
@@ -2713,7 +2715,7 @@
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME:
-                    if (context->getClientVersion() < 3)
+                    if (clientVersion < 3)
                     {
                         return gl::error(GL_INVALID_ENUM);
                     }
@@ -2721,7 +2723,7 @@
                     break;
 
                   default:
-                    if (context->getClientVersion() < 3)
+                    if (clientVersion < 3)
                     {
                         return gl::error(GL_INVALID_ENUM);
                     }
@@ -2768,27 +2770,27 @@
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
-                    *params = attachmentObject->getRedSize();
+                    *params = attachmentObject->getRedSize(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
-                    *params = attachmentObject->getGreenSize();
+                    *params = attachmentObject->getGreenSize(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
-                    *params = attachmentObject->getBlueSize();
+                    *params = attachmentObject->getBlueSize(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
-                    *params = attachmentObject->getAlphaSize();
+                    *params = attachmentObject->getAlphaSize(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
-                    *params = attachmentObject->getDepthSize();
+                    *params = attachmentObject->getDepthSize(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
-                    *params = attachmentObject->getStencilSize();
+                    *params = attachmentObject->getStencilSize(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE:
@@ -2796,11 +2798,11 @@
                     {
                         gl::error(GL_INVALID_OPERATION);
                     }
-                    *params = attachmentObject->getComponentType();
+                    *params = attachmentObject->getComponentType(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING:
-                    *params = attachmentObject->getColorEncoding();
+                    *params = attachmentObject->getColorEncoding(clientVersion);
                     break;
 
                   case GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER:
diff --git a/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp b/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp
index b58569a..02fd962 100644
--- a/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp
+++ b/src/libGLESv2/renderer/d3d11/RenderStateCache.cpp
@@ -10,7 +10,7 @@
 
 #include "libGLESv2/renderer/d3d11/RenderStateCache.h"
 #include "libGLESv2/renderer/d3d11/renderer11_utils.h"
-#include "libGLESv2/renderer/Renderer.h"
+#include "libGLESv2/renderer/d3d11/Renderer11.h"
 #include "libGLESv2/Framebuffer.h"
 #include "libGLESv2/Renderbuffer.h"
 
@@ -38,7 +38,7 @@
 const unsigned int RenderStateCache::kMaxDepthStencilStates = 4096;
 const unsigned int RenderStateCache::kMaxSamplerStates = 4096;
 
-RenderStateCache::RenderStateCache() : mDevice(NULL), mCounter(0),
+RenderStateCache::RenderStateCache() : mRenderer(NULL), mCounter(0),
                                        mBlendStateCache(kMaxBlendStates, hashBlendState, compareBlendStates),
                                        mRasterizerStateCache(kMaxRasterizerStates, hashRasterizerState, compareRasterizerStates),
                                        mDepthStencilStateCache(kMaxDepthStencilStates, hashDepthStencilState, compareDepthStencilStates),
@@ -51,10 +51,10 @@
     clear();
 }
 
-void RenderStateCache::initialize(ID3D11Device *device)
+void RenderStateCache::initialize(Renderer11 *renderer)
 {
     clear();
-    mDevice = device;
+    mRenderer = renderer;
 }
 
 void RenderStateCache::clear()
@@ -81,7 +81,7 @@
 
 ID3D11BlendState *RenderStateCache::getBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState)
 {
-    if (!mDevice)
+    if (!mRenderer)
     {
         ERR("RenderStateCache is not initialized.");
         return NULL;
@@ -89,6 +89,8 @@
 
     bool mrt = false;
 
+    int clientVersion = mRenderer->getCurrentClientVersion();
+
     BlendStateKey key = { 0 };
     key.blendState = blendState;
     for (unsigned int i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; i++)
@@ -101,10 +103,10 @@
                 mrt = true;
             }
 
-            key.rtChannels[i][0] = attachment->getRedSize()   > 0;
-            key.rtChannels[i][1] = attachment->getGreenSize() > 0;
-            key.rtChannels[i][2] = attachment->getBlueSize()  > 0;
-            key.rtChannels[i][3] = attachment->getAlphaSize() > 0;
+            key.rtChannels[i][0] = attachment->getRedSize(clientVersion)   > 0;
+            key.rtChannels[i][1] = attachment->getGreenSize(clientVersion) > 0;
+            key.rtChannels[i][2] = attachment->getBlueSize(clientVersion)  > 0;
+            key.rtChannels[i][3] = attachment->getAlphaSize(clientVersion) > 0;
         }
         else
         {
@@ -169,7 +171,8 @@
         }
 
         ID3D11BlendState *dx11BlendState = NULL;
-        HRESULT result = mDevice->CreateBlendState(&blendDesc, &dx11BlendState);
+        ID3D11Device *device = mRenderer->getDevice();
+        HRESULT result = device->CreateBlendState(&blendDesc, &dx11BlendState);
         if (FAILED(result) || !dx11BlendState)
         {
             ERR("Unable to create a ID3D11BlendState, HRESULT: 0x%X.", result);
@@ -198,7 +201,7 @@
 
 ID3D11RasterizerState *RenderStateCache::getRasterizerState(const gl::RasterizerState &rasterState, bool scissorEnabled)
 {
-    if (!mDevice)
+    if (!mRenderer)
     {
         ERR("RenderStateCache is not initialized.");
         return NULL;
@@ -264,7 +267,8 @@
         }
 
         ID3D11RasterizerState *dx11RasterizerState = NULL;
-        HRESULT result = mDevice->CreateRasterizerState(&rasterDesc, &dx11RasterizerState);
+        ID3D11Device *device = mRenderer->getDevice();
+        HRESULT result = device->CreateRasterizerState(&rasterDesc, &dx11RasterizerState);
         if (FAILED(result) || !dx11RasterizerState)
         {
             ERR("Unable to create a ID3D11RasterizerState, HRESULT: 0x%X.", result);
@@ -293,7 +297,7 @@
 
 ID3D11DepthStencilState *RenderStateCache::getDepthStencilState(const gl::DepthStencilState &dsState)
 {
-    if (!mDevice)
+    if (!mRenderer)
     {
         ERR("RenderStateCache is not initialized.");
         return NULL;
@@ -342,7 +346,8 @@
         dsDesc.BackFace.StencilFunc = gl_d3d11::ConvertComparison(dsState.stencilBackFunc);
 
         ID3D11DepthStencilState *dx11DepthStencilState = NULL;
-        HRESULT result = mDevice->CreateDepthStencilState(&dsDesc, &dx11DepthStencilState);
+        ID3D11Device *device = mRenderer->getDevice();
+        HRESULT result = device->CreateDepthStencilState(&dsDesc, &dx11DepthStencilState);
         if (FAILED(result) || !dx11DepthStencilState)
         {
             ERR("Unable to create a ID3D11DepthStencilState, HRESULT: 0x%X.", result);
@@ -371,7 +376,7 @@
 
 ID3D11SamplerState *RenderStateCache::getSamplerState(const gl::SamplerState &samplerState)
 {
-    if (!mDevice)
+    if (!mRenderer)
     {
         ERR("RenderStateCache is not initialized.");
         return NULL;
@@ -420,7 +425,8 @@
         samplerDesc.MaxLOD = samplerState.maxLod;
 
         ID3D11SamplerState *dx11SamplerState = NULL;
-        HRESULT result = mDevice->CreateSamplerState(&samplerDesc, &dx11SamplerState);
+        ID3D11Device *device = mRenderer->getDevice();
+        HRESULT result = device->CreateSamplerState(&samplerDesc, &dx11SamplerState);
         if (FAILED(result) || !dx11SamplerState)
         {
             ERR("Unable to create a ID3D11DepthStencilState, HRESULT: 0x%X.", result);
diff --git a/src/libGLESv2/renderer/d3d11/RenderStateCache.h b/src/libGLESv2/renderer/d3d11/RenderStateCache.h
index 7f33496..b96be8e 100644
--- a/src/libGLESv2/renderer/d3d11/RenderStateCache.h
+++ b/src/libGLESv2/renderer/d3d11/RenderStateCache.h
@@ -20,6 +20,7 @@
 
 namespace rx
 {
+class Renderer11;
 
 class RenderStateCache
 {
@@ -27,7 +28,7 @@
     RenderStateCache();
     virtual ~RenderStateCache();
 
-    void initialize(ID3D11Device *device);
+    void initialize(Renderer11 *renderer);
     void clear();
 
     ID3D11BlendState *getBlendState(const gl::Framebuffer *framebuffer, const gl::BlendState &blendState);
@@ -100,7 +101,7 @@
                                SamplerStateEqualityFunction> SamplerStateMap;
     SamplerStateMap mSamplerStateCache;
 
-    ID3D11Device *mDevice;
+    Renderer11 *mRenderer;
 };
 
 }
diff --git a/src/libGLESv2/renderer/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
index 8b57277..5ff4c59 100644
--- a/src/libGLESv2/renderer/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
@@ -291,7 +291,7 @@
 // to reset the scene status and ensure the default states are reset.
 void Renderer11::initializeDevice()
 {
-    mStateCache.initialize(mDevice);
+    mStateCache.initialize(this);
     mInputLayoutCache.initialize(mDevice, mDeviceContext);
 
     ASSERT(!mVertexDataManager && !mIndexDataManager);
diff --git a/src/libGLESv2/renderer/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d9/Renderer9.cpp
index b6889f9..23eb2be 100644
--- a/src/libGLESv2/renderer/d3d9/Renderer9.cpp
+++ b/src/libGLESv2/renderer/d3d9/Renderer9.cpp
@@ -1122,7 +1122,7 @@
     }
 
     gl::Renderbuffer *nullRenderbuffer = new gl::Renderbuffer(this, 0, new gl::Colorbuffer(this, width, height, GL_NONE, 0));
-    gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment(this, 0, new gl::RenderbufferAttachment(nullRenderbuffer));
+    gl::FramebufferAttachment *nullbuffer = new gl::FramebufferAttachment(0, new gl::RenderbufferAttachment(nullRenderbuffer));
 
     // add nullbuffer to the cache
     NullColorbufferCacheEntry *oldest = &mNullColorbufferCache[0];
@@ -1241,8 +1241,8 @@
             mDevice->SetDepthStencilSurface(depthStencilSurface);
             SafeRelease(depthStencilSurface);
 
-            depthSize = depthStencil->getDepthSize();
-            stencilSize = depthStencil->getStencilSize();
+            depthSize = depthStencil->getDepthSize(getCurrentClientVersion());
+            stencilSize = depthStencil->getStencilSize(getCurrentClientVersion());
         }
         else
         {