SPV: Plumb through XFB buffer and stride information.
Also, only emit this XFB information where the SPIR-V spec says
it should be emitted: essentially, on objects.
This and the previous commit together fix #1185.
diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp
index 4ae5286..745021f 100755
--- a/SPIRV/GlslangToSpv.cpp
+++ b/SPIRV/GlslangToSpv.cpp
@@ -2661,13 +2661,6 @@
builder.addCapability(spv::CapabilityGeometryStreams);
builder.addDecoration(spvType, spv::DecorationStream, type.getQualifier().layoutStream);
}
- if (glslangIntermediate->getXfbMode()) {
- builder.addCapability(spv::CapabilityTransformFeedback);
- if (type.getQualifier().hasXfbStride())
- builder.addDecoration(spvType, spv::DecorationXfbStride, type.getQualifier().layoutXfbStride);
- if (type.getQualifier().hasXfbBuffer())
- builder.addDecoration(spvType, spv::DecorationXfbBuffer, type.getQualifier().layoutXfbBuffer);
- }
}
// Turn the expression forming the array size into an id.
@@ -5508,15 +5501,6 @@
builder.addDecoration(id, spv::DecorationIndex, symbol->getQualifier().layoutIndex);
if (symbol->getQualifier().hasComponent())
builder.addDecoration(id, spv::DecorationComponent, symbol->getQualifier().layoutComponent);
- if (glslangIntermediate->getXfbMode()) {
- builder.addCapability(spv::CapabilityTransformFeedback);
- if (symbol->getQualifier().hasXfbStride())
- builder.addDecoration(id, spv::DecorationXfbStride, symbol->getQualifier().layoutXfbStride);
- if (symbol->getQualifier().hasXfbBuffer())
- builder.addDecoration(id, spv::DecorationXfbBuffer, symbol->getQualifier().layoutXfbBuffer);
- if (symbol->getQualifier().hasXfbOffset())
- builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);
- }
// atomic counters use this:
if (symbol->getQualifier().hasOffset())
builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutOffset);
@@ -5543,8 +5527,14 @@
builder.addCapability(spv::CapabilityTransformFeedback);
if (symbol->getQualifier().hasXfbStride())
builder.addDecoration(id, spv::DecorationXfbStride, symbol->getQualifier().layoutXfbStride);
- if (symbol->getQualifier().hasXfbBuffer())
+ if (symbol->getQualifier().hasXfbBuffer()) {
builder.addDecoration(id, spv::DecorationXfbBuffer, symbol->getQualifier().layoutXfbBuffer);
+ unsigned stride = glslangIntermediate->getXfbStride(symbol->getQualifier().layoutXfbBuffer);
+ if (stride != glslang::TQualifier::layoutXfbStrideEnd)
+ builder.addDecoration(id, spv::DecorationXfbStride, stride);
+ }
+ if (symbol->getQualifier().hasXfbOffset())
+ builder.addDecoration(id, spv::DecorationOffset, symbol->getQualifier().layoutXfbOffset);
}
if (symbol->getType().isImage()) {