GrMemoryPoolTest.cpp revision cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2
14da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com/* 24da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * Copyright 2011 Google Inc. 34da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * 44da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * Use of this source code is governed by a BSD-style license that can be 54da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com * found in the LICENSE file. 64da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com */ 74da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 8cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com// This is a GPU-backend specific test 9cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#if SK_SUPPORT_GPU 10cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com 114da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "Test.h" 124da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "GrMemoryPool.h" 134da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkRandom.h" 144da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkTDArray.h" 154da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkTScopedPtr.h" 164da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "SkInstCnt.h" 174da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 184da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comnamespace { 194da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// A is the top of an inheritance tree of classes that overload op new and 204da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// and delete to use a GrMemoryPool. The objects have values of different types 214da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// that can be set and checked. 224da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass A { 234da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic: 244da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com A() {}; 254da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual void setValues(int v) { 264da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fChar = static_cast<char>(v); 274da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 284da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual bool checkValues(int v) { 294da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return fChar == static_cast<char>(v); 304da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 314da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual ~A() {}; 324da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 334da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com void* operator new(size_t size) { 344da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com if (!gPool.get()) { 354da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return ::operator new(size); 364da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } else { 374da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return gPool->allocate(size); 384da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 394da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 404da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 414da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com void operator delete(void* p) { 424da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com if (!gPool.get()) { 434da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com ::operator delete(p); 444da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } else { 454da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return gPool->release(p); 464da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 474da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 484da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 494da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com SK_DECLARE_INST_COUNT_ROOT(A); 504da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 514da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static A* Create(SkRandom* r); 524da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 534da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static void SetAllocator(size_t preallocSize, size_t minAllocSize) { 54b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#ifdef SK_ENABLE_INST_COUNT 554da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com SkASSERT(0 == GetInstanceCount()); 56b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#endif 574da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com GrMemoryPool* pool = new GrMemoryPool(preallocSize, minAllocSize); 584da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com gPool.reset(pool); 594da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 604da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 614da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static void ResetAllocator() { 62b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#ifdef SK_ENABLE_INST_COUNT 634da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com SkASSERT(0 == GetInstanceCount()); 64b74af872cc1ce45768df3ae03fa86ad3ed76b582robertphillips@google.com#endif 654da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com gPool.reset(NULL); 664da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 674da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 684da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate: 694da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static SkTScopedPtr<GrMemoryPool> gPool; 704da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com char fChar; 714da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}; 724da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comSK_DEFINE_INST_COUNT(A); 734da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comSkTScopedPtr<GrMemoryPool> A::gPool; 744da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 754da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass B : public A { 764da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic: 774da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com B() {}; 784da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual void setValues(int v) { 794da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fDouble = static_cast<double>(v); 804da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::setValues(v); 814da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 824da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual bool checkValues(int v) { 834da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return fDouble == static_cast<double>(v) && 844da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::checkValues(v); 854da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 864da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual ~B() {}; 874da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 884da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate: 894da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com double fDouble; 904da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 914da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com typedef A INHERITED; 924da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}; 934da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 944da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass C : public A { 954da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic: 964da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com C() {}; 974da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual void setValues(int v) { 984da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fInt64 = static_cast<int64_t>(v); 994da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::setValues(v); 1004da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1014da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual bool checkValues(int v) { 1024da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return fInt64 == static_cast<int64_t>(v) && 1034da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::checkValues(v); 1044da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1054da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual ~C() {}; 1064da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1074da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate: 1084da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com int64_t fInt64; 1094da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1104da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com typedef A INHERITED; 1114da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}; 1124da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1134da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com// D derives from C and owns a dynamically created B 1144da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass D : public C { 1154da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic: 1164da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com D() { 1174da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fB = new B(); 1184da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1194da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual void setValues(int v) { 1204da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fVoidStar = reinterpret_cast<void*>(v); 1214da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::setValues(v); 1224da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fB->setValues(v); 1234da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1244da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual bool checkValues(int v) { 1254da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return fVoidStar == reinterpret_cast<void*>(v) && 1264da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fB->checkValues(v) && 1274da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::checkValues(v); 1284da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1294da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual ~D() { 1304da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com delete fB; 1314da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1324da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate: 1334da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com void* fVoidStar; 1344da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com B* fB; 1354da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1364da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com typedef C INHERITED; 1374da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}; 1384da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1394da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comclass E : public A { 1404da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.compublic: 1414da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com E() {} 1424da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual void setValues(int v) { 1434da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (size_t i = 0; i < SK_ARRAY_COUNT(fIntArray); ++i) { 1444da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com fIntArray[i] = v; 1454da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1464da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com this->INHERITED::setValues(v); 1474da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1484da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual bool checkValues(int v) { 1494da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com bool ok = true; 1504da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (size_t i = 0; ok && i < SK_ARRAY_COUNT(fIntArray); ++i) { 1514da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com if (fIntArray[i] != v) { 1524da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com ok = false; 1534da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1544da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1554da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return ok && this->INHERITED::checkValues(v); 1564da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1574da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com virtual ~E() {} 1584da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comprivate: 1594da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com int fIntArray[20]; 1604da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1614da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com typedef A INHERITED; 1624da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}; 1634da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1644da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comA* A::Create(SkRandom* r) { 1654da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com switch (r->nextRangeU(0, 4)) { 1664da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com case 0: 1674da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return new A; 1684da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com case 1: 1694da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return new B; 1704da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com case 2: 1714da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return new C; 1724da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com case 3: 1734da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return new D; 1744da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com case 4: 1754da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return new E; 1764da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com default: 1774da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com // suppress warning 1784da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com return NULL; 1794da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 1804da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com} 1814da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com} 1824da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comstruct Rec { 1834da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com A* fInstance; 1844da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com int fValue; 1854da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com}; 1864da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 1874da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comstatic void test_memory_pool(skiatest::Reporter* reporter) { 1884da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com // prealloc and min alloc sizes for the pool 1894da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static const size_t gSizes[][2] = { 1904da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com {0, 0}, 1914da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com {10 * sizeof(A), 20 * sizeof(A)}, 1924da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com {100 * sizeof(A), 100 * sizeof(A)}, 1934da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com {500 * sizeof(A), 500 * sizeof(A)}, 1944da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com {10000 * sizeof(A), 0}, 1954da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com {1, 100 * sizeof(A)}, 1964da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com }; 1974da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com // different percentages of creation vs deletion 1984da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static const float gCreateFraction[] = {1.f, .95f, 0.75f, .5f}; 1994da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com // number of create/destroys per test 2004da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static const int kNumIters = 20000; 2014da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com // check that all the values stored in A objects are correct after this 2024da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com // number of iterations 2034da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com static const int kCheckPeriod = 500; 2044da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 2054da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com SkRandom r; 2064da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (size_t s = 0; s < SK_ARRAY_COUNT(gSizes); ++s) { 2074da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com A::SetAllocator(gSizes[s][0], gSizes[s][1]); 2084da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (size_t c = 0; c < SK_ARRAY_COUNT(gCreateFraction); ++c) { 2094da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com SkTDArray<Rec> instanceRecs; 2104da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (int i = 0; i < kNumIters; ++i) { 2114da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com float createOrDestroy = r.nextUScalar1(); 2124da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com if (createOrDestroy < gCreateFraction[c] || 2134da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 0 == instanceRecs.count()) { 2144da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com Rec* rec = instanceRecs.append(); 2154da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com rec->fInstance = A::Create(&r); 2164da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com rec->fValue = static_cast<int>(r.nextU()); 2174da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com rec->fInstance->setValues(rec->fValue); 2184da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } else { 2194da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com int d = r.nextRangeU(0, instanceRecs.count() - 1); 2204da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com Rec& rec = instanceRecs[d]; 2214da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com REPORTER_ASSERT(reporter, rec.fInstance->checkValues(rec.fValue)); 2224da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com delete rec.fInstance; 2234da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com instanceRecs.removeShuffle(d); 2244da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2254da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com if (0 == i % kCheckPeriod) { 2264da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (int r = 0; r < instanceRecs.count(); ++r) { 2274da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com Rec& rec = instanceRecs[r]; 2284da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com REPORTER_ASSERT(reporter, rec.fInstance->checkValues(rec.fValue)); 2294da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2304da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2314da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2324da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com for (int i = 0; i < instanceRecs.count(); ++i) { 2334da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com Rec& rec = instanceRecs[i]; 2344da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com REPORTER_ASSERT(reporter, rec.fInstance->checkValues(rec.fValue)); 2354da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com delete rec.fInstance; 2364da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2374da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#ifdef SK_DEBUG 2384da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com REPORTER_ASSERT(reporter, !A::GetInstanceCount()); 2394da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#endif 2404da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2414da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com } 2424da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com} 2434da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 2444da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com#include "TestClassDef.h" 2454da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.comDEFINE_TESTCLASS("GrMemoryPool", GrMemoryPoolClass, test_memory_pool) 2464da34e36cb7a07c3a28ae2a135b1837c26fc7aeabsalomon@google.com 247cf8fb1f6f03fc77f9927564f9ef9abeeeec508d2bsalomon@google.com#endif 248