/* * Copyright 2018 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "src/gpu/mtl/GrMtlVaryingHandler.h" #include "include/private/GrMtlTypesPriv.h" #if !__has_feature(objc_arc) #error This file must be compiled with Arc. Use -fobjc-arc flag #endif GR_NORETAIN_BEGIN static void finalize_helper(GrMtlVaryingHandler::VarArray& vars) { int locationIndex = 0; int componentCount = 0; for (GrShaderVar& var : vars.items()) { // Metal only allows scalars (including bool and char) and vectors as varyings SkASSERT(GrSLTypeVecLength(var.getType()) != -1); componentCount += GrSLTypeVecLength(var.getType()); SkString location; location.appendf("location = %d", locationIndex); var.addLayoutQualifier(location.c_str()); ++locationIndex; } // The max number of inputs is 60 for iOS and 32 for macOS. The max number of components is 60 // for iOS and 128 for macOS. To be conservative, we are going to assert that we have less than // 32 varyings and less than 60 components across all varyings. If we hit this assert, we can // implement a function in GrMtlCaps to be less conservative. SkASSERT(locationIndex <= 32); SkASSERT(componentCount <= 60); } void GrMtlVaryingHandler::onFinalize() { finalize_helper(fVertexInputs); finalize_helper(fVertexOutputs); finalize_helper(fGeomInputs); finalize_helper(fGeomOutputs); finalize_helper(fFragInputs); finalize_helper(fFragOutputs); } GR_NORETAIN_END