1 /*
2 * Copyright 2011 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
9 #include "GrRenderTarget.h"
10
11 #include "GrContext.h"
12 #include "GrContextPriv.h"
13 #include "GrRenderTargetContext.h"
14 #include "GrGpu.h"
15 #include "GrRenderTargetOpList.h"
16 #include "GrRenderTargetPriv.h"
17 #include "GrStencilAttachment.h"
18 #include "GrStencilSettings.h"
19 #include "SkRectPriv.h"
20
GrRenderTarget(GrGpu * gpu,const GrSurfaceDesc & desc,GrRenderTargetFlags flags,GrStencilAttachment * stencil)21 GrRenderTarget::GrRenderTarget(GrGpu* gpu, const GrSurfaceDesc& desc,
22 GrRenderTargetFlags flags,
23 GrStencilAttachment* stencil)
24 : INHERITED(gpu, desc)
25 , fSampleCnt(desc.fSampleCnt)
26 , fStencilAttachment(stencil)
27 , fFlags(flags) {
28 SkASSERT(desc.fFlags & kRenderTarget_GrSurfaceFlag);
29 SkASSERT(!(fFlags & GrRenderTargetFlags::kMixedSampled) || fSampleCnt > 1);
30 SkASSERT(!(fFlags & GrRenderTargetFlags::kWindowRectsSupport) ||
31 gpu->caps()->maxWindowRectangles() > 0);
32 fResolveRect = SkRectPriv::MakeILargestInverted();
33 }
34
flagAsNeedingResolve(const SkIRect * rect)35 void GrRenderTarget::flagAsNeedingResolve(const SkIRect* rect) {
36 if (kCanResolve_ResolveType == getResolveType()) {
37 if (rect) {
38 fResolveRect.join(*rect);
39 if (!fResolveRect.intersect(0, 0, this->width(), this->height())) {
40 fResolveRect.setEmpty();
41 }
42 } else {
43 fResolveRect.setLTRB(0, 0, this->width(), this->height());
44 }
45 }
46 }
47
overrideResolveRect(const SkIRect rect)48 void GrRenderTarget::overrideResolveRect(const SkIRect rect) {
49 fResolveRect = rect;
50 if (fResolveRect.isEmpty()) {
51 fResolveRect = SkRectPriv::MakeILargestInverted();
52 } else {
53 if (!fResolveRect.intersect(0, 0, this->width(), this->height())) {
54 fResolveRect = SkRectPriv::MakeILargestInverted();
55 }
56 }
57 }
58
flagAsResolved()59 void GrRenderTarget::flagAsResolved() {
60 fResolveRect = SkRectPriv::MakeILargestInverted();
61 }
62
onRelease()63 void GrRenderTarget::onRelease() {
64 SkSafeSetNull(fStencilAttachment);
65
66 INHERITED::onRelease();
67 }
68
onAbandon()69 void GrRenderTarget::onAbandon() {
70 SkSafeSetNull(fStencilAttachment);
71
72 INHERITED::onAbandon();
73 }
74
75 ///////////////////////////////////////////////////////////////////////////////
76
attachStencilAttachment(sk_sp<GrStencilAttachment> stencil)77 bool GrRenderTargetPriv::attachStencilAttachment(sk_sp<GrStencilAttachment> stencil) {
78 if (!stencil && !fRenderTarget->fStencilAttachment) {
79 // No need to do any work since we currently don't have a stencil attachment and
80 // we're not actually adding one.
81 return true;
82 }
83 fRenderTarget->fStencilAttachment = stencil.release();
84 if (!fRenderTarget->completeStencilAttachment()) {
85 SkSafeSetNull(fRenderTarget->fStencilAttachment);
86 return false;
87 }
88 return true;
89 }
90
numStencilBits() const91 int GrRenderTargetPriv::numStencilBits() const {
92 SkASSERT(this->getStencilAttachment());
93 return this->getStencilAttachment()->bits();
94 }
95