1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2016 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/vk/GrVkVaryingHandler.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 switch(type) { 14cb93a386Sopenharmony_ci case kVoid_GrSLType: 15cb93a386Sopenharmony_ci return 0; 16cb93a386Sopenharmony_ci case kFloat_GrSLType: // fall through 17cb93a386Sopenharmony_ci case kHalf_GrSLType: 18cb93a386Sopenharmony_ci return 1; 19cb93a386Sopenharmony_ci case kFloat2_GrSLType: // fall through 20cb93a386Sopenharmony_ci case kHalf2_GrSLType: 21cb93a386Sopenharmony_ci return 1; 22cb93a386Sopenharmony_ci case kFloat3_GrSLType: 23cb93a386Sopenharmony_ci case kHalf3_GrSLType: 24cb93a386Sopenharmony_ci return 1; 25cb93a386Sopenharmony_ci case kFloat4_GrSLType: 26cb93a386Sopenharmony_ci case kHalf4_GrSLType: 27cb93a386Sopenharmony_ci return 1; 28cb93a386Sopenharmony_ci case kInt2_GrSLType: 29cb93a386Sopenharmony_ci case kUInt2_GrSLType: 30cb93a386Sopenharmony_ci case kShort2_GrSLType: 31cb93a386Sopenharmony_ci case kUShort2_GrSLType: 32cb93a386Sopenharmony_ci return 1; 33cb93a386Sopenharmony_ci case kInt3_GrSLType: 34cb93a386Sopenharmony_ci case kUInt3_GrSLType: 35cb93a386Sopenharmony_ci case kShort3_GrSLType: 36cb93a386Sopenharmony_ci case kUShort3_GrSLType: 37cb93a386Sopenharmony_ci return 1; 38cb93a386Sopenharmony_ci case kInt4_GrSLType: 39cb93a386Sopenharmony_ci case kUInt4_GrSLType: 40cb93a386Sopenharmony_ci case kShort4_GrSLType: 41cb93a386Sopenharmony_ci case kUShort4_GrSLType: 42cb93a386Sopenharmony_ci return 1; 43cb93a386Sopenharmony_ci case kFloat2x2_GrSLType: 44cb93a386Sopenharmony_ci case kHalf2x2_GrSLType: 45cb93a386Sopenharmony_ci return 2; 46cb93a386Sopenharmony_ci case kFloat3x3_GrSLType: 47cb93a386Sopenharmony_ci case kHalf3x3_GrSLType: 48cb93a386Sopenharmony_ci return 3; 49cb93a386Sopenharmony_ci case kFloat4x4_GrSLType: 50cb93a386Sopenharmony_ci case kHalf4x4_GrSLType: 51cb93a386Sopenharmony_ci return 4; 52cb93a386Sopenharmony_ci case kTexture2DSampler_GrSLType: 53cb93a386Sopenharmony_ci case kSampler_GrSLType: 54cb93a386Sopenharmony_ci case kTexture2D_GrSLType: 55cb93a386Sopenharmony_ci case kInput_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 } 73cb93a386Sopenharmony_ci SK_ABORT("Unexpected type"); 74cb93a386Sopenharmony_ci} 75cb93a386Sopenharmony_ci 76cb93a386Sopenharmony_cistatic void finalize_helper(GrVkVaryingHandler::VarArray& vars) { 77cb93a386Sopenharmony_ci int locationIndex = 0; 78cb93a386Sopenharmony_ci for (GrShaderVar& var : vars.items()) { 79cb93a386Sopenharmony_ci SkString location; 80cb93a386Sopenharmony_ci location.appendf("location = %d", locationIndex); 81cb93a386Sopenharmony_ci var.addLayoutQualifier(location.c_str()); 82cb93a386Sopenharmony_ci 83cb93a386Sopenharmony_ci int elementSize = grsltype_to_location_size(var.getType()); 84cb93a386Sopenharmony_ci SkASSERT(elementSize > 0); 85cb93a386Sopenharmony_ci int numElements = var.isArray() ? var.getArrayCount() : 1; 86cb93a386Sopenharmony_ci SkASSERT(numElements > 0); 87cb93a386Sopenharmony_ci locationIndex += elementSize * numElements; 88cb93a386Sopenharmony_ci } 89cb93a386Sopenharmony_ci // Vulkan requires at least 64 locations to be supported for both vertex output and fragment 90cb93a386Sopenharmony_ci // input. If we ever hit this assert, then we'll need to add a cap to actually check the 91cb93a386Sopenharmony_ci // supported input and output values and adjust our supported shaders based on those values. 92cb93a386Sopenharmony_ci SkASSERT(locationIndex <= 64); 93cb93a386Sopenharmony_ci} 94cb93a386Sopenharmony_ci 95cb93a386Sopenharmony_civoid GrVkVaryingHandler::onFinalize() { 96cb93a386Sopenharmony_ci finalize_helper(fVertexInputs); 97cb93a386Sopenharmony_ci finalize_helper(fVertexOutputs); 98cb93a386Sopenharmony_ci finalize_helper(fFragInputs); 99cb93a386Sopenharmony_ci finalize_helper(fFragOutputs); 100cb93a386Sopenharmony_ci} 101