1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/gpu/GrSPIRVVaryingHandler.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci/** Returns the number of locations take up by a given GrSLType. We assume that all 11cb93a386Sopenharmony_ci scalar values are 32 bits. */ 12cb93a386Sopenharmony_cistatic inline int grsltype_to_location_size(GrSLType type) { 13cb93a386Sopenharmony_ci // If a new GrSL type is added, this function will need to be updated. 14cb93a386Sopenharmony_ci static_assert(kGrSLTypeCount == 41); 15cb93a386Sopenharmony_ci 16cb93a386Sopenharmony_ci switch(type) { 17cb93a386Sopenharmony_ci case kVoid_GrSLType: 18cb93a386Sopenharmony_ci return 0; 19cb93a386Sopenharmony_ci case kFloat_GrSLType: // fall through 20cb93a386Sopenharmony_ci case kHalf_GrSLType: 21cb93a386Sopenharmony_ci return 1; 22cb93a386Sopenharmony_ci case kFloat2_GrSLType: // fall through 23cb93a386Sopenharmony_ci case kHalf2_GrSLType: 24cb93a386Sopenharmony_ci return 1; 25cb93a386Sopenharmony_ci case kFloat3_GrSLType: 26cb93a386Sopenharmony_ci case kHalf3_GrSLType: 27cb93a386Sopenharmony_ci return 1; 28cb93a386Sopenharmony_ci case kFloat4_GrSLType: 29cb93a386Sopenharmony_ci case kHalf4_GrSLType: 30cb93a386Sopenharmony_ci return 1; 31cb93a386Sopenharmony_ci case kInt2_GrSLType: 32cb93a386Sopenharmony_ci case kUInt2_GrSLType: 33cb93a386Sopenharmony_ci case kShort2_GrSLType: 34cb93a386Sopenharmony_ci case kUShort2_GrSLType: 35cb93a386Sopenharmony_ci return 1; 36cb93a386Sopenharmony_ci case kInt3_GrSLType: 37cb93a386Sopenharmony_ci case kUInt3_GrSLType: 38cb93a386Sopenharmony_ci case kShort3_GrSLType: 39cb93a386Sopenharmony_ci case kUShort3_GrSLType: 40cb93a386Sopenharmony_ci return 1; 41cb93a386Sopenharmony_ci case kInt4_GrSLType: 42cb93a386Sopenharmony_ci case kUInt4_GrSLType: 43cb93a386Sopenharmony_ci case kShort4_GrSLType: 44cb93a386Sopenharmony_ci case kUShort4_GrSLType: 45cb93a386Sopenharmony_ci return 1; 46cb93a386Sopenharmony_ci case kFloat2x2_GrSLType: 47cb93a386Sopenharmony_ci case kHalf2x2_GrSLType: 48cb93a386Sopenharmony_ci return 2; 49cb93a386Sopenharmony_ci case kFloat3x3_GrSLType: 50cb93a386Sopenharmony_ci case kHalf3x3_GrSLType: 51cb93a386Sopenharmony_ci return 3; 52cb93a386Sopenharmony_ci case kFloat4x4_GrSLType: 53cb93a386Sopenharmony_ci case kHalf4x4_GrSLType: 54cb93a386Sopenharmony_ci return 4; 55cb93a386Sopenharmony_ci case kTexture2DSampler_GrSLType: 56cb93a386Sopenharmony_ci return 0; 57cb93a386Sopenharmony_ci case kTextureExternalSampler_GrSLType: 58cb93a386Sopenharmony_ci return 0; 59cb93a386Sopenharmony_ci case kTexture2DRectSampler_GrSLType: 60cb93a386Sopenharmony_ci return 0; 61cb93a386Sopenharmony_ci case kBool_GrSLType: 62cb93a386Sopenharmony_ci case kBool2_GrSLType: 63cb93a386Sopenharmony_ci case kBool3_GrSLType: 64cb93a386Sopenharmony_ci case kBool4_GrSLType: 65cb93a386Sopenharmony_ci return 1; 66cb93a386Sopenharmony_ci case kInt_GrSLType: // fall through 67cb93a386Sopenharmony_ci case kShort_GrSLType: 68cb93a386Sopenharmony_ci return 1; 69cb93a386Sopenharmony_ci case kUInt_GrSLType: // fall through 70cb93a386Sopenharmony_ci case kUShort_GrSLType: 71cb93a386Sopenharmony_ci return 1; 72cb93a386Sopenharmony_ci case kTexture2D_GrSLType: 73cb93a386Sopenharmony_ci return 0; 74cb93a386Sopenharmony_ci case kSampler_GrSLType: 75cb93a386Sopenharmony_ci return 0; 76cb93a386Sopenharmony_ci case kInput_GrSLType: 77cb93a386Sopenharmony_ci return 0; 78cb93a386Sopenharmony_ci } 79cb93a386Sopenharmony_ci SK_ABORT("Unexpected type"); 80cb93a386Sopenharmony_ci} 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_cistatic void finalize_helper(GrSPIRVVaryingHandler::VarArray& vars) { 83cb93a386Sopenharmony_ci int locationIndex = 0; 84cb93a386Sopenharmony_ci for (GrShaderVar& var : vars.items()) { 85cb93a386Sopenharmony_ci SkString location; 86cb93a386Sopenharmony_ci location.appendf("location = %d", locationIndex); 87cb93a386Sopenharmony_ci var.addLayoutQualifier(location.c_str()); 88cb93a386Sopenharmony_ci 89cb93a386Sopenharmony_ci int elementSize = grsltype_to_location_size(var.getType()); 90cb93a386Sopenharmony_ci SkASSERT(elementSize > 0); 91cb93a386Sopenharmony_ci int numElements = var.isArray() ? var.getArrayCount() : 1; 92cb93a386Sopenharmony_ci SkASSERT(numElements > 0); 93cb93a386Sopenharmony_ci locationIndex += elementSize * numElements; 94cb93a386Sopenharmony_ci } 95cb93a386Sopenharmony_ci // TODO: determine the layout limits for SPIR-V, and enforce them via asserts here. 96cb93a386Sopenharmony_ci} 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_civoid GrSPIRVVaryingHandler::onFinalize() { 99cb93a386Sopenharmony_ci finalize_helper(fVertexInputs); 100cb93a386Sopenharmony_ci finalize_helper(fVertexOutputs); 101cb93a386Sopenharmony_ci finalize_helper(fFragInputs); 102cb93a386Sopenharmony_ci finalize_helper(fFragOutputs); 103cb93a386Sopenharmony_ci} 104