| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "GrProcessor.h" | 8 #include "GrProcessor.h" |
| 9 #include "GrContext.h" | 9 #include "GrContext.h" |
| 10 #include "GrCoordTransform.h" | |
| 11 #include "GrGeometryProcessor.h" | 10 #include "GrGeometryProcessor.h" |
| 12 #include "GrInvariantOutput.h" | 11 #include "GrInvariantOutput.h" |
| 13 #include "GrMemoryPool.h" | 12 #include "GrMemoryPool.h" |
| 14 #include "GrXferProcessor.h" | 13 #include "GrXferProcessor.h" |
| 15 #include "SkSpinlock.h" | 14 #include "SkSpinlock.h" |
| 16 #include "gl/GrGLFragmentProcessor.h" | |
| 17 | 15 |
| 18 #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS | 16 #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS |
| 19 | 17 |
| 20 class GrFragmentProcessor; | 18 class GrFragmentProcessor; |
| 21 class GrGeometryProcessor; | 19 class GrGeometryProcessor; |
| 22 | 20 |
| 23 /* | 21 /* |
| 24 * Originally these were both in the processor unit test header, but then it see
med to cause linker | 22 * Originally these were both in the processor unit test header, but then it see
med to cause linker |
| 25 * problems on android. | 23 * problems on android. |
| 26 */ | 24 */ |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 for (int i = 0; i < this->numTextures(); ++i) { | 121 for (int i = 0; i < this->numTextures(); ++i) { |
| 124 if (this->textureAccess(i) != that.textureAccess(i)) { | 122 if (this->textureAccess(i) != that.textureAccess(i)) { |
| 125 return false; | 123 return false; |
| 126 } | 124 } |
| 127 } | 125 } |
| 128 return true; | 126 return true; |
| 129 } | 127 } |
| 130 | 128 |
| 131 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | 129 ////////////////////////////////////////////////////////////////////////////////
/////////////////// |
| 132 | 130 |
| 133 GrFragmentProcessor::~GrFragmentProcessor() { | |
| 134 // 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. | |
| 136 for (int i = 0; i < fChildProcessors.count(); ++i) { | |
| 137 fChildProcessors[i]->completedExecution(); | |
| 138 } | |
| 139 } | |
| 140 | |
| 141 bool GrFragmentProcessor::isEqual(const GrFragmentProcessor& that, | |
| 142 bool ignoreCoordTransforms) const { | |
| 143 if (this->classID() != that.classID() || | |
| 144 !this->hasSameTextureAccesses(that)) { | |
| 145 return false; | |
| 146 } | |
| 147 if (ignoreCoordTransforms) { | |
| 148 if (this->numTransforms() != that.numTransforms()) { | |
| 149 return false; | |
| 150 } | |
| 151 } else if (!this->hasSameTransforms(that)) { | |
| 152 return false; | |
| 153 } | |
| 154 if (!this->onIsEqual(that)) { | |
| 155 return false; | |
| 156 } | |
| 157 if (this->numChildProcessors() != that.numChildProcessors()) { | |
| 158 return false; | |
| 159 } | |
| 160 for (int i = 0; i < this->numChildProcessors(); ++i) { | |
| 161 if (!this->childProcessor(i).isEqual(that.childProcessor(i), ignoreCoord
Transforms)) { | |
| 162 return false; | |
| 163 } | |
| 164 } | |
| 165 return true; | |
| 166 } | |
| 167 | |
| 168 GrGLFragmentProcessor* GrFragmentProcessor::createGLInstance() const { | |
| 169 GrGLFragmentProcessor* glFragProc = this->onCreateGLInstance(); | |
| 170 glFragProc->fChildProcessors.push_back_n(fChildProcessors.count()); | |
| 171 for (int i = 0; i < fChildProcessors.count(); ++i) { | |
| 172 glFragProc->fChildProcessors[i] = fChildProcessors[i]->createGLInstance(
); | |
| 173 } | |
| 174 return glFragProc; | |
| 175 } | |
| 176 | |
| 177 void GrFragmentProcessor::addTextureAccess(const GrTextureAccess* textureAccess)
{ | |
| 178 // Can't add texture accesses after registering any children since their tex
ture accesses have | |
| 179 // already been bubbled up into our fTextureAccesses array | |
| 180 SkASSERT(fChildProcessors.empty()); | |
| 181 | |
| 182 INHERITED::addTextureAccess(textureAccess); | |
| 183 fNumTexturesExclChildren++; | |
| 184 } | |
| 185 | |
| 186 void GrFragmentProcessor::addCoordTransform(const GrCoordTransform* transform) { | |
| 187 // Can't add transforms after registering any children since their transform
s have already been | |
| 188 // bubbled up into our fCoordTransforms array | |
| 189 SkASSERT(fChildProcessors.empty()); | |
| 190 | |
| 191 fCoordTransforms.push_back(transform); | |
| 192 fUsesLocalCoords = fUsesLocalCoords || transform->sourceCoords() == kLocal_G
rCoordSet; | |
| 193 SkDEBUGCODE(transform->setInProcessor();) | |
| 194 fNumTransformsExclChildren++; | |
| 195 } | |
| 196 | |
| 197 int GrFragmentProcessor::registerChildProcessor(const GrFragmentProcessor* child
) { | |
| 198 // Append the child's transforms to our transforms array and the child's tex
tures array to our | |
| 199 // textures array | |
| 200 if (!child->fCoordTransforms.empty()) { | |
| 201 fCoordTransforms.push_back_n(child->fCoordTransforms.count(), | |
| 202 child->fCoordTransforms.begin()); | |
| 203 } | |
| 204 if (!child->fTextureAccesses.empty()) { | |
| 205 fTextureAccesses.push_back_n(child->fTextureAccesses.count(), | |
| 206 child->fTextureAccesses.begin()); | |
| 207 } | |
| 208 | |
| 209 int index = fChildProcessors.count(); | |
| 210 fChildProcessors.push_back(SkRef(child)); | |
| 211 | |
| 212 if (child->willReadFragmentPosition()) { | |
| 213 this->setWillReadFragmentPosition(); | |
| 214 } | |
| 215 | |
| 216 if (child->usesLocalCoords()) { | |
| 217 fUsesLocalCoords = true; | |
| 218 } | |
| 219 | |
| 220 return index; | |
| 221 } | |
| 222 | |
| 223 void GrFragmentProcessor::notifyRefCntIsZero() const { | |
| 224 // See comment above GrProgramElement for a detailed explanation of why we d
o this. | |
| 225 for (int i = 0; i < fChildProcessors.count(); ++i) { | |
| 226 fChildProcessors[i]->addPendingExecution(); | |
| 227 fChildProcessors[i]->unref(); | |
| 228 } | |
| 229 } | |
| 230 | |
| 231 bool GrFragmentProcessor::hasSameTransforms(const GrFragmentProcessor& that) con
st { | |
| 232 if (this->numTransforms() != that.numTransforms()) { | |
| 233 return false; | |
| 234 } | |
| 235 int count = this->numTransforms(); | |
| 236 for (int i = 0; i < count; ++i) { | |
| 237 if (this->coordTransform(i) != that.coordTransform(i)) { | |
| 238 return false; | |
| 239 } | |
| 240 } | |
| 241 return true; | |
| 242 } | |
| 243 | |
| 244 #include "effects/GrXfermodeFragmentProcessor.h" | |
| 245 | |
| 246 const GrFragmentProcessor* GrFragmentProcessor::MulOuputByInputAlpha( | |
| 247 const GrFragmentProcessor* fp) { | |
| 248 return GrXfermodeFragmentProcessor::CreateFromDstProcessor(fp, SkXfermode::k
DstIn_Mode); | |
| 249 } | |
| 250 | |
| 251 ////////////////////////////////////////////////////////////////////////////////
/////////////////// | |
| 252 | |
| 253 // Initial static variable from GrXPFactory | 131 // Initial static variable from GrXPFactory |
| 254 int32_t GrXPFactory::gCurrXPFClassID = | 132 int32_t GrXPFactory::gCurrXPFClassID = |
| 255 GrXPFactory::kIllegalXPFClassID; | 133 GrXPFactory::kIllegalXPFClassID; |
| OLD | NEW |