blob: 59120980c176c01e60cbe225456f5b65d9179ca5 [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;
Brian Salomon1d816b92017-08-17 11:07:59 -040016 case kFloat_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050017 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040018 case kVec2f_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050019 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040020 case kVec3f_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050021 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040022 case kVec4f_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050023 return 1;
Robert Phillips8296e752017-08-25 08:45:21 -040024 case kVec2us_GrSLType:
25 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040026 case kVec2i_GrSLType:
csmartdaltonb37cb232017-02-08 14:56:27 -050027 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040028 case kVec3i_GrSLType:
csmartdaltonb37cb232017-02-08 14:56:27 -050029 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040030 case kVec4i_GrSLType:
csmartdaltonb37cb232017-02-08 14:56:27 -050031 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040032 case kMat22f_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050033 return 2;
Brian Salomon1d816b92017-08-17 11:07:59 -040034 case kMat33f_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050035 return 3;
Brian Salomon1d816b92017-08-17 11:07:59 -040036 case kMat44f_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050037 return 4;
38 case kTexture2DSampler_GrSLType:
39 return 0;
Brian Salomona8f00022016-11-16 12:55:57 -050040 case kITexture2DSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050041 return 0;
42 case kTextureExternalSampler_GrSLType:
43 return 0;
44 case kTexture2DRectSampler_GrSLType:
45 return 0;
csmartdalton22458032016-11-16 11:28:16 -070046 case kBufferSampler_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050047 return 0;
48 case kBool_GrSLType:
49 return 1;
Brian Salomon1d816b92017-08-17 11:07:59 -040050 case kInt_GrSLType:
Brian Salomonfa26e662016-11-14 11:27:00 -050051 return 1;
52 case kUint_GrSLType:
53 return 1;
54 case kTexture2D_GrSLType:
55 return 0;
56 case kSampler_GrSLType:
57 return 0;
Brian Salomonf9f45122016-11-29 11:59:17 -050058 case kImageStorage2D_GrSLType:
59 return 0;
60 case kIImageStorage2D_GrSLType:
61 return 0;
Brian Salomonfa26e662016-11-14 11:27:00 -050062 }
Ben Wagnerb4aab9a2017-08-16 10:53:04 -040063 SK_ABORT("Unexpected type");
Brian Salomonfa26e662016-11-14 11:27:00 -050064 return -1;
egdaniel5b20c462016-09-27 09:09:44 -070065}
jvanverth992ad362016-02-26 09:21:02 -080066
67void finalize_helper(GrVkVaryingHandler::VarArray& vars) {
egdaniel5b20c462016-09-27 09:09:44 -070068 int locationIndex = 0;
jvanverth992ad362016-02-26 09:21:02 -080069 for (int i = 0; i < vars.count(); ++i) {
Brian Salomon99938a82016-11-21 13:41:08 -050070 GrShaderVar& var = vars[i];
jvanverth992ad362016-02-26 09:21:02 -080071 SkString location;
egdaniel5b20c462016-09-27 09:09:44 -070072 location.appendf("location = %d", locationIndex);
Brian Salomon60397682016-11-22 15:06:46 -050073 var.addLayoutQualifier(location.c_str());
egdaniel5b20c462016-09-27 09:09:44 -070074
75 int elementSize = grsltype_to_location_size(var.getType());
Chris Dalton135e4462017-07-18 11:39:14 -060076 SkASSERT(elementSize > 0);
egdaniel5b20c462016-09-27 09:09:44 -070077 int numElements = 1;
Chris Dalton135e4462017-07-18 11:39:14 -060078 if (var.isArray() && !var.isUnsizedArray()) {
79 numElements = var.getArrayCount();
egdaniel5b20c462016-09-27 09:09:44 -070080 }
Chris Dalton135e4462017-07-18 11:39:14 -060081 SkASSERT(numElements > 0);
egdaniel5b20c462016-09-27 09:09:44 -070082 locationIndex += elementSize * numElements;
jvanverth992ad362016-02-26 09:21:02 -080083 }
egdaniel5b20c462016-09-27 09:09:44 -070084 // Vulkan requires at least 64 locations to be supported for both vertex output and fragment
85 // input. If we ever hit this assert, then we'll need to add a cap to actually check the
86 // supported input and output values and adjust our supported shaders based on those values.
87 SkASSERT(locationIndex <= 64);
jvanverth992ad362016-02-26 09:21:02 -080088}
89
90void GrVkVaryingHandler::onFinalize() {
91 finalize_helper(fVertexInputs);
92 finalize_helper(fVertexOutputs);
93 finalize_helper(fGeomInputs);
94 finalize_helper(fGeomOutputs);
95 finalize_helper(fFragInputs);
96 finalize_helper(fFragOutputs);
97}