1 /* 2 * Copyright 2012 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 "GrEffect.h" 9 #include "GrBackendEffectFactory.h" 10 #include "GrContext.h" 11 #include "GrMemoryPool.h" 12 #include "SkTLS.h" 13 14 SK_DEFINE_INST_COUNT(GrEffect) 15 16 #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 17 SkTArray<GrEffectTestFactory*, true>* GrEffectTestFactory::GetFactories() { 18 static SkTArray<GrEffectTestFactory*, true> gFactories; 19 return &gFactories; 20 } 21 #endif 22 23 namespace GrEffectUnitTest { 24 const SkMatrix& TestMatrix(SkRandom* random) { 25 static SkMatrix gMatrices[5]; 26 static bool gOnce; 27 if (!gOnce) { 28 gMatrices[0].reset(); 29 gMatrices[1].setTranslate(SkIntToScalar(-100), SkIntToScalar(100)); 30 gMatrices[2].setRotate(SkIntToScalar(17)); 31 gMatrices[3].setRotate(SkIntToScalar(185)); 32 gMatrices[3].postTranslate(SkIntToScalar(66), SkIntToScalar(-33)); 33 gMatrices[3].postScale(SkIntToScalar(2), SK_ScalarHalf); 34 gMatrices[4].setRotate(SkIntToScalar(215)); 35 gMatrices[4].set(SkMatrix::kMPersp0, SkFloatToScalar(0.00013f)); 36 gMatrices[4].set(SkMatrix::kMPersp1, SkFloatToScalar(-0.000039f)); 37 gOnce = true; 38 } 39 return gMatrices[random->nextULessThan(static_cast<uint32_t>(SK_ARRAY_COUNT(gMatrices)))]; 40 } 41 } 42 43 class GrEffect_Globals { 44 public: 45 static GrMemoryPool* GetTLS() { 46 return (GrMemoryPool*)SkTLS::Get(CreateTLS, DeleteTLS); 47 } 48 49 private: 50 static void* CreateTLS() { 51 return SkNEW_ARGS(GrMemoryPool, (4096, 4096)); 52 } 53 54 static void DeleteTLS(void* pool) { 55 SkDELETE(reinterpret_cast<GrMemoryPool*>(pool)); 56 } 57 }; 58 59 int32_t GrBackendEffectFactory::fCurrEffectClassID = GrBackendEffectFactory::kIllegalEffectClassID; 60 61 /////////////////////////////////////////////////////////////////////////////// 62 63 SK_DEFINE_INST_COUNT(GrEffectRef) 64 65 GrEffectRef::~GrEffectRef() { 66 GrAssert(1 == this->getRefCnt()); 67 fEffect->EffectRefDestroyed(); 68 fEffect->unref(); 69 } 70 71 void* GrEffectRef::operator new(size_t size) { 72 return GrEffect_Globals::GetTLS()->allocate(size); 73 } 74 75 void GrEffectRef::operator delete(void* target) { 76 GrEffect_Globals::GetTLS()->release(target); 77 } 78 79 /////////////////////////////////////////////////////////////////////////////// 80 81 GrEffect::~GrEffect() { 82 GrAssert(NULL == fEffectRef); 83 } 84 85 const char* GrEffect::name() const { 86 return this->getFactory().name(); 87 } 88 89 void GrEffect::addTextureAccess(const GrTextureAccess* access) { 90 fTextureAccesses.push_back(access); 91 } 92 93 void* GrEffect::operator new(size_t size) { 94 return GrEffect_Globals::GetTLS()->allocate(size); 95 } 96 97 void GrEffect::operator delete(void* target) { 98 GrEffect_Globals::GetTLS()->release(target); 99 } 100