Home | History | Annotate | Download | only in vk
      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. */
     12 static 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 
     65 void 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 
     88 void 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