Only access the scissorState's rect when it is valid

It is odd asan/valgrind hasn't been complaining about this

Change-Id: I8e7952e6fc554450ff8c5c5940500f09be48d6b0
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/255144
Reviewed-by: Michael Ludwig <michaelludwig@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
diff --git a/src/gpu/GrScissorState.h b/src/gpu/GrScissorState.h
index 79ba47f..dac735b 100644
--- a/src/gpu/GrScissorState.h
+++ b/src/gpu/GrScissorState.h
@@ -30,7 +30,10 @@
     bool operator!=(const GrScissorState& other) const { return !(*this == other); }
 
     bool enabled() const { return fEnabled; }
-    const SkIRect& rect() const { return fRect; }
+    const SkIRect& rect() const {
+        SkASSERT(fEnabled);
+        return fRect;
+    }
 
 private:
     bool    fEnabled;
diff --git a/src/gpu/ccpr/GrCCDrawPathsOp.cpp b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
index c7f756a..0d14575 100644
--- a/src/gpu/ccpr/GrCCDrawPathsOp.cpp
+++ b/src/gpu/ccpr/GrCCDrawPathsOp.cpp
@@ -436,7 +436,10 @@
     initArgs.fDstProxyView = flushState->drawOpArgs().dstProxyView();
     initArgs.fOutputSwizzle = flushState->drawOpArgs().outputSwizzle();
     auto clip = flushState->detachAppliedClip();
-    GrPipeline::FixedDynamicState fixedDynamicState(clip.scissorState().rect());
+    GrPipeline::FixedDynamicState fixedDynamicState;
+    if (clip.scissorState().enabled()) {
+        fixedDynamicState.fScissorRect = clip.scissorState().rect();
+    }
     GrPipeline pipeline(initArgs, std::move(fProcessors), std::move(clip));
 
     int baseInstance = fBaseInstance;
diff --git a/src/gpu/ops/GrDrawPathOp.cpp b/src/gpu/ops/GrDrawPathOp.cpp
index c0cc4d4..51f5291 100644
--- a/src/gpu/ops/GrDrawPathOp.cpp
+++ b/src/gpu/ops/GrDrawPathOp.cpp
@@ -89,7 +89,14 @@
 
 void GrDrawPathOp::onExecute(GrOpFlushState* state, const SkRect& chainBounds) {
     GrAppliedClip appliedClip = state->detachAppliedClip();
-    GrPipeline::FixedDynamicState fixedDynamicState(appliedClip.scissorState().rect());
+
+    GrPipeline::FixedDynamicState* fixedDynamicState = nullptr, storage;
+
+    if (appliedClip.scissorState().enabled()) {
+        storage.fScissorRect = appliedClip.scissorState().rect();
+        fixedDynamicState = &storage;
+    }
+
     GrPipeline pipeline(this->pipelineInitArgs(*state), this->detachProcessors(),
                         std::move(appliedClip));
     sk_sp<GrPathProcessor> pathProc(GrPathProcessor::Create(this->color(), this->viewMatrix()));
@@ -99,7 +106,7 @@
                               state->drawOpArgs().origin(),
                               &pipeline,
                               pathProc.get(),
-                              &fixedDynamicState,
+                              fixedDynamicState,
                               nullptr, 0,
                               GrPrimitiveType::kPath);
 
diff --git a/src/gpu/ops/GrFillRRectOp.cpp b/src/gpu/ops/GrFillRRectOp.cpp
index 13e596b..0760808 100644
--- a/src/gpu/ops/GrFillRRectOp.cpp
+++ b/src/gpu/ops/GrFillRRectOp.cpp
@@ -746,8 +746,13 @@
     initArgs.fDstProxyView = flushState->drawOpArgs().dstProxyView();
     initArgs.fOutputSwizzle = flushState->drawOpArgs().outputSwizzle();
     auto clip = flushState->detachAppliedClip();
-    GrPipeline::FixedDynamicState* fixedDynamicState =
-        flushState->allocator()->make<GrPipeline::FixedDynamicState>(clip.scissorState().rect());
+    GrPipeline::FixedDynamicState* fixedDynamicState = nullptr;
+
+    if (clip.scissorState().enabled()) {
+        fixedDynamicState = flushState->allocator()->make<GrPipeline::FixedDynamicState>(
+                                                                    clip.scissorState().rect());
+    }
+
     GrPipeline* pipeline = flushState->allocator()->make<GrPipeline>(initArgs,
                                                                      std::move(fProcessors),
                                                                      std::move(clip));
diff --git a/src/gpu/ops/GrMeshDrawOp.cpp b/src/gpu/ops/GrMeshDrawOp.cpp
index 3250a22..1974fc6 100644
--- a/src/gpu/ops/GrMeshDrawOp.cpp
+++ b/src/gpu/ops/GrMeshDrawOp.cpp
@@ -100,10 +100,14 @@
 GrPipeline::FixedDynamicState* GrMeshDrawOp::Target::MakeFixedDynamicState(
         SkArenaAlloc* arena, const GrAppliedClip* clip, int numPrimProcTextures) {
 
-    if ((clip && clip->scissorState().enabled()) || numPrimProcTextures) {
-        const SkIRect& scissor = (clip) ? clip->scissorState().rect() : SkIRect::MakeEmpty();
+    bool haveScissor = clip && clip->scissorState().enabled();
 
-        auto result = arena->make<GrPipeline::FixedDynamicState>(scissor);
+    if (haveScissor || numPrimProcTextures) {
+        auto result = arena->make<GrPipeline::FixedDynamicState>();
+
+        if (haveScissor) {
+            result->fScissorRect = clip->scissorState().rect();
+        }
 
         if (numPrimProcTextures) {
             result->fPrimitiveProcessorTextures = arena->makeArrayDefault<GrTextureProxy*>(