| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrRenderTarget_DEFINED |
| #define GrRenderTarget_DEFINED |
| |
| #include "include/core/SkRect.h" |
| #include "include/private/base/SkTArray.h" |
| #include "src/gpu/ganesh/GrSurface.h" |
| |
| class GrCaps; |
| class GrAttachment; |
| class GrBackendRenderTarget; |
| |
| /** |
| * GrRenderTarget represents a 2D buffer of pixels that can be rendered to. |
| * A context's render target is set by setRenderTarget(). Render targets are |
| * created by a createTexture with the kRenderTarget_SurfaceFlag flag. |
| * Additionally, GrContext provides methods for creating GrRenderTargets |
| * that wrap externally created render targets. |
| */ |
| class GrRenderTarget : virtual public GrSurface { |
| public: |
| // Make manual MSAA resolve publicly accessible from GrRenderTarget. |
| using GrSurface::setRequiresManualMSAAResolve; |
| using GrSurface::requiresManualMSAAResolve; |
| |
| virtual bool alwaysClearStencil() const { return false; } |
| |
| // GrSurface overrides |
| GrRenderTarget* asRenderTarget() override { return this; } |
| const GrRenderTarget* asRenderTarget() const override { return this; } |
| |
| /** |
| * Returns the number of samples/pixel in the color buffer (One if non-MSAA). |
| */ |
| int numSamples() const { return fSampleCnt; } |
| |
| virtual GrBackendRenderTarget getBackendRenderTarget() const = 0; |
| |
| GrAttachment* getStencilAttachment(bool useMSAASurface) const { |
| return (useMSAASurface) ? fMSAAStencilAttachment.get() : fStencilAttachment.get(); |
| } |
| |
| GrAttachment* getStencilAttachment() const { |
| return getStencilAttachment(this->numSamples() > 1); |
| } |
| |
| // Checked when this object is asked to attach a stencil buffer. |
| virtual bool canAttemptStencilAttachment(bool useMSAASurface) const = 0; |
| |
| void attachStencilAttachment(sk_sp<GrAttachment> stencil, bool useMSAASurface); |
| |
| int numStencilBits(bool useMSAASurface) const; |
| |
| /** |
| * Returns a unique key that identifies this render target's sample pattern. (Must be |
| * multisampled.) |
| */ |
| int getSamplePatternKey(); |
| |
| /** |
| * Retrieves the per-pixel HW sample locations for this render target, and, as a by-product, the |
| * actual number of samples in use. (This may differ from fSampleCnt.) Sample locations are |
| * returned as 0..1 offsets relative to the top-left corner of the pixel. |
| */ |
| const skia_private::TArray<SkPoint>& getSampleLocations(); |
| |
| protected: |
| GrRenderTarget(GrGpu*, |
| const SkISize&, |
| int sampleCount, |
| GrProtected, |
| std::string_view label, |
| sk_sp<GrAttachment> stenicl = nullptr); |
| ~GrRenderTarget() override; |
| |
| // override of GrResource |
| void onAbandon() override; |
| void onRelease() override; |
| |
| private: |
| // Allows the backends to perform any additional work that is required for attaching a |
| // GrAttachment. When this is called, the GrAttachment has already been put onto |
| // the GrRenderTarget. This function must return false if any failures occur when completing the |
| // stencil attachment. |
| virtual bool completeStencilAttachment(GrAttachment* stencil, bool useMSAASurface) = 0; |
| |
| sk_sp<GrAttachment> fStencilAttachment; |
| sk_sp<GrAttachment> fMSAAStencilAttachment; |
| int fSampleCnt; |
| |
| using INHERITED = GrSurface; |
| }; |
| |
| #endif |