1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This is a GPU-backend specific test. It relies on static intializers to work 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTypes.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#if SK_SUPPORT_GPU && defined(SK_VULKAN) 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContextPriv.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrContextFactory.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "GrTest.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Test.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "vk/GrVkGpu.h" 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotusing sk_gpu_test::GrContextFactory; 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid subheap_test(skiatest::Reporter* reporter, GrContext* context) { 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkGpu* gpu = static_cast<GrVkGpu*>(context->contextPriv().getGpu()); 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // memtype doesn't matter, we're just testing the suballocation algorithm so we'll use 0 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkSubHeap heap(gpu, 0, 0, 64 * 1024, 32); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkAlloc alloc0, alloc1, alloc2, alloc3; 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // test full allocation and free 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(64 * 1024, &alloc0)); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, alloc0.fOffset == 0); 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, alloc0.fSize == 64 * 1024); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 0 && heap.largestBlockSize() == 0); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 64*1024 && heap.largestBlockSize() == 64 * 1024); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // now let's suballoc some memory 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(16 * 1024, &alloc0)); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(23 * 1024, &alloc1)); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(18 * 1024, &alloc2)); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 7 * 1024 && heap.largestBlockSize() == 7 * 1024); 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free lone block 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 30 * 1024 && heap.largestBlockSize() == 23 * 1024); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // allocate into smallest free block 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(6 * 1024, &alloc3)); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 24 * 1024 && heap.largestBlockSize() == 23 * 1024); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // allocate into exact size free block 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(23 * 1024, &alloc1)); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 1 * 1024 && heap.largestBlockSize() == 1 * 1024); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free lone block 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 19 * 1024 && heap.largestBlockSize() == 18 * 1024); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free and merge with preceding block and following 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 25 * 1024 && heap.largestBlockSize() == 25 * 1024); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free and merge with following block 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 48 * 1024 && heap.largestBlockSize() == 48 * 1024); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free starting block and merge with following 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 64 * 1024 && heap.largestBlockSize() == 64 * 1024); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // realloc 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(4 * 1024, &alloc0)); 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(35 * 1024, &alloc1)); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(10 * 1024, &alloc2)); 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 15 * 1024 && heap.largestBlockSize() == 15 * 1024); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free starting block and merge with following 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 19 * 1024 && heap.largestBlockSize() == 15 * 1024); 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free block and merge with preceding 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 54 * 1024 && heap.largestBlockSize() == 39 * 1024); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // free block and merge with preceding and following 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 64 * 1024 && heap.largestBlockSize() == 64 * 1024); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // fragment 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(19 * 1024, &alloc0)); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(5 * 1024, &alloc1)); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(15 * 1024, &alloc2)); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(3 * 1024, &alloc3)); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 22 * 1024 && heap.largestBlockSize() == 22 * 1024); 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 41 * 1024 && heap.largestBlockSize() == 22 * 1024); 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 56 * 1024 && heap.largestBlockSize() == 22 * 1024); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, !heap.alloc(40 * 1024, &alloc0)); 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 59 * 1024 && heap.largestBlockSize() == 40 * 1024); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(40 * 1024, &alloc0)); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 19 * 1024 && heap.largestBlockSize() == 19 * 1024); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 24 * 1024 && heap.largestBlockSize() == 24 * 1024); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 64 * 1024 && heap.largestBlockSize() == 64 * 1024); 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // unaligned sizes 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(19 * 1024 - 31, &alloc0)); 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(5 * 1024 - 5, &alloc1)); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(15 * 1024 - 19, &alloc2)); 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(3 * 1024 - 3, &alloc3)); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 22 * 1024 && heap.largestBlockSize() == 22 * 1024); 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 41 * 1024 && heap.largestBlockSize() == 22 * 1024); 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 56 * 1024 && heap.largestBlockSize() == 22 * 1024); 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, !heap.alloc(40 * 1024, &alloc0)); 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 59 * 1024 && heap.largestBlockSize() == 40 * 1024); 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(40 * 1024, &alloc0)); 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 19 * 1024 && heap.largestBlockSize() == 19 * 1024); 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 24 * 1024 && heap.largestBlockSize() == 24 * 1024); 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.freeSize() == 64 * 1024 && heap.largestBlockSize() == 64 * 1024); 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid suballoc_test(skiatest::Reporter* reporter, GrContext* context) { 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkGpu* gpu = static_cast<GrVkGpu*>(context->contextPriv().getGpu()); 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // memtype/heap index don't matter, we're just testing the allocation algorithm so we'll use 0 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkHeap heap(gpu, GrVkHeap::kSubAlloc_Strategy, 64 * 1024); 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkAlloc alloc0, alloc1, alloc2, alloc3; 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const VkDeviceSize kAlignment = 16; 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const uint32_t kMemType = 0; 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const uint32_t kHeapIndex = 0; 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 0 && heap.usedSize() == 0); 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // fragment allocations so we need to grow heap 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(19 * 1024 - 3, kAlignment, kMemType, kHeapIndex, &alloc0)); 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(5 * 1024 - 9, kAlignment, kMemType, kHeapIndex, &alloc1)); 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(15 * 1024 - 15, kAlignment, kMemType, kHeapIndex, &alloc2)); 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(3 * 1024 - 6, kAlignment, kMemType, kHeapIndex, &alloc3)); 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 64 * 1024 && heap.usedSize() == 42 * 1024); 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 64 * 1024 && heap.usedSize() == 23 * 1024); 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 64 * 1024 && heap.usedSize() == 8 * 1024); 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // we expect the heap to grow here 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(40 * 1024, kAlignment, kMemType, kHeapIndex, &alloc0)); 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 48 * 1024); 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 45 * 1024); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should not grow here (first subheap has exactly enough room) 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(40 * 1024, kAlignment, kMemType, kHeapIndex, &alloc3)); 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 85 * 1024); 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should not grow here (second subheap has room) 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(22 * 1024, kAlignment, kMemType, kHeapIndex, &alloc2)); 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 107 * 1024); 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 102 * 1024); 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 62 * 1024); 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 40 * 1024); 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 0 * 1024); 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should not grow here (allocating more than subheap size) 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(128 * 1024, kAlignment, kMemType, kHeapIndex, &alloc0)); 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 0 * 1024); 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(24 * 1024, kAlignment, kMemType, kHeapIndex, &alloc0)); 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 128 * 1024 && heap.usedSize() == 24 * 1024); 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should alloc a new subheap because the memory type is different 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(24 * 1024, kAlignment, kMemType+1, kHeapIndex, &alloc1)); 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 192 * 1024 && heap.usedSize() == 48 * 1024); 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should alloc a new subheap because the alignment is different 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(24 * 1024, 128, kMemType, kHeapIndex, &alloc2)); 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 256 * 1024 && heap.usedSize() == 72 * 1024); 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 256 * 1024 && heap.usedSize() == 0 * 1024); 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotvoid singlealloc_test(skiatest::Reporter* reporter, GrContext* context) { 179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkGpu* gpu = static_cast<GrVkGpu*>(context->contextPriv().getGpu()); 180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // memtype/heap index don't matter, we're just testing the allocation algorithm so we'll use 0 182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkHeap heap(gpu, GrVkHeap::kSingleAlloc_Strategy, 64 * 1024); 183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot GrVkAlloc alloc0, alloc1, alloc2, alloc3; 184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const VkDeviceSize kAlignment = 64; 185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const uint32_t kMemType = 0; 186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const uint32_t kHeapIndex = 0; 187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 0 && heap.usedSize() == 0); 189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // make a few allocations 191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(49 * 1024 - 3, kAlignment, kMemType, kHeapIndex, &alloc0)); 192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(5 * 1024 - 37, kAlignment, kMemType, kHeapIndex, &alloc1)); 193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(15 * 1024 - 11, kAlignment, kMemType, kHeapIndex, &alloc2)); 194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(3 * 1024 - 29, kAlignment, kMemType, kHeapIndex, &alloc3)); 195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 72 * 1024); 196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 23 * 1024); 198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 8 * 1024); 200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should not grow here (first subheap has room) 201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(40 * 1024, kAlignment, kMemType, kHeapIndex, &alloc0)); 202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 48 * 1024); 203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 45 * 1024); 205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // check for exact fit -- heap should not grow here (third subheap has room) 206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(15 * 1024 - 63, kAlignment, kMemType, kHeapIndex, &alloc2)); 207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 60 * 1024); 208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 72 * 1024 && heap.usedSize() == 45 * 1024); 210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should grow here (no subheap has room) 211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(40 * 1024, kAlignment, kMemType, kHeapIndex, &alloc3)); 212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 112 * 1024 && heap.usedSize() == 85 * 1024); 213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 112 * 1024 && heap.usedSize() == 80 * 1024); 215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 112 * 1024 && heap.usedSize() == 40 * 1024); 217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc3); 218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 112 * 1024 && heap.usedSize() == 0 * 1024); 219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(24 * 1024, kAlignment, kMemType, kHeapIndex, &alloc0)); 220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 112 * 1024 && heap.usedSize() == 24 * 1024); 221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should alloc a new subheap because the memory type is different 222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(24 * 1024, kAlignment, kMemType + 1, kHeapIndex, &alloc1)); 223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 136 * 1024 && heap.usedSize() == 48 * 1024); 224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // heap should alloc a new subheap because the alignment is different 225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.alloc(24 * 1024, 128, kMemType, kHeapIndex, &alloc2)); 226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 160 * 1024 && heap.usedSize() == 72 * 1024); 227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc1); 228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc2); 229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot heap.free(alloc0); 230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot REPORTER_ASSERT(reporter, heap.allocSize() == 160 * 1024 && heap.usedSize() == 0 * 1024); 231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GPUTEST_FOR_VULKAN_CONTEXT(VkHeapTests, reporter, ctxInfo) { 234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot subheap_test(reporter, ctxInfo.grContext()); 235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot suballoc_test(reporter, ctxInfo.grContext()); 236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot singlealloc_test(reporter, ctxInfo.grContext()); 237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif 240