1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrRenderTarget.h"
8*c8dee2aaSAndroid Build Coastguard Worker
9*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrAttachment.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrBackendUtils.h"
11*c8dee2aaSAndroid Build Coastguard Worker
12*c8dee2aaSAndroid Build Coastguard Worker #include <utility>
13*c8dee2aaSAndroid Build Coastguard Worker
14*c8dee2aaSAndroid Build Coastguard Worker class GrGpu;
15*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
16*c8dee2aaSAndroid Build Coastguard Worker
GrRenderTarget(GrGpu * gpu,const SkISize & dimensions,int sampleCount,GrProtected isProtected,std::string_view label,sk_sp<GrAttachment> stencil)17*c8dee2aaSAndroid Build Coastguard Worker GrRenderTarget::GrRenderTarget(GrGpu* gpu,
18*c8dee2aaSAndroid Build Coastguard Worker const SkISize& dimensions,
19*c8dee2aaSAndroid Build Coastguard Worker int sampleCount,
20*c8dee2aaSAndroid Build Coastguard Worker GrProtected isProtected,
21*c8dee2aaSAndroid Build Coastguard Worker std::string_view label,
22*c8dee2aaSAndroid Build Coastguard Worker sk_sp<GrAttachment> stencil)
23*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(gpu, dimensions, isProtected, label)
24*c8dee2aaSAndroid Build Coastguard Worker , fSampleCnt(sampleCount) {
25*c8dee2aaSAndroid Build Coastguard Worker if (this->numSamples() > 1) {
26*c8dee2aaSAndroid Build Coastguard Worker fMSAAStencilAttachment = std::move(stencil);
27*c8dee2aaSAndroid Build Coastguard Worker } else {
28*c8dee2aaSAndroid Build Coastguard Worker fStencilAttachment = std::move(stencil);
29*c8dee2aaSAndroid Build Coastguard Worker }
30*c8dee2aaSAndroid Build Coastguard Worker }
31*c8dee2aaSAndroid Build Coastguard Worker
32*c8dee2aaSAndroid Build Coastguard Worker GrRenderTarget::~GrRenderTarget() = default;
33*c8dee2aaSAndroid Build Coastguard Worker
onRelease()34*c8dee2aaSAndroid Build Coastguard Worker void GrRenderTarget::onRelease() {
35*c8dee2aaSAndroid Build Coastguard Worker fStencilAttachment = nullptr;
36*c8dee2aaSAndroid Build Coastguard Worker fMSAAStencilAttachment = nullptr;
37*c8dee2aaSAndroid Build Coastguard Worker
38*c8dee2aaSAndroid Build Coastguard Worker INHERITED::onRelease();
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker
onAbandon()41*c8dee2aaSAndroid Build Coastguard Worker void GrRenderTarget::onAbandon() {
42*c8dee2aaSAndroid Build Coastguard Worker fStencilAttachment = nullptr;
43*c8dee2aaSAndroid Build Coastguard Worker fMSAAStencilAttachment = nullptr;
44*c8dee2aaSAndroid Build Coastguard Worker
45*c8dee2aaSAndroid Build Coastguard Worker INHERITED::onAbandon();
46*c8dee2aaSAndroid Build Coastguard Worker }
47*c8dee2aaSAndroid Build Coastguard Worker
attachStencilAttachment(sk_sp<GrAttachment> stencil,bool useMSAASurface)48*c8dee2aaSAndroid Build Coastguard Worker void GrRenderTarget::attachStencilAttachment(sk_sp<GrAttachment> stencil, bool useMSAASurface) {
49*c8dee2aaSAndroid Build Coastguard Worker auto stencilAttachment = (useMSAASurface) ? &GrRenderTarget::fMSAAStencilAttachment
50*c8dee2aaSAndroid Build Coastguard Worker : &GrRenderTarget::fStencilAttachment;
51*c8dee2aaSAndroid Build Coastguard Worker if (!stencil && !(this->*stencilAttachment)) {
52*c8dee2aaSAndroid Build Coastguard Worker // No need to do any work since we currently don't have a stencil attachment and
53*c8dee2aaSAndroid Build Coastguard Worker // we're not actually adding one.
54*c8dee2aaSAndroid Build Coastguard Worker return;
55*c8dee2aaSAndroid Build Coastguard Worker }
56*c8dee2aaSAndroid Build Coastguard Worker
57*c8dee2aaSAndroid Build Coastguard Worker if (!this->completeStencilAttachment(stencil.get(), useMSAASurface)) {
58*c8dee2aaSAndroid Build Coastguard Worker return;
59*c8dee2aaSAndroid Build Coastguard Worker }
60*c8dee2aaSAndroid Build Coastguard Worker
61*c8dee2aaSAndroid Build Coastguard Worker this->*stencilAttachment = std::move(stencil);
62*c8dee2aaSAndroid Build Coastguard Worker }
63*c8dee2aaSAndroid Build Coastguard Worker
numStencilBits(bool useMSAASurface) const64*c8dee2aaSAndroid Build Coastguard Worker int GrRenderTarget::numStencilBits(bool useMSAASurface) const {
65*c8dee2aaSAndroid Build Coastguard Worker return GrBackendFormatStencilBits(this->getStencilAttachment(useMSAASurface)->backendFormat());
66*c8dee2aaSAndroid Build Coastguard Worker }
67