Index: src/gpu/GrGeometryProcessor.cpp |
diff --git a/src/gpu/GrGeometryProcessor.cpp b/src/gpu/GrGeometryProcessor.cpp |
index c707efc6a2f620e5c56c576e43a4fcc60797e2b8..23989cfe9223b6e97caa4143b569ff711b59fbf4 100644 |
--- a/src/gpu/GrGeometryProcessor.cpp |
+++ b/src/gpu/GrGeometryProcessor.cpp |
@@ -7,70 +7,7 @@ |
#include "GrGeometryProcessor.h" |
-#include "GrCoordTransform.h" |
#include "GrInvariantOutput.h" |
-#include "gl/GrGLGeometryProcessor.h" |
- |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-/** |
- * The key for an individual coord transform is made up of a matrix type, a precision, and a bit |
- * that indicates the source of the input coords. |
- */ |
-enum { |
- kMatrixTypeKeyBits = 1, |
- kMatrixTypeKeyMask = (1 << kMatrixTypeKeyBits) - 1, |
- |
- kPrecisionBits = 2, |
- kPrecisionShift = kMatrixTypeKeyBits, |
- |
- kPositionCoords_Flag = (1 << (kPrecisionShift + kPrecisionBits)), |
- kDeviceCoords_Flag = kPositionCoords_Flag + kPositionCoords_Flag, |
- |
- kTransformKeyBits = kMatrixTypeKeyBits + kPrecisionBits + 2, |
-}; |
- |
-GR_STATIC_ASSERT(kHigh_GrSLPrecision < (1 << kPrecisionBits)); |
- |
-/** |
- * We specialize the vertex code for each of these matrix types. |
- */ |
-enum MatrixType { |
- kNoPersp_MatrixType = 0, |
- kGeneral_MatrixType = 1, |
-}; |
- |
-uint32_t |
-GrPrimitiveProcessor::getTransformKey(const SkTArray<const GrCoordTransform*, true>& coords) const { |
- uint32_t totalKey = 0; |
- for (int t = 0; t < coords.count(); ++t) { |
- uint32_t key = 0; |
- const GrCoordTransform* coordTransform = coords[t]; |
- if (coordTransform->getMatrix().hasPerspective()) { |
- key |= kGeneral_MatrixType; |
- } else { |
- key |= kNoPersp_MatrixType; |
- } |
- |
- if (kLocal_GrCoordSet == coordTransform->sourceCoords() && |
- !this->hasExplicitLocalCoords()) { |
- key |= kPositionCoords_Flag; |
- } else if (kDevice_GrCoordSet == coordTransform->sourceCoords()) { |
- key |= kDeviceCoords_Flag; |
- } |
- |
- GR_STATIC_ASSERT(kGrSLPrecisionCount <= (1 << kPrecisionBits)); |
- key |= (coordTransform->precision() << kPrecisionShift); |
- |
- key <<= kTransformKeyBits * t; |
- |
- SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap |
- totalKey |= key; |
- } |
- return totalKey; |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
void GrGeometryProcessor::getInvariantOutputColor(GrInitInvariantOutput* out) const { |
if (fHasVertexColor) { |
@@ -89,483 +26,4 @@ void GrGeometryProcessor::getInvariantOutputCoverage(GrInitInvariantOutput* out) |
this->onGetInvariantOutputCoverage(out); |
} |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-#include "gl/builders/GrGLProgramBuilder.h" |
- |
-SkMatrix GrGLPrimitiveProcessor::GetTransformMatrix(const SkMatrix& localMatrix, |
- const GrCoordTransform& coordTransform) { |
- SkMatrix combined; |
- // We only apply the localmatrix to localcoords |
- if (kLocal_GrCoordSet == coordTransform.sourceCoords()) { |
- combined.setConcat(coordTransform.getMatrix(), localMatrix); |
- } else { |
- combined = coordTransform.getMatrix(); |
- } |
- if (coordTransform.reverseY()) { |
- // combined.postScale(1,-1); |
- // combined.postTranslate(0,1); |
- combined.set(SkMatrix::kMSkewY, |
- combined[SkMatrix::kMPersp0] - combined[SkMatrix::kMSkewY]); |
- combined.set(SkMatrix::kMScaleY, |
- combined[SkMatrix::kMPersp1] - combined[SkMatrix::kMScaleY]); |
- combined.set(SkMatrix::kMTransY, |
- combined[SkMatrix::kMPersp2] - combined[SkMatrix::kMTransY]); |
- } |
- return combined; |
-} |
- |
-void |
-GrGLPrimitiveProcessor::setupColorPassThrough(GrGLGPBuilder* pb, |
- GrGPInput inputType, |
- const char* outputName, |
- const GrGeometryProcessor::Attribute* colorAttr, |
- UniformHandle* colorUniform) { |
- GrGLGPFragmentBuilder* fs = pb->getFragmentShaderBuilder(); |
- if (kUniform_GrGPInput == inputType) { |
- SkASSERT(colorUniform); |
- const char* stagedLocalVarName; |
- *colorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
- kVec4f_GrSLType, |
- kDefault_GrSLPrecision, |
- "Color", |
- &stagedLocalVarName); |
- fs->codeAppendf("%s = %s;", outputName, stagedLocalVarName); |
- } else if (kAttribute_GrGPInput == inputType) { |
- SkASSERT(colorAttr); |
- pb->addPassThroughAttribute(colorAttr, outputName); |
- } else if (kAllOnes_GrGPInput == inputType) { |
- fs->codeAppendf("%s = vec4(1);", outputName); |
- } |
-} |
- |
-void GrGLPrimitiveProcessor::addUniformViewMatrix(GrGLGPBuilder* pb) { |
- fViewMatrixUniform = pb->addUniform(GrGLProgramBuilder::kVertex_Visibility, |
- kMat33f_GrSLType, kDefault_GrSLPrecision, |
- "uViewM", |
- &fViewMatrixName); |
-} |
- |
-void GrGLPrimitiveProcessor::setUniformViewMatrix(const GrGLProgramDataManager& pdman, |
- const SkMatrix& viewMatrix) { |
- if (!fViewMatrix.cheapEqualTo(viewMatrix)) { |
- SkASSERT(fViewMatrixUniform.isValid()); |
- fViewMatrix = viewMatrix; |
- |
- GrGLfloat viewMatrix[3 * 3]; |
- GrGLGetMatrix<3>(viewMatrix, fViewMatrix); |
- pdman.setMatrix3f(fViewMatrixUniform, viewMatrix); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
- |
-void GrGLGeometryProcessor::emitCode(EmitArgs& args) { |
- GrGLVertexBuilder* vsBuilder = args.fPB->getVertexShaderBuilder(); |
- GrGPArgs gpArgs; |
- this->onEmitCode(args, &gpArgs); |
- vsBuilder->transformToNormalizedDeviceSpace(gpArgs.fPositionVar); |
-} |
- |
-void GrGLGeometryProcessor::emitTransforms(GrGLGPBuilder* pb, |
- const GrShaderVar& posVar, |
- const char* localCoords, |
- const SkMatrix& localMatrix, |
- const TransformsIn& tin, |
- TransformsOut* tout) { |
- GrGLVertexBuilder* vb = pb->getVertexShaderBuilder(); |
- tout->push_back_n(tin.count()); |
- fInstalledTransforms.push_back_n(tin.count()); |
- for (int i = 0; i < tin.count(); i++) { |
- const ProcCoords& coordTransforms = tin[i]; |
- fInstalledTransforms[i].push_back_n(coordTransforms.count()); |
- for (int t = 0; t < coordTransforms.count(); t++) { |
- SkString strUniName("StageMatrix"); |
- strUniName.appendf("_%i_%i", i, t); |
- GrSLType varyingType; |
- |
- GrCoordSet coordType = coordTransforms[t]->sourceCoords(); |
- uint32_t type = coordTransforms[t]->getMatrix().getType(); |
- if (kLocal_GrCoordSet == coordType) { |
- type |= localMatrix.getType(); |
- } |
- varyingType = SkToBool(SkMatrix::kPerspective_Mask & type) ? kVec3f_GrSLType : |
- kVec2f_GrSLType; |
- GrSLPrecision precision = coordTransforms[t]->precision(); |
- |
- const char* uniName; |
- fInstalledTransforms[i][t].fHandle = |
- pb->addUniform(GrGLProgramBuilder::kVertex_Visibility, |
- kMat33f_GrSLType, precision, |
- strUniName.c_str(), |
- &uniName).toShaderBuilderIndex(); |
- |
- SkString strVaryingName("MatrixCoord"); |
- strVaryingName.appendf("_%i_%i", i, t); |
- |
- GrGLVertToFrag v(varyingType); |
- pb->addVarying(strVaryingName.c_str(), &v, precision); |
- |
- SkASSERT(kVec2f_GrSLType == varyingType || kVec3f_GrSLType == varyingType); |
- SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCoords, |
- (SkString(v.fsIn()), varyingType)); |
- |
- // varying = matrix * coords (logically) |
- if (kDevice_GrCoordSet == coordType) { |
- if (kVec2f_GrSLType == varyingType) { |
- if (kVec2f_GrSLType == posVar.getType()) { |
- vb->codeAppendf("%s = (%s * vec3(%s, 1)).xy;", |
- v.vsOut(), uniName, posVar.c_str()); |
- } else { |
- // The brackets here are just to scope the temp variable |
- vb->codeAppendf("{ vec3 temp = %s * %s;", uniName, posVar.c_str()); |
- vb->codeAppendf("%s = vec2(temp.x/temp.z, temp.y/temp.z); }", v.vsOut()); |
- } |
- } else { |
- if (kVec2f_GrSLType == posVar.getType()) { |
- vb->codeAppendf("%s = %s * vec3(%s, 1);", |
- v.vsOut(), uniName, posVar.c_str()); |
- } else { |
- vb->codeAppendf("%s = %s * %s;", v.vsOut(), uniName, posVar.c_str()); |
- } |
- } |
- } else { |
- if (kVec2f_GrSLType == varyingType) { |
- vb->codeAppendf("%s = (%s * vec3(%s, 1)).xy;", v.vsOut(), uniName, localCoords); |
- } else { |
- vb->codeAppendf("%s = %s * vec3(%s, 1);", v.vsOut(), uniName, localCoords); |
- } |
- } |
- } |
- } |
-} |
- |
- |
-void |
-GrGLGeometryProcessor::setTransformData(const GrPrimitiveProcessor& primProc, |
- const GrGLProgramDataManager& pdman, |
- int index, |
- const SkTArray<const GrCoordTransform*, true>& transforms) { |
- SkSTArray<2, Transform, true>& procTransforms = fInstalledTransforms[index]; |
- int numTransforms = transforms.count(); |
- for (int t = 0; t < numTransforms; ++t) { |
- SkASSERT(procTransforms[t].fHandle.isValid()); |
- const SkMatrix& transform = GetTransformMatrix(primProc.localMatrix(), *transforms[t]); |
- if (!procTransforms[t].fCurrentValue.cheapEqualTo(transform)) { |
- pdman.setSkMatrix(procTransforms[t].fHandle.convertToUniformHandle(), transform); |
- procTransforms[t].fCurrentValue = transform; |
- } |
- } |
-} |
- |
-void GrGLGeometryProcessor::SetupPosition(GrGLVertexBuilder* vsBuilder, |
- GrGPArgs* gpArgs, |
- const char* posName, |
- const SkMatrix& mat, |
- const char* matName) { |
- if (mat.isIdentity()) { |
- gpArgs->fPositionVar.set(kVec2f_GrSLType, "pos2"); |
- |
- vsBuilder->codeAppendf("vec2 %s = %s;", gpArgs->fPositionVar.c_str(), posName); |
- } else if (!mat.hasPerspective()) { |
- gpArgs->fPositionVar.set(kVec2f_GrSLType, "pos2"); |
- |
- vsBuilder->codeAppendf("vec2 %s = vec2(%s * vec3(%s, 1));", |
- gpArgs->fPositionVar.c_str(), matName, posName); |
- } else { |
- gpArgs->fPositionVar.set(kVec3f_GrSLType, "pos3"); |
- |
- vsBuilder->codeAppendf("vec3 %s = %s * vec3(%s, 1);", |
- gpArgs->fPositionVar.c_str(), matName, posName); |
- } |
-} |
- |
-/////////////////////////////////////////////////////////////////////////////////////////////////// |
- |
-#include "gl/GrGLGpu.h" |
-#include "gl/GrGLPathRendering.h" |
- |
-struct PathBatchTracker { |
- GrGPInput fInputColorType; |
- GrGPInput fInputCoverageType; |
- GrColor fColor; |
- bool fUsesLocalCoords; |
-}; |
- |
-GrGLPathProcessor::GrGLPathProcessor(const GrPathProcessor&, const GrBatchTracker&) |
- : fColor(GrColor_ILLEGAL) {} |
- |
-void GrGLPathProcessor::emitCode(EmitArgs& args) { |
- GrGLGPBuilder* pb = args.fPB; |
- GrGLGPFragmentBuilder* fs = args.fPB->getFragmentShaderBuilder(); |
- const PathBatchTracker& local = args.fBT.cast<PathBatchTracker>(); |
- |
- // emit transforms |
- this->emitTransforms(args.fPB, args.fTransformsIn, args.fTransformsOut); |
- |
- // Setup uniform color |
- if (kUniform_GrGPInput == local.fInputColorType) { |
- const char* stagedLocalVarName; |
- fColorUniform = pb->addUniform(GrGLProgramBuilder::kFragment_Visibility, |
- kVec4f_GrSLType, |
- kDefault_GrSLPrecision, |
- "Color", |
- &stagedLocalVarName); |
- fs->codeAppendf("%s = %s;", args.fOutputColor, stagedLocalVarName); |
- } |
- |
- // setup constant solid coverage |
- if (kAllOnes_GrGPInput == local.fInputCoverageType) { |
- fs->codeAppendf("%s = vec4(1);", args.fOutputCoverage); |
- } |
-} |
- |
-void GrGLPathProcessor::GenKey(const GrPathProcessor&, |
- const GrBatchTracker& bt, |
- const GrGLCaps&, |
- GrProcessorKeyBuilder* b) { |
- const PathBatchTracker& local = bt.cast<PathBatchTracker>(); |
- b->add32(local.fInputColorType | local.fInputCoverageType << 16); |
-} |
- |
-void GrGLPathProcessor::setData(const GrGLProgramDataManager& pdman, |
- const GrPrimitiveProcessor& primProc, |
- const GrBatchTracker& bt) { |
- const PathBatchTracker& local = bt.cast<PathBatchTracker>(); |
- if (kUniform_GrGPInput == local.fInputColorType && local.fColor != fColor) { |
- GrGLfloat c[4]; |
- GrColorToRGBAFloat(local.fColor, c); |
- pdman.set4fv(fColorUniform, 1, c); |
- fColor = local.fColor; |
- } |
-} |
- |
-class GrGLLegacyPathProcessor : public GrGLPathProcessor { |
-public: |
- GrGLLegacyPathProcessor(const GrPathProcessor& pathProc, const GrBatchTracker& bt, |
- int maxTexCoords) |
- : INHERITED(pathProc, bt) |
- , fTexCoordSetCnt(0) { |
- SkDEBUGCODE(fMaxTexCoords = maxTexCoords;) |
- } |
- |
- int addTexCoordSets(int count) { |
- int firstFreeCoordSet = fTexCoordSetCnt; |
- fTexCoordSetCnt += count; |
- SkASSERT(fMaxTexCoords >= fTexCoordSetCnt); |
- return firstFreeCoordSet; |
- } |
- |
- void emitTransforms(GrGLGPBuilder*, const TransformsIn& tin, TransformsOut* tout) SK_OVERRIDE { |
- tout->push_back_n(tin.count()); |
- fInstalledTransforms.push_back_n(tin.count()); |
- for (int i = 0; i < tin.count(); i++) { |
- const ProcCoords& coordTransforms = tin[i]; |
- int texCoordIndex = this->addTexCoordSets(coordTransforms.count()); |
- |
- // Use the first uniform location as the texcoord index. |
- fInstalledTransforms[i].push_back_n(1); |
- fInstalledTransforms[i][0].fHandle = ShaderVarHandle(texCoordIndex); |
- |
- SkString name; |
- for (int t = 0; t < coordTransforms.count(); ++t) { |
- GrSLType type = coordTransforms[t]->getMatrix().hasPerspective() ? kVec3f_GrSLType : |
- kVec2f_GrSLType; |
- |
- name.printf("%s(gl_TexCoord[%i])", GrGLSLTypeString(type), texCoordIndex++); |
- SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCoords, (name, type)); |
- } |
- } |
- } |
- |
- void setTransformData(const GrPrimitiveProcessor& primProc, |
- int index, |
- const SkTArray<const GrCoordTransform*, true>& transforms, |
- GrGLPathRendering* glpr, |
- GrGLuint) SK_OVERRIDE { |
- // We've hidden the texcoord index in the first entry of the transforms array for each |
- // effect |
- int texCoordIndex = fInstalledTransforms[index][0].fHandle.handle(); |
- for (int t = 0; t < transforms.count(); ++t) { |
- const SkMatrix& transform = GetTransformMatrix(primProc.localMatrix(), *transforms[t]); |
- GrGLPathRendering::PathTexGenComponents components = |
- GrGLPathRendering::kST_PathTexGenComponents; |
- if (transform.hasPerspective()) { |
- components = GrGLPathRendering::kSTR_PathTexGenComponents; |
- } |
- glpr->enablePathTexGen(texCoordIndex++, components, transform); |
- } |
- } |
- |
- void didSetData(GrGLPathRendering* glpr) SK_OVERRIDE { |
- glpr->flushPathTexGenSettings(fTexCoordSetCnt); |
- } |
- |
-private: |
- SkDEBUGCODE(int fMaxTexCoords;) |
- int fTexCoordSetCnt; |
- |
- typedef GrGLPathProcessor INHERITED; |
-}; |
- |
-class GrGLNormalPathProcessor : public GrGLPathProcessor { |
-public: |
- GrGLNormalPathProcessor(const GrPathProcessor& pathProc, const GrBatchTracker& bt) |
- : INHERITED(pathProc, bt) {} |
- |
- void emitTransforms(GrGLGPBuilder* pb, const TransformsIn& tin, |
- TransformsOut* tout) SK_OVERRIDE { |
- tout->push_back_n(tin.count()); |
- fInstalledTransforms.push_back_n(tin.count()); |
- for (int i = 0; i < tin.count(); i++) { |
- const ProcCoords& coordTransforms = tin[i]; |
- fInstalledTransforms[i].push_back_n(coordTransforms.count()); |
- for (int t = 0; t < coordTransforms.count(); t++) { |
- GrSLType varyingType = |
- coordTransforms[t]->getMatrix().hasPerspective() ? kVec3f_GrSLType : |
- kVec2f_GrSLType; |
- |
- |
- SkString strVaryingName("MatrixCoord"); |
- strVaryingName.appendf("_%i_%i", i, t); |
- GrGLVertToFrag v(varyingType); |
- pb->addVarying(strVaryingName.c_str(), &v); |
- SeparableVaryingInfo& varyingInfo = fSeparableVaryingInfos.push_back(); |
- varyingInfo.fVariable = pb->getFragmentShaderBuilder()->fInputs.back(); |
- varyingInfo.fLocation = fSeparableVaryingInfos.count() - 1; |
- varyingInfo.fType = varyingType; |
- fInstalledTransforms[i][t].fHandle = ShaderVarHandle(varyingInfo.fLocation); |
- fInstalledTransforms[i][t].fType = varyingType; |
- |
- SkNEW_APPEND_TO_TARRAY(&(*tout)[i], GrGLProcessor::TransformedCoords, |
- (SkString(v.fsIn()), varyingType)); |
- } |
- } |
- } |
- |
- void resolveSeparableVaryings(GrGLGpu* gpu, GrGLuint programId) { |
- int count = fSeparableVaryingInfos.count(); |
- for (int i = 0; i < count; ++i) { |
- GrGLint location; |
- GR_GL_CALL_RET(gpu->glInterface(), |
- location, |
- GetProgramResourceLocation(programId, |
- GR_GL_FRAGMENT_INPUT, |
- fSeparableVaryingInfos[i].fVariable.c_str())); |
- fSeparableVaryingInfos[i].fLocation = location; |
- } |
- } |
- |
- void setTransformData(const GrPrimitiveProcessor& primProc, |
- int index, |
- const SkTArray<const GrCoordTransform*, true>& coordTransforms, |
- GrGLPathRendering* glpr, |
- GrGLuint programID) SK_OVERRIDE { |
- SkSTArray<2, Transform, true>& transforms = fInstalledTransforms[index]; |
- int numTransforms = transforms.count(); |
- for (int t = 0; t < numTransforms; ++t) { |
- SkASSERT(transforms[t].fHandle.isValid()); |
- const SkMatrix& transform = GetTransformMatrix(primProc.localMatrix(), |
- *coordTransforms[t]); |
- if (transforms[t].fCurrentValue.cheapEqualTo(transform)) { |
- continue; |
- } |
- transforms[t].fCurrentValue = transform; |
- const SeparableVaryingInfo& fragmentInput = |
- fSeparableVaryingInfos[transforms[t].fHandle.handle()]; |
- SkASSERT(transforms[t].fType == kVec2f_GrSLType || |
- transforms[t].fType == kVec3f_GrSLType); |
- unsigned components = transforms[t].fType == kVec2f_GrSLType ? 2 : 3; |
- glpr->setProgramPathFragmentInputTransform(programID, |
- fragmentInput.fLocation, |
- GR_GL_OBJECT_LINEAR, |
- components, |
- transform); |
- } |
- } |
- |
-private: |
- struct SeparableVaryingInfo { |
- GrSLType fType; |
- GrGLShaderVar fVariable; |
- GrGLint fLocation; |
- }; |
- |
- |
- typedef SkSTArray<8, SeparableVaryingInfo, true> SeparableVaryingInfoArray; |
- |
- SeparableVaryingInfoArray fSeparableVaryingInfos; |
- |
- typedef GrGLPathProcessor INHERITED; |
-}; |
- |
-GrPathProcessor::GrPathProcessor(GrColor color, |
- const SkMatrix& viewMatrix, |
- const SkMatrix& localMatrix) |
- : INHERITED(viewMatrix, localMatrix, true) |
- , fColor(color) { |
- this->initClassID<GrPathProcessor>(); |
-} |
- |
-void GrPathProcessor::getInvariantOutputColor(GrInitInvariantOutput* out) const { |
- out->setKnownFourComponents(fColor); |
-} |
- |
-void GrPathProcessor::getInvariantOutputCoverage(GrInitInvariantOutput* out) const { |
- out->setKnownSingleComponent(0xff); |
-} |
- |
-void GrPathProcessor::initBatchTracker(GrBatchTracker* bt, const GrPipelineInfo& init) const { |
- PathBatchTracker* local = bt->cast<PathBatchTracker>(); |
- if (init.fColorIgnored) { |
- local->fInputColorType = kIgnored_GrGPInput; |
- local->fColor = GrColor_ILLEGAL; |
- } else { |
- local->fInputColorType = kUniform_GrGPInput; |
- local->fColor = GrColor_ILLEGAL == init.fOverrideColor ? this->color() : |
- init.fOverrideColor; |
- } |
- |
- local->fInputCoverageType = init.fCoverageIgnored ? kIgnored_GrGPInput : kAllOnes_GrGPInput; |
- local->fUsesLocalCoords = init.fUsesLocalCoords; |
-} |
- |
-bool GrPathProcessor::canMakeEqual(const GrBatchTracker& m, |
- const GrPrimitiveProcessor& that, |
- const GrBatchTracker& t) const { |
- if (this->classID() != that.classID() || !this->hasSameTextureAccesses(that)) { |
- return false; |
- } |
- |
- if (!this->viewMatrix().cheapEqualTo(that.viewMatrix())) { |
- return false; |
- } |
- |
- const PathBatchTracker& mine = m.cast<PathBatchTracker>(); |
- const PathBatchTracker& theirs = t.cast<PathBatchTracker>(); |
- return CanCombineLocalMatrices(*this, mine.fUsesLocalCoords, |
- that, theirs.fUsesLocalCoords) && |
- CanCombineOutput(mine.fInputColorType, mine.fColor, |
- theirs.fInputColorType, theirs.fColor) && |
- CanCombineOutput(mine.fInputCoverageType, 0xff, |
- theirs.fInputCoverageType, 0xff); |
-} |
- |
-void GrPathProcessor::getGLProcessorKey(const GrBatchTracker& bt, |
- const GrGLCaps& caps, |
- GrProcessorKeyBuilder* b) const { |
- GrGLPathProcessor::GenKey(*this, bt, caps, b); |
-} |
- |
-GrGLPrimitiveProcessor* GrPathProcessor::createGLInstance(const GrBatchTracker& bt, |
- const GrGLCaps& caps) const { |
- SkASSERT(caps.nvprSupport() != GrGLCaps::kNone_NvprSupport); |
- if (caps.nvprSupport() == GrGLCaps::kLegacy_NvprSupport) { |
- return SkNEW_ARGS(GrGLLegacyPathProcessor, (*this, bt, |
- caps.maxFixedFunctionTextureCoords())); |
- } else { |
- return SkNEW_ARGS(GrGLNormalPathProcessor, (*this, bt)); |
- } |
-} |