Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/gpu/vk/GrVkTexture.cpp

Issue 1925303002: Add mipmap loading to Vulkan. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Some fixups and notes for future work Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/gpu/vk/GrVkTexture.h ('K') | « src/gpu/vk/GrVkTexture.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« src/gpu/vk/GrVkTexture.h ('K') | « src/gpu/vk/GrVkTexture.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698