1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "GrVkVaryingHandler.h" 9 10 /** Returns the number of locations take up by a given GrSLType. We assume that all 11 scalar values are 32 bits. */ grsltype_to_location_size(GrSLType type)12static inline int grsltype_to_location_size(GrSLType type) { 13 switch(type) { 14 case kVoid_GrSLType: 15 return 0; 16 case kFloat_GrSLType: 17 return 1; 18 case kVec2f_GrSLType: 19 return 1; 20 case kVec3f_GrSLType: 21 return 1; 22 case kVec4f_GrSLType: 23 return 1; 24 case kVec2i_GrSLType: 25 return 1; 26 case kVec3i_GrSLType: 27 return 1; 28 case kVec4i_GrSLType: 29 return 1; 30 case kMat22f_GrSLType: 31 return 2; 32 case kMat33f_GrSLType: 33 return 3; 34 case kMat44f_GrSLType: 35 return 4; 36 case kTexture2DSampler_GrSLType: 37 return 0; 38 case kITexture2DSampler_GrSLType: 39 return 0; 40 case kTextureExternalSampler_GrSLType: 41 return 0; 42 case kTexture2DRectSampler_GrSLType: 43 return 0; 44 case kBufferSampler_GrSLType: 45 return 0; 46 case kBool_GrSLType: 47 return 1; 48 case kInt_GrSLType: 49 return 1; 50 case kUint_GrSLType: 51 return 1; 52 case kTexture2D_GrSLType: 53 return 0; 54 case kSampler_GrSLType: 55 return 0; 56 case kImageStorage2D_GrSLType: 57 return 0; 58 case kIImageStorage2D_GrSLType: 59 return 0; 60 } 61 SkFAIL("Unexpected type"); 62 return -1; 63 } 64 finalize_helper(GrVkVaryingHandler::VarArray & vars)65void finalize_helper(GrVkVaryingHandler::VarArray& vars) { 66 int locationIndex = 0; 67 for (int i = 0; i < vars.count(); ++i) { 68 GrShaderVar& var = vars[i]; 69 SkString location; 70 location.appendf("location = %d", locationIndex); 71 var.addLayoutQualifier(location.c_str()); 72 73 int elementSize = grsltype_to_location_size(var.getType()); 74 SkASSERT(elementSize > 0); 75 int numElements = 1; 76 if (var.isArray() && !var.isUnsizedArray()) { 77 numElements = var.getArrayCount(); 78 } 79 SkASSERT(numElements > 0); 80 locationIndex += elementSize * numElements; 81 } 82 // Vulkan requires at least 64 locations to be supported for both vertex output and fragment 83 // input. If we ever hit this assert, then we'll need to add a cap to actually check the 84 // supported input and output values and adjust our supported shaders based on those values. 85 SkASSERT(locationIndex <= 64); 86 } 87 onFinalize()88void GrVkVaryingHandler::onFinalize() { 89 finalize_helper(fVertexInputs); 90 finalize_helper(fVertexOutputs); 91 finalize_helper(fGeomInputs); 92 finalize_helper(fGeomOutputs); 93 finalize_helper(fFragInputs); 94 finalize_helper(fFragOutputs); 95 } 96