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