bool GrDrawVerticesOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) { GrDrawVerticesOp* that = t->cast<GrDrawVerticesOp>(); if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) { return false; } if (!this->combinablePrimitive() || this->primitiveType() != that->primitiveType()) { return false; } if (fMeshes[0].fVertices->hasIndices() != that->fMeshes[0].fVertices->hasIndices()) { return false; } if (fColorArrayType != that->fColorArrayType) { return false; } if (fLinearizeColors != that->fLinearizeColors) { return false; } if (fVertexCount + that->fVertexCount > SK_MaxU16) { return false; } // NOTE: For SkColor vertex colors, the source color space is always sRGB, and the destination // gamut is determined by the render target context. A mis-match should be impossible. SkASSERT(GrColorSpaceXform::Equals(fColorSpaceXform.get(), that->fColorSpaceXform.get())); // If either op required explicit local coords or per-vertex colors the combined mesh does. Same // with multiple view matrices. fFlags |= that->fFlags; if (!this->requiresPerVertexColors() && this->fMeshes[0].fColor != that->fMeshes[0].fColor) { fFlags |= kRequiresPerVertexColors_Flag; } // Check whether we are about to acquire a mesh with a different view matrix. if (!this->hasMultipleViewMatrices() && !this->fMeshes[0].fViewMatrix.cheapEqualTo(that->fMeshes[0].fViewMatrix)) { fFlags |= kHasMultipleViewMatrices_Flag; } fMeshes.push_back_n(that->fMeshes.count(), that->fMeshes.begin()); fVertexCount += that->fVertexCount; fIndexCount += that->fIndexCount; this->joinBounds(*that); return true; }
GrOp::CombineResult GrDrawVerticesOp::onCombineIfPossible(GrOp* t, const GrCaps& caps) { GrDrawVerticesOp* that = t->cast<GrDrawVerticesOp>(); if (!fHelper.isCompatible(that->fHelper, caps, this->bounds(), that->bounds())) { return CombineResult::kCannotCombine; } // Meshes with bones cannot be combined because different meshes use different bones, so to // combine them, the matrices would have to be combined, and the bone indices on each vertex // would change, thus making the vertices uncacheable. if (this->hasBones() || that->hasBones()) { return CombineResult::kCannotCombine; } // Non-volatile meshes cannot batch, because if a non-volatile mesh batches with another mesh, // then on the next frame, if that non-volatile mesh is drawn, it will draw the other mesh // that was saved in its vertex buffer, which is not necessarily there anymore. if (!this->fMeshes[0].fVertices->isVolatile() || !that->fMeshes[0].fVertices->isVolatile()) { return CombineResult::kCannotCombine; } if (!this->combinablePrimitive() || this->primitiveType() != that->primitiveType()) { return CombineResult::kCannotCombine; } if (fMeshes[0].fVertices->hasIndices() != that->fMeshes[0].fVertices->hasIndices()) { return CombineResult::kCannotCombine; } if (fColorArrayType != that->fColorArrayType) { return CombineResult::kCannotCombine; } if (fVertexCount + that->fVertexCount > SkTo<int>(UINT16_MAX)) { return CombineResult::kCannotCombine; } // NOTE: For SkColor vertex colors, the source color space is always sRGB, and the destination // gamut is determined by the render target context. A mis-match should be impossible. SkASSERT(GrColorSpaceXform::Equals(fColorSpaceXform.get(), that->fColorSpaceXform.get())); // If either op required explicit local coords or per-vertex colors the combined mesh does. Same // with multiple view matrices. fFlags |= that->fFlags; if (!this->requiresPerVertexColors() && this->fMeshes[0].fColor != that->fMeshes[0].fColor) { fFlags |= kRequiresPerVertexColors_Flag; } // Check whether we are about to acquire a mesh with a different view matrix. if (!this->hasMultipleViewMatrices() && !this->fMeshes[0].fViewMatrix.cheapEqualTo(that->fMeshes[0].fViewMatrix)) { fFlags |= kHasMultipleViewMatrices_Flag; } fMeshes.push_back_n(that->fMeshes.count(), that->fMeshes.begin()); fVertexCount += that->fVertexCount; fIndexCount += that->fIndexCount; this->joinBounds(*that); return CombineResult::kMerged; }