Commit 7210986f by jbauman@chromium.org

Limit struct size to size of full shader constant.

The HLSL compiler can optimize out the last elements of a struct, which caused ANGLE to overwrite constants right after the end of the struct. Each element in a struct should be limited by the size of the entire struct. BUG= Review URL: https://codereview.appspot.com/6856100 git-svn-id: https://angleproject.googlecode.com/svn/trunk@1394 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 835757fa
#define MAJOR_VERSION 1
#define MINOR_VERSION 0
#define BUILD_VERSION 0
#define BUILD_REVISION 1393
#define BUILD_REVISION 1394
#define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x)
......
......@@ -83,17 +83,17 @@ D3DConstant::D3DConstant(const char *base, const ctab::ConstantInfo *constantInf
if (typeClass == CLASS_STRUCT)
{
addStructMembers(base, registerSet, registerIndex, typeInfo);
addStructMembers(base, registerSet, registerIndex, registerIndex + registerCount, typeInfo);
}
}
D3DConstant::D3DConstant(const char *base, RegisterSet registerSet, unsigned registerIndex, const ctab::StructMemberInfo *memberInfo)
D3DConstant::D3DConstant(const char *base, RegisterSet registerSet, unsigned registerIndex, unsigned maxRegister, const ctab::StructMemberInfo *memberInfo)
: registerSet(registerSet), registerIndex(registerIndex)
{
const ctab::TypeInfo *typeInfo = reinterpret_cast<const ctab::TypeInfo*>(base + memberInfo->typeInfo);
name = base + memberInfo->name;
registerCount = typeInfo->rows * typeInfo->elements;
registerCount = std::min(static_cast<int>(maxRegister - registerIndex), typeInfo->rows * typeInfo->elements);
typeClass = static_cast<Class>(typeInfo->typeClass);
type = static_cast<Type>(typeInfo->type);
rows = typeInfo->rows;
......@@ -102,7 +102,7 @@ D3DConstant::D3DConstant(const char *base, RegisterSet registerSet, unsigned reg
if (typeClass == CLASS_STRUCT)
{
registerCount = addStructMembers(base, registerSet, registerIndex, typeInfo);
registerCount = addStructMembers(base, registerSet, registerIndex, maxRegister, typeInfo);
}
}
......@@ -117,7 +117,7 @@ D3DConstant::~D3DConstant()
}
}
unsigned D3DConstant::addStructMembers(const char *base, RegisterSet registerSet, unsigned registerIndex, const ctab::TypeInfo *typeInfo)
unsigned D3DConstant::addStructMembers(const char *base, RegisterSet registerSet, unsigned registerIndex, unsigned maxRegister, const ctab::TypeInfo *typeInfo)
{
const ctab::StructMemberInfo *memberInfos = reinterpret_cast<const ctab::StructMemberInfo*>(
base + typeInfo->structMemberInfos);
......@@ -135,7 +135,7 @@ unsigned D3DConstant::addStructMembers(const char *base, RegisterSet registerSet
const ctab::TypeInfo *memberTypeInfo = reinterpret_cast<const ctab::TypeInfo*>(
base + memberInfos[i].typeInfo);
D3DConstant *member = new D3DConstant(base, registerSet, memberIndex, memberInfos + i);
D3DConstant *member = new D3DConstant(base, registerSet, memberIndex, maxRegister, memberInfos + i);
memberIndex += member->registerCount;
structMembers[j][i] = member;
......
......@@ -90,8 +90,8 @@ struct D3DConstant
std::vector<std::vector<const D3DConstant*> > structMembers;
private:
D3DConstant(const char *base, RegisterSet registerSet, unsigned registerIndex, const ctab::StructMemberInfo *memberInfo);
unsigned addStructMembers(const char *base, RegisterSet registerSet, unsigned registerIndex, const ctab::TypeInfo *typeInfo);
D3DConstant(const char *base, RegisterSet registerSet, unsigned registerIndex, unsigned maxRegister, const ctab::StructMemberInfo *memberInfo);
unsigned addStructMembers(const char *base, RegisterSet registerSet, unsigned registerIndex, unsigned maxRegister, const ctab::TypeInfo *typeInfo);
};
class D3DConstantTable
......
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