1
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
8
9
10#include "GrRenderTarget.h"
11
12#include "GrContext.h"
13#include "GrGpu.h"
14#include "GrRenderTargetPriv.h"
15#include "GrStencilAttachment.h"
16
17void GrRenderTarget::discard() {
18    // go through context so that all necessary flushing occurs
19    GrContext* context = this->getContext();
20    if (NULL == context) {
21        return;
22    }
23    context->discardRenderTarget(this);
24}
25
26void GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) {
27    if (kCanResolve_ResolveType == getResolveType()) {
28        if (rect) {
29            fResolveRect.join(*rect);
30            if (!fResolveRect.intersect(0, 0, this->width(), this->height())) {
31                fResolveRect.setEmpty();
32            }
33        } else {
34            fResolveRect.setLTRB(0, 0, this->width(), this->height());
35        }
36    }
37}
38
39void GrRenderTarget::overrideResolveRect(const SkIRect rect) {
40    fResolveRect = rect;
41    if (fResolveRect.isEmpty()) {
42        fResolveRect.setLargestInverted();
43    } else {
44        if (!fResolveRect.intersect(0, 0, this->width(), this->height())) {
45            fResolveRect.setLargestInverted();
46        }
47    }
48}
49
50void GrRenderTarget::onRelease() {
51    this->renderTargetPriv().didAttachStencilAttachment(NULL);
52
53    INHERITED::onRelease();
54}
55
56void GrRenderTarget::onAbandon() {
57    this->renderTargetPriv().didAttachStencilAttachment(NULL);
58
59    INHERITED::onAbandon();
60}
61
62///////////////////////////////////////////////////////////////////////////////
63
64void GrRenderTargetPriv::didAttachStencilAttachment(GrStencilAttachment* stencilAttachment) {
65    SkRefCnt_SafeAssign(fRenderTarget->fStencilAttachment, stencilAttachment);
66}
67
68GrStencilAttachment* GrRenderTargetPriv::attachStencilAttachment() const {
69    if (fRenderTarget->fStencilAttachment) {
70        return fRenderTarget->fStencilAttachment;
71    }
72    if (!fRenderTarget->wasDestroyed() && fRenderTarget->canAttemptStencilAttachment()) {
73        fRenderTarget->getGpu()->attachStencilAttachmentToRenderTarget(fRenderTarget);
74    }
75    return fRenderTarget->fStencilAttachment;
76}
77