diff --git a/include/gpu/GrTypesPriv.h b/include/gpu/GrTypesPriv.h
index 44d5599..2fa4c3a 100644
--- a/include/gpu/GrTypesPriv.h
+++ b/include/gpu/GrTypesPriv.h
@@ -17,6 +17,9 @@
   */
 enum GrSLType {
     kVoid_GrSLType,
+    kBool_GrSLType,
+    kInt_GrSLType,
+    kUint_GrSLType,
     kFloat_GrSLType,
     kVec2f_GrSLType,
     kVec3f_GrSLType,
@@ -29,9 +32,6 @@
     kTextureExternalSampler_GrSLType,
     kTexture2DRectSampler_GrSLType,
     kTextureBufferSampler_GrSLType,
-    kBool_GrSLType,
-    kInt_GrSLType,
-    kUint_GrSLType,
     kTexture2D_GrSLType,
     kSampler_GrSLType,
 
@@ -83,173 +83,117 @@
 
 static const int kGrSLPrecisionCount = kLast_GrSLPrecision + 1;
 
-/**
- * Gets the vector size of the SLType. Returns -1 for void, matrices, and samplers.
- */
-static inline int GrSLTypeVectorCount(GrSLType type) {
-    SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount));
-    static const int kCounts[] = { -1, 1, 2, 3, 4, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, -1, -1, -1 };
-    return kCounts[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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kCounts) == kGrSLTypeCount);
-}
-
-/** Return the type enum for a vector of floats of length n (1..4),
- e.g. 1 -> kFloat_GrSLType, 2 -> kVec2_GrSLType, ... */
-static inline GrSLType GrSLFloatVectorType(int count) {
-    SkASSERT(count > 0 && count <= 4);
-    return (GrSLType)(count);
-
-    GR_STATIC_ASSERT(kFloat_GrSLType == 1);
-    GR_STATIC_ASSERT(kVec2f_GrSLType == 2);
-    GR_STATIC_ASSERT(kVec3f_GrSLType == 3);
-    GR_STATIC_ASSERT(kVec4f_GrSLType == 4);
-}
-
 /** Is the shading language type float (including vectors/matrices)? */
 static inline bool GrSLTypeIsFloatType(GrSLType type) {
-    SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount));
-    return type >= kFloat_GrSLType && type <= kMat44f_GrSLType;
+    switch (type) {
+        case kFloat_GrSLType:
+        case kVec2f_GrSLType:
+        case kVec3f_GrSLType:
+        case kVec4f_GrSLType:
+        case kMat22f_GrSLType:
+        case kMat33f_GrSLType:
+        case kMat44f_GrSLType:
+            return true;
 
-    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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(18 == kGrSLTypeCount);
-}
-
-/** Is the shading language type integral (including vectors/matrices)? */
-static inline bool GrSLTypeIsIntType(GrSLType type) {
-    SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount));
-    return type >= kInt_GrSLType && type <= kUint_GrSLType;
-
-    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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(18 == kGrSLTypeCount);
-}
-
-/** Is the shading language type numeric (including vectors/matrices)? */
-static inline bool GrSLTypeIsNumeric(GrSLType type) {
-    return GrSLTypeIsFloatType(type) || GrSLTypeIsIntType(type);
-}
-
-/** Returns the size in bytes for floating point GrSLTypes. For non floating point type returns 0 */
-static inline size_t GrSLTypeSize(GrSLType type) {
-    SkASSERT(GrSLTypeIsFloatType(type));
-    static const size_t kSizes[] = {
-        0,                        // kVoid_GrSLType
-        sizeof(float),            // kFloat_GrSLType
-        2 * sizeof(float),        // kVec2f_GrSLType
-        3 * sizeof(float),        // kVec3f_GrSLType
-        4 * sizeof(float),        // kVec4f_GrSLType
-        2 * 2 * sizeof(float),    // kMat22f_GrSLType
-        3 * 3 * sizeof(float),    // kMat33f_GrSLType
-        4 * 4 * sizeof(float),    // kMat44f_GrSLType
-        0,                        // kTexture2DSampler_GrSLType
-        0,                        // kTexture2DISampler_GrSLType
-        0,                        // kTextureExternalSampler_GrSLType
-        0,                        // kTexture2DRectSampler_GrSLType
-        0,                        // kTextureBufferSampler_GrSLType
-        0,                        // kBool_GrSLType
-        0,                        // kInt_GrSLType
-        0,                        // 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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(18 == kGrSLTypeCount);
+        case kVoid_GrSLType:
+        case kTexture2DSampler_GrSLType:
+        case kTexture2DISampler_GrSLType:
+        case kTextureExternalSampler_GrSLType:
+        case kTexture2DRectSampler_GrSLType:
+        case kTextureBufferSampler_GrSLType:
+        case kBool_GrSLType:
+        case kInt_GrSLType:
+        case kUint_GrSLType:
+        case kTexture2D_GrSLType:
+        case kSampler_GrSLType:
+            return false;
+    }
+    SkFAIL("Unexpected type");
+    return false;
 }
 
 static inline bool GrSLTypeIs2DCombinedSamplerType(GrSLType type) {
-    SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount));
-    return type >= kTexture2DSampler_GrSLType && type <= kTexture2DRectSampler_GrSLType;
+    switch (type) {
+        case kTexture2DSampler_GrSLType:
+        case kTexture2DISampler_GrSLType:
+        case kTextureExternalSampler_GrSLType:
+        case kTexture2DRectSampler_GrSLType:
+            return true;
 
-    GR_STATIC_ASSERT(8 == kTexture2DSampler_GrSLType);
-    GR_STATIC_ASSERT(9 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
+        case kVoid_GrSLType:
+        case kFloat_GrSLType:
+        case kVec2f_GrSLType:
+        case kVec3f_GrSLType:
+        case kVec4f_GrSLType:
+        case kMat22f_GrSLType:
+        case kMat33f_GrSLType:
+        case kMat44f_GrSLType:
+        case kTextureBufferSampler_GrSLType:
+        case kInt_GrSLType:
+        case kUint_GrSLType:
+        case kBool_GrSLType:
+        case kTexture2D_GrSLType:
+        case kSampler_GrSLType:
+            return false;
+    }
+    SkFAIL("Unexpected type");
+    return false;
 }
 
 static inline bool GrSLTypeIsCombinedSamplerType(GrSLType type) {
-    SkASSERT(type >= 0 && type < static_cast<GrSLType>(kGrSLTypeCount));
-    return type >= kTexture2DSampler_GrSLType && type <= kTextureBufferSampler_GrSLType;
+    switch (type) {
+        case kTexture2DSampler_GrSLType:
+        case kTexture2DISampler_GrSLType:
+        case kTextureExternalSampler_GrSLType:
+        case kTexture2DRectSampler_GrSLType:
+        case kTextureBufferSampler_GrSLType:
+            return true;
 
-    GR_STATIC_ASSERT(8 == kTexture2DSampler_GrSLType);
-    GR_STATIC_ASSERT(9 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
+        case kVoid_GrSLType:
+        case kFloat_GrSLType:
+        case kVec2f_GrSLType:
+        case kVec3f_GrSLType:
+        case kVec4f_GrSLType:
+        case kMat22f_GrSLType:
+        case kMat33f_GrSLType:
+        case kMat44f_GrSLType:
+        case kInt_GrSLType:
+        case kUint_GrSLType:
+        case kBool_GrSLType:
+        case kTexture2D_GrSLType:
+        case kSampler_GrSLType:
+            return false;
+    }
+    SkFAIL("Unexpected type");
+    return false;
 }
 
 static inline bool GrSLTypeAcceptsPrecision(GrSLType type) {
-    return type != kVoid_GrSLType && type != kBool_GrSLType;
+    switch (type) {
+        case kInt_GrSLType:
+        case kUint_GrSLType:
+        case kFloat_GrSLType:
+        case kVec2f_GrSLType:
+        case kVec3f_GrSLType:
+        case kVec4f_GrSLType:
+        case kMat22f_GrSLType:
+        case kMat33f_GrSLType:
+        case kMat44f_GrSLType:
+        case kTexture2DSampler_GrSLType:
+        case kTexture2DISampler_GrSLType:
+        case kTextureExternalSampler_GrSLType:
+        case kTexture2DRectSampler_GrSLType:
+        case kTextureBufferSampler_GrSLType:
+        case kTexture2D_GrSLType:
+        case kSampler_GrSLType:
+            return true;
+
+        case kVoid_GrSLType:
+        case kBool_GrSLType:
+            return false;
+    }
+    SkFAIL("Unexpected type");
+    return false;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -275,72 +219,61 @@
 };
 static const int kGrVertexAttribTypeCount = kLast_GrVertexAttribType + 1;
 
-/**
- * Returns the vector size of the type.
- */
-static inline int GrVertexAttribTypeVectorCount(GrVertexAttribType type) {
-    SkASSERT(type >= 0 && type < kGrVertexAttribTypeCount);
-    static const int kCounts[] = { 1, 2, 3, 4, 1, 4, 2, 1, 1 };
-    return kCounts[type];
-
-    GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType);
-    GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType);
-    GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType);
-    GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType);
-    GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType);
-    GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType);
-    GR_STATIC_ASSERT(6 == kVec2us_GrVertexAttribType);
-    GR_STATIC_ASSERT(7 == kInt_GrVertexAttribType);
-    GR_STATIC_ASSERT(8 == kUint_GrVertexAttribType);
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kCounts) == kGrVertexAttribTypeCount);
-}
 
 /**
  * Returns the size of the attrib type in bytes.
  */
 static inline size_t GrVertexAttribTypeSize(GrVertexAttribType type) {
-    static const size_t kSizes[] = {
-        sizeof(float),          // kFloat_GrVertexAttribType
-        2*sizeof(float),        // kVec2f_GrVertexAttribType
-        3*sizeof(float),        // kVec3f_GrVertexAttribType
-        4*sizeof(float),        // kVec4f_GrVertexAttribType
-        1*sizeof(char),         // kUByte_GrVertexAttribType
-        4*sizeof(char),         // kVec4ub_GrVertexAttribType
-        2*sizeof(int16_t),      // kVec2us_GrVertexAttribType
-        sizeof(int32_t),        // kInt_GrVertexAttribType
-        sizeof(uint32_t)        // kUint_GrVertexAttribType
-    };
-    return kSizes[type];
-
-    GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType);
-    GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType);
-    GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType);
-    GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType);
-    GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType);
-    GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType);
-    GR_STATIC_ASSERT(6 == kVec2us_GrVertexAttribType);
-    GR_STATIC_ASSERT(7 == kInt_GrVertexAttribType);
-    GR_STATIC_ASSERT(8 == kUint_GrVertexAttribType);
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kSizes) == kGrVertexAttribTypeCount);
+    switch (type) {
+        case kFloat_GrVertexAttribType:
+            return sizeof(float);
+        case kVec2f_GrVertexAttribType:
+            return 2*sizeof(float);
+        case kVec3f_GrVertexAttribType:
+            return 3*sizeof(float);
+        case kVec4f_GrVertexAttribType:
+            return 4*sizeof(float);
+        case kUByte_GrVertexAttribType:
+            return 1*sizeof(char);
+        case kVec4ub_GrVertexAttribType:
+            return 4*sizeof(char);
+        case kVec2us_GrVertexAttribType:
+            return 2*sizeof(int16_t);
+        case kInt_GrVertexAttribType:
+            return sizeof(int32_t);
+        case kUint_GrVertexAttribType:
+            return sizeof(uint32_t);
+    }
+    SkFAIL("Unexpected attribute type");
+    return 0;
 }
 
 /**
  * Is the attrib type integral?
  */
 static inline bool GrVertexAttribTypeIsIntType(GrVertexAttribType type) {
-    SkASSERT(type >= 0 && type < static_cast<GrVertexAttribType>(kGrVertexAttribTypeCount));
-    return type >= kInt_GrVertexAttribType;
-
-    GR_STATIC_ASSERT(0 == kFloat_GrVertexAttribType);
-    GR_STATIC_ASSERT(1 == kVec2f_GrVertexAttribType);
-    GR_STATIC_ASSERT(2 == kVec3f_GrVertexAttribType);
-    GR_STATIC_ASSERT(3 == kVec4f_GrVertexAttribType);
-    GR_STATIC_ASSERT(4 == kUByte_GrVertexAttribType);
-    GR_STATIC_ASSERT(5 == kVec4ub_GrVertexAttribType);
-    GR_STATIC_ASSERT(6 == kVec2us_GrVertexAttribType);
-    GR_STATIC_ASSERT(7 == kInt_GrVertexAttribType);
-    GR_STATIC_ASSERT(8 == kUint_GrVertexAttribType);
-    GR_STATIC_ASSERT(9 == kGrVertexAttribTypeCount);
+    switch (type) {
+        case kFloat_GrVertexAttribType:
+            return false;
+        case kVec2f_GrVertexAttribType:
+            return false;
+        case kVec3f_GrVertexAttribType:
+            return false;
+        case kVec4f_GrVertexAttribType:
+            return false;
+        case kUByte_GrVertexAttribType:
+            return false;
+        case kVec4ub_GrVertexAttribType:
+            return false;
+        case kVec2us_GrVertexAttribType:
+            return false;
+        case kInt_GrVertexAttribType:
+            return true;
+        case kUint_GrVertexAttribType:
+            return true;
+    }
+    SkFAIL("Unexpected attribute type");
+    return false;
 }
 
 /**
@@ -348,9 +281,6 @@
  */
 static inline GrSLType GrVertexAttribTypeToSLType(GrVertexAttribType type) {
     switch (type) {
-        default:
-            SkFAIL("Unsupported type conversion");
-            return kVoid_GrSLType;
         case kUByte_GrVertexAttribType:
         case kFloat_GrVertexAttribType:
             return kFloat_GrSLType;
@@ -367,6 +297,8 @@
         case kUint_GrVertexAttribType:
             return kUint_GrSLType;
     }
+    SkFAIL("Unsupported type conversion");
+    return kVoid_GrSLType;
 }
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/vk/GrVkUniformHandler.cpp b/src/gpu/vk/GrVkUniformHandler.cpp
index 7c11b9d..612d0db 100644
--- a/src/gpu/vk/GrVkUniformHandler.cpp
+++ b/src/gpu/vk/GrVkUniformHandler.cpp
@@ -15,95 +15,81 @@
 // the std140 alignment, you can use this, but then make sure if you have an array type it is
 // aligned to 16 bytes (i.e. has mask of 0xF).
 uint32_t grsltype_to_alignment_mask(GrSLType type) {
-    SkASSERT(GrSLTypeIsFloatType(type));
-    static const uint32_t kAlignmentMask[] = {
-        0x0, // kVoid_GrSLType, should never return this
-        0x3, // kFloat_GrSLType
-        0x7, // kVec2f_GrSLType
-        0xF, // kVec3f_GrSLType
-        0xF, // kVec4f_GrSLType
-        0x7, // kMat22f_GrSLType
-        0xF, // kMat33f_GrSLType
-        0xF, // kMat44f_GrSLType
-        0x0, // kTexture2DSampler_GrSLType, should never return this
-        0x0, // kTexture2DISampler_GrSLType, should never return this
-        0x0, // kTextureExternalSampler_GrSLType, should never return this
-        0x0, // kTexture2DSamplerRect_GrSLType, should never return this
-        0x0, // ktextureBufferSampler_GrSLType, should never return this
-        0x0, // kBool_GrSLType
-        0x7, // kInt_GrSLType
-        0x7, // kUint_GrSLType
-        0x0, // Texture2D_GrSLType, should never return this
-        0x0, // Sampler_GrSLType, should never return this
-    };
-    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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kAlignmentMask) == kGrSLTypeCount);
-    return kAlignmentMask[type];
+    switch(type) {
+        case kInt_GrSLType:
+            return 0x3;
+        case kUint_GrSLType:
+            return 0x3;
+        case kFloat_GrSLType:
+            return 0x3;
+        case kVec2f_GrSLType:
+            return 0x7;
+        case kVec3f_GrSLType:
+            return 0xF;
+        case kVec4f_GrSLType:
+            return 0xF;
+        case kMat22f_GrSLType:
+            return 0x7;
+        case kMat33f_GrSLType:
+            return 0xF;
+        case kMat44f_GrSLType:
+            return 0xF;
+
+        // This query is only valid for certain types.
+        case kVoid_GrSLType:
+        case kBool_GrSLType:
+        case kTexture2DSampler_GrSLType:
+        case kTexture2DISampler_GrSLType:
+        case kTextureExternalSampler_GrSLType:
+        case kTexture2DRectSampler_GrSLType:
+        case kTextureBufferSampler_GrSLType:
+        case kTexture2D_GrSLType:
+        case kSampler_GrSLType:
+            break;
+    }
+    SkFAIL("Unexpected type");
+    return 0;
 }
 
 /** Returns the size in bytes taken up in vulkanbuffers for floating point GrSLTypes.
     For non floating point type returns 0. Currently this reflects the std140 alignment
     so a mat22 takes up 8 floats. */
 static inline uint32_t grsltype_to_vk_size(GrSLType type) {
-    SkASSERT(GrSLTypeIsFloatType(type));
-    static const uint32_t kSizes[] = {
-        0,                        // kVoid_GrSLType
-        sizeof(float),            // kFloat_GrSLType
-        2 * sizeof(float),        // kVec2f_GrSLType
-        3 * sizeof(float),        // kVec3f_GrSLType
-        4 * sizeof(float),        // kVec4f_GrSLType
-        8 * sizeof(float),        // kMat22f_GrSLType. TODO: this will be 4 * szof(float) on std430.
-        12 * sizeof(float),       // kMat33f_GrSLType
-        16 * sizeof(float),       // kMat44f_GrSLType
-        0,                        // kTexture2DSampler_GrSLType
-        0,                        // kTexture2DISampler_GrSLType
-        0,                        // kTextureExternalSampler_GrSLType
-        0,                        // kTexture2DRectSampler_GrSLType
-        0,                        // kTextureBufferSampler_GrSLType
-        1,                        // kBool_GrSLType
-        4,                        // kInt_GrSLType
-        4,                        // kUint_GrSLType
-        0,                        // kTexture2D_GrSLType
-        0,                        // kSampler_GrSLType
-    };
-    return kSizes[type];
+    switch(type) {
+        case kInt_GrSLType:
+            return 4;
+        case kUint_GrSLType:
+            return 4;
+        case kFloat_GrSLType:
+            return sizeof(float);
+        case kVec2f_GrSLType:
+            return 2 * sizeof(float);
+        case kVec3f_GrSLType:
+            return 3 * sizeof(float);
+        case kVec4f_GrSLType:
+            return 4 * sizeof(float);
+        case kMat22f_GrSLType:
+            //TODO: this will be 4 * szof(float) on std430.
+            return 8 * sizeof(float);
+        case kMat33f_GrSLType:
+            return 12 * sizeof(float);
+        case kMat44f_GrSLType:
+            return 16 * sizeof(float);
 
-    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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kSizes) == kGrSLTypeCount);
+        // This query is only valid for certain types.
+        case kVoid_GrSLType:
+        case kBool_GrSLType:
+        case kTexture2DSampler_GrSLType:
+        case kTexture2DISampler_GrSLType:
+        case kTextureExternalSampler_GrSLType:
+        case kTexture2DRectSampler_GrSLType:
+        case kTextureBufferSampler_GrSLType:
+        case kTexture2D_GrSLType:
+        case kSampler_GrSLType:
+            break;
+    }
+    SkFAIL("Unexpected type");
+    return 0;
 }
 
 
diff --git a/src/gpu/vk/GrVkVaryingHandler.cpp b/src/gpu/vk/GrVkVaryingHandler.cpp
index 10c5362..988e62c 100644
--- a/src/gpu/vk/GrVkVaryingHandler.cpp
+++ b/src/gpu/vk/GrVkVaryingHandler.cpp
@@ -10,47 +10,46 @@
 /** 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,  // kTexture2DISampler_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 == kTexture2DISampler_GrSLType);
-    GR_STATIC_ASSERT(10 == kTextureExternalSampler_GrSLType);
-    GR_STATIC_ASSERT(11 == kTexture2DRectSampler_GrSLType);
-    GR_STATIC_ASSERT(12 == kTextureBufferSampler_GrSLType);
-    GR_STATIC_ASSERT(13 == kBool_GrSLType);
-    GR_STATIC_ASSERT(14 == kInt_GrSLType);
-    GR_STATIC_ASSERT(15 == kUint_GrSLType);
-    GR_STATIC_ASSERT(16 == kTexture2D_GrSLType);
-    GR_STATIC_ASSERT(17 == kSampler_GrSLType);
-    GR_STATIC_ASSERT(SK_ARRAY_COUNT(kSizes) == kGrSLTypeCount);
+    switch(type) {
+        case kVoid_GrSLType:
+            return 0;
+        case kFloat_GrSLType:
+            return 1;
+        case kVec2f_GrSLType:
+            return 1;
+        case kVec3f_GrSLType:
+            return 1;
+        case kVec4f_GrSLType:
+            return 1;
+        case kMat22f_GrSLType:
+            return 2;
+        case kMat33f_GrSLType:
+            return 3;
+        case kMat44f_GrSLType:
+            return 4;
+        case kTexture2DSampler_GrSLType:
+            return 0;
+        case kTexture2DISampler_GrSLType:
+             return 0;
+        case kTextureExternalSampler_GrSLType:
+             return 0;
+        case kTexture2DRectSampler_GrSLType:
+             return 0;
+        case kTextureBufferSampler_GrSLType:
+             return 0;
+        case kBool_GrSLType:
+             return 1;
+        case kInt_GrSLType:
+             return 1;
+        case kUint_GrSLType:
+             return 1;
+        case kTexture2D_GrSLType:
+             return 0;
+        case kSampler_GrSLType:
+             return 0;
+    }
+    SkFAIL("Unexpected type");
+    return -1;
 }
 
 void finalize_helper(GrVkVaryingHandler::VarArray& vars) {
