OLD | NEW |
(Empty) | |
| 1 /* |
| 2 * Copyright 2015 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 #include "GrVkTexture.h" |
| 9 #include "GrVkGpu.h" |
| 10 #include "GrVkImageView.h" |
| 11 #include "GrVkUtil.h" |
| 12 |
| 13 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) |
| 14 |
| 15 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. |
| 16 GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
| 17 const GrSurfaceDesc& desc, |
| 18 GrGpuResource::LifeCycle lifeCycle, |
| 19 const GrVkImage::Resource* imageResource, |
| 20 const GrVkImageView* view) |
| 21 : GrSurface(gpu, lifeCycle, desc) |
| 22 , GrVkImage(imageResource) |
| 23 , INHERITED(gpu, lifeCycle, desc) |
| 24 , fTextureView(view) { |
| 25 this->registerWithCache(); |
| 26 } |
| 27 |
| 28 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. |
| 29 GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
| 30 const GrSurfaceDesc& desc, |
| 31 GrGpuResource::LifeCycle lifeCycle, |
| 32 const GrVkImage::Resource* imageResource, |
| 33 const GrVkImageView* view, |
| 34 Derived) |
| 35 : GrSurface(gpu, lifeCycle, desc) |
| 36 , GrVkImage(imageResource) |
| 37 , INHERITED(gpu, lifeCycle, desc) |
| 38 , fTextureView(view) {} |
| 39 |
| 40 |
| 41 GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, |
| 42 const GrSurfaceDesc& desc, |
| 43 GrGpuResource::LifeCycle lifeCycle, |
| 44 VkFormat format, |
| 45 const GrVkImage::Resource* imageResource) { |
| 46 VkImage image = imageResource->fImage; |
| 47 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, |
| 48 GrVkImageView::kColor
_Type); |
| 49 if (!imageView) { |
| 50 return nullptr; |
| 51 } |
| 52 |
| 53 return new GrVkTexture(gpu, desc, lifeCycle, imageResource, imageView); |
| 54 } |
| 55 |
| 56 GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, const GrSurfaceDesc& de
sc, |
| 57 GrGpuResource::LifeCycle lifeCycle, |
| 58 const GrVkImage::ImageDesc& imageDesc
) { |
| 59 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); |
| 60 |
| 61 const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, im
ageDesc); |
| 62 if (!imageResource) { |
| 63 return nullptr; |
| 64 } |
| 65 |
| 66 GrVkTexture* texture = Create(gpu, desc, lifeCycle, imageDesc.fFormat, image
Resource); |
| 67 // Create() will increment the refCount of the image resource if it succeeds |
| 68 imageResource->unref(gpu); |
| 69 |
| 70 return texture; |
| 71 } |
| 72 |
| 73 GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, const GrSurfaceDesc
& desc, |
| 74 GrGpuResource::LifeCycle lifeCycl
e, |
| 75 VkFormat format, |
| 76 const GrVkImage::Resource* imageR
esource) { |
| 77 SkASSERT(imageResource); |
| 78 |
| 79 // Note: we assume the caller will unref the imageResource |
| 80 // Create() will increment the refCount, and we'll unref when we're done wit
h it |
| 81 return Create(gpu, desc, lifeCycle, format, imageResource); |
| 82 } |
| 83 |
| 84 GrVkTexture::~GrVkTexture() { |
| 85 // either release or abandon should have been called by the owner of this ob
ject. |
| 86 SkASSERT(!fTextureView); |
| 87 } |
| 88 |
| 89 void GrVkTexture::onRelease() { |
| 90 // we create this and don't hand it off, so we should always destroy it |
| 91 if (fTextureView) { |
| 92 fTextureView->unref(this->getVkGpu()); |
| 93 fTextureView = nullptr; |
| 94 } |
| 95 |
| 96 if (this->shouldFreeResources()) { |
| 97 this->releaseImage(this->getVkGpu()); |
| 98 } else { |
| 99 this->abandonImage(); |
| 100 } |
| 101 |
| 102 INHERITED::onRelease(); |
| 103 } |
| 104 |
| 105 void GrVkTexture::onAbandon() { |
| 106 if (fTextureView) { |
| 107 fTextureView->unrefAndAbandon(); |
| 108 fTextureView = nullptr; |
| 109 } |
| 110 |
| 111 this->abandonImage(); |
| 112 INHERITED::onAbandon(); |
| 113 } |
| 114 |
| 115 GrBackendObject GrVkTexture::getTextureHandle() const { |
| 116 // Currently just passing back the pointer to the Resource as the handle |
| 117 return (GrBackendObject)&fResource; |
| 118 } |
| 119 |
| 120 GrVkGpu* GrVkTexture::getVkGpu() const { |
| 121 SkASSERT(!this->wasDestroyed()); |
| 122 return static_cast<GrVkGpu*>(this->getGpu()); |
| 123 } |
| 124 |
OLD | NEW |