| 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, | 215 imageResource = new GrVkImage::BorrowedResource(info->fImage, |
| 220 info->fAlloc, | 216 info->fAlloc, |
| 221 flags, | 217 flags, |
| 222 info->fFormat); | 218 info->fFormat); |
| 223 } else { | 219 } else { |
| 224 imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, flag
s, info->fFormat); | 220 imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, flag
s, info->fFormat); |
| 225 } | 221 } |
| 226 if (!imageResource) { | 222 if (!imageResource) { |
| 227 return nullptr; | 223 return nullptr; |
| 228 } | 224 } |
| 229 | 225 |
| 230 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, desc, lifeCycle, imageR
esource); | 226 GrVkRenderTarget* rt = GrVkRenderTarget::Create(gpu, SkBudgeted::kNo, desc,
imageResource); |
| 231 if (rt) { | 227 if (rt) { |
| 232 rt->fCurrentLayout = info->fImageLayout; | 228 rt->fCurrentLayout = info->fImageLayout; |
| 233 } | 229 } |
| 234 // Create() will increment the refCount of the image resource if it succeeds | 230 // Create() will increment the refCount of the image resource if it succeeds |
| 235 imageResource->unref(gpu); | 231 imageResource->unref(gpu); |
| 236 | 232 |
| 237 return rt; | 233 return rt; |
| 238 } | 234 } |
| 239 | 235 |
| 240 bool GrVkRenderTarget::completeStencilAttachment() { | 236 bool GrVkRenderTarget::completeStencilAttachment() { |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 fFramebuffer = nullptr; | 356 fFramebuffer = nullptr; |
| 361 } | 357 } |
| 362 if (fCachedSimpleRenderPass) { | 358 if (fCachedSimpleRenderPass) { |
| 363 fCachedSimpleRenderPass->unrefAndAbandon(); | 359 fCachedSimpleRenderPass->unrefAndAbandon(); |
| 364 fCachedSimpleRenderPass = nullptr; | 360 fCachedSimpleRenderPass = nullptr; |
| 365 } | 361 } |
| 366 } | 362 } |
| 367 | 363 |
| 368 void GrVkRenderTarget::onRelease() { | 364 void GrVkRenderTarget::onRelease() { |
| 369 this->releaseInternalObjects(); | 365 this->releaseInternalObjects(); |
| 370 if (this->shouldFreeResources()) { | 366 this->releaseImage(this->getVkGpu()); |
| 371 this->releaseImage(this->getVkGpu()); | |
| 372 } else { | |
| 373 this->abandonImage(); | |
| 374 } | |
| 375 | |
| 376 GrRenderTarget::onRelease(); | 367 GrRenderTarget::onRelease(); |
| 377 } | 368 } |
| 378 | 369 |
| 379 void GrVkRenderTarget::onAbandon() { | 370 void GrVkRenderTarget::onAbandon() { |
| 380 this->abandonInternalObjects(); | 371 this->abandonInternalObjects(); |
| 381 this->abandonImage(); | 372 this->abandonImage(); |
| 382 GrRenderTarget::onAbandon(); | 373 GrRenderTarget::onAbandon(); |
| 383 } | 374 } |
| 384 | 375 |
| 385 | 376 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 406 } | 397 } |
| 407 | 398 |
| 408 return nullptr; | 399 return nullptr; |
| 409 } | 400 } |
| 410 | 401 |
| 411 | 402 |
| 412 GrVkGpu* GrVkRenderTarget::getVkGpu() const { | 403 GrVkGpu* GrVkRenderTarget::getVkGpu() const { |
| 413 SkASSERT(!this->wasDestroyed()); | 404 SkASSERT(!this->wasDestroyed()); |
| 414 return static_cast<GrVkGpu*>(this->getGpu()); | 405 return static_cast<GrVkGpu*>(this->getGpu()); |
| 415 } | 406 } |
| OLD | NEW |