18072caa80384292858d31ae34b7e19768875866bjoshualitt/*
28072caa80384292858d31ae34b7e19768875866bjoshualitt * Copyright 2014 Google Inc.
38072caa80384292858d31ae34b7e19768875866bjoshualitt *
48072caa80384292858d31ae34b7e19768875866bjoshualitt * Use of this source code is governed by a BSD-style license that can be
58072caa80384292858d31ae34b7e19768875866bjoshualitt * found in the LICENSE file.
68072caa80384292858d31ae34b7e19768875866bjoshualitt */
78072caa80384292858d31ae34b7e19768875866bjoshualitt
88072caa80384292858d31ae34b7e19768875866bjoshualitt#include "GrPrimitiveProcessor.h"
98072caa80384292858d31ae34b7e19768875866bjoshualitt
108072caa80384292858d31ae34b7e19768875866bjoshualitt#include "GrCoordTransform.h"
118072caa80384292858d31ae34b7e19768875866bjoshualitt
128072caa80384292858d31ae34b7e19768875866bjoshualitt/**
138072caa80384292858d31ae34b7e19768875866bjoshualitt * The key for an individual coord transform is made up of a matrix type, a precision, and a bit
148072caa80384292858d31ae34b7e19768875866bjoshualitt * that indicates the source of the input coords.
158072caa80384292858d31ae34b7e19768875866bjoshualitt */
168072caa80384292858d31ae34b7e19768875866bjoshualittenum {
178072caa80384292858d31ae34b7e19768875866bjoshualitt    kMatrixTypeKeyBits   = 1,
188072caa80384292858d31ae34b7e19768875866bjoshualitt    kMatrixTypeKeyMask   = (1 << kMatrixTypeKeyBits) - 1,
198072caa80384292858d31ae34b7e19768875866bjoshualitt
208072caa80384292858d31ae34b7e19768875866bjoshualitt    kPrecisionBits       = 2,
218072caa80384292858d31ae34b7e19768875866bjoshualitt    kPrecisionShift      = kMatrixTypeKeyBits,
228072caa80384292858d31ae34b7e19768875866bjoshualitt
238072caa80384292858d31ae34b7e19768875866bjoshualitt    kPositionCoords_Flag = (1 << (kPrecisionShift + kPrecisionBits)),
248072caa80384292858d31ae34b7e19768875866bjoshualitt
258072caa80384292858d31ae34b7e19768875866bjoshualitt    kTransformKeyBits    = kMatrixTypeKeyBits + kPrecisionBits + 2,
268072caa80384292858d31ae34b7e19768875866bjoshualitt};
278072caa80384292858d31ae34b7e19768875866bjoshualitt
288072caa80384292858d31ae34b7e19768875866bjoshualittGR_STATIC_ASSERT(kHigh_GrSLPrecision < (1 << kPrecisionBits));
298072caa80384292858d31ae34b7e19768875866bjoshualitt
308072caa80384292858d31ae34b7e19768875866bjoshualitt/**
318072caa80384292858d31ae34b7e19768875866bjoshualitt * We specialize the vertex code for each of these matrix types.
328072caa80384292858d31ae34b7e19768875866bjoshualitt */
338072caa80384292858d31ae34b7e19768875866bjoshualittenum MatrixType {
348072caa80384292858d31ae34b7e19768875866bjoshualitt    kNoPersp_MatrixType  = 0,
358072caa80384292858d31ae34b7e19768875866bjoshualitt    kGeneral_MatrixType  = 1,
368072caa80384292858d31ae34b7e19768875866bjoshualitt};
378072caa80384292858d31ae34b7e19768875866bjoshualitt
388072caa80384292858d31ae34b7e19768875866bjoshualittuint32_t
39a7f4c435bc1dcd845990a5515828bbe8cccfab41wangyixGrPrimitiveProcessor::getTransformKey(const SkTArray<const GrCoordTransform*, true>& coords,
40a7f4c435bc1dcd845990a5515828bbe8cccfab41wangyix                                      int numCoords) const {
418072caa80384292858d31ae34b7e19768875866bjoshualitt    uint32_t totalKey = 0;
42a7f4c435bc1dcd845990a5515828bbe8cccfab41wangyix    for (int t = 0; t < numCoords; ++t) {
438072caa80384292858d31ae34b7e19768875866bjoshualitt        uint32_t key = 0;
448072caa80384292858d31ae34b7e19768875866bjoshualitt        const GrCoordTransform* coordTransform = coords[t];
458072caa80384292858d31ae34b7e19768875866bjoshualitt        if (coordTransform->getMatrix().hasPerspective()) {
468072caa80384292858d31ae34b7e19768875866bjoshualitt            key |= kGeneral_MatrixType;
478072caa80384292858d31ae34b7e19768875866bjoshualitt        } else {
488072caa80384292858d31ae34b7e19768875866bjoshualitt            key |= kNoPersp_MatrixType;
498072caa80384292858d31ae34b7e19768875866bjoshualitt        }
508072caa80384292858d31ae34b7e19768875866bjoshualitt
512ebd0c80a2a9d90a2c2c653f40a2a7205bd2d31bBrian Salomon        if (!this->hasExplicitLocalCoords()) {
528072caa80384292858d31ae34b7e19768875866bjoshualitt            key |= kPositionCoords_Flag;
538072caa80384292858d31ae34b7e19768875866bjoshualitt        }
548072caa80384292858d31ae34b7e19768875866bjoshualitt
558072caa80384292858d31ae34b7e19768875866bjoshualitt        GR_STATIC_ASSERT(kGrSLPrecisionCount <= (1 << kPrecisionBits));
568072caa80384292858d31ae34b7e19768875866bjoshualitt        key |= (coordTransform->precision() << kPrecisionShift);
578072caa80384292858d31ae34b7e19768875866bjoshualitt
588072caa80384292858d31ae34b7e19768875866bjoshualitt        key <<= kTransformKeyBits * t;
598072caa80384292858d31ae34b7e19768875866bjoshualitt
608072caa80384292858d31ae34b7e19768875866bjoshualitt        SkASSERT(0 == (totalKey & key)); // keys for each transform ought not to overlap
618072caa80384292858d31ae34b7e19768875866bjoshualitt        totalKey |= key;
628072caa80384292858d31ae34b7e19768875866bjoshualitt    }
638072caa80384292858d31ae34b7e19768875866bjoshualitt    return totalKey;
648072caa80384292858d31ae34b7e19768875866bjoshualitt}
65