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.cpp b/src/gpu/GrProgramInfo.cpp
index 0abc7c2..3391b61 100644
--- a/src/gpu/GrProgramInfo.cpp
+++ b/src/gpu/GrProgramInfo.cpp
@@ -9,6 +9,7 @@
 
 
 #ifdef SK_DEBUG
+#include "src/gpu/GrMesh.h"
 #include "src/gpu/GrTexturePriv.h"
 
 void GrProgramInfo::validate() const {
@@ -25,25 +26,8 @@
 
     SkASSERT(!fPipeline.isScissorEnabled() || this->hasFixedScissor() ||
              this->hasDynamicScissors());
-}
-
-void GrProgramInfo::checkAllInstantiated(int meshCount) const {
-    if (this->hasFixedPrimProcTextures()) {
-        auto fixedPrimProcTextures = this->fixedPrimProcTextures();
-        for (int s = 0; s < this->primProc().numTextureSamplers(); ++s) {
-            SkASSERT(fixedPrimProcTextures[s]->isInstantiated());
-        }
-    }
 
     if (this->hasDynamicPrimProcTextures()) {
-        for (int m = 0; m < meshCount; ++m) {
-            auto dynamicPrimProcTextures = this->dynamicPrimProcTextures(m);
-            for (int s = 0; s < this->primProc().numTextureSamplers(); ++s) {
-                SkASSERT(dynamicPrimProcTextures[s]->isInstantiated());
-            }
-        }
-
-        // TODO: if GrProgramInfo had the mesh count we could do this in validate!
         // Check that, for a given sampler, the properties of the dynamic textures remain
         // the same for all the meshes
         for (int s = 0; s < this->primProc().numTextureSamplers(); ++s) {
@@ -53,7 +37,7 @@
             GrTextureType type = dynamicPrimProcTextures[s]->textureType();
             GrPixelConfig config = dynamicPrimProcTextures[s]->config();
 
-            for (int m = 1; m < meshCount; ++m) {
+            for (int m = 1; m < fNumDynamicStateArrays; ++m) {
                 dynamicPrimProcTextures = this->dynamicPrimProcTextures(m);
 
                 auto testProxy = dynamicPrimProcTextures[s];
@@ -65,7 +49,25 @@
     }
 }
 
-void GrProgramInfo::checkMSAAAndMIPSAreResolved(int meshCount) const {
+void GrProgramInfo::checkAllInstantiated() const {
+    if (this->hasFixedPrimProcTextures()) {
+        auto fixedPrimProcTextures = this->fixedPrimProcTextures();
+        for (int s = 0; s < this->primProc().numTextureSamplers(); ++s) {
+            SkASSERT(fixedPrimProcTextures[s]->isInstantiated());
+        }
+    }
+
+    if (this->hasDynamicPrimProcTextures()) {
+        for (int m = 0; m < fNumDynamicStateArrays; ++m) {
+            auto dynamicPrimProcTextures = this->dynamicPrimProcTextures(m);
+            for (int s = 0; s < this->primProc().numTextureSamplers(); ++s) {
+                SkASSERT(dynamicPrimProcTextures[s]->isInstantiated());
+            }
+        }
+    }
+}
+
+void GrProgramInfo::checkMSAAAndMIPSAreResolved() const {
 
     auto assertResolved = [](GrTexture* tex, const GrSamplerState& sampler) {
         SkASSERT(tex);
@@ -81,7 +83,7 @@
     };
 
     if (this->hasDynamicPrimProcTextures()) {
-        for (int m = 0; m < meshCount; ++m) {
+        for (int m = 0; m < fNumDynamicStateArrays; ++m) {
             auto dynamicPrimProcTextures = this->dynamicPrimProcTextures(m);
 
             for (int s = 0; s < this->primProc().numTextureSamplers(); ++s) {
@@ -107,4 +109,13 @@
     }
 }
 
+void GrProgramInfo::compatibleWithMeshes(const GrMesh meshes[], int meshCount) const {
+    SkASSERT(!fNumDynamicStateArrays || meshCount == fNumDynamicStateArrays);
+
+    for (int i = 0; i < meshCount; ++i) {
+        SkASSERT(fPrimProc.hasVertexAttributes() == meshes[i].hasVertexData());
+        SkASSERT(fPrimProc.hasInstanceAttributes() == meshes[i].hasInstanceData());
+    }
+}
+
 #endif