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 "GrOpFlushState.h"
12#include "GrProxyProvider.h"
13
14GrClearOp::GrClearOp(const GrFixedClip& clip, GrColor color, GrSurfaceProxy* proxy)
15        : INHERITED(ClassID())
16        , fClip(clip)
17        , fColor(color) {
18    const SkIRect rtRect = SkIRect::MakeWH(proxy->width(), proxy->height());
19    if (fClip.scissorEnabled()) {
20        // Don't let scissors extend outside the RT. This may improve op combining.
21        if (!fClip.intersect(rtRect)) {
22            SkASSERT(0);  // should be caught upstream
23            fClip = GrFixedClip(SkIRect::MakeEmpty());
24        }
25
26        if (GrProxyProvider::IsFunctionallyExact(proxy) && fClip.scissorRect() == rtRect) {
27            fClip.disableScissor();
28        }
29    }
30    this->setBounds(SkRect::Make(fClip.scissorEnabled() ? fClip.scissorRect() : rtRect),
31                    HasAABloat::kNo, IsZeroArea::kNo);
32}
33
34void GrClearOp::onExecute(GrOpFlushState* state) {
35    SkASSERT(state->rtCommandBuffer());
36    state->rtCommandBuffer()->clear(fClip, fColor);
37}
38