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#ifndef GrRenderTarget_DEFINED
9#define GrRenderTarget_DEFINED
10
11#include "include/core/SkRect.h"
12#include "src/gpu/GrSurface.h"
13
14class GrCaps;
15class GrRenderTargetPriv;
16class GrStencilAttachment;
17class GrBackendRenderTarget;
18
19/**
20 * GrRenderTarget represents a 2D buffer of pixels that can be rendered to.
21 * A context's render target is set by setRenderTarget(). Render targets are
22 * created by a createTexture with the kRenderTarget_SurfaceFlag flag.
23 * Additionally, GrContext provides methods for creating GrRenderTargets
24 * that wrap externally created render targets.
25 */
26class GrRenderTarget : virtual public GrSurface {
27public:
28 // Make manual MSAA resolve publicly accessible from GrRenderTarget.
29 using GrSurface::setRequiresManualMSAAResolve;
30 using GrSurface::requiresManualMSAAResolve;
31
32 virtual bool alwaysClearStencil() const { return false; }
33
34 // GrSurface overrides
35 GrRenderTarget* asRenderTarget() override { return this; }
36 const GrRenderTarget* asRenderTarget() const override { return this; }
37
38 /**
39 * Returns the number of samples/pixel in the color buffer (One if non-MSAA).
40 */
41 int numSamples() const { return fSampleCnt; }
42
43 virtual GrBackendRenderTarget getBackendRenderTarget() const = 0;
44
45 // Checked when this object is asked to attach a stencil buffer.
46 virtual bool canAttemptStencilAttachment() const = 0;
47
48 // Provides access to functions that aren't part of the public API.
49 GrRenderTargetPriv renderTargetPriv();
50 const GrRenderTargetPriv renderTargetPriv() const;
51
52protected:
53 GrRenderTarget(GrGpu*, const SkISize&, int sampleCount, GrProtected,
54 GrStencilAttachment* = nullptr);
55 ~GrRenderTarget() override;
56
57 // override of GrResource
58 void onAbandon() override;
59 void onRelease() override;
60
61private:
62 // Allows the backends to perform any additional work that is required for attaching a
63 // GrStencilAttachment. When this is called, the GrStencilAttachment has already been put onto
64 // the GrRenderTarget. This function must return false if any failures occur when completing the
65 // stencil attachment.
66 virtual bool completeStencilAttachment() = 0;
67
68 friend class GrRenderTargetPriv;
69
70 int fSampleCnt;
71 int fSamplePatternKey;
72 sk_sp<GrStencilAttachment> fStencilAttachment;
73
74 typedef GrSurface INHERITED;
75};
76
77#endif
78