1 /*
2 * Copyright 2017 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 #include "GrClearOp.h"
9
10 #include "GrGpuCommandBuffer.h"
11 #include "GrMemoryPool.h"
12 #include "GrOpFlushState.h"
13 #include "GrProxyProvider.h"
14 #include "GrRecordingContext.h"
15 #include "GrRecordingContextPriv.h"
16
Make(GrRecordingContext * context,const GrFixedClip & clip,const SkPMColor4f & color,GrSurfaceProxy * dstProxy)17 std::unique_ptr<GrClearOp> GrClearOp::Make(GrRecordingContext* context,
18 const GrFixedClip& clip,
19 const SkPMColor4f& color,
20 GrSurfaceProxy* dstProxy) {
21 const SkIRect rect = SkIRect::MakeWH(dstProxy->width(), dstProxy->height());
22 if (clip.scissorEnabled() && !SkIRect::Intersects(clip.scissorRect(), rect)) {
23 return nullptr;
24 }
25
26 GrOpMemoryPool* pool = context->priv().opMemoryPool();
27
28 return pool->allocate<GrClearOp>(clip, color, dstProxy);
29 }
30
Make(GrRecordingContext * context,const SkIRect & rect,const SkPMColor4f & color,bool fullScreen)31 std::unique_ptr<GrClearOp> GrClearOp::Make(GrRecordingContext* context,
32 const SkIRect& rect,
33 const SkPMColor4f& color,
34 bool fullScreen) {
35 SkASSERT(fullScreen || !rect.isEmpty());
36
37 GrOpMemoryPool* pool = context->priv().opMemoryPool();
38
39 return pool->allocate<GrClearOp>(rect, color, fullScreen);
40 }
41
GrClearOp(const GrFixedClip & clip,const SkPMColor4f & color,GrSurfaceProxy * proxy)42 GrClearOp::GrClearOp(const GrFixedClip& clip, const SkPMColor4f& color, GrSurfaceProxy* proxy)
43 : INHERITED(ClassID())
44 , fClip(clip)
45 , fColor(color) {
46 const SkIRect rtRect = SkIRect::MakeWH(proxy->width(), proxy->height());
47 if (fClip.scissorEnabled()) {
48 // Don't let scissors extend outside the RT. This may improve op combining.
49 if (!fClip.intersect(rtRect)) {
50 SkASSERT(0); // should be caught upstream
51 fClip = GrFixedClip(SkIRect::MakeEmpty());
52 }
53
54 if (GrProxyProvider::IsFunctionallyExact(proxy) && fClip.scissorRect() == rtRect) {
55 fClip.disableScissor();
56 }
57 }
58 this->setBounds(SkRect::Make(fClip.scissorEnabled() ? fClip.scissorRect() : rtRect),
59 HasAABloat::kNo, IsZeroArea::kNo);
60 }
61
onExecute(GrOpFlushState * state,const SkRect & chainBounds)62 void GrClearOp::onExecute(GrOpFlushState* state, const SkRect& chainBounds) {
63 SkASSERT(state->rtCommandBuffer());
64 state->rtCommandBuffer()->clear(fClip, fColor);
65 }
66