Index: include/private/GrRenderTargetProxy.h |
diff --git a/include/private/GrRenderTargetProxy.h b/include/private/GrRenderTargetProxy.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..287aa017f0b7645afcba3a8160466ae91c8e0159 |
--- /dev/null |
+++ b/include/private/GrRenderTargetProxy.h |
@@ -0,0 +1,123 @@ |
+/* |
+ * Copyright 2016 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrRenderTargetProxy_DEFINED |
+#define GrRenderTargetProxy_DEFINED |
+ |
+#include "GrRenderTarget.h" |
+#include "GrSurfaceProxy.h" |
+#include "GrTypes.h" |
+ |
+class GrTextureProvider; |
+ |
+// This class delays the acquisition of RenderTargets until they are actually |
+// required |
+// Beware: the uniqueID of the RenderTargetProxy will usually be different than |
+// the uniqueID of the RenderTarget it represents! |
+class GrRenderTargetProxy : public GrSurfaceProxy { |
+public: |
+ /** |
+ * The caller gets the creation ref. |
+ */ |
+ static sk_sp<GrRenderTargetProxy> Make(const GrCaps&, const GrSurfaceDesc&, |
+ SkBackingFit, SkBudgeted); |
+ static sk_sp<GrRenderTargetProxy> Make(sk_sp<GrRenderTarget> rt); |
+ |
+ ~GrRenderTargetProxy() override; |
+ |
+ // TODO: add asTextureProxy variants |
+ GrRenderTargetProxy* asRenderTargetProxy() override { return this; } |
+ const GrRenderTargetProxy* asRenderTargetProxy() const override { return this; } |
+ |
+ // Actually instantiate the backing rendertarget, if necessary. |
+ GrRenderTarget* instantiate(GrTextureProvider* texProvider); |
+ |
+ /** |
+ * @return true if the surface is multisampled in all buffers, |
+ * false otherwise |
+ */ |
+ bool isUnifiedMultisampled() const { |
+ if (fSampleConfig != GrRenderTarget::kUnified_SampleConfig) { |
+ return false; |
+ } |
+ return 0 != fDesc.fSampleCnt; |
+ } |
+ |
+ /** |
+ * @return true if the surface is multisampled in the stencil buffer, |
+ * false otherwise |
+ */ |
+ bool isStencilBufferMultisampled() const { |
+ return 0 != fDesc.fSampleCnt; |
+ } |
+ |
+ /** |
+ * @return the number of color samples-per-pixel, or zero if non-MSAA or |
+ * multisampled in the stencil buffer only. |
+ */ |
+ int numColorSamples() const { |
+ if (fSampleConfig == GrRenderTarget::kUnified_SampleConfig) { |
+ return fDesc.fSampleCnt; |
+ } |
+ return 0; |
+ } |
+ |
+ /** |
+ * @return the number of stencil samples-per-pixel, or zero if non-MSAA. |
+ */ |
+ int numStencilSamples() const { |
+ return fDesc.fSampleCnt; |
+ } |
+ |
+ /** |
+ * @return true if the surface is mixed sampled, false otherwise. |
+ */ |
+ bool hasMixedSamples() const { |
+ SkASSERT(GrRenderTarget::kStencil_SampleConfig != fSampleConfig || |
+ this->isStencilBufferMultisampled()); |
+ return GrRenderTarget::kStencil_SampleConfig == fSampleConfig; |
+ } |
+ |
+ void setLastDrawTarget(GrDrawTarget* dt); |
+ GrDrawTarget* getLastDrawTarget() { return fLastDrawTarget; } |
+ |
+private: |
+ // TODO: we can probably munge the 'desc' in both the wrapped and deferred |
+ // cases to make the sampleConfig/numSamples stuff more rational. |
+ GrRenderTargetProxy(const GrCaps& caps, const GrSurfaceDesc& desc, |
+ SkBackingFit fit, SkBudgeted budgeted) |
+ : INHERITED(desc, fit, budgeted) |
+ , fTarget(nullptr) |
+ , fSampleConfig(GrRenderTarget::ComputeSampleConfig(caps, desc.fSampleCnt)) |
+ , fLastDrawTarget(nullptr) { |
+ } |
+ |
+ // Wrapped version |
+ GrRenderTargetProxy(sk_sp<GrRenderTarget> rt); |
+ |
+ // For wrapped render targets we store it here. |
+ // For deferred proxies we will fill this in when we need to instantiate the deferred resource |
+ sk_sp<GrRenderTarget> fTarget; |
+ |
+ // The sample config doesn't usually get computed until the render target is instantiated but |
+ // the render target proxy may need to answer queries about it before then. For this reason |
+ // we precompute it in the deferred case. In the wrapped case we just copy the wrapped |
+ // rendertarget's info here. |
+ GrRenderTarget::SampleConfig fSampleConfig; |
+ |
+ // The last drawTarget that wrote to or is currently going to write to this renderTarget |
+ // The drawTarget can be closed (e.g., no draw context is currently bound |
+ // to this renderTarget). |
+ // This back-pointer is required so that we can add a dependancy between |
+ // the drawTarget used to create the current contents of this renderTarget |
+ // and the drawTarget of a destination renderTarget to which this one is being drawn. |
+ GrDrawTarget* fLastDrawTarget; |
+ |
+ typedef GrSurfaceProxy INHERITED; |
+}; |
+ |
+#endif |