| Index: src/gpu/vk/GrVkVaryingHandler.cpp
|
| diff --git a/src/gpu/vk/GrVkVaryingHandler.cpp b/src/gpu/vk/GrVkVaryingHandler.cpp
|
| index 71d548e43948649f495ca77670c32625e34d9c82..ac3a31570478472ad464c72d7fd840bac9ea866e 100644
|
| --- a/src/gpu/vk/GrVkVaryingHandler.cpp
|
| +++ b/src/gpu/vk/GrVkVaryingHandler.cpp
|
| @@ -7,13 +7,70 @@
|
|
|
| #include "GrVkVaryingHandler.h"
|
|
|
| +/** 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, // 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 == kTextureExternalSampler_GrSLType);
|
| + GR_STATIC_ASSERT(10 == kTexture2DRectSampler_GrSLType);
|
| + GR_STATIC_ASSERT(11 == kTextureBufferSampler_GrSLType);
|
| + GR_STATIC_ASSERT(12 == kBool_GrSLType);
|
| + GR_STATIC_ASSERT(13 == kInt_GrSLType);
|
| + GR_STATIC_ASSERT(14 == kUint_GrSLType);
|
| + GR_STATIC_ASSERT(15 == kTexture2D_GrSLType);
|
| + GR_STATIC_ASSERT(16 == kSampler_GrSLType);
|
| + GR_STATIC_ASSERT(SK_ARRAY_COUNT(kSizes) == kGrSLTypeCount);
|
| +}
|
|
|
| void finalize_helper(GrVkVaryingHandler::VarArray& vars) {
|
| + int locationIndex = 0;
|
| for (int i = 0; i < vars.count(); ++i) {
|
| + GrGLSLShaderVar& var = vars[i];
|
| SkString location;
|
| - location.appendf("location = %d", i);
|
| - vars[i].setLayoutQualifier(location.c_str());
|
| + location.appendf("location = %d", locationIndex);
|
| + var.setLayoutQualifier(location.c_str());
|
| +
|
| + int elementSize = grsltype_to_location_size(var.getType());
|
| + SkASSERT(elementSize);
|
| + int numElements = 1;
|
| + if (var.isArray()) {
|
| + numElements = var.getArrayCount();
|
| + }
|
| + locationIndex += elementSize * numElements;
|
| }
|
| + // Vulkan requires at least 64 locations to be supported for both vertex output and fragment
|
| + // input. If we ever hit this assert, then we'll need to add a cap to actually check the
|
| + // supported input and output values and adjust our supported shaders based on those values.
|
| + SkASSERT(locationIndex <= 64);
|
| }
|
|
|
| void GrVkVaryingHandler::onFinalize() {
|
|
|