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 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 dsAllocateInfo.pNext = nullptr; | 214 dsAllocateInfo.pNext = nullptr; |
215 dsAllocateInfo.descriptorPool = fUniformDescPool->descPool(); | 215 dsAllocateInfo.descriptorPool = fUniformDescPool->descPool(); |
216 dsAllocateInfo.descriptorSetCount = 1; | 216 dsAllocateInfo.descriptorSetCount = 1; |
217 dsAllocateInfo.pSetLayouts = &fUniformDescLayout; | 217 dsAllocateInfo.pSetLayouts = &fUniformDescLayout; |
218 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), AllocateDescriptorSets(fGpu->device
(), | 218 GR_VK_CALL_ERRCHECK(fGpu->vkInterface(), AllocateDescriptorSets(fGpu->device
(), |
219 &dsAllocateI
nfo, | 219 &dsAllocateI
nfo, |
220 ds)); | 220 ds)); |
221 *outPool = fUniformDescPool; | 221 *outPool = fUniformDescPool; |
222 } | 222 } |
223 | 223 |
224 GrVkPrimaryCommandBuffer* GrVkResourceProvider::createPrimaryCommandBuffer() { | 224 GrVkPrimaryCommandBuffer* GrVkResourceProvider::findOrCreatePrimaryCommandBuffer
() { |
225 GrVkPrimaryCommandBuffer* cmdBuffer = GrVkPrimaryCommandBuffer::Create(fGpu,
fGpu->cmdPool()); | 225 GrVkPrimaryCommandBuffer* cmdBuffer = nullptr; |
| 226 int count = fAvailableCommandBuffers.count(); |
| 227 if (count > 0) { |
| 228 cmdBuffer = fAvailableCommandBuffers[count -1]; |
| 229 SkASSERT(cmdBuffer->finished(fGpu)); |
| 230 fAvailableCommandBuffers.removeShuffle(count - 1); |
| 231 } else { |
| 232 cmdBuffer = GrVkPrimaryCommandBuffer::Create(fGpu, fGpu->cmdPool()); |
| 233 } |
226 fActiveCommandBuffers.push_back(cmdBuffer); | 234 fActiveCommandBuffers.push_back(cmdBuffer); |
227 cmdBuffer->ref(); | 235 cmdBuffer->ref(); |
228 return cmdBuffer; | 236 return cmdBuffer; |
229 } | 237 } |
230 | 238 |
231 void GrVkResourceProvider::checkCommandBuffers() { | 239 void GrVkResourceProvider::checkCommandBuffers() { |
232 for (int i = fActiveCommandBuffers.count()-1; i >= 0; --i) { | 240 for (int i = fActiveCommandBuffers.count()-1; i >= 0; --i) { |
233 if (fActiveCommandBuffers[i]->finished(fGpu)) { | 241 if (fActiveCommandBuffers[i]->finished(fGpu)) { |
234 fActiveCommandBuffers[i]->unref(fGpu); | 242 GrVkPrimaryCommandBuffer* cmdBuffer = fActiveCommandBuffers[i]; |
| 243 cmdBuffer->reset(fGpu); |
| 244 fAvailableCommandBuffers.push_back(cmdBuffer); |
235 fActiveCommandBuffers.removeShuffle(i); | 245 fActiveCommandBuffers.removeShuffle(i); |
236 } | 246 } |
237 } | 247 } |
238 } | 248 } |
239 | 249 |
| 250 GrVkSecondaryCommandBuffer* GrVkResourceProvider::findOrCreateSecondaryCommandBu
ffer() { |
| 251 GrVkSecondaryCommandBuffer* cmdBuffer = nullptr; |
| 252 int count = fAvailableSecondaryCommandBuffers.count(); |
| 253 if (count > 0) { |
| 254 cmdBuffer = fAvailableSecondaryCommandBuffers[count-1]; |
| 255 fAvailableSecondaryCommandBuffers.removeShuffle(count - 1); |
| 256 } else { |
| 257 cmdBuffer = GrVkSecondaryCommandBuffer::Create(fGpu, fGpu->cmdPool()); |
| 258 } |
| 259 return cmdBuffer; |
| 260 } |
| 261 |
| 262 void GrVkResourceProvider::recycleSecondaryCommandBuffer(GrVkSecondaryCommandBuf
fer* cb) { |
| 263 cb->reset(fGpu); |
| 264 fAvailableSecondaryCommandBuffers.push_back(cb); |
| 265 } |
| 266 |
240 void GrVkResourceProvider::destroyResources() { | 267 void GrVkResourceProvider::destroyResources() { |
241 // release our current command buffers | 268 // release our active command buffers |
242 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { | 269 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { |
243 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); | 270 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); |
244 SkASSERT(fActiveCommandBuffers[i]->unique()); | 271 SkASSERT(fActiveCommandBuffers[i]->unique()); |
245 fActiveCommandBuffers[i]->unref(fGpu); | 272 fActiveCommandBuffers[i]->unref(fGpu); |
246 } | 273 } |
247 fActiveCommandBuffers.reset(); | 274 fActiveCommandBuffers.reset(); |
| 275 // release our available command buffers |
| 276 for (int i = 0; i < fAvailableCommandBuffers.count(); ++i) { |
| 277 SkASSERT(fAvailableCommandBuffers[i]->finished(fGpu)); |
| 278 SkASSERT(fAvailableCommandBuffers[i]->unique()); |
| 279 fAvailableCommandBuffers[i]->unref(fGpu); |
| 280 } |
| 281 fAvailableCommandBuffers.reset(); |
| 282 |
| 283 // release our available secondary command buffers |
| 284 for (int i = 0; i < fAvailableSecondaryCommandBuffers.count(); ++i) { |
| 285 SkASSERT(fAvailableSecondaryCommandBuffers[i]->unique()); |
| 286 fAvailableSecondaryCommandBuffers[i]->unref(fGpu); |
| 287 } |
| 288 fAvailableSecondaryCommandBuffers.reset(); |
248 | 289 |
249 // loop over all render pass sets to make sure we destroy all the internal V
kRenderPasses | 290 // loop over all render pass sets to make sure we destroy all the internal V
kRenderPasses |
250 for (int i = 0; i < fRenderPassArray.count(); ++i) { | 291 for (int i = 0; i < fRenderPassArray.count(); ++i) { |
251 fRenderPassArray[i].releaseResources(fGpu); | 292 fRenderPassArray[i].releaseResources(fGpu); |
252 } | 293 } |
253 fRenderPassArray.reset(); | 294 fRenderPassArray.reset(); |
254 | 295 |
255 // Iterate through all store GrVkSamplers and unref them before resetting th
e hash. | 296 // Iterate through all store GrVkSamplers and unref them before resetting th
e hash. |
256 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); | 297 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); |
257 for (; !iter.done(); ++iter) { | 298 for (; !iter.done(); ++iter) { |
258 (*iter).unref(fGpu); | 299 (*iter).unref(fGpu); |
259 } | 300 } |
260 fSamplers.reset(); | 301 fSamplers.reset(); |
261 | 302 |
262 fPipelineStateCache->release(); | 303 fPipelineStateCache->release(); |
263 | 304 |
264 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); | 305 GR_VK_CALL(fGpu->vkInterface(), DestroyPipelineCache(fGpu->device(), fPipeli
neCache, nullptr)); |
265 fPipelineCache = VK_NULL_HANDLE; | 306 fPipelineCache = VK_NULL_HANDLE; |
266 | 307 |
267 if (fUniformDescLayout) { | 308 if (fUniformDescLayout) { |
268 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), | 309 GR_VK_CALL(fGpu->vkInterface(), DestroyDescriptorSetLayout(fGpu->device(
), |
269 fUniformDescL
ayout, | 310 fUniformDescL
ayout, |
270 nullptr)); | 311 nullptr)); |
271 fUniformDescLayout = VK_NULL_HANDLE; | 312 fUniformDescLayout = VK_NULL_HANDLE; |
272 } | 313 } |
273 fUniformDescPool->unref(fGpu); | 314 fUniformDescPool->unref(fGpu); |
274 | 315 |
275 #ifdef SK_TRACE_VK_RESOURCES | 316 #ifdef SK_TRACE_VK_RESOURCES |
| 317 if (GrVkResource::fTrace.count()) { |
| 318 SkTDynamicHash<GrVkResource, uint32_t>::Iter iter(&GrVkResource::fTrace)
; |
| 319 for (; !iter.done(); ++iter) { |
| 320 (*iter).dumpInfo(); |
| 321 } |
| 322 } |
276 SkASSERT(0 == GrVkResource::fTrace.count()); | 323 SkASSERT(0 == GrVkResource::fTrace.count()); |
277 #endif | 324 #endif |
278 } | 325 } |
279 | 326 |
280 void GrVkResourceProvider::abandonResources() { | 327 void GrVkResourceProvider::abandonResources() { |
281 // release our current command buffers | 328 // release our active command buffers |
282 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { | 329 for (int i = 0; i < fActiveCommandBuffers.count(); ++i) { |
283 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); | 330 SkASSERT(fActiveCommandBuffers[i]->finished(fGpu)); |
| 331 SkASSERT(fActiveCommandBuffers[i]->unique()); |
284 fActiveCommandBuffers[i]->unrefAndAbandon(); | 332 fActiveCommandBuffers[i]->unrefAndAbandon(); |
285 } | 333 } |
286 fActiveCommandBuffers.reset(); | 334 fActiveCommandBuffers.reset(); |
| 335 // release our available command buffers |
| 336 for (int i = 0; i < fAvailableCommandBuffers.count(); ++i) { |
| 337 SkASSERT(fAvailableCommandBuffers[i]->finished(fGpu)); |
| 338 SkASSERT(fAvailableCommandBuffers[i]->unique()); |
| 339 fAvailableCommandBuffers[i]->unrefAndAbandon(); |
| 340 } |
| 341 fAvailableCommandBuffers.reset(); |
| 342 |
| 343 // release our available secondary command buffers |
| 344 for (int i = 0; i < fAvailableSecondaryCommandBuffers.count(); ++i) { |
| 345 SkASSERT(fAvailableSecondaryCommandBuffers[i]->unique()); |
| 346 fAvailableSecondaryCommandBuffers[i]->unrefAndAbandon(); |
| 347 } |
| 348 fAvailableSecondaryCommandBuffers.reset(); |
287 | 349 |
288 // loop over all render pass sets to make sure we destroy all the internal V
kRenderPasses | 350 // loop over all render pass sets to make sure we destroy all the internal V
kRenderPasses |
289 for (int i = 0; i < fRenderPassArray.count(); ++i) { | 351 for (int i = 0; i < fRenderPassArray.count(); ++i) { |
290 fRenderPassArray[i].abandonResources(); | 352 fRenderPassArray[i].abandonResources(); |
291 } | 353 } |
292 fRenderPassArray.reset(); | 354 fRenderPassArray.reset(); |
293 | 355 |
294 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re
setting the hash. | 356 // Iterate through all store GrVkSamplers and unrefAndAbandon them before re
setting the hash. |
295 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); | 357 SkTDynamicHash<GrVkSampler, uint16_t>::Iter iter(&fSamplers); |
296 for (; !iter.done(); ++iter) { | 358 for (; !iter.done(); ++iter) { |
297 (*iter).unrefAndAbandon(); | 359 (*iter).unrefAndAbandon(); |
298 } | 360 } |
299 fSamplers.reset(); | 361 fSamplers.reset(); |
300 | 362 |
301 fPipelineStateCache->abandon(); | 363 fPipelineStateCache->abandon(); |
302 | 364 |
303 fPipelineCache = VK_NULL_HANDLE; | 365 fPipelineCache = VK_NULL_HANDLE; |
304 | 366 |
305 fUniformDescLayout = VK_NULL_HANDLE; | 367 fUniformDescLayout = VK_NULL_HANDLE; |
306 fUniformDescPool->unrefAndAbandon(); | 368 fUniformDescPool->unrefAndAbandon(); |
307 | 369 |
308 #ifdef SK_TRACE_VK_RESOURCES | 370 #ifdef SK_TRACE_VK_RESOURCES |
| 371 if (GrVkResource::fTrace.count()) { |
| 372 SkTDynamicHash<GrVkResource, uint32_t>::Iter iter(&GrVkResource::fTrace)
; |
| 373 for (; !iter.done(); ++iter) { |
| 374 (*iter).dumpInfo(); |
| 375 } |
| 376 } |
309 SkASSERT(0 == GrVkResource::fTrace.count()); | 377 SkASSERT(0 == GrVkResource::fTrace.count()); |
310 #endif | 378 #endif |
311 } | 379 } |
312 | 380 |
313 //////////////////////////////////////////////////////////////////////////////// | 381 //////////////////////////////////////////////////////////////////////////////// |
314 | 382 |
315 GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet( | 383 GrVkResourceProvider::CompatibleRenderPassSet::CompatibleRenderPassSet( |
316 const GrVkG
pu* gpu, | 384 const GrVkG
pu* gpu, |
317 const GrVkR
enderTarget& target) | 385 const GrVkR
enderTarget& target) |
318 : fLastReturnedIndex(0) { | 386 : fLastReturnedIndex(0) { |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 } | 424 } |
357 | 425 |
358 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { | 426 void GrVkResourceProvider::CompatibleRenderPassSet::abandonResources() { |
359 for (int i = 0; i < fRenderPasses.count(); ++i) { | 427 for (int i = 0; i < fRenderPasses.count(); ++i) { |
360 if (fRenderPasses[i]) { | 428 if (fRenderPasses[i]) { |
361 fRenderPasses[i]->unrefAndAbandon(); | 429 fRenderPasses[i]->unrefAndAbandon(); |
362 fRenderPasses[i] = nullptr; | 430 fRenderPasses[i] = nullptr; |
363 } | 431 } |
364 } | 432 } |
365 } | 433 } |
OLD | NEW |