diff options
author | egdaniel <egdaniel@google.com> | 2016-09-27 09:09:44 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-09-27 09:09:44 -0700 |
commit | 5b20c463a3e0cd0e101acfb77608cab8532717f2 (patch) | |
tree | 30a99019e0f489314f4172c7f27d2e16ec2d4279 /src | |
parent | 25661bac7722860b7589c5b01ec404531d941456 (diff) |
Update vulkan varying locations to correctly handle arrays
BUG=skia:5797
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2369013006
Review-Url: https://codereview.chromium.org/2369013006
Diffstat (limited to 'src')
-rw-r--r-- | src/gpu/vk/GrVkVaryingHandler.cpp | 61 |
1 files changed, 59 insertions, 2 deletions
diff --git a/src/gpu/vk/GrVkVaryingHandler.cpp b/src/gpu/vk/GrVkVaryingHandler.cpp index 71d548e439..ac3a315704 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() { |