aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/batches/GrOp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gpu/batches/GrOp.cpp')
-rw-r--r--src/gpu/batches/GrOp.cpp63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/gpu/batches/GrOp.cpp b/src/gpu/batches/GrOp.cpp
new file mode 100644
index 0000000000..1d86419c77
--- /dev/null
+++ b/src/gpu/batches/GrOp.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2015 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#include "GrOp.h"
+
+#include "GrMemoryPool.h"
+#include "SkSpinlock.h"
+
+// TODO I noticed a small benefit to using a larger exclusive pool for ops. Its very small, but
+// seems to be mostly consistent. There is a lot in flux right now, but we should really revisit
+// this.
+
+
+// We use a global pool protected by a mutex(spinlock). Chrome may use the same GrContext on
+// different threads. The GrContext is not used concurrently on different threads and there is a
+// memory barrier between accesses of a context on different threads. Also, there may be multiple
+// GrContexts and those contexts may be in use concurrently on different threads.
+namespace {
+static SkSpinlock gOpPoolSpinLock;
+class MemoryPoolAccessor {
+public:
+
+// We know in the Android framework there is only one GrContext.
+#if defined(SK_BUILD_FOR_ANDROID_FRAMEWORK)
+ MemoryPoolAccessor() {}
+ ~MemoryPoolAccessor() {}
+#else
+ MemoryPoolAccessor() { gOpPoolSpinLock.acquire(); }
+ ~MemoryPoolAccessor() { gOpPoolSpinLock.release(); }
+#endif
+
+ GrMemoryPool* pool() const {
+ static GrMemoryPool gPool(16384, 16384);
+ return &gPool;
+ }
+};
+}
+
+int32_t GrOp::gCurrOpClassID = GrOp::kIllegalOpID;
+
+int32_t GrOp::gCurrOpUniqueID = GrOp::kIllegalOpID;
+
+void* GrOp::operator new(size_t size) {
+ return MemoryPoolAccessor().pool()->allocate(size);
+}
+
+void GrOp::operator delete(void* target) {
+ return MemoryPoolAccessor().pool()->release(target);
+}
+
+GrOp::GrOp(uint32_t classID)
+ : fClassID(classID)
+ , fUniqueID(kIllegalOpID) {
+ SkASSERT(classID == SkToU32(fClassID));
+ SkDEBUGCODE(fUsed = false;)
+ SkDEBUGCODE(fBoundsFlags = kUninitialized_BoundsFlag);
+}
+
+GrOp::~GrOp() {}