Avoid updating glPathStencilFunc unless it changes
authorkkinnunen <kkinnunen@nvidia.com>
Mon, 25 Jan 2016 14:07:26 +0000 (06:07 -0800)
committerCommit bot <commit-bot@chromium.org>
Mon, 25 Jan 2016 14:07:26 +0000 (06:07 -0800)
Avoid updating glPathStencilFunc unless it changes.
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1619623005

Review URL: https://codereview.chromium.org/1619623005

src/gpu/GrStencil.h
src/gpu/gl/GrGLPathRendering.cpp

index d94a45f..28042b0 100644 (file)
@@ -277,10 +277,14 @@ public:
 
     void invalidate()  {
         // write an illegal value to the first member
-        fPassOps[0] = (GrStencilOp)(uint8_t)-1;
+        fPassOps[0] = kStencilOpCount;
         fFlags = 0;
     }
 
+    bool isValid() const {
+        return fPassOps[0] < kStencilOpCount;
+    }
+
     bool operator == (const GrStencilSettings& s) const {
         static const size_t gCompareSize = sizeof(GrStencilSettings) -
                                            sizeof(fFlags);
index 3cfec74..7fb8535 100644 (file)
@@ -291,13 +291,20 @@ void GrGLPathRendering::deletePaths(GrGLuint path, GrGLsizei range) {
 
 void GrGLPathRendering::flushPathStencilSettings(const GrStencilSettings& stencilSettings) {
     if (fHWPathStencilSettings != stencilSettings) {
+        SkASSERT(stencilSettings.isValid());
         // Just the func, ref, and mask is set here. The op and write mask are params to the call
         // that draws the path to the SB (glStencilFillPath)
-        GrGLenum func =
-            GrToGLStencilFunc(stencilSettings.func(GrStencilSettings::kFront_Face));
-        GL_CALL(PathStencilFunc(func, stencilSettings.funcRef(GrStencilSettings::kFront_Face),
-                                stencilSettings.funcMask(GrStencilSettings::kFront_Face)));
-
+        const GrStencilSettings::Face kFront_Face = GrStencilSettings::kFront_Face;
+        GrStencilFunc func = stencilSettings.func(kFront_Face);
+        uint16_t funcRef = stencilSettings.funcRef(kFront_Face);
+        uint16_t funcMask = stencilSettings.funcMask(kFront_Face);
+
+        if (!fHWPathStencilSettings.isValid() ||
+            func != fHWPathStencilSettings.func(kFront_Face) ||
+            funcRef != fHWPathStencilSettings.funcRef(kFront_Face) ||
+            funcMask != fHWPathStencilSettings.funcMask(kFront_Face)) {
+            GL_CALL(PathStencilFunc(GrToGLStencilFunc(func), funcRef, funcMask));
+        }
         fHWPathStencilSettings = stencilSettings;
     }
 }