blob: 042e19f6ad6745ea1da528ccfd50d00b19e562ec [file] [log] [blame]
bsalomon@google.comaa5b6732011-07-29 15:13:20 +00001
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"
bsalomon6bc1b5f2015-02-23 09:06:38 -080014#include "GrRenderTargetPriv.h"
bsalomon@google.com81c3f8d2011-08-03 15:18:33 +000015#include "GrStencilBuffer.h"
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000016
commit-bot@chromium.org28361fa2014-03-28 16:08:05 +000017void 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
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +000026void GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) {
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000027 if (kCanResolve_ResolveType == getResolveType()) {
bsalomon49f085d2014-09-05 13:34:00 -070028 if (rect) {
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000029 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
commit-bot@chromium.orgfd03d4a2013-07-17 21:39:42 +000039void GrRenderTarget::overrideResolveRect(const SkIRect rect) {
bsalomon@google.comaa5b6732011-07-29 15:13:20 +000040 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 }
bsalomon@google.com81c3f8d2011-08-03 15:18:33 +000048}
49
robertphillips@google.comd6bbbf82012-09-05 15:46:34 +000050void GrRenderTarget::onRelease() {
bsalomon6bc1b5f2015-02-23 09:06:38 -080051 this->renderTargetPriv().didAttachStencilBuffer(NULL);
robertphillips@google.comd3645542012-09-05 18:37:39 +000052
53 INHERITED::onRelease();
robertphillips@google.comd6bbbf82012-09-05 15:46:34 +000054}
55
56void GrRenderTarget::onAbandon() {
bsalomon6bc1b5f2015-02-23 09:06:38 -080057 this->renderTargetPriv().didAttachStencilBuffer(NULL);
robertphillips@google.comd3645542012-09-05 18:37:39 +000058
59 INHERITED::onAbandon();
robertphillips@google.comd6bbbf82012-09-05 15:46:34 +000060}
bsalomon6bc1b5f2015-02-23 09:06:38 -080061
62///////////////////////////////////////////////////////////////////////////////
63
64void GrRenderTargetPriv::didAttachStencilBuffer(GrStencilBuffer* stencilBuffer) {
65 SkRefCnt_SafeAssign(fRenderTarget->fStencilBuffer, stencilBuffer);
66}
67
68GrStencilBuffer* GrRenderTargetPriv::attachStencilBuffer() const {
69 if (fRenderTarget->fStencilBuffer) {
70 return fRenderTarget->fStencilBuffer;
71 }
72 if (!fRenderTarget->wasDestroyed() && fRenderTarget->canAttemptStencilAttachment()) {
73 fRenderTarget->getGpu()->attachStencilBufferToRenderTarget(fRenderTarget);
74 }
75 return fRenderTarget->fStencilBuffer;
76}