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