• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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