diff --git a/src/libGLESv2/renderer/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
index 0a8849c..40b6ee7 100644
--- a/src/libGLESv2/renderer/d3d11/Renderer11.cpp
+++ b/src/libGLESv2/renderer/d3d11/Renderer11.cpp
@@ -523,7 +523,17 @@
 
 void Renderer11::generateSwizzle(gl::Texture *texture)
 {
-    UNIMPLEMENTED();
+    if (texture)
+    {
+        TextureStorageInterface *texStorage = texture->getNativeTexture();
+        if (texStorage)
+        {
+            TextureStorage11 *storage11 = TextureStorage11::makeTextureStorage11(texStorage->getStorageInstance());
+
+            storage11->generateSwizzles(texture->getSwizzleRed(), texture->getSwizzleGreen(), texture->getSwizzleBlue(),
+                                        texture->getSwizzleAlpha());
+        }
+    }
 }
 
 void Renderer11::setSamplerState(gl::SamplerType type, int index, const gl::SamplerState &samplerState)
@@ -1090,6 +1100,8 @@
         mDepthStencilInitialized = true;
     }
 
+    invalidateFramebufferSwizzles(framebuffer);
+
     return true;
 }
 
@@ -1597,6 +1609,7 @@
 void Renderer11::clear(const gl::ClearParameters &clearParams, gl::Framebuffer *frameBuffer)
 {
     mClear->clearFramebuffer(clearParams, frameBuffer);
+    invalidateFramebufferSwizzles(frameBuffer);
 }
 
 void Renderer11::markAllStateDirty()
@@ -2378,6 +2391,9 @@
         TextureStorage11_2D *dest11 = TextureStorage11_2D::makeTextureStorage11_2D(dest->getStorageInstance());
 
         mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+        dest11->invalidateSwizzleCache();
+
         return true;
     }
 
@@ -2392,6 +2408,9 @@
         TextureStorage11_Cube *dest11 = TextureStorage11_Cube::makeTextureStorage11_Cube(dest->getStorageInstance());
 
         mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+        dest11->invalidateSwizzleCache();
+
         return true;
     }
 
@@ -2406,6 +2425,9 @@
         TextureStorage11_3D *dest11 = TextureStorage11_3D::makeTextureStorage11_3D(dest->getStorageInstance());
 
         mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+        dest11->invalidateSwizzleCache();
+
         return true;
     }
 
@@ -2420,6 +2442,9 @@
         TextureStorage11_2DArray *dest11 = TextureStorage11_2DArray::makeTextureStorage11_2DArray(dest->getStorageInstance());
 
         mDeviceContext->CopyResource(dest11->getBaseTexture(), source11->getBaseTexture());
+
+        dest11->invalidateSwizzleCache();
+
         return true;
     }
 
@@ -2482,6 +2507,8 @@
     bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
                                   destFormat, GL_NEAREST);
 
+    storage11->invalidateSwizzleCacheLevel(level);
+
     return ret;
 }
 
@@ -2541,6 +2568,8 @@
     bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
                                   destFormat, GL_NEAREST);
 
+    storage11->invalidateSwizzleCacheLevel(level);
+
     return ret;
 }
 
@@ -2600,6 +2629,8 @@
     bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
                                   destFormat, GL_NEAREST);
 
+    storage11->invalidateSwizzleCacheLevel(level);
+
     return ret;
 }
 
@@ -2661,6 +2692,8 @@
     bool ret = mBlit->copyTexture(source, sourceArea, sourceSize, dest, destArea, destSize, NULL,
                                   destFormat, GL_NEAREST);
 
+    storage11->invalidateSwizzleCacheLevel(level);
+
     return ret;
 }
 
@@ -2966,6 +2999,8 @@
         }
     }
 
+    invalidateFramebufferSwizzles(drawTarget);
+
     return true;
 }
 
@@ -3403,6 +3438,46 @@
     }
 }
 
+void Renderer11::invalidateRenderbufferSwizzles(gl::Renderbuffer *renderBuffer, int mipLevel)
+{
+    TextureStorage *texStorage = renderBuffer->getTextureStorage();
+    if (texStorage)
+    {
+        TextureStorage11 *texStorage11 = TextureStorage11::makeTextureStorage11(texStorage);
+        if (!texStorage11)
+        {
+            ERR("texture storage pointer unexpectedly null.");
+            return;
+        }
+
+        texStorage11->invalidateSwizzleCacheLevel(mipLevel);
+    }
+}
+
+void Renderer11::invalidateFramebufferSwizzles(gl::Framebuffer *framebuffer)
+{
+    for (unsigned int colorAttachment = 0; colorAttachment < gl::IMPLEMENTATION_MAX_DRAW_BUFFERS; colorAttachment++)
+    {
+        gl::Renderbuffer *colorbuffer = framebuffer->getColorbuffer(colorAttachment);
+        if (colorbuffer)
+        {
+            invalidateRenderbufferSwizzles(colorbuffer, framebuffer->getColorbufferMipLevel(colorAttachment));
+        }
+    }
+
+    gl::Renderbuffer *depthBuffer = framebuffer->getDepthbuffer();
+    if (depthBuffer)
+    {
+        invalidateRenderbufferSwizzles(depthBuffer, framebuffer->getDepthbufferMipLevel());
+    }
+
+    gl::Renderbuffer *stencilBuffer = framebuffer->getStencilbuffer();
+    if (stencilBuffer)
+    {
+        invalidateRenderbufferSwizzles(stencilBuffer, framebuffer->getStencilbufferMipLevel());
+    }
+}
+
 bool Renderer11::getLUID(LUID *adapterLuid) const
 {
     adapterLuid->HighPart = 0;
