123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- /*
- * 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/gpu/GrSurface.h"
- class GrCaps;
- class GrRenderTargetOpList;
- class GrRenderTargetPriv;
- class GrStencilAttachment;
- 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:
- 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; }
- /**
- * Call to indicate the multisample contents were modified such that the
- * render target needs to be resolved before it can be used as texture. Gr
- * tracks this for its own drawing and thus this only needs to be called
- * when the render target has been modified outside of Gr. This has no
- * effect on wrapped backend render targets.
- *
- * @param rect a rect bounding the area needing resolve. NULL indicates
- * the whole RT needs resolving.
- */
- void flagAsNeedingResolve(const SkIRect* rect = nullptr);
- /**
- * Call to indicate that GrRenderTarget was externally resolved. This may
- * allow Gr to skip a redundant resolve step.
- */
- void flagAsResolved();
- /**
- * @return true if the GrRenderTarget requires MSAA resolving
- */
- bool needsResolve() const { return !fResolveRect.isEmpty(); }
- /**
- * Returns a rect bounding the region needing resolving.
- */
- const SkIRect& getResolveRect() const { return fResolveRect; }
- // a MSAA RT may require explicit resolving , it may auto-resolve (e.g. FBO
- // 0 in GL), or be unresolvable because the client didn't give us the
- // resolve destination.
- enum ResolveType {
- kCanResolve_ResolveType,
- kAutoResolves_ResolveType,
- kCantResolve_ResolveType,
- };
- virtual ResolveType getResolveType() const = 0;
- virtual GrBackendRenderTarget getBackendRenderTarget() const = 0;
- // Checked when this object is asked to attach a stencil buffer.
- virtual bool canAttemptStencilAttachment() const = 0;
- // Provides access to functions that aren't part of the public API.
- GrRenderTargetPriv renderTargetPriv();
- const GrRenderTargetPriv renderTargetPriv() const;
- protected:
- GrRenderTarget(GrGpu*, const GrSurfaceDesc&, int sampleCount, GrProtected,
- GrStencilAttachment* = 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
- // GrStencilAttachment. When this is called, the GrStencilAttachment has already been put onto
- // the GrRenderTarget. This function must return false if any failures occur when completing the
- // stencil attachment.
- virtual bool completeStencilAttachment() = 0;
- friend class GrRenderTargetPriv;
- int fSampleCnt;
- int fSamplePatternKey;
- sk_sp<GrStencilAttachment> fStencilAttachment;
- SkIRect fResolveRect;
- typedef GrSurface INHERITED;
- };
- #endif
|