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