diff --git a/src/gpu/GrProgramDesc.cpp b/src/gpu/GrProgramDesc.cpp
index f39b666..26b06f9 100644
--- a/src/gpu/GrProgramDesc.cpp
+++ b/src/gpu/GrProgramDesc.cpp
@@ -180,12 +180,10 @@
                                                                       fp.numCoordTransforms()), b);
 }
 
-bool GrProgramDesc::Build(GrProgramDesc* desc,
-                          GrPixelConfig config,
-                          const GrPrimitiveProcessor& primProc,
-                          bool hasPointSize,
-                          const GrPipeline& pipeline,
-                          GrGpu* gpu) {
+bool GrProgramDesc::Build(
+        GrProgramDesc* desc, const GrRenderTarget* renderTarget,
+        const GrPrimitiveProcessor& primProc, bool hasPointSize, const GrPipeline& pipeline,
+        GrGpu* gpu) {
     // The descriptor is used as a cache key. Thus when a field of the
     // descriptor will not affect program generation (because of the attribute
     // bindings in use or other descriptor field settings) it should be set
@@ -206,6 +204,7 @@
         desc->key().reset();
         return false;
     }
+    GrProcessor::CustomFeatures processorFeatures = primProc.requestedFeatures();
 
     for (int i = 0; i < pipeline.numFragmentProcessors(); ++i) {
         const GrFragmentProcessor& fp = pipeline.getFragmentProcessor(i);
@@ -213,6 +212,7 @@
             desc->key().reset();
             return false;
         }
+        processorFeatures |= fp.requestedFeatures();
     }
 
     const GrXferProcessor& xp = pipeline.getXferProcessor();
@@ -227,6 +227,12 @@
         desc->key().reset();
         return false;
     }
+    processorFeatures |= xp.requestedFeatures();
+
+    if (processorFeatures & GrProcessor::CustomFeatures::kSampleLocations) {
+        SkASSERT(pipeline.isHWAntialiasState());
+        b.add32(renderTarget->renderTargetPriv().getSamplePatternKey(pipeline));
+    }
 
     // --------DO NOT MOVE HEADER ABOVE THIS LINE--------------------------------------------------
     // Because header is a pointer into the dynamic array, we can't push any new data into the key
@@ -235,8 +241,7 @@
 
     // make sure any padding in the header is zeroed.
     memset(header, 0, kHeaderSize);
-    header->fOutputSwizzle = shaderCaps.configOutputSwizzle(config).asKey();
-    header->fSnapVerticesToPixelCenters = pipeline.snapVerticesToPixelCenters();
+    header->fOutputSwizzle = shaderCaps.configOutputSwizzle(renderTarget->config()).asKey();
     header->fColorFragmentProcessorCnt = pipeline.numColorFragmentProcessors();
     header->fCoverageFragmentProcessorCnt = pipeline.numCoverageFragmentProcessors();
     // Fail if the client requested more processors than the key can fit.
@@ -244,6 +249,9 @@
         header->fCoverageFragmentProcessorCnt != pipeline.numCoverageFragmentProcessors()) {
         return false;
     }
+    header->fProcessorFeatures = (uint8_t)processorFeatures;
+    SkASSERT(header->processorFeatures() == processorFeatures);  // Ensure enough bits.
+    header->fSnapVerticesToPixelCenters = pipeline.snapVerticesToPixelCenters();
     header->fHasPointSize = hasPointSize ? 1 : 0;
     return true;
 }
