OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "GrVkRenderTarget.h" | 8 #include "GrVkRenderTarget.h" |
9 | 9 |
10 #include "GrRenderTargetPriv.h" | 10 #include "GrRenderTargetPriv.h" |
11 #include "GrVkCommandBuffer.h" | 11 #include "GrVkCommandBuffer.h" |
12 #include "GrVkFramebuffer.h" | 12 #include "GrVkFramebuffer.h" |
13 #include "GrVkGpu.h" | 13 #include "GrVkGpu.h" |
14 #include "GrVkImageView.h" | 14 #include "GrVkImageView.h" |
15 #include "GrVkResourceProvider.h" | 15 #include "GrVkResourceProvider.h" |
16 #include "GrVkUtil.h" | 16 #include "GrVkUtil.h" |
17 | 17 |
18 #include "vk/GrVkTypes.h" | 18 #include "vk/GrVkTypes.h" |
19 | 19 |
20 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) | 20 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) |
21 | 21 |
22 // We're virtually derived from GrSurface (via GrRenderTarget) so its | 22 // We're virtually derived from GrSurface (via GrRenderTarget) so its |
23 // constructor must be explicitly called. | 23 // constructor must be explicitly called. |
24 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, | 24 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| 25 SkBudgeted budgeted, |
25 const GrSurfaceDesc& desc, | 26 const GrSurfaceDesc& desc, |
26 GrGpuResource::LifeCycle lifeCycle, | |
27 const GrVkImage::Resource* imageResource, | 27 const GrVkImage::Resource* imageResource, |
28 const GrVkImage::Resource* msaaResource, | 28 const GrVkImage::Resource* msaaResource, |
29 const GrVkImageView* colorAttachmentView, | 29 const GrVkImageView* colorAttachmentView, |
30 const GrVkImageView* resolveAttachmentView) | 30 const GrVkImageView* resolveAttachmentView) |
31 : GrSurface(gpu, lifeCycle, desc) | 31 : GrSurface(gpu, desc) |
32 , GrVkImage(imageResource) | 32 , GrVkImage(imageResource) |
33 // for the moment we only support 1:1 color to stencil | 33 // for the moment we only support 1:1 color to stencil |
34 , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig) | 34 , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
35 , fFramebuffer(nullptr) | 35 , fFramebuffer(nullptr) |
36 , fColorAttachmentView(colorAttachmentView) | 36 , fColorAttachmentView(colorAttachmentView) |
37 , fMSAAImageResource(msaaResource) | 37 , fMSAAImageResource(msaaResource) |
38 , fResolveAttachmentView(resolveAttachmentView) | 38 , fResolveAttachmentView(resolveAttachmentView) |
39 , fCachedSimpleRenderPass(nullptr) { | 39 , fCachedSimpleRenderPass(nullptr) { |
40 SkASSERT(desc.fSampleCnt); | 40 SkASSERT(desc.fSampleCnt); |
41 // The plus 1 is to account for the resolve texture. | 41 // The plus 1 is to account for the resolve texture. |
42 fColorValuesPerPixel = desc.fSampleCnt + 1; // TODO: this still correct? | 42 fColorValuesPerPixel = desc.fSampleCnt + 1; // TODO: this still correct? |
43 this->createFramebuffer(gpu); | 43 this->createFramebuffer(gpu); |
44 this->registerWithCache(); | 44 this->registerWithCache(budgeted); |
45 msaaResource->ref(); | 45 msaaResource->ref(); |
46 } | 46 } |
47 | 47 |
48 // We're virtually derived from GrSurface (via GrRenderTarget) so its | 48 // We're virtually derived from GrSurface (via GrRenderTarget) so its |
49 // constructor must be explicitly called. | 49 // constructor must be explicitly called. |
50 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, | 50 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
51 const GrSurfaceDesc& desc, | 51 const GrSurfaceDesc& desc, |
52 GrGpuResource::LifeCycle lifeCycle, | |
53 const GrVkImage::Resource* imageResource, | 52 const GrVkImage::Resource* imageResource, |
54 const GrVkImage::Resource* msaaResource, | 53 const GrVkImage::Resource* msaaResource, |
55 const GrVkImageView* colorAttachmentView, | 54 const GrVkImageView* colorAttachmentView, |
56 const GrVkImageView* resolveAttachmentView, | 55 const GrVkImageView* resolveAttachmentView) |
57 Derived) | 56 : GrSurface(gpu, desc) |
58 : GrSurface(gpu, lifeCycle, desc) | |
59 , GrVkImage(imageResource) | 57 , GrVkImage(imageResource) |
60 // for the moment we only support 1:1 color to stencil | 58 // for the moment we only support 1:1 color to stencil |
61 , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig) | 59 , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
62 , fFramebuffer(nullptr) | 60 , fFramebuffer(nullptr) |
63 , fColorAttachmentView(colorAttachmentView) | 61 , fColorAttachmentView(colorAttachmentView) |
64 , fMSAAImageResource(msaaResource) | 62 , fMSAAImageResource(msaaResource) |
65 , fResolveAttachmentView(resolveAttachmentView) | 63 , fResolveAttachmentView(resolveAttachmentView) |
66 , fCachedSimpleRenderPass(nullptr) { | 64 , fCachedSimpleRenderPass(nullptr) { |
67 SkASSERT(desc.fSampleCnt); | 65 SkASSERT(desc.fSampleCnt); |
68 // The plus 1 is to account for the resolve texture. | 66 // The plus 1 is to account for the resolve texture. |
69 fColorValuesPerPixel = desc.fSampleCnt + 1; // TODO: this still correct? | 67 fColorValuesPerPixel = desc.fSampleCnt + 1; // TODO: this still correct? |
70 this->createFramebuffer(gpu); | 68 this->createFramebuffer(gpu); |
71 msaaResource->ref(); | 69 msaaResource->ref(); |
72 } | 70 } |
73 | 71 |
74 // We're virtually derived from GrSurface (via GrRenderTarget) so its | 72 // We're virtually derived from GrSurface (via GrRenderTarget) so its |
75 // constructor must be explicitly called. | 73 // constructor must be explicitly called. |
76 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, | 74 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
| 75 SkBudgeted budgeted, |
77 const GrSurfaceDesc& desc, | 76 const GrSurfaceDesc& desc, |
78 GrGpuResource::LifeCycle lifeCycle, | |
79 const GrVkImage::Resource* imageResource, | 77 const GrVkImage::Resource* imageResource, |
80 const GrVkImageView* colorAttachmentView) | 78 const GrVkImageView* colorAttachmentView) |
81 : GrSurface(gpu, lifeCycle, desc) | 79 : GrSurface(gpu, desc) |
82 , GrVkImage(imageResource) | 80 , GrVkImage(imageResource) |
83 , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig) | 81 , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
84 , fFramebuffer(nullptr) | 82 , fFramebuffer(nullptr) |
85 , fColorAttachmentView(colorAttachmentView) | 83 , fColorAttachmentView(colorAttachmentView) |
86 , fMSAAImageResource(nullptr) | 84 , fMSAAImageResource(nullptr) |
87 , fResolveAttachmentView(nullptr) | 85 , fResolveAttachmentView(nullptr) |
88 , fCachedSimpleRenderPass(nullptr) { | 86 , fCachedSimpleRenderPass(nullptr) { |
89 SkASSERT(!desc.fSampleCnt); | 87 SkASSERT(!desc.fSampleCnt); |
90 fColorValuesPerPixel = 1; | 88 fColorValuesPerPixel = 1; |
91 this->createFramebuffer(gpu); | 89 this->createFramebuffer(gpu); |
92 this->registerWithCache(); | 90 this->registerWithCache(budgeted); |
93 } | 91 } |
94 | 92 |
95 // We're virtually derived from GrSurface (via GrRenderTarget) so its | 93 // We're virtually derived from GrSurface (via GrRenderTarget) so its |
96 // constructor must be explicitly called. | 94 // constructor must be explicitly called. |
97 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, | 95 GrVkRenderTarget::GrVkRenderTarget(GrVkGpu* gpu, |
98 const GrSurfaceDesc& desc, | 96 const GrSurfaceDesc& desc, |
99 GrGpuResource::LifeCycle lifeCycle, | |
100 const GrVkImage::Resource* imageResource, | 97 const GrVkImage::Resource* imageResource, |
101 const GrVkImageView* colorAttachmentView, | 98 const GrVkImageView* colorAttachmentView) |
102 Derived) | 99 : GrSurface(gpu, desc) |
103 : GrSurface(gpu, lifeCycle, desc) | |
104 , GrVkImage(imageResource) | 100 , GrVkImage(imageResource) |
105 , GrRenderTarget(gpu, lifeCycle, desc, kUnified_SampleConfig) | 101 , GrRenderTarget(gpu, desc, kUnified_SampleConfig) |
106 , fFramebuffer(nullptr) | 102 , fFramebuffer(nullptr) |
107 , fColorAttachmentView(colorAttachmentView) | 103 , fColorAttachmentView(colorAttachmentView) |
108 , fMSAAImageResource(nullptr) | 104 , fMSAAImageResource(nullptr) |
109 , fResolveAttachmentView(nullptr) | 105 , fResolveAttachmentView(nullptr) |
110 , fCachedSimpleRenderPass(nullptr) { | 106 , fCachedSimpleRenderPass(nullptr) { |
111 SkASSERT(!desc.fSampleCnt); | 107 SkASSERT(!desc.fSampleCnt); |
112 fColorValuesPerPixel = 1; | 108 fColorValuesPerPixel = 1; |
113 this->createFramebuffer(gpu); | 109 this->createFramebuffer(gpu); |
114 } | 110 } |
115 | 111 |
116 GrVkRenderTarget* | 112 GrVkRenderTarget* |
117 GrVkRenderTarget::Create(GrVkGpu* gpu, | 113 GrVkRenderTarget::Create(GrVkGpu* gpu, |
| 114 SkBudgeted budgeted, |
118 const GrSurfaceDesc& desc, | 115 const GrSurfaceDesc& desc, |
119 GrGpuResource::LifeCycle lifeCycle, | |
120 const GrVkImage::Resource* imageResource) { | 116 const GrVkImage::Resource* imageResource) { |
121 VkFormat pixelFormat; | 117 VkFormat pixelFormat; |
122 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat); | 118 GrPixelConfigToVkFormat(desc.fConfig, &pixelFormat); |
123 | 119 |
124 VkImage colorImage; | 120 VkImage colorImage; |
125 | 121 |
126 // create msaa surface if necessary | 122 // create msaa surface if necessary |
127 const GrVkImage::Resource* msaaResource = nullptr; | 123 const GrVkImage::Resource* msaaResource = nullptr; |
128 const GrVkImageView* resolveAttachmentView = nullptr; | 124 const GrVkImageView* resolveAttachmentView = nullptr; |
129 if (desc.fSampleCnt) { | 125 if (desc.fSampleCnt) { |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 if (!colorAttachmentView) { | 161 if (!colorAttachmentView) { |
166 if (msaaResource) { | 162 if (msaaResource) { |
167 resolveAttachmentView->unref(gpu); | 163 resolveAttachmentView->unref(gpu); |
168 msaaResource->unref(gpu); | 164 msaaResource->unref(gpu); |
169 } | 165 } |
170 return NULL; | 166 return NULL; |
171 } | 167 } |
172 | 168 |
173 GrVkRenderTarget* texRT; | 169 GrVkRenderTarget* texRT; |
174 if (msaaResource) { | 170 if (msaaResource) { |
175 texRT = new GrVkRenderTarget(gpu, desc, lifeCycle, imageResource, msaaRe
source, | 171 texRT = new GrVkRenderTarget(gpu, budgeted, desc, imageResource, msaaRes
ource, |
176 colorAttachmentView, resolveAttachmentView)
; | 172 colorAttachmentView, resolveAttachmentView)
; |
177 msaaResource->unref(gpu); | 173 msaaResource->unref(gpu); |
178 } else { | 174 } else { |
179 texRT = new GrVkRenderTarget(gpu, desc, lifeCycle, imageResource, | 175 texRT = new GrVkRenderTarget(gpu, budgeted, desc, imageResource, |
180 colorAttachmentView); | 176 colorAttachmentView); |
181 } | 177 } |
182 | 178 |
183 return texRT; | 179 return texRT; |
184 } | 180 } |
185 | 181 |
186 GrVkRenderTarget* | 182 GrVkRenderTarget* |
187 GrVkRenderTarget::CreateNewRenderTarget(GrVkGpu* gpu, | 183 GrVkRenderTarget::CreateNewRenderTarget(GrVkGpu* gpu, |
| 184 SkBudgeted budgeted, |
188 const GrSurfaceDesc& desc, | 185 const GrSurfaceDesc& desc, |
189 GrGpuResource::LifeCycle lifeCycle, | |
190 const GrVkImage::ImageDesc& imageDesc) { | 186 const GrVkImage::ImageDesc& imageDesc) { |
191 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); | 187 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT); |
192 | 188 |
193 const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, im
ageDesc); | 189 const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, im
ageDesc); |
194 if (!imageResource) { | 190 if (!imageResource) { |
195 return nullptr; | 191 return nullptr; |
196 } | 192 } |
197 | 193 |
198 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, desc, lifeCycle, imageR
esource); | 194 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, budgeted, desc, imageRe
source); |
199 // Create() will increment the refCount of the image resource if it succeeds | 195 // Create() will increment the refCount of the image resource if it succeeds |
200 imageResource->unref(gpu); | 196 imageResource->unref(gpu); |
201 return rt; | 197 return rt; |
202 } | 198 } |
203 | 199 |
204 GrVkRenderTarget* | 200 GrVkRenderTarget* |
205 GrVkRenderTarget::CreateWrappedRenderTarget(GrVkGpu* gpu, | 201 GrVkRenderTarget::CreateWrappedRenderTarget(GrVkGpu* gpu, |
206 const GrSurfaceDesc& desc, | 202 const GrSurfaceDesc& desc, |
207 GrGpuResource::LifeCycle lifeCycle, | 203 GrWrapOwnership ownership, |
208 const GrVkTextureInfo* info) { | 204 const GrVkTextureInfo* info) { |
209 SkASSERT(info); | 205 SkASSERT(info); |
210 // We can wrap a rendertarget without its allocation, as long as we don't ta
ke ownership | 206 // We can wrap a rendertarget without its allocation, as long as we don't ta
ke ownership |
211 SkASSERT(VK_NULL_HANDLE != info->fImage); | 207 SkASSERT(VK_NULL_HANDLE != info->fImage); |
212 SkASSERT(VK_NULL_HANDLE != info->fAlloc || kAdopted_LifeCycle != lifeCycle); | 208 SkASSERT(VK_NULL_HANDLE != info->fAlloc || kAdopt_GrWrapOwnership != ownersh
ip); |
213 | 209 |
214 GrVkImage::Resource::Flags flags = (VK_IMAGE_TILING_LINEAR == info->fImageTi
ling) | 210 GrVkImage::Resource::Flags flags = (VK_IMAGE_TILING_LINEAR == info->fImageTi
ling) |
215 ? Resource::kLinearTiling_Flag : Resource::
kNo_Flags; | 211 ? Resource::kLinearTiling_Flag : Resource::
kNo_Flags; |
216 | 212 |
217 const GrVkImage::Resource* imageResource; | 213 const GrVkImage::Resource* imageResource; |
218 if (kBorrowed_LifeCycle == lifeCycle) { | 214 if (kBorrow_GrWrapOwnership == ownership) { |
219 imageResource = new GrVkImage::BorrowedResource(info->fImage, info->fAll
oc, flags); | 215 imageResource = new GrVkImage::BorrowedResource(info->fImage, info->fAll
oc, flags); |
220 } else { | 216 } else { |
221 imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, flag
s); | 217 imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, flag
s); |
222 } | 218 } |
223 if (!imageResource) { | 219 if (!imageResource) { |
224 return nullptr; | 220 return nullptr; |
225 } | 221 } |
226 | 222 |
227 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, desc, lifeCycle, imageR
esource); | 223 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, SkBudgeted::kNo, desc,
imageResource); |
228 if (rt) { | 224 if (rt) { |
229 rt->fCurrentLayout = info->fImageLayout; | 225 rt->fCurrentLayout = info->fImageLayout; |
230 } | 226 } |
231 // Create() will increment the refCount of the image resource if it succeeds | 227 // Create() will increment the refCount of the image resource if it succeeds |
232 imageResource->unref(gpu); | 228 imageResource->unref(gpu); |
233 | 229 |
234 return rt; | 230 return rt; |
235 } | 231 } |
236 | 232 |
237 bool GrVkRenderTarget::completeStencilAttachment() { | 233 bool GrVkRenderTarget::completeStencilAttachment() { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 fFramebuffer = nullptr; | 353 fFramebuffer = nullptr; |
358 } | 354 } |
359 if (fCachedSimpleRenderPass) { | 355 if (fCachedSimpleRenderPass) { |
360 fCachedSimpleRenderPass->unrefAndAbandon(); | 356 fCachedSimpleRenderPass->unrefAndAbandon(); |
361 fCachedSimpleRenderPass = nullptr; | 357 fCachedSimpleRenderPass = nullptr; |
362 } | 358 } |
363 } | 359 } |
364 | 360 |
365 void GrVkRenderTarget::onRelease() { | 361 void GrVkRenderTarget::onRelease() { |
366 this->releaseInternalObjects(); | 362 this->releaseInternalObjects(); |
367 if (this->shouldFreeResources()) { | 363 this->releaseImage(this->getVkGpu()); |
368 this->releaseImage(this->getVkGpu()); | |
369 } else { | |
370 this->abandonImage(); | |
371 } | |
372 | |
373 GrRenderTarget::onRelease(); | 364 GrRenderTarget::onRelease(); |
374 } | 365 } |
375 | 366 |
376 void GrVkRenderTarget::onAbandon() { | 367 void GrVkRenderTarget::onAbandon() { |
377 this->abandonInternalObjects(); | 368 this->abandonInternalObjects(); |
378 this->abandonImage(); | 369 this->abandonImage(); |
379 GrRenderTarget::onAbandon(); | 370 GrRenderTarget::onAbandon(); |
380 } | 371 } |
381 | 372 |
382 | 373 |
(...skipping 20 matching lines...) Expand all Loading... |
403 } | 394 } |
404 | 395 |
405 return nullptr; | 396 return nullptr; |
406 } | 397 } |
407 | 398 |
408 | 399 |
409 GrVkGpu* GrVkRenderTarget::getVkGpu() const { | 400 GrVkGpu* GrVkRenderTarget::getVkGpu() const { |
410 SkASSERT(!this->wasDestroyed()); | 401 SkASSERT(!this->wasDestroyed()); |
411 return static_cast<GrVkGpu*>(this->getGpu()); | 402 return static_cast<GrVkGpu*>(this->getGpu()); |
412 } | 403 } |
OLD | NEW |