1*c8dee2aaSAndroid Build Coastguard Worker/* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2018 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/ganesh/mtl/GrMtlVaryingHandler.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker#include "src/gpu/ganesh/mtl/GrMtlTypesPriv.h" 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker#if !__has_feature(objc_arc) 13*c8dee2aaSAndroid Build Coastguard Worker#error This file must be compiled with Arc. Use -fobjc-arc flag 14*c8dee2aaSAndroid Build Coastguard Worker#endif 15*c8dee2aaSAndroid Build Coastguard Worker 16*c8dee2aaSAndroid Build Coastguard WorkerGR_NORETAIN_BEGIN 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Workerstatic void finalize_helper(GrMtlVaryingHandler::VarArray& vars) { 19*c8dee2aaSAndroid Build Coastguard Worker int locationIndex = 0; 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(int componentCount = 0); 22*c8dee2aaSAndroid Build Coastguard Worker for (GrShaderVar& var : vars.items()) { 23*c8dee2aaSAndroid Build Coastguard Worker // Metal only allows scalars (including bool and char) and vectors as varyings 24*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(SkSLTypeVecLength(var.getType()) != -1); 25*c8dee2aaSAndroid Build Coastguard Worker SkDEBUGCODE(componentCount += SkSLTypeVecLength(var.getType())); 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker SkString location; 28*c8dee2aaSAndroid Build Coastguard Worker location.appendf("location = %d", locationIndex); 29*c8dee2aaSAndroid Build Coastguard Worker var.addLayoutQualifier(location.c_str()); 30*c8dee2aaSAndroid Build Coastguard Worker ++locationIndex; 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker // The max number of inputs is 60 for iOS and 32 for macOS. The max number of components is 60 33*c8dee2aaSAndroid Build Coastguard Worker // for iOS and 128 for macOS. To be conservative, we are going to assert that we have less than 34*c8dee2aaSAndroid Build Coastguard Worker // 32 varyings and less than 60 components across all varyings. If we hit this assert, we can 35*c8dee2aaSAndroid Build Coastguard Worker // implement a function in GrMtlCaps to be less conservative. 36*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(locationIndex <= 32); 37*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(componentCount <= 60); 38*c8dee2aaSAndroid Build Coastguard Worker} 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Workervoid GrMtlVaryingHandler::onFinalize() { 41*c8dee2aaSAndroid Build Coastguard Worker finalize_helper(fVertexInputs); 42*c8dee2aaSAndroid Build Coastguard Worker finalize_helper(fVertexOutputs); 43*c8dee2aaSAndroid Build Coastguard Worker finalize_helper(fFragInputs); 44*c8dee2aaSAndroid Build Coastguard Worker finalize_helper(fFragOutputs); 45*c8dee2aaSAndroid Build Coastguard Worker} 46*c8dee2aaSAndroid Build Coastguard Worker 47*c8dee2aaSAndroid Build Coastguard WorkerGR_NORETAIN_END 48