| 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 "GrVkTexture.h" | 8 #include "GrVkTexture.h" |
| 9 #include "GrVkGpu.h" | 9 #include "GrVkGpu.h" |
| 10 #include "GrVkImageView.h" | 10 #include "GrVkImageView.h" |
| 11 #include "GrTexturePriv.h" | 11 #include "GrTexturePriv.h" |
| 12 #include "GrVkUtil.h" | 12 #include "GrVkUtil.h" |
| 13 #include "SkMipMap.h" | |
| 14 | 13 |
| 15 #include "vk/GrVkTypes.h" | 14 #include "vk/GrVkTypes.h" |
| 16 | 15 |
| 17 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) | 16 #define VK_CALL(GPU, X) GR_VK_CALL(GPU->vkInterface(), X) |
| 18 | 17 |
| 19 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. | 18 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. |
| 20 GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 19 GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
| 21 SkBudgeted budgeted, | 20 SkBudgeted budgeted, |
| 22 const GrSurfaceDesc& desc, | 21 const GrSurfaceDesc& desc, |
| 23 const GrVkImage::Resource* imageResource, | 22 const GrVkImage::Resource* imageResource, |
| 24 const GrVkImageView* view) | 23 const GrVkImageView* view) |
| 25 : GrSurface(gpu, desc) | 24 : GrSurface(gpu, desc) |
| 26 , GrVkImage(imageResource) | 25 , GrVkImage(imageResource) |
| 27 , INHERITED(gpu, desc, kSampler2D_GrSLType, | 26 , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) |
| 28 false) // false because we don't upload MIP data in Vk yet | |
| 29 , fTextureView(view) { | 27 , fTextureView(view) { |
| 30 this->registerWithCache(budgeted); | 28 this->registerWithCache(budgeted); |
| 31 } | 29 } |
| 32 | 30 |
| 33 GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 31 GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
| 34 Wrapped, | 32 Wrapped, |
| 35 const GrSurfaceDesc& desc, | 33 const GrSurfaceDesc& desc, |
| 36 const GrVkImage::Resource* imageResource, | 34 const GrVkImage::Resource* imageResource, |
| 37 const GrVkImageView* view) | 35 const GrVkImageView* view) |
| 38 : GrSurface(gpu, desc) | 36 : GrSurface(gpu, desc) |
| 39 , GrVkImage(imageResource) | 37 , GrVkImage(imageResource) |
| 40 , INHERITED(gpu, desc, kSampler2D_GrSLType, | 38 , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) |
| 41 false) // false because we don't upload MIP data in Vk yet | |
| 42 , fTextureView(view) { | 39 , fTextureView(view) { |
| 43 this->registerWithCacheWrapped(); | 40 this->registerWithCacheWrapped(); |
| 44 } | 41 } |
| 45 | 42 |
| 46 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. | 43 // Because this class is virtually derived from GrSurface we must explicitly cal
l its constructor. |
| 47 GrVkTexture::GrVkTexture(GrVkGpu* gpu, | 44 GrVkTexture::GrVkTexture(GrVkGpu* gpu, |
| 48 const GrSurfaceDesc& desc, | 45 const GrSurfaceDesc& desc, |
| 49 const GrVkImage::Resource* imageResource, | 46 const GrVkImage::Resource* imageResource, |
| 50 const GrVkImageView* view) | 47 const GrVkImageView* view) |
| 51 : GrSurface(gpu, desc) | 48 : GrSurface(gpu, desc) |
| 52 , GrVkImage(imageResource) | 49 , GrVkImage(imageResource) |
| 53 , INHERITED(gpu, desc, kSampler2D_GrSLType, | 50 , INHERITED(gpu, desc, kSampler2D_GrSLType, desc.fIsMipMapped) |
| 54 false) // false because we don't upload MIP data in Vk yet | |
| 55 , fTextureView(view) {} | 51 , fTextureView(view) {} |
| 56 | 52 |
| 57 | 53 |
| 58 template<typename ResourceType> | 54 template<typename ResourceType> |
| 59 GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, | 55 GrVkTexture* GrVkTexture::Create(GrVkGpu* gpu, |
| 60 ResourceType type, | 56 ResourceType type, |
| 61 const GrSurfaceDesc& desc, | 57 const GrSurfaceDesc& desc, |
| 62 VkFormat format, | 58 VkFormat format, uint32_t levels, |
| 63 const GrVkImage::Resource* imageResource) { | 59 const GrVkImage::Resource* imageResource) { |
| 64 VkImage image = imageResource->fImage; | 60 VkImage image = imageResource->fImage; |
| 65 | 61 |
| 66 uint32_t mipLevels = 1; | |
| 67 // TODO: enable when mipLevel loading is implemented in GrVkGpu | |
| 68 //if (desc.fIsMipMapped) { | |
| 69 // mipLevels = SkMipMap::ComputeLevelCount(this->width(), this->height())
; | |
| 70 //} | |
| 71 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, | 62 const GrVkImageView* imageView = GrVkImageView::Create(gpu, image, format, |
| 72 GrVkImageView::kColor
_Type, mipLevels); | 63 GrVkImageView::kColor
_Type, |
| 64 levels); |
| 73 if (!imageView) { | 65 if (!imageView) { |
| 74 return nullptr; | 66 return nullptr; |
| 75 } | 67 } |
| 76 | 68 |
| 77 return new GrVkTexture(gpu, type, desc, imageResource, imageView); | 69 return new GrVkTexture(gpu, type, desc, imageResource, imageView); |
| 78 } | 70 } |
| 79 | 71 |
| 80 GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, | 72 GrVkTexture* GrVkTexture::CreateNewTexture(GrVkGpu* gpu, SkBudgeted budgeted, |
| 81 const GrSurfaceDesc& desc, | 73 const GrSurfaceDesc& desc, |
| 82 const GrVkImage::ImageDesc& imageDesc
) { | 74 const GrVkImage::ImageDesc& imageDesc
) { |
| 83 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); | 75 SkASSERT(imageDesc.fUsageFlags & VK_IMAGE_USAGE_SAMPLED_BIT); |
| 84 | 76 |
| 85 const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, im
ageDesc); | 77 const GrVkImage::Resource* imageResource = GrVkImage::CreateResource(gpu, im
ageDesc); |
| 86 if (!imageResource) { | 78 if (!imageResource) { |
| 87 return nullptr; | 79 return nullptr; |
| 88 } | 80 } |
| 89 | 81 |
| 90 GrVkTexture* texture = Create(gpu, budgeted, desc, imageDesc.fFormat, imageR
esource); | 82 GrVkTexture* texture = Create(gpu, budgeted, desc, imageDesc.fFormat, imageD
esc.fLevels, |
| 83 imageResource); |
| 91 // Create() will increment the refCount of the image resource if it succeeds | 84 // Create() will increment the refCount of the image resource if it succeeds |
| 92 imageResource->unref(gpu); | 85 imageResource->unref(gpu); |
| 93 | 86 |
| 94 return texture; | 87 return texture; |
| 95 } | 88 } |
| 96 | 89 |
| 97 GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, | 90 GrVkTexture* GrVkTexture::CreateWrappedTexture(GrVkGpu* gpu, |
| 98 const GrSurfaceDesc& desc, | 91 const GrSurfaceDesc& desc, |
| 99 GrWrapOwnership ownership, | 92 GrWrapOwnership ownership, |
| 100 VkFormat format, | 93 VkFormat format, |
| (...skipping 11 matching lines...) Expand all Loading... |
| 112 info->fAlloc, | 105 info->fAlloc, |
| 113 flags, | 106 flags, |
| 114 info->fFormat); | 107 info->fFormat); |
| 115 } else { | 108 } else { |
| 116 imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, flag
s, info->fFormat); | 109 imageResource = new GrVkImage::Resource(info->fImage, info->fAlloc, flag
s, info->fFormat); |
| 117 } | 110 } |
| 118 if (!imageResource) { | 111 if (!imageResource) { |
| 119 return nullptr; | 112 return nullptr; |
| 120 } | 113 } |
| 121 | 114 |
| 122 GrVkTexture* texture = Create(gpu, kWrapped, desc, format, imageResource); | 115 // We have no other information so we have to assume that wrapped textures h
ave only one level |
| 116 GrVkTexture* texture = Create(gpu, kWrapped, desc, format, 1, imageResource)
; |
| 123 if (texture) { | 117 if (texture) { |
| 124 texture->fCurrentLayout = info->fImageLayout; | 118 texture->fCurrentLayout = info->fImageLayout; |
| 125 } | 119 } |
| 126 // Create() will increment the refCount of the image resource if it succeeds | 120 // Create() will increment the refCount of the image resource if it succeeds |
| 127 imageResource->unref(gpu); | 121 imageResource->unref(gpu); |
| 128 | 122 |
| 129 return texture; | 123 return texture; |
| 130 } | 124 } |
| 131 | 125 |
| 132 GrVkTexture::~GrVkTexture() { | 126 GrVkTexture::~GrVkTexture() { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 159 GrBackendObject GrVkTexture::getTextureHandle() const { | 153 GrBackendObject GrVkTexture::getTextureHandle() const { |
| 160 // Currently just passing back the pointer to the Resource as the handle | 154 // Currently just passing back the pointer to the Resource as the handle |
| 161 return (GrBackendObject)&fResource; | 155 return (GrBackendObject)&fResource; |
| 162 } | 156 } |
| 163 | 157 |
| 164 GrVkGpu* GrVkTexture::getVkGpu() const { | 158 GrVkGpu* GrVkTexture::getVkGpu() const { |
| 165 SkASSERT(!this->wasDestroyed()); | 159 SkASSERT(!this->wasDestroyed()); |
| 166 return static_cast<GrVkGpu*>(this->getGpu()); | 160 return static_cast<GrVkGpu*>(this->getGpu()); |
| 167 } | 161 } |
| 168 | 162 |
| 169 bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu) { | 163 bool GrVkTexture::reallocForMipmap(const GrVkGpu* gpu, uint32_t mipLevels) { |
| 164 if (mipLevels == 1) { |
| 165 // don't need to do anything for a 1x1 texture |
| 166 return false; |
| 167 } |
| 168 |
| 170 const GrVkImage::Resource* oldResource = fResource; | 169 const GrVkImage::Resource* oldResource = fResource; |
| 171 | 170 |
| 171 // We shouldn't realloc something that doesn't belong to us |
| 172 if (GrVkImage::Resource::kBorrowed_Flag & oldResource->fFlags) { |
| 173 return false; |
| 174 } |
| 175 |
| 172 // Does this even make sense for rendertargets? | 176 // Does this even make sense for rendertargets? |
| 173 bool renderTarget = SkToBool(fDesc.fFlags & kRenderTarget_GrSurfaceFlag); | 177 bool renderTarget = SkToBool(fDesc.fFlags & kRenderTarget_GrSurfaceFlag); |
| 174 | 178 |
| 175 VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT; | 179 VkImageUsageFlags usageFlags = VK_IMAGE_USAGE_SAMPLED_BIT; |
| 176 if (renderTarget) { | 180 if (renderTarget) { |
| 177 usageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; | 181 usageFlags |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; |
| 178 } | 182 } |
| 179 usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_
BIT; | 183 usageFlags |= VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_
BIT; |
| 180 | 184 |
| 181 uint32_t mipLevels = SkMipMap::ComputeLevelCount(this->width(), this->height
()); | |
| 182 if (mipLevels == 1) { | |
| 183 // don't need to do anything for a 1x1 texture | |
| 184 return false; | |
| 185 } | |
| 186 | |
| 187 GrVkImage::ImageDesc imageDesc; | 185 GrVkImage::ImageDesc imageDesc; |
| 188 imageDesc.fImageType = VK_IMAGE_TYPE_2D; | 186 imageDesc.fImageType = VK_IMAGE_TYPE_2D; |
| 189 imageDesc.fFormat = oldResource->fFormat; | 187 imageDesc.fFormat = oldResource->fFormat; |
| 190 imageDesc.fWidth = fDesc.fWidth; | 188 imageDesc.fWidth = fDesc.fWidth; |
| 191 imageDesc.fHeight = fDesc.fHeight; | 189 imageDesc.fHeight = fDesc.fHeight; |
| 192 imageDesc.fLevels = mipLevels; | 190 imageDesc.fLevels = mipLevels; |
| 193 imageDesc.fSamples = 1; | 191 imageDesc.fSamples = 1; |
| 194 imageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL; | 192 imageDesc.fImageTiling = VK_IMAGE_TILING_OPTIMAL; |
| 195 imageDesc.fUsageFlags = usageFlags; | 193 imageDesc.fUsageFlags = usageFlags; |
| 196 imageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; | 194 imageDesc.fMemProps = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 211 } | 209 } |
| 212 | 210 |
| 213 oldResource->unref(gpu); | 211 oldResource->unref(gpu); |
| 214 oldView->unref(gpu); | 212 oldView->unref(gpu); |
| 215 fResource = imageResource; | 213 fResource = imageResource; |
| 216 fTextureView = textureView; | 214 fTextureView = textureView; |
| 217 this->texturePriv().setMaxMipMapLevel(mipLevels); | 215 this->texturePriv().setMaxMipMapLevel(mipLevels); |
| 218 | 216 |
| 219 return true; | 217 return true; |
| 220 } | 218 } |
| OLD | NEW |