Renderer11 now generates swizzles and invalidates the cached swizzles.

Change-Id: If5c998a91195942297beeb26a0ec635ff6a466ea
Reviewed-on: https://chromium-review.googlesource.com/177035
Reviewed-by: Shannon Woods <shannonwoods@chromium.org>
Commit-Queue: Shannon Woods <shannonwoods@chromium.org>
Tested-by: Shannon Woods <shannonwoods@chromium.org>
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;