1/* 2 * Copyright 2015 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8#include "GrOp.h" 9 10#include "GrMemoryPool.h" 11#include "SkSpinlock.h" 12 13// TODO I noticed a small benefit to using a larger exclusive pool for ops. Its very small, but 14// seems to be mostly consistent. There is a lot in flux right now, but we should really revisit 15// this. 16 17 18// We use a global pool protected by a mutex(spinlock). Chrome may use the same GrContext on 19// different threads. The GrContext is not used concurrently on different threads and there is a 20// memory barrier between accesses of a context on different threads. Also, there may be multiple 21// GrContexts and those contexts may be in use concurrently on different threads. 22namespace { 23#if !defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) 24static SkSpinlock gOpPoolSpinLock; 25#endif 26class MemoryPoolAccessor { 27public: 28 29// We know in the Android framework there is only one GrContext. 30#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK) 31 MemoryPoolAccessor() {} 32 ~MemoryPoolAccessor() {} 33#else 34 MemoryPoolAccessor() { gOpPoolSpinLock.acquire(); } 35 ~MemoryPoolAccessor() { gOpPoolSpinLock.release(); } 36#endif 37 38 GrMemoryPool* pool() const { 39 static GrMemoryPool gPool(16384, 16384); 40 return &gPool; 41 } 42}; 43} 44 45int32_t GrOp::gCurrOpClassID = GrOp::kIllegalOpID; 46 47int32_t GrOp::gCurrOpUniqueID = GrOp::kIllegalOpID; 48 49void* GrOp::operator new(size_t size) { 50 return MemoryPoolAccessor().pool()->allocate(size); 51} 52 53void GrOp::operator delete(void* target) { 54 return MemoryPoolAccessor().pool()->release(target); 55} 56 57GrOp::GrOp(uint32_t classID) 58 : fClassID(classID) 59 , fUniqueID(kIllegalOpID) { 60 SkASSERT(classID == SkToU32(fClassID)); 61 SkDEBUGCODE(fBoundsFlags = kUninitialized_BoundsFlag); 62} 63 64GrOp::~GrOp() {} 65