Add "meshCount" to GrProgramInfo

This improves the encapsulation of the GrProgramInfo class.

Bug: skia:9455
Change-Id: Ic241ba4a2c2edea3e774522065371e5ed8cc2da3
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/247438
Commit-Queue: Robert Phillips <robertphillips@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/GrProgramInfo.h b/src/gpu/GrProgramInfo.h
index 63f5e1a..671147a 100644
--- a/src/gpu/GrProgramInfo.h
+++ b/src/gpu/GrProgramInfo.h
@@ -12,29 +12,32 @@
 #include "src/gpu/GrPipeline.h"
 #include "src/gpu/GrPrimitiveProcessor.h"
 
+class GrMesh;
+
 class GrProgramInfo {
 public:
-    // TODO: it seems like this object should also get the number of copies in
-    // dynamicStateArrays. If that were true a portion of checkAllInstantiated could be moved
-    // to validate.
     GrProgramInfo(int numSamples,
                   GrSurfaceOrigin origin,
                   const GrPipeline& pipeline,
                   const GrPrimitiveProcessor& primProc,
                   const GrPipeline::FixedDynamicState* fixedDynamicState,
-                  const GrPipeline::DynamicStateArrays* dynamicStateArrays)
+                  const GrPipeline::DynamicStateArrays* dynamicStateArrays,
+                  int numDynamicStateArrays)
             : fNumSamples(numSamples)
             , fOrigin(origin)
             , fPipeline(pipeline)
             , fPrimProc(primProc)
             , fFixedDynamicState(fixedDynamicState)
-            , fDynamicStateArrays(dynamicStateArrays) {
+            , fDynamicStateArrays(dynamicStateArrays)
+            , fNumDynamicStateArrays(numDynamicStateArrays) {
         fRequestedFeatures = fPrimProc.requestedFeatures();
         for (int i = 0; i < fPipeline.numFragmentProcessors(); ++i) {
             fRequestedFeatures |= fPipeline.getFragmentProcessor(i).requestedFeatures();
         }
         fRequestedFeatures |= fPipeline.getXferProcessor().requestedFeatures();
+
         SkDEBUGCODE(this->validate();)
+        (void) fNumDynamicStateArrays;  // touch this to quiet unused member warnings
     }
 
     GrProcessor::CustomFeatures requestedFeatures() const { return fRequestedFeatures; }
@@ -44,7 +47,6 @@
     const GrPipeline& pipeline() const { return fPipeline; }
     const GrPrimitiveProcessor& primProc() const { return fPrimProc; }
     const GrPipeline::FixedDynamicState* fixedDynamicState() const { return fFixedDynamicState; }
-    const GrPipeline::DynamicStateArrays* dynamicStateArrays() const { return fDynamicStateArrays; }
 
     // TODO: can this be removed?
     const GrTextureProxy* const* primProcProxies() const {
@@ -84,6 +86,7 @@
 
     const GrTextureProxy* const* dynamicPrimProcTextures(int i) const {
         SkASSERT(this->hasDynamicPrimProcTextures());
+        SkASSERT(i < fNumDynamicStateArrays);
 
         return fDynamicStateArrays->fPrimitiveProcessorTextures +
                                                                 i * fPrimProc.numTextureSamplers();
@@ -101,8 +104,9 @@
 
 #ifdef SK_DEBUG
     void validate() const;
-    void checkAllInstantiated(int meshCount) const;
-    void checkMSAAAndMIPSAreResolved(int meshCount) const;
+    void checkAllInstantiated() const;
+    void checkMSAAAndMIPSAreResolved() const;
+    void compatibleWithMeshes(const GrMesh meshes[], int meshCount) const;
 
     bool isNVPR() const {
         return fPrimProc.isPathRendering() && !fPrimProc.willUseGeoShader() &&
@@ -117,6 +121,7 @@
     const GrPrimitiveProcessor&           fPrimProc;
     const GrPipeline::FixedDynamicState*  fFixedDynamicState;
     const GrPipeline::DynamicStateArrays* fDynamicStateArrays;
+    const int                             fNumDynamicStateArrays;
     GrProcessor::CustomFeatures           fRequestedFeatures;
 };