diff options
author | joshualitt <joshualitt@chromium.org> | 2015-02-12 14:20:52 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-02-12 14:20:52 -0800 |
commit | 8072caa80384292858d31ae34b7e19768875866b (patch) | |
tree | 540934943305cb0aa1e73bfa836e260cab8b45b0 /src/gpu/GrPrimitiveProcessor.cpp | |
parent | b0fb935bd544b0c6f68c692c7e1ee40876184a1a (diff) |
A simple change to move a bunch of stuff out of Gr*Geometry.h
BUG=skia:
Review URL: https://codereview.chromium.org/920863002
Diffstat (limited to 'src/gpu/GrPrimitiveProcessor.cpp')
-rw-r--r-- | src/gpu/GrPrimitiveProcessor.cpp | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/src/gpu/GrPrimitiveProcessor.cpp b/src/gpu/GrPrimitiveProcessor.cpp new file mode 100644 index 0000000000..673656821b --- /dev/null +++ b/src/gpu/GrPrimitiveProcessor.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2014 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "GrPrimitiveProcessor.h" + +#include "GrCoordTransform.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; +} |