Chromium Code Reviews| 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 "GrVkMemory.h" | 8 #include "GrVkMemory.h" |
| 9 | 9 |
| 10 #include "GrVkGpu.h" | 10 #include "GrVkGpu.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 75 } | 75 } |
| 76 | 76 |
| 77 GrVkHeap* heap = gpu->getHeap(buffer_type_to_heap(type)); | 77 GrVkHeap* heap = gpu->getHeap(buffer_type_to_heap(type)); |
| 78 | 78 |
| 79 if (!heap->alloc(memReqs.size, memReqs.alignment, typeIndex, alloc)) { | 79 if (!heap->alloc(memReqs.size, memReqs.alignment, typeIndex, alloc)) { |
| 80 SkDebugf("Failed to alloc buffer\n"); | 80 SkDebugf("Failed to alloc buffer\n"); |
| 81 return false; | 81 return false; |
| 82 } | 82 } |
| 83 | 83 |
| 84 // Bind Memory to device | 84 // Bind Memory to device |
| 85 VkResult err = GR_VK_CALL(iface, BindBufferMemory(device, buffer, | 85 VkResult err = GR_VK_CALL(iface, BindBufferMemory(device, buffer, |
| 86 alloc->fMemory, alloc->fOf fset)); | 86 alloc->fMemory, alloc->fOf fset)); |
| 87 if (err) { | 87 if (err) { |
| 88 SkASSERT_RELEASE(heap->free(*alloc)); | 88 SkASSERT_RELEASE(heap->free(*alloc)); |
| 89 return false; | 89 return false; |
| 90 } | 90 } |
| 91 | 91 |
| 92 return true; | 92 return true; |
| 93 } | 93 } |
| 94 | 94 |
| 95 void GrVkMemory::FreeBufferMemory(const GrVkGpu* gpu, GrVkBuffer::Type type, | 95 void GrVkMemory::FreeBufferMemory(const GrVkGpu* gpu, GrVkBuffer::Type type, |
| (...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 422 alloc->fMemory = fAlloc; | 422 alloc->fMemory = fAlloc; |
| 423 return INHERITED::alloc(size, &alloc->fOffset, &alloc->fSize); | 423 return INHERITED::alloc(size, &alloc->fOffset, &alloc->fSize); |
| 424 } | 424 } |
| 425 | 425 |
| 426 void GrVkSubHeap::free(const GrVkAlloc& alloc) { | 426 void GrVkSubHeap::free(const GrVkAlloc& alloc) { |
| 427 SkASSERT(alloc.fMemory == fAlloc); | 427 SkASSERT(alloc.fMemory == fAlloc); |
| 428 | 428 |
| 429 INHERITED::free(alloc.fOffset, alloc.fSize); | 429 INHERITED::free(alloc.fOffset, alloc.fSize); |
| 430 } | 430 } |
| 431 | 431 |
| 432 bool GrVkHeap::subAlloc(VkDeviceSize size, VkDeviceSize alignment, | 432 bool GrVkHeap::subAlloc(VkDeviceSize size, VkDeviceSize alignment, |
| 433 uint32_t memoryTypeIndex, GrVkAlloc* alloc) { | 433 uint32_t memoryTypeIndex, GrVkAlloc* alloc) { |
| 434 VkDeviceSize alignedSize = align_size(size, alignment); | 434 VkDeviceSize alignedSize = align_size(size, alignment); |
| 435 | 435 |
| 436 // if requested is larger than our subheap allocation, just alloc directly | 436 // if requested is larger than our subheap allocation, just alloc directly |
| 437 if (alignedSize > fSubHeapSize) { | 437 if (alignedSize > fSubHeapSize) { |
| 438 VkMemoryAllocateInfo allocInfo = { | 438 VkMemoryAllocateInfo allocInfo = { |
| 439 VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // sType | 439 VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO, // sType |
| 440 NULL, // pNext | 440 NULL, // pNext |
| 441 size, // allocationSize | 441 size, // allocationSize |
| 442 memoryTypeIndex, // memoryTypeIndex | 442 memoryTypeIndex, // memoryTypeIndex |
| 443 }; | 443 }; |
| 444 | 444 |
| 445 VkResult err = GR_VK_CALL(fGpu->vkInterface(), AllocateMemory(fGpu->devi ce(), | 445 VkResult err = GR_VK_CALL(fGpu->vkInterface(), AllocateMemory(fGpu->devi ce(), |
| 446 &allocInfo , | 446 &allocInfo , |
| 447 nullptr, | 447 nullptr, |
| 448 &alloc->fM emory)); | 448 &alloc->fM emory)); |
| 449 if (VK_SUCCESS != err) { | 449 if (VK_SUCCESS != err) { |
| 450 return false; | 450 return false; |
| 451 } | 451 } |
| 452 alloc->fOffset = 0; | 452 alloc->fOffset = 0; |
| 453 alloc->fSize = 0; // hint that this is not a subheap allocation | 453 alloc->fSize = 0; // hint that this is not a subheap allocation |
| 454 | 454 |
| 455 return true; | 455 return true; |
| 456 } | 456 } |
| 457 | 457 |
| 458 // first try to find a subheap that fits our allocation request | 458 // first try to find a subheap that fits our allocation request |
| 459 int bestFitIndex = -1; | 459 int bestFitIndex = -1; |
| 460 VkDeviceSize bestFitSize = 0x7FFFFFFF; | 460 VkDeviceSize bestFitSize = 0x7FFFFFFF; |
| 461 for (auto i = 0; i < fSubHeaps.count(); ++i) { | 461 for (auto i = 0; i < fSubHeaps.count(); ++i) { |
| 462 if (fSubHeaps[i]->memoryTypeIndex() == memoryTypeIndex) { | 462 if (fSubHeaps[i]->memoryTypeIndex() == memoryTypeIndex && |
| 463 fSubHeaps[i]->alignment() == alignment) { | |
| 463 VkDeviceSize heapSize = fSubHeaps[i]->largestBlockSize(); | 464 VkDeviceSize heapSize = fSubHeaps[i]->largestBlockSize(); |
| 464 if (heapSize >= alignedSize && heapSize < bestFitSize) { | 465 if (heapSize >= alignedSize && heapSize < bestFitSize) { |
| 465 bestFitIndex = i; | 466 bestFitIndex = i; |
| 466 bestFitSize = heapSize; | 467 bestFitSize = heapSize; |
| 467 } | 468 } |
| 468 } | 469 } |
| 469 } | 470 } |
| 470 | 471 |
| 471 if (bestFitIndex >= 0) { | 472 if (bestFitIndex >= 0) { |
| 472 SkASSERT(fSubHeaps[bestFitIndex]->alignment() == alignment); | 473 SkASSERT(fSubHeaps[bestFitIndex]->alignment() == alignment); |
|
egdaniel
2016/08/10 14:46:04
This assert fires without the change
| |
| 473 if (fSubHeaps[bestFitIndex]->alloc(size, alloc)) { | 474 if (fSubHeaps[bestFitIndex]->alloc(size, alloc)) { |
| 474 fUsedSize += alloc->fSize; | 475 fUsedSize += alloc->fSize; |
| 475 return true; | 476 return true; |
| 476 } | 477 } |
| 477 return false; | 478 return false; |
| 478 } | 479 } |
| 479 | 480 |
| 480 // need to allocate a new subheap | 481 // need to allocate a new subheap |
| 481 SkAutoTDelete<GrVkSubHeap>& subHeap = fSubHeaps.push_back(); | 482 SkAutoTDelete<GrVkSubHeap>& subHeap = fSubHeaps.push_back(); |
| 482 subHeap.reset(new GrVkSubHeap(fGpu, memoryTypeIndex, fSubHeapSize, alignment )); | 483 subHeap.reset(new GrVkSubHeap(fGpu, memoryTypeIndex, fSubHeapSize, alignment )); |
| 483 // try to recover from failed allocation by only allocating what we need | 484 // try to recover from failed allocation by only allocating what we need |
| 484 if (subHeap->size() == 0) { | 485 if (subHeap->size() == 0) { |
| 485 VkDeviceSize alignedSize = align_size(size, alignment); | 486 VkDeviceSize alignedSize = align_size(size, alignment); |
| 486 subHeap.reset(new GrVkSubHeap(fGpu, memoryTypeIndex, alignedSize, alignm ent)); | 487 subHeap.reset(new GrVkSubHeap(fGpu, memoryTypeIndex, alignedSize, alignm ent)); |
| 487 if (subHeap->size() == 0) { | 488 if (subHeap->size() == 0) { |
| 488 return false; | 489 return false; |
| 489 } | 490 } |
| 490 } | 491 } |
| 491 fAllocSize += fSubHeapSize; | 492 fAllocSize += fSubHeapSize; |
| 492 if (subHeap->alloc(size, alloc)) { | 493 if (subHeap->alloc(size, alloc)) { |
| 493 fUsedSize += alloc->fSize; | 494 fUsedSize += alloc->fSize; |
| 494 return true; | 495 return true; |
| 495 } | 496 } |
| 496 | 497 |
| 497 return false; | 498 return false; |
| 498 } | 499 } |
| 499 | 500 |
| 500 bool GrVkHeap::singleAlloc(VkDeviceSize size, VkDeviceSize alignment, | 501 bool GrVkHeap::singleAlloc(VkDeviceSize size, VkDeviceSize alignment, |
| 501 uint32_t memoryTypeIndex, GrVkAlloc* alloc) { | 502 uint32_t memoryTypeIndex, GrVkAlloc* alloc) { |
| 502 VkDeviceSize alignedSize = align_size(size, alignment); | 503 VkDeviceSize alignedSize = align_size(size, alignment); |
| 503 | 504 |
| 504 // first try to find an unallocated subheap that fits our allocation request | 505 // first try to find an unallocated subheap that fits our allocation request |
| 505 int bestFitIndex = -1; | 506 int bestFitIndex = -1; |
| 506 VkDeviceSize bestFitSize = 0x7FFFFFFF; | 507 VkDeviceSize bestFitSize = 0x7FFFFFFF; |
| 507 for (auto i = 0; i < fSubHeaps.count(); ++i) { | 508 for (auto i = 0; i < fSubHeaps.count(); ++i) { |
| 508 if (fSubHeaps[i]->memoryTypeIndex() == memoryTypeIndex && fSubHeaps[i]-> unallocated()) { | 509 if (fSubHeaps[i]->memoryTypeIndex() == memoryTypeIndex && |
| 510 fSubHeaps[i]->alignment() == alignment && | |
| 511 fSubHeaps[i]->unallocated()) { | |
| 509 VkDeviceSize heapSize = fSubHeaps[i]->size(); | 512 VkDeviceSize heapSize = fSubHeaps[i]->size(); |
| 510 if (heapSize >= alignedSize && heapSize < bestFitSize) { | 513 if (heapSize >= alignedSize && heapSize < bestFitSize) { |
| 511 bestFitIndex = i; | 514 bestFitIndex = i; |
| 512 bestFitSize = heapSize; | 515 bestFitSize = heapSize; |
| 513 } | 516 } |
| 514 } | 517 } |
| 515 } | 518 } |
| 516 | 519 |
| 517 if (bestFitIndex >= 0) { | 520 if (bestFitIndex >= 0) { |
| 518 SkASSERT(fSubHeaps[bestFitIndex]->alignment() == alignment); | 521 SkASSERT(fSubHeaps[bestFitIndex]->alignment() == alignment); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 548 fSubHeaps[i]->free(alloc); | 551 fSubHeaps[i]->free(alloc); |
| 549 fUsedSize -= alloc.fSize; | 552 fUsedSize -= alloc.fSize; |
| 550 return true; | 553 return true; |
| 551 } | 554 } |
| 552 } | 555 } |
| 553 | 556 |
| 554 return false; | 557 return false; |
| 555 } | 558 } |
| 556 | 559 |
| 557 | 560 |
| OLD | NEW |