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 "GrSurface.h" 12 #include "SkRect.h" 13 14 class GrCaps; 15 class GrRenderTargetOpList; 16 class GrRenderTargetPriv; 17 class GrStencilAttachment; 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 */ 26 class GrRenderTarget : virtual public GrSurface { 27 public: 28 // GrSurface overrides asRenderTarget()29 GrRenderTarget* asRenderTarget() override { return this; } asRenderTarget()30 const GrRenderTarget* asRenderTarget() const override { return this; } 31 32 // GrRenderTarget isStencilBufferMultisampled()33 bool isStencilBufferMultisampled() const { return fSampleCnt > 0; } 34 fsaaType()35 GrFSAAType fsaaType() const { 36 if (!fSampleCnt) { 37 SkASSERT(!(fFlags & GrRenderTargetFlags::kMixedSampled)); 38 return GrFSAAType::kNone; 39 } 40 return (fFlags & GrRenderTargetFlags::kMixedSampled) ? GrFSAAType::kMixedSamples 41 : GrFSAAType::kUnifiedMSAA; 42 } 43 44 /** 45 * Returns the number of samples/pixel in the stencil buffer (Zero if non-MSAA). 46 */ numStencilSamples()47 int numStencilSamples() const { return fSampleCnt; } 48 49 /** 50 * Returns the number of samples/pixel in the color buffer (Zero if non-MSAA or mixed sampled). 51 */ numColorSamples()52 int numColorSamples() const { 53 return GrFSAAType::kMixedSamples == this->fsaaType() ? 0 : fSampleCnt; 54 } 55 56 /** 57 * Call to indicate the multisample contents were modified such that the 58 * render target needs to be resolved before it can be used as texture. Gr 59 * tracks this for its own drawing and thus this only needs to be called 60 * when the render target has been modified outside of Gr. This has no 61 * effect on wrapped backend render targets. 62 * 63 * @param rect a rect bounding the area needing resolve. NULL indicates 64 * the whole RT needs resolving. 65 */ 66 void flagAsNeedingResolve(const SkIRect* rect = NULL); 67 68 /** 69 * Call to override the region that needs to be resolved. 70 */ 71 void overrideResolveRect(const SkIRect rect); 72 73 /** 74 * Call to indicate that GrRenderTarget was externally resolved. This may 75 * allow Gr to skip a redundant resolve step. 76 */ flagAsResolved()77 void flagAsResolved() { fResolveRect.setLargestInverted(); } 78 79 /** 80 * @return true if the GrRenderTarget requires MSAA resolving 81 */ needsResolve()82 bool needsResolve() const { return !fResolveRect.isEmpty(); } 83 84 /** 85 * Returns a rect bounding the region needing resolving. 86 */ getResolveRect()87 const SkIRect& getResolveRect() const { return fResolveRect; } 88 89 // a MSAA RT may require explicit resolving , it may auto-resolve (e.g. FBO 90 // 0 in GL), or be unresolvable because the client didn't give us the 91 // resolve destination. 92 enum ResolveType { 93 kCanResolve_ResolveType, 94 kAutoResolves_ResolveType, 95 kCantResolve_ResolveType, 96 }; 97 virtual ResolveType getResolveType() const = 0; 98 99 /** 100 * Return the native ID or handle to the rendertarget, depending on the 101 * platform. e.g. on OpenGL, return the FBO ID. 102 */ 103 virtual GrBackendObject getRenderTargetHandle() const = 0; 104 105 // Checked when this object is asked to attach a stencil buffer. 106 virtual bool canAttemptStencilAttachment() const = 0; 107 108 // Provides access to functions that aren't part of the public API. 109 GrRenderTargetPriv renderTargetPriv(); 110 const GrRenderTargetPriv renderTargetPriv() const; 111 112 protected: 113 GrRenderTarget(GrGpu*, const GrSurfaceDesc&, 114 GrRenderTargetFlags = GrRenderTargetFlags::kNone, 115 GrStencilAttachment* = nullptr); 116 117 // override of GrResource 118 void onAbandon() override; 119 void onRelease() override; 120 121 private: 122 // Allows the backends to perform any additional work that is required for attaching a 123 // GrStencilAttachment. When this is called, the GrStencilAttachment has already been put onto 124 // the GrRenderTarget. This function must return false if any failures occur when completing the 125 // stencil attachment. 126 virtual bool completeStencilAttachment() = 0; 127 128 friend class GrRenderTargetPriv; 129 130 int fSampleCnt; 131 GrStencilAttachment* fStencilAttachment; 132 uint8_t fMultisampleSpecsID; 133 GrRenderTargetFlags fFlags; 134 135 SkIRect fResolveRect; 136 137 typedef GrSurface INHERITED; 138 }; 139 140 #endif 141