OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 "GrVkResourceProvider.h" | 8 #include "GrVkResourceProvider.h" |
9 | 9 |
10 #include "GrTextureParams.h" | 10 #include "GrTextureParams.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) | 22 GrVkResourceProvider::GrVkResourceProvider(GrVkGpu* gpu) |
23 : fGpu(gpu) | 23 : fGpu(gpu) |
24 , fPipelineCache(VK_NULL_HANDLE) | 24 , fPipelineCache(VK_NULL_HANDLE) |
25 , fUniformDescPool(nullptr) | 25 , fUniformDescPool(nullptr) |
26 , fCurrentUniformDescCount(0) { | 26 , fCurrentUniformDescCount(0) { |
27 fPipelineStateCache = new PipelineStateCache(gpu); | 27 fPipelineStateCache = new PipelineStateCache(gpu); |
28 } | 28 } |
29 | 29 |
30 GrVkResourceProvider::~GrVkResourceProvider() { | 30 GrVkResourceProvider::~GrVkResourceProvider() { |
31 SkASSERT(0 == fSimpleRenderPasses.count()); | 31 SkASSERT(0 == fRenderPassArray.count()); |
32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); | 32 SkASSERT(VK_NULL_HANDLE == fPipelineCache); |
33 delete fPipelineStateCache; | 33 delete fPipelineStateCache; |
34 } | 34 } |
35 | 35 |
36 void GrVkResourceProvider::initUniformDescObjects() { | 36 void GrVkResourceProvider::initUniformDescObjects() { |
37 // Create Uniform Buffer Descriptor | 37 // Create Uniform Buffer Descriptor |
38 // The vertex uniform buffer will have binding 0 and the fragment binding 1. | 38 // The vertex uniform buffer will have binding 0 and the fragment binding 1. |
39 VkDescriptorSetLayoutBinding dsUniBindings[2]; | 39 VkDescriptorSetLayoutBinding dsUniBindings[2]; |
40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding)); | 40 memset(&dsUniBindings, 0, 2 * sizeof(VkDescriptorSetLayoutBinding)); |
41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding; | 41 dsUniBindings[0].binding = GrVkUniformHandler::kVertexBinding; |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 | 95 |
96 return GrVkPipeline::Create(fGpu, pipeline, primProc, shaderStageInfo, shade
rStageCount, | 96 return GrVkPipeline::Create(fGpu, pipeline, primProc, shaderStageInfo, shade
rStageCount, |
97 primitiveType, renderPass, layout, fPipelineCach
e); | 97 primitiveType, renderPass, layout, fPipelineCach
e); |
98 } | 98 } |
99 | 99 |
100 | 100 |
101 // To create framebuffers, we first need to create a simple RenderPass that is | 101 // To create framebuffers, we first need to create a simple RenderPass that is |
102 // only used for framebuffer creation. When we actually render we will create | 102 // only used for framebuffer creation. When we actually render we will create |
103 // RenderPasses as needed that are compatible with the framebuffer. | 103 // RenderPasses as needed that are compatible with the framebuffer. |
104 const GrVkRenderPass* | 104 const GrVkRenderPass* |
105 GrVkResourceProvider::findOrCreateCompatibleRenderPass(const GrVkRenderTarget& t
arget) { | 105 GrVkResourceProvider::findCompatibleRenderPass(const GrVkRenderTarget& target, |
106 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { | 106 CompatibleRPHandle* compatibleHan
dle) { |
107 GrVkRenderPass* renderPass = fSimpleRenderPasses[i]; | 107 for (int i = 0; i < fRenderPassArray.count(); ++i) { |
108 if (renderPass->isCompatible(target)) { | 108 if (fRenderPassArray[i].isCompatible(target)) { |
| 109 const GrVkRenderPass* renderPass = fRenderPassArray[i].getCompatible
RenderPass(); |
109 renderPass->ref(); | 110 renderPass->ref(); |
| 111 if (compatibleHandle) { |
| 112 *compatibleHandle = CompatibleRPHandle(i); |
| 113 } |
110 return renderPass; | 114 return renderPass; |
111 } | 115 } |
112 } | 116 } |
113 | 117 |
114 GrVkRenderPass* renderPass = new GrVkRenderPass(); | 118 const GrVkRenderPass* renderPass = |
115 renderPass->initSimple(fGpu, target); | 119 fRenderPassArray.emplace_back(fGpu, target).getCompatibleRenderPass(); |
116 fSimpleRenderPasses.push_back(renderPass); | 120 renderPass->ref(); |
| 121 |
| 122 if (compatibleHandle) { |
| 123 *compatibleHandle = CompatibleRPHandle(fRenderPassArray.count() - 1); |
| 124 } |
| 125 return renderPass; |
| 126 } |
| 127 |
| 128 const GrVkRenderPass* |
| 129 GrVkResourceProvider::findCompatibleRenderPass(const CompatibleRPHandle& compati
bleHandle) { |
| 130 SkASSERT(compatibleHandle.isValid() && compatibleHandle.toIndex() < fRenderP
assArray.count()); |
| 131 int index = compatibleHandle.toIndex(); |
| 132 const GrVkRenderPass* renderPass = fRenderPassArray[index].getCompatibleRend
erPass(); |
117 renderPass->ref(); | 133 renderPass->ref(); |
118 return renderPass; | 134 return renderPass; |
119 } | 135 } |
120 | 136 |
121 GrVkDescriptorPool* GrVkResourceProvider::findOrCreateCompatibleDescriptorPool( | 137 GrVkDescriptorPool* GrVkResourceProvider::findOrCreateCompatibleDescriptorPool( |
122 VkDescriptorType typ
e, uint32_t count) { | 138 VkDescriptorType typ
e, uint32_t count) { |
123 return new GrVkDescriptorPool(fGpu, type, count); | 139 return new GrVkDescriptorPool(fGpu, type, count); |
124 } | 140 } |
125 | 141 |
126 GrVkSampler* GrVkResourceProvider::findOrCreateCompatibleSampler(const GrTexture
Params& params, | 142 GrVkSampler* GrVkResourceProvider::findOrCreateCompatibleSampler(const GrTexture
Params& params, |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 | 207 |
192 void GrVkResourceProvider::destroyResources() { | 208 void GrVkResourceProvider::destroyResources() { |
193 // release our current command buffers | 209 // release our current command buffers |
194 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { | 210 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { |
195 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); | 211 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); |
196 SkASSERT(fActiveCommandBuffers[i]->unique()); | 212 SkASSERT(fActiveCommandBuffers[i]->unique()); |
197 fActiveCommandBuffers[i]->unref(fGpu); | 213 fActiveCommandBuffers[i]->unref(fGpu); |
198 } | 214 } |
199 fActiveCommandBuffers.reset(); | 215 fActiveCommandBuffers.reset(); |
200 | 216 |
201 // loop over all render passes to make sure we destroy all the internal VkRe
nderPasses | 217 // loop over all render pass sets to make sure we destroy all the internal V
kRenderPasses |
202 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { | 218 for (int i = 0; i < fRenderPassArray.count(); ++i) { |
203 fSimpleRenderPasses[i]->unref(fGpu); | 219 fRenderPassArray[i].releaseResources(fGpu); |
204 } | 220 } |
205 fSimpleRenderPasses.reset(); | 221 fRenderPassArray.reset(); |
206 | 222 |
207 // Iterate through all store GrVkSamplers and unref them before resetting th
e hash. | 223 // Iterate through all store GrVkSamplers and unref them before resetting th
e hash. |
208 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); | 224 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); |
209 for (; !iter.done(); ++iter) { | 225 for (; !iter.done(); ++iter) { |
210 (*iter).unref(fGpu); | 226 (*iter).unref(fGpu); |
211 } | 227 } |
212 fSamplers.reset(); | 228 fSamplers.reset(); |
213 | 229 |
214 fPipelineStateCache->release(); | 230 fPipelineStateCache->release(); |
215 | 231 |
(...skipping 14 matching lines...) Expand all Loading... |
230 } | 246 } |
231 | 247 |
232 void GrVkResourceProvider::abandonResources() { | 248 void GrVkResourceProvider::abandonResources() { |
233 // release our current command buffers | 249 // release our current command buffers |
234 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { | 250 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { |
235 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); | 251 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); |
236 fActiveCommandBuffers[i]->unrefAndAbandon(); | 252 fActiveCommandBuffers[i]->unrefAndAbandon(); |
237 } | 253 } |
238 fActiveCommandBuffers.reset(); | 254 fActiveCommandBuffers.reset(); |
239 | 255 |
240 for (int i = 0; i < fSimpleRenderPasses.count(); ++i) { | 256 // loop over all render pass sets to make sure we destroy all the internal V
kRenderPasses |
241 fSimpleRenderPasses[i]->unrefAndAbandon(); | 257 for (int i = 0; i < fRenderPassArray.count(); ++i) { |
| 258 fRenderPassArray[i].abandonResources(); |
242 } | 259 } |
243 fSimpleRenderPasses.reset(); | 260 fRenderPassArray.reset(); |
244 | 261 |
245 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re
setting the hash. | 262 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re
setting the hash. |
246 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); | 263 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); |
247 for (; !iter.done(); ++iter) { | 264 for (; !iter.done(); ++iter) { |
248 (*iter).unrefAndAbandon(); | 265 (*iter).unrefAndAbandon(); |
249 } | 266 } |
250 fSamplers.reset(); | 267 fSamplers.reset(); |
251 | 268 |
252 fPipelineStateCache->abandon(); | 269 fPipelineStateCache->abandon(); |
253 | 270 |
254 #ifdef SK_TRACE_VK_RESOURCES | 271 #ifdef SK_TRACE_VK_RESOURCES |
255 SkASSERT(0 == GrVkResource::fTrace.count()); | 272 SkASSERT(0 == GrVkResource::fTrace.count()); |
256 #endif | 273 #endif |
257 fPipelineCache = VK_NULL_HANDLE; | 274 fPipelineCache = VK_NULL_HANDLE; |
258 | 275 |
259 fUniformDescLayout = VK_NULL_HANDLE; | 276 fUniformDescLayout = VK_NULL_HANDLE; |
260 fUniformDescPool->unrefAndAbandon(); | 277 fUniformDescPool->unrefAndAbandon(); |
261 } | 278 } |
| 279 |
| 280 //////////////////////////////////////////////////////////////////////////////// |
| 281 |
| 282 GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet( |
| 283 const GrVkG
pu* gpu, |
| 284 const GrVkR
enderTarget& target) |
| 285 : fRenderPasses() { |
| 286 fRenderPasses[kLoadStore_LoadStoreOp] = new GrVkRenderPass(); |
| 287 fRenderPasses[kLoadStore_LoadStoreOp]->initSimple(gpu, target); |
| 288 } |
| 289 |
| 290 bool GrVkResourceProvider::CompatibleRenderPassSet::isCompatible( |
| 291 const GrVkRenderTar
get& target) const { |
| 292 SkASSERT(fRenderPasses[kLoadStore_LoadStoreOp]); |
| 293 return fRenderPasses[kLoadStore_LoadStoreOp]->isCompatible(target); |
| 294 } |
| 295 |
| 296 void GrVkResourceProvider::CompatibleRenderPassSet::releaseResources(const GrVkG
pu* gpu) { |
| 297 for (int i = 0; i < kLoadStoreOpCount; ++i) { |
| 298 if (fRenderPasses[i]) { |
| 299 fRenderPasses[i]->unref(gpu); |
| 300 fRenderPasses[i] = nullptr; |
| 301 } |
| 302 } |
| 303 } |
| 304 |
| 305 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { |
| 306 for (int i = 0; i < kLoadStoreOpCount; ++i) { |
| 307 if (fRenderPasses[i]) { |
| 308 fRenderPasses[i]->unrefAndAbandon(); |
| 309 fRenderPasses[i] = nullptr; |
| 310 } |
| 311 } |
| 312 } |
OLD | NEW |