Commit 33a74bde by Jamie Madill

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/212930Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarNicolas Capens <capn@chromium.org>
parent ffd7387a
...@@ -17,12 +17,19 @@ ...@@ -17,12 +17,19 @@
namespace sh namespace sh
{ {
Std140PaddingHelper::Std140PaddingHelper(const std::map<TString, int> &structElementIndexes) Std140PaddingHelper::Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
: mPaddingCounter(0), unsigned *uniqueCounter)
: mPaddingCounter(uniqueCounter),
mElementIndex(0), mElementIndex(0),
mStructElementIndexes(structElementIndexes) mStructElementIndexes(structElementIndexes)
{} {}
TString Std140PaddingHelper::next()
{
unsigned value = (*mPaddingCounter)++;
return str(value);
}
int Std140PaddingHelper::prePadding(const TType &type) int Std140PaddingHelper::prePadding(const TType &type)
{ {
if (type.getBasicType() == EbtStruct || type.isMatrix() || type.isArray()) if (type.getBasicType() == EbtStruct || type.isMatrix() || type.isArray())
...@@ -68,7 +75,7 @@ TString Std140PaddingHelper::prePaddingString(const TType &type) ...@@ -68,7 +75,7 @@ TString Std140PaddingHelper::prePaddingString(const TType &type)
for (int paddingIndex = 0; paddingIndex < paddingCount; paddingIndex++) for (int paddingIndex = 0; paddingIndex < paddingCount; paddingIndex++)
{ {
padding += " float pad_" + str(mPaddingCounter++) + ";\n"; padding += " float pad_" + next() + ";\n";
} }
return padding; return padding;
...@@ -116,19 +123,25 @@ TString Std140PaddingHelper::postPaddingString(const TType &type, bool useHLSLRo ...@@ -116,19 +123,25 @@ TString Std140PaddingHelper::postPaddingString(const TType &type, bool useHLSLRo
TString padding; TString padding;
for (int paddingOffset = numComponents; paddingOffset < 4; paddingOffset++) for (int paddingOffset = numComponents; paddingOffset < 4; paddingOffset++)
{ {
padding += " float pad_" + str(mPaddingCounter++) + ";\n"; padding += " float pad_" + next() + ";\n";
} }
return padding; return padding;
} }
StructureHLSL::StructureHLSL() StructureHLSL::StructureHLSL()
: mUniquePaddingCounter(0)
{} {}
Std140PaddingHelper StructureHLSL::getPaddingHelper()
{
return Std140PaddingHelper(mStd140StructElementIndexes, &mUniquePaddingCounter);
}
TString StructureHLSL::defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing) TString StructureHLSL::defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing)
{ {
if (useStd140Packing) if (useStd140Packing)
{ {
Std140PaddingHelper padHelper(mStd140StructElementIndexes); Std140PaddingHelper padHelper = getPaddingHelper();
return define(structure, useHLSLRowMajorPacking, useStd140Packing, &padHelper); return define(structure, useHLSLRowMajorPacking, useStd140Packing, &padHelper);
} }
else else
...@@ -461,7 +474,7 @@ std::string StructureHLSL::structsHeader() const ...@@ -461,7 +474,7 @@ std::string StructureHLSL::structsHeader() const
void StructureHLSL::storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking) void StructureHLSL::storeStd140ElementIndex(const TStructure &structure, bool useHLSLRowMajorPacking)
{ {
Std140PaddingHelper padHelper(mStd140StructElementIndexes); Std140PaddingHelper padHelper = getPaddingHelper();
const TFieldList &fields = structure.fields(); const TFieldList &fields = structure.fields();
for (unsigned int i = 0; i < fields.size(); i++) for (unsigned int i = 0; i < fields.size(); i++)
......
...@@ -26,7 +26,8 @@ namespace sh ...@@ -26,7 +26,8 @@ namespace sh
class Std140PaddingHelper class Std140PaddingHelper
{ {
public: public:
explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes); explicit Std140PaddingHelper(const std::map<TString, int> &structElementIndexes,
unsigned *uniqueCounter);
int elementIndex() const { return mElementIndex; } int elementIndex() const { return mElementIndex; }
int prePadding(const TType &type); int prePadding(const TType &type);
...@@ -34,7 +35,9 @@ class Std140PaddingHelper ...@@ -34,7 +35,9 @@ class Std140PaddingHelper
TString postPaddingString(const TType &type, bool useHLSLRowMajorPacking); TString postPaddingString(const TType &type, bool useHLSLRowMajorPacking);
private: private:
int mPaddingCounter; TString next();
unsigned *mPaddingCounter;
int mElementIndex; int mElementIndex;
const std::map<TString, int> &mStructElementIndexes; const std::map<TString, int> &mStructElementIndexes;
}; };
...@@ -50,9 +53,11 @@ class StructureHLSL ...@@ -50,9 +53,11 @@ class StructureHLSL
TString defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing); TString defineQualified(const TStructure &structure, bool useHLSLRowMajorPacking, bool useStd140Packing);
static TString defineNameless(const TStructure &structure); static TString defineNameless(const TStructure &structure);
Std140PaddingHelper getPaddingHelper() const { return Std140PaddingHelper(mStd140StructElementIndexes); } Std140PaddingHelper getPaddingHelper();
private: private:
unsigned mUniquePaddingCounter;
std::map<TString, int> mStd140StructElementIndexes; std::map<TString, int> mStd140StructElementIndexes;
typedef std::set<TString> StructNames; typedef std::set<TString> StructNames;
......
...@@ -269,7 +269,7 @@ TString UniformHLSL::interfaceBlockMembersString(const TInterfaceBlock &interfac ...@@ -269,7 +269,7 @@ TString UniformHLSL::interfaceBlockMembersString(const TInterfaceBlock &interfac
if (blockStorage == EbsStd140) if (blockStorage == EbsStd140)
{ {
// 2 and 3 component vector types in some cases need pre-padding // 2 and 3 component vector types in some cases need pre-padding
hlsl += padHelper.prePadding(fieldType); hlsl += padHelper.prePaddingString(fieldType);
} }
hlsl += " " + InterfaceBlockFieldTypeString(field, blockStorage) + hlsl += " " + InterfaceBlockFieldTypeString(field, blockStorage) +
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment