• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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. */
grsltype_to_location_size(GrSLType type)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 
finalize_helper(GrVkVaryingHandler::VarArray & vars)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 
onFinalize()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