Fix std140 UBO layouts.

A call to "prePadding" instaed of "prePaddingString" was confusing
the HLSL output engine.

A separate bug was causing HLSL errors because HLSL puts all cbuffer
members in a flattened namespace, which caused our internal padding
variables to overlap.

BUG=angle:725

Change-Id: I69a01fefa430a83e433385c64a532a69e6851ae8
Reviewed-on: https://chromium-review.googlesource.com/212930
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Nicolas Capens <capn@chromium.org>
diff --git a/src/compiler/translator/StructureHLSL.cpp b/src/compiler/translator/StructureHLSL.cpp
index 7aaf47c..48929af 100644
--- a/src/compiler/translator/StructureHLSL.cpp
+++ b/src/compiler/translator/StructureHLSL.cpp
@@ -17,12 +17,19 @@
 namespace sh
 {
 
-Std140PaddingHelper::Std140PaddingHelper(const std::map<TString, int> &structElementIndexes)
-    : mPaddingCounter(0),
+Std140PaddingHelper::Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
+                                         unsigned *uniqueCounter)
+    : mPaddingCounter(uniqueCounter),
       mElementIndex(0),
       mStructElementIndexes(structElementIndexes)
 {}
 
+TString Std140PaddingHelper::next()
+{
+    unsigned value = (*mPaddingCounter)++;
+    return str(value);
+}
+
 int Std140PaddingHelper::prePadding(const TType &type)
 {
     if (type.getBasicType() == EbtStruct || type.isMatrix() || type.isArray())
@@ -68,7 +75,7 @@
 
     for (int paddingIndex = 0; paddingIndex < paddingCount; paddingIndex++)
     {
-        padding += "    float pad_" + str(mPaddingCounter++) + ";\n";
+        padding += "    float pad_" + next() + ";\n";
     }
 
     return padding;
@@ -116,19 +123,25 @@
     TString padding;
     for (int paddingOffset = numComponents; paddingOffset < 4; paddingOffset++)
     {
-        padding += "    float pad_" + str(mPaddingCounter++) + ";\n";
+        padding += "    float pad_" + next() + ";\n";
     }
     return padding;
 }
 
 StructureHLSL::StructureHLSL()
+    : mUniquePaddingCounter(0)
 {}
 
+Std140PaddingHelper StructureHLSL::getPaddingHelper()
+{
+    return Std140PaddingHelper(mStd140StructElementIndexes, &mUniquePaddingCounter);
+}
+
 TString StructureHLSL::defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing)
 {
     if (useStd140Packing)
     {
-        Std140PaddingHelper padHelper(mStd140StructElementIndexes);
+        Std140PaddingHelper padHelper = getPaddingHelper();
         return define(structure, useHLSLRowMajorPacking, useStd140Packing, &padHelper);
     }
     else
@@ -461,7 +474,7 @@
 
 void StructureHLSL::storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking)
 {
-    Std140PaddingHelper padHelper(mStd140StructElementIndexes);
+    Std140PaddingHelper padHelper = getPaddingHelper();
     const TFieldList &fields = structure.fields();
 
     for (unsigned int i = 0; i < fields.size(); i++)