Correct implementation of saveLayer().

Change-Id: I5375126636913e0a84f2d6bbd0ebe40d2e4f2763
diff --git a/libs/hwui/ProgramCache.h b/libs/hwui/ProgramCache.h
index 8f5304d..0a17052 100644
--- a/libs/hwui/ProgramCache.h
+++ b/libs/hwui/ProgramCache.h
@@ -35,7 +35,7 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 // Debug
-#define DEBUG_PROGRAM_CACHE 1
+#define DEBUG_PROGRAM_CACHE 0
 
 // Debug
 #if DEBUG_PROGRAM_CACHE
@@ -44,6 +44,9 @@
     #define PROGRAM_LOGD(...)
 #endif
 
+/*
+ * IMPORTANT: All 32 bits are used, switch to a long.
+ */
 #define PROGRAM_KEY_TEXTURE 0x1
 #define PROGRAM_KEY_A8_TEXTURE 0x2
 #define PROGRAM_KEY_BITMAP 0x4
@@ -53,6 +56,7 @@
 #define PROGRAM_KEY_COLOR_LIGHTING 0x40
 #define PROGRAM_KEY_COLOR_BLEND 0x80
 #define PROGRAM_KEY_BITMAP_NPOT 0x100
+#define PROGRAM_KEY_SWAP_SRC_DST 0x2000
 
 #define PROGRAM_KEY_BITMAP_WRAPS_MASK 0x600
 #define PROGRAM_KEY_BITMAP_WRAPT_MASK 0x1800
@@ -70,6 +74,9 @@
 // Types
 ///////////////////////////////////////////////////////////////////////////////
 
+/*
+ * IMPORTANT: All 32 bits are used, switch to a long.
+ */
 typedef uint32_t programid;
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -95,7 +102,7 @@
         shadersMode(SkXfermode::kClear_Mode), isBitmapFirst(false),
         bitmapWrapS(GL_CLAMP_TO_EDGE), bitmapWrapT(GL_CLAMP_TO_EDGE),
         colorOp(kColorNone), colorMode(SkXfermode::kClear_Mode),
-        framebufferMode(SkXfermode::kClear_Mode) {
+        framebufferMode(SkXfermode::kClear_Mode), swapSrcDst(false) {
     }
 
     // Texturing
@@ -118,6 +125,7 @@
     // Framebuffer blending (requires Extensions.hasFramebufferFetch())
     // Ignored for all values < SkXfermode::kPlus_Mode
     SkXfermode::Mode framebufferMode;
+    bool swapSrcDst;
 
     inline uint32_t getEnumForWrap(GLenum wrap) const {
         switch (wrap) {
@@ -163,6 +171,7 @@
                 break;
         }
         key |= (framebufferMode & PROGRAM_MAX_XFERMODE) << PROGRAM_XFERMODE_FRAMEBUFFER_SHIFT;
+        if (swapSrcDst) key |= PROGRAM_KEY_SWAP_SRC_DST;
         return key;
     }
 }; // struct ProgramDescription