Update vulkan varying locations to correctly handle arrays

BUG=skia:5797
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2369013006

Review-Url: https://codereview.chromium.org/2369013006
diff --git a/src/gpu/vk/GrVkVaryingHandler.cpp b/src/gpu/vk/GrVkVaryingHandler.cpp
index 71d548e..ac3a315 100644
--- a/src/gpu/vk/GrVkVaryingHandler.cpp
+++ b/src/gpu/vk/GrVkVaryingHandler.cpp
@@ -7,13 +7,70 @@
 
 #include "GrVkVaryingHandler.h"
 
+/** Returns the number of locations take up by a given GrSLType. We assume that all
+    scalar values are 32 bits. */
+static inline int grsltype_to_location_size(GrSLType type) {
+    static const uint32_t kSizes[] = {
+        0,  // kVoid_GrSLType
+        1,  // kFloat_GrSLType
+        1,  // kVec2f_GrSLType
+        1,  // kVec3f_GrSLType
+        1,  // kVec4f_GrSLType
+        2,  // kMat22f_GrSLType
+        3,  // kMat33f_GrSLType
+        4,  // kMat44f_GrSLType
+        0,  // kTexture2DSampler_GrSLType
+        0,  // kTextureExternalSampler_GrSLType
+        0,  // kTexture2DRectSampler_GrSLType
+        0,  // kTextureBufferSampler_GrSLType
+        1,  // kBool_GrSLType
+        1,  // kInt_GrSLType
+        1,  // kUint_GrSLType
+        0,  // kTexture2D_GrSLType
+        0,  // kSampler_GrSLType
+    };
+    return kSizes[type];
+
+    GR_STATIC_ASSERT(0 == kVoid_GrSLType);
+    GR_STATIC_ASSERT(1 == kFloat_GrSLType);
+    GR_STATIC_ASSERT(2 == kVec2f_GrSLType);
+    GR_STATIC_ASSERT(3 == kVec3f_GrSLType);
+    GR_STATIC_ASSERT(4 == kVec4f_GrSLType);
+    GR_STATIC_ASSERT(5 == kMat22f_GrSLType);
+    GR_STATIC_ASSERT(6 == kMat33f_GrSLType);
+    GR_STATIC_ASSERT(7 == kMat44f_GrSLType);
+    GR_STATIC_ASSERT(8 == kTexture2DSampler_GrSLType);
+    GR_STATIC_ASSERT(9 == kTextureExternalSampler_GrSLType);
+    GR_STATIC_ASSERT(10 == kTexture2DRectSampler_GrSLType);
+    GR_STATIC_ASSERT(11 == kTextureBufferSampler_GrSLType);
+    GR_STATIC_ASSERT(12 == kBool_GrSLType);
+    GR_STATIC_ASSERT(13 == kInt_GrSLType);
+    GR_STATIC_ASSERT(14 == kUint_GrSLType);
+    GR_STATIC_ASSERT(15 == kTexture2D_GrSLType);
+    GR_STATIC_ASSERT(16 == kSampler_GrSLType);
+    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kSizes) == kGrSLTypeCount);
+}
 
 void finalize_helper(GrVkVaryingHandler::VarArray& vars) {
+    int locationIndex = 0;
     for (int i = 0; i < vars.count(); ++i) {
+        GrGLSLShaderVar& var = vars[i];
         SkString location;
-        location.appendf("location = %d", i);
-        vars[i].setLayoutQualifier(location.c_str());
+        location.appendf("location = %d", locationIndex);
+        var.setLayoutQualifier(location.c_str());
+
+        int elementSize = grsltype_to_location_size(var.getType());
+        SkASSERT(elementSize);
+        int numElements = 1;
+        if (var.isArray()) {
+           numElements = var.getArrayCount();
+        }
+        locationIndex += elementSize * numElements;
     }
+    // Vulkan requires at least 64 locations to be supported for both vertex output and fragment
+    // input. If we ever hit this assert, then we'll need to add a cap to actually check the
+    // supported input and output values and adjust our supported shaders based on those values.
+    SkASSERT(locationIndex <= 64);
 }
 
 void GrVkVaryingHandler::onFinalize() {