blob: 2b3e97571eb9d681b4f4c8dd2c4d1381af301bf9 [file] [log] [blame]
jvanverth992ad362016-02-26 09:21:02 -08001/*
egdanielfd016d72016-09-27 12:13:05 -07002 * 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 */
jvanverth992ad362016-02-26 09:21:02 -08007
8#include "GrVkVaryingHandler.h"
9
egdaniel5b20c462016-09-27 09:09:44 -070010/** Returns the number of locations take up by a given GrSLType. We assume that all
11 scalar values are 32 bits. */
12static inline int grsltype_to_location_size(GrSLType type) {
Brian Salomonfa26e662016-11-14 11:27:00 -050013 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 kMat22f_GrSLType:
25 return 2;
26 case kMat33f_GrSLType:
27 return 3;
28 case kMat44f_GrSLType:
29 return 4;
30 case kTexture2DSampler_GrSLType:
31 return 0;
Brian Salomona8f00022016-11-16 12:55:57 -050032 case kITexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050033 return 0;
34 case kTextureExternalSampler_GrSLType:
35 return 0;
36 case kTexture2DRectSampler_GrSLType:
37 return 0;
csmartdalton22458032016-11-16 11:28:16 -070038 case kBufferSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050039 return 0;
40 case kBool_GrSLType:
41 return 1;
42 case kInt_GrSLType:
43 return 1;
44 case kUint_GrSLType:
45 return 1;
46 case kTexture2D_GrSLType:
47 return 0;
48 case kSampler_GrSLType:
49 return 0;
50 }
51 SkFAIL("Unexpected type");
52 return -1;
egdaniel5b20c462016-09-27 09:09:44 -070053}
jvanverth992ad362016-02-26 09:21:02 -080054
55void finalize_helper(GrVkVaryingHandler::VarArray& vars) {
egdaniel5b20c462016-09-27 09:09:44 -070056 int locationIndex = 0;
jvanverth992ad362016-02-26 09:21:02 -080057 for (int i = 0; i < vars.count(); ++i) {
Brian Salomon99938a82016-11-21 13:41:08 -050058 GrShaderVar& var = vars[i];
jvanverth992ad362016-02-26 09:21:02 -080059 SkString location;
egdaniel5b20c462016-09-27 09:09:44 -070060 location.appendf("location = %d", locationIndex);
61 var.setLayoutQualifier(location.c_str());
62
63 int elementSize = grsltype_to_location_size(var.getType());
64 SkASSERT(elementSize);
65 int numElements = 1;
66 if (var.isArray()) {
67 numElements = var.getArrayCount();
68 }
69 locationIndex += elementSize * numElements;
jvanverth992ad362016-02-26 09:21:02 -080070 }
egdaniel5b20c462016-09-27 09:09:44 -070071 // Vulkan requires at least 64 locations to be supported for both vertex output and fragment
72 // input. If we ever hit this assert, then we'll need to add a cap to actually check the
73 // supported input and output values and adjust our supported shaders based on those values.
74 SkASSERT(locationIndex <= 64);
jvanverth992ad362016-02-26 09:21:02 -080075}
76
77void GrVkVaryingHandler::onFinalize() {
78 finalize_helper(fVertexInputs);
79 finalize_helper(fVertexOutputs);
80 finalize_helper(fGeomInputs);
81 finalize_helper(fGeomOutputs);
82 finalize_helper(fFragInputs);
83 finalize_helper(fFragOutputs);
84}