OLD | NEW |
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 "GrProcessor.h" | |
9 #include "GrContext.h" | |
10 #include "GrCoordTransform.h" | |
11 #include "GrGeometryProcessor.h" | |
12 #include "GrInvariantOutput.h" | |
13 #include "GrMemoryPool.h" | |
14 #include "GrXferProcessor.h" | |
15 #include "SkSpinlock.h" | |
16 #include "gl/GrGLFragmentProcessor.h" | |
17 | |
18 #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS | |
19 | |
20 class GrFragmentProcessor; | |
21 class GrGeometryProcessor; | |
22 | 1 |
23 /* | 2 /* |
24 * Originally these were both in the processor unit test header, but then it see
med to cause linker | 3 * Copyright 2015 Google Inc. |
25 * problems on android. | 4 * |
26 */ | 5 * Use of this source code is governed by a BSD-style license that can be |
27 template<> | 6 * found in the LICENSE file. |
28 SkTArray<GrProcessorTestFactory<GrFragmentProcessor>*, true>* | 7 */ |
29 GrProcessorTestFactory<GrFragmentProcessor>::GetFactories() { | |
30 static SkTArray<GrProcessorTestFactory<GrFragmentProcessor>*, true> gFactori
es; | |
31 return &gFactories; | |
32 } | |
33 | 8 |
34 template<> | 9 #include "GrFragmentProcessor.h" |
35 SkTArray<GrProcessorTestFactory<GrXPFactory>*, true>* | 10 #include "GrCoordTransform.h" |
36 GrProcessorTestFactory<GrXPFactory>::GetFactories() { | 11 #include "gl/GrGLFragmentProcessor.h" |
37 static SkTArray<GrProcessorTestFactory<GrXPFactory>*, true> gFactories; | 12 #include "effects/GrXfermodeFragmentProcessor.h" |
38 return &gFactories; | |
39 } | |
40 | |
41 template<> | |
42 SkTArray<GrProcessorTestFactory<GrGeometryProcessor>*, true>* | |
43 GrProcessorTestFactory<GrGeometryProcessor>::GetFactories() { | |
44 static SkTArray<GrProcessorTestFactory<GrGeometryProcessor>*, true> gFactori
es; | |
45 return &gFactories; | |
46 } | |
47 | |
48 /* | |
49 * To ensure we always have successful static initialization, before creating fr
om the factories | |
50 * we verify the count is as expected. If a new factory is added, then these nu
mbers must be | |
51 * manually adjusted. | |
52 */ | |
53 static const int kFPFactoryCount = 38; | |
54 static const int kGPFactoryCount = 14; | |
55 static const int kXPFactoryCount = 5; | |
56 | |
57 template<> | |
58 void GrProcessorTestFactory<GrFragmentProcessor>::VerifyFactoryCount() { | |
59 if (kFPFactoryCount != GetFactories()->count()) { | |
60 SkFAIL("Wrong number of fragment processor factories!"); | |
61 } | |
62 } | |
63 | |
64 template<> | |
65 void GrProcessorTestFactory<GrGeometryProcessor>::VerifyFactoryCount() { | |
66 if (kGPFactoryCount != GetFactories()->count()) { | |
67 SkFAIL("Wrong number of geometry processor factories!"); | |
68 } | |
69 } | |
70 | |
71 template<> | |
72 void GrProcessorTestFactory<GrXPFactory>::VerifyFactoryCount() { | |
73 if (kXPFactoryCount != GetFactories()->count()) { | |
74 SkFAIL("Wrong number of xp factory factories!"); | |
75 } | |
76 } | |
77 | |
78 #endif | |
79 | |
80 | |
81 // We use a global pool protected by a mutex(spinlock). Chrome may use the same
GrContext on | |
82 // different threads. The GrContext is not used concurrently on different thread
s and there is a | |
83 // memory barrier between accesses of a context on different threads. Also, ther
e may be multiple | |
84 // GrContexts and those contexts may be in use concurrently on different threads
. | |
85 namespace { | |
86 SK_DECLARE_STATIC_SPINLOCK(gProcessorSpinlock); | |
87 class MemoryPoolAccessor { | |
88 public: | |
89 MemoryPoolAccessor() { gProcessorSpinlock.acquire(); } | |
90 | |
91 ~MemoryPoolAccessor() { gProcessorSpinlock.release(); } | |
92 | |
93 GrMemoryPool* pool() const { | |
94 static GrMemoryPool gPool(4096, 4096); | |
95 return &gPool; | |
96 } | |
97 }; | |
98 } | |
99 | |
100 int32_t GrProcessor::gCurrProcessorClassID = GrProcessor::kIllegalProcessorClass
ID; | |
101 | |
102 /////////////////////////////////////////////////////////////////////////////// | |
103 | |
104 GrProcessor::~GrProcessor() {} | |
105 | |
106 void GrProcessor::addTextureAccess(const GrTextureAccess* access) { | |
107 fTextureAccesses.push_back(access); | |
108 this->addGpuResource(access->getProgramTexture()); | |
109 } | |
110 | |
111 void* GrProcessor::operator new(size_t size) { | |
112 return MemoryPoolAccessor().pool()->allocate(size); | |
113 } | |
114 | |
115 void GrProcessor::operator delete(void* target) { | |
116 return MemoryPoolAccessor().pool()->release(target); | |
117 } | |
118 | |
119 bool GrProcessor::hasSameTextureAccesses(const GrProcessor& that) const { | |
120 if (this->numTextures() != that.numTextures()) { | |
121 return false; | |
122 } | |
123 for (int i = 0; i < this->numTextures(); ++i) { | |
124 if (this->textureAccess(i) != that.textureAccess(i)) { | |
125 return false; | |
126 } | |
127 } | |
128 return true; | |
129 } | |
130 | |
131 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | |
132 | 13 |
133 GrFragmentProcessor::~GrFragmentProcessor() { | 14 GrFragmentProcessor::~GrFragmentProcessor() { |
134 // If we got here then our ref count must have reached zero, so we will have
converted refs | 15 // If we got here then our ref count must have reached zero, so we will have
converted refs |
135 // to pending executions for all children. | 16 // to pending executions for all children. |
136 for (int i = 0; i < fChildProcessors.count(); ++i) { | 17 for (int i = 0; i < fChildProcessors.count(); ++i) { |
137 fChildProcessors[i]->completedExecution(); | 18 fChildProcessors[i]->completedExecution(); |
138 } | 19 } |
139 } | 20 } |
140 | 21 |
141 bool GrFragmentProcessor::isEqual(const GrFragmentProcessor& that, | 22 bool GrFragmentProcessor::isEqual(const GrFragmentProcessor& that, |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 } | 115 } |
235 int count = this->numTransforms(); | 116 int count = this->numTransforms(); |
236 for (int i = 0; i < count; ++i) { | 117 for (int i = 0; i < count; ++i) { |
237 if (this->coordTransform(i) != that.coordTransform(i)) { | 118 if (this->coordTransform(i) != that.coordTransform(i)) { |
238 return false; | 119 return false; |
239 } | 120 } |
240 } | 121 } |
241 return true; | 122 return true; |
242 } | 123 } |
243 | 124 |
244 #include "effects/GrXfermodeFragmentProcessor.h" | |
245 | |
246 const GrFragmentProcessor* GrFragmentProcessor::MulOuputByInputAlpha( | 125 const GrFragmentProcessor* GrFragmentProcessor::MulOuputByInputAlpha( |
247 const GrFragmentProcessor* fp) { | 126 const GrFragmentProcessor* fp) { |
248 return GrXfermodeFragmentProcessor::CreateFromDstProcessor(fp, SkXfermode::k
DstIn_Mode); | 127 return GrXfermodeFragmentProcessor::CreateFromDstProcessor(fp, SkXfermode::k
DstIn_Mode); |
249 } | 128 } |
250 | 129 |
251 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | |
252 | |
253 // Initial static variable from GrXPFactory | |
254 int32_t GrXPFactory::gCurrXPFClassID = | |
255 GrXPFactory::kIllegalXPFClassID; | |
OLD | NEW |