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*>(