1 /* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrClearBatch_DEFINED 9 #define GrClearBatch_DEFINED 10 11 #include "GrBatch.h" 12 #include "GrBatchFlushState.h" 13 #include "GrGpu.h" 14 #include "GrRenderTarget.h" 15 16 class GrClearBatch final : public GrBatch { 17 public: 18 DEFINE_BATCH_CLASS_ID 19 GrClearBatch(const SkIRect & rect,GrColor color,GrRenderTarget * rt)20 GrClearBatch(const SkIRect& rect, GrColor color, GrRenderTarget* rt) 21 : INHERITED(ClassID()) 22 , fRect(rect) 23 , fColor(color) 24 , fRenderTarget(rt) { 25 fBounds = SkRect::Make(rect); 26 } 27 name()28 const char* name() const override { return "Clear"; } 29 renderTargetUniqueID()30 uint32_t renderTargetUniqueID() const override { return fRenderTarget.get()->getUniqueID(); } renderTarget()31 GrRenderTarget* renderTarget() const override { return fRenderTarget.get(); } 32 dumpInfo()33 SkString dumpInfo() const override { 34 SkString string; 35 string.printf("Color: 0x%08x, Rect [L: %d, T: %d, R: %d, B: %d], RT: %d", 36 fColor, fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom, 37 fRenderTarget.get()->getUniqueID()); 38 return string; 39 } 40 41 private: onCombineIfPossible(GrBatch * t,const GrCaps & caps)42 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { 43 // This could be much more complicated. Currently we look at cases where the new clear 44 // contains the old clear, or when the new clear is a subset of the old clear and is the 45 // same color. 46 GrClearBatch* cb = t->cast<GrClearBatch>(); 47 SkASSERT(cb->fRenderTarget == fRenderTarget); 48 if (cb->fRect.contains(fRect)) { 49 fRect = cb->fRect; 50 fBounds = cb->fBounds; 51 fColor = cb->fColor; 52 return true; 53 } else if (cb->fColor == fColor && fRect.contains(cb->fRect)) { 54 return true; 55 } 56 return false; 57 } 58 onPrepare(GrBatchFlushState *)59 void onPrepare(GrBatchFlushState*) override {} 60 onDraw(GrBatchFlushState * state)61 void onDraw(GrBatchFlushState* state) override { 62 state->gpu()->clear(fRect, fColor, fRenderTarget.get()); 63 } 64 65 SkIRect fRect; 66 GrColor fColor; 67 GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget; 68 69 typedef GrBatch INHERITED; 70 }; 71 72 class GrClearStencilClipBatch final : public GrBatch { 73 public: 74 DEFINE_BATCH_CLASS_ID 75 GrClearStencilClipBatch(const SkIRect & rect,bool insideClip,GrRenderTarget * rt)76 GrClearStencilClipBatch(const SkIRect& rect, bool insideClip, GrRenderTarget* rt) 77 : INHERITED(ClassID()) 78 , fRect(rect) 79 , fInsideClip(insideClip) 80 , fRenderTarget(rt) { 81 fBounds = SkRect::Make(rect); 82 } 83 name()84 const char* name() const override { return "ClearStencilClip"; } 85 renderTargetUniqueID()86 uint32_t renderTargetUniqueID() const override { return fRenderTarget.get()->getUniqueID(); } renderTarget()87 GrRenderTarget* renderTarget() const override { return fRenderTarget.get(); } 88 dumpInfo()89 SkString dumpInfo() const override { 90 SkString string; 91 string.printf("Rect [L: %d, T: %d, R: %d, B: %d], IC: %d, RT: 0x%p", 92 fRect.fLeft, fRect.fTop, fRect.fRight, fRect.fBottom, fInsideClip, 93 fRenderTarget.get()); 94 return string; 95 } 96 97 private: onCombineIfPossible(GrBatch * t,const GrCaps & caps)98 bool onCombineIfPossible(GrBatch* t, const GrCaps& caps) override { return false; } 99 onPrepare(GrBatchFlushState *)100 void onPrepare(GrBatchFlushState*) override {} 101 onDraw(GrBatchFlushState * state)102 void onDraw(GrBatchFlushState* state) override { 103 state->gpu()->clearStencilClip(fRect, fInsideClip, fRenderTarget.get()); 104 } 105 106 SkIRect fRect; 107 bool fInsideClip; 108 GrPendingIOResource<GrRenderTarget, kWrite_GrIOType> fRenderTarget; 109 110 typedef GrBatch INHERITED; 111 }; 112 113 #endif 114