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