OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2016 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 GrRenderTargetProxy_DEFINED |
| 9 #define GrRenderTargetProxy_DEFINED |
| 10 |
| 11 #include "GrRenderTarget.h" |
| 12 #include "GrSurfaceProxy.h" |
| 13 #include "GrTypes.h" |
| 14 |
| 15 class GrTextureProvider; |
| 16 |
| 17 // This class delays the acquisition of RenderTargets until they are actually |
| 18 // required |
| 19 // Beware: the uniqueID of the RenderTargetProxy will usually be different than |
| 20 // the uniqueID of the RenderTarget it represents! |
| 21 class GrRenderTargetProxy : public GrSurfaceProxy { |
| 22 public: |
| 23 /** |
| 24 * The caller gets the creation ref. |
| 25 */ |
| 26 static sk_sp<GrRenderTargetProxy> Make(const GrCaps&, const GrSurfaceDesc&, |
| 27 SkBackingFit, SkBudgeted); |
| 28 static sk_sp<GrRenderTargetProxy> Make(sk_sp<GrRenderTarget> rt); |
| 29 |
| 30 ~GrRenderTargetProxy() override; |
| 31 |
| 32 // TODO: add asTextureProxy variants |
| 33 GrRenderTargetProxy* asRenderTargetProxy() override { return this; } |
| 34 const GrRenderTargetProxy* asRenderTargetProxy() const override { return thi
s; } |
| 35 |
| 36 // Actually instantiate the backing rendertarget, if necessary. |
| 37 GrRenderTarget* instantiate(GrTextureProvider* texProvider); |
| 38 |
| 39 /** |
| 40 * @return true if the surface is multisampled in all buffers, |
| 41 * false otherwise |
| 42 */ |
| 43 bool isUnifiedMultisampled() const { |
| 44 if (fSampleConfig != GrRenderTarget::kUnified_SampleConfig) { |
| 45 return false; |
| 46 } |
| 47 return 0 != fDesc.fSampleCnt; |
| 48 } |
| 49 |
| 50 /** |
| 51 * @return true if the surface is multisampled in the stencil buffer, |
| 52 * false otherwise |
| 53 */ |
| 54 bool isStencilBufferMultisampled() const { |
| 55 return 0 != fDesc.fSampleCnt; |
| 56 } |
| 57 |
| 58 /** |
| 59 * @return the number of color samples-per-pixel, or zero if non-MSAA or |
| 60 * multisampled in the stencil buffer only. |
| 61 */ |
| 62 int numColorSamples() const { |
| 63 if (fSampleConfig == GrRenderTarget::kUnified_SampleConfig) { |
| 64 return fDesc.fSampleCnt; |
| 65 } |
| 66 return 0; |
| 67 } |
| 68 |
| 69 /** |
| 70 * @return the number of stencil samples-per-pixel, or zero if non-MSAA. |
| 71 */ |
| 72 int numStencilSamples() const { |
| 73 return fDesc.fSampleCnt; |
| 74 } |
| 75 |
| 76 /** |
| 77 * @return true if the surface is mixed sampled, false otherwise. |
| 78 */ |
| 79 bool hasMixedSamples() const { |
| 80 SkASSERT(GrRenderTarget::kStencil_SampleConfig != fSampleConfig || |
| 81 this->isStencilBufferMultisampled()); |
| 82 return GrRenderTarget::kStencil_SampleConfig == fSampleConfig; |
| 83 } |
| 84 |
| 85 void setLastDrawTarget(GrDrawTarget* dt); |
| 86 GrDrawTarget* getLastDrawTarget() { return fLastDrawTarget; } |
| 87 |
| 88 private: |
| 89 // TODO: we can probably munge the 'desc' in both the wrapped and deferred |
| 90 // cases to make the sampleConfig/numSamples stuff more rational. |
| 91 GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc, |
| 92 SkBackingFit fit, SkBudgeted budgeted) |
| 93 : INHERITED(desc, fit, budgeted) |
| 94 , fTarget(nullptr) |
| 95 , fSampleConfig(GrRenderTarget::ComputeSampleConfig(caps, desc.fSampleCn
t)) |
| 96 , fLastDrawTarget(nullptr) { |
| 97 } |
| 98 |
| 99 // Wrapped version |
| 100 GrRenderTargetProxy(sk_sp<GrRenderTarget> rt); |
| 101 |
| 102 // For wrapped render targets we store it here. |
| 103 // For deferred proxies we will fill this in when we need to instantiate the
deferred resource |
| 104 sk_sp<GrRenderTarget> fTarget; |
| 105 |
| 106 // The sample config doesn't usually get computed until the render target is
instantiated but |
| 107 // the render target proxy may need to answer queries about it before then.
For this reason |
| 108 // we precompute it in the deferred case. In the wrapped case we just copy t
he wrapped |
| 109 // rendertarget's info here. |
| 110 GrRenderTarget::SampleConfig fSampleConfig; |
| 111 |
| 112 // The last drawTarget that wrote to or is currently going to write to this
renderTarget |
| 113 // The drawTarget can be closed (e.g., no draw context is currently bound |
| 114 // to this renderTarget). |
| 115 // This back-pointer is required so that we can add a dependancy between |
| 116 // the drawTarget used to create the current contents of this renderTarget |
| 117 // and the drawTarget of a destination renderTarget to which this one is bei
ng drawn. |
| 118 GrDrawTarget* fLastDrawTarget; |
| 119 |
| 120 typedef GrSurfaceProxy INHERITED; |
| 121 }; |
| 122 |
| 123 #endif |
OLD | NEW |