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 |