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 MAJOR_VERSION 1
#define MINOR_VERSION 0 #define MINOR_VERSION 0
#define BUILD_VERSION 0 #define BUILD_VERSION 0
#define BUILD_REVISION 1393 #define BUILD_REVISION 1394
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x) #define MACRO_STRINGIFY(x) STRINGIFY(x)
......
...@@ -83,17 +83,17 @@ D3DConstant::D3DConstant(const char *base, const ctab::ConstantInfo *constantInf ...@@ -83,17 +83,17 @@ D3DConstant::D3DConstant(const char *base, const ctab::ConstantInfo *constantInf
if (typeClass == CLASS_STRUCT) 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) : registerSet(registerSet), registerIndex(registerIndex)
{ {
const ctab::TypeInfo *typeInfo = reinterpret_cast<const ctab::TypeInfo*>(base + memberInfo->typeInfo); const ctab::TypeInfo *typeInfo = reinterpret_cast<const ctab::TypeInfo*>(base + memberInfo->typeInfo);
name = base + memberInfo->name; 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); typeClass = static_cast<Class>(typeInfo->typeClass);
type = static_cast<Type>(typeInfo->type); type = static_cast<Type>(typeInfo->type);
rows = typeInfo->rows; rows = typeInfo->rows;
...@@ -102,7 +102,7 @@ D3DConstant::D3DConstant(const char *base, RegisterSet registerSet, unsigned reg ...@@ -102,7 +102,7 @@ D3DConstant::D3DConstant(const char *base, RegisterSet registerSet, unsigned reg
if (typeClass == CLASS_STRUCT) if (typeClass == CLASS_STRUCT)
{ {
registerCount = addStructMembers(base, registerSet, registerIndex, typeInfo); registerCount = addStructMembers(base, registerSet, registerIndex, maxRegister, typeInfo);
} }
} }
...@@ -117,7 +117,7 @@ D3DConstant::~D3DConstant() ...@@ -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*>( const ctab::StructMemberInfo *memberInfos = reinterpret_cast<const ctab::StructMemberInfo*>(
base + typeInfo->structMemberInfos); base + typeInfo->structMemberInfos);
...@@ -135,7 +135,7 @@ unsigned D3DConstant::addStructMembers(const char *base, RegisterSet registerSet ...@@ -135,7 +135,7 @@ unsigned D3DConstant::addStructMembers(const char *base, RegisterSet registerSet
const ctab::TypeInfo *memberTypeInfo = reinterpret_cast<const ctab::TypeInfo*>( const ctab::TypeInfo *memberTypeInfo = reinterpret_cast<const ctab::TypeInfo*>(
base + memberInfos[i].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; memberIndex += member->registerCount;
structMembers[j][i] = member; structMembers[j][i] = member;
......
...@@ -90,8 +90,8 @@ struct D3DConstant ...@@ -90,8 +90,8 @@ struct D3DConstant
std::vector<std::vector<const D3DConstant*> > structMembers; std::vector<std::vector<const D3DConstant*> > structMembers;
private: private:
D3DConstant(const char *base, RegisterSet registerSet, unsigned registerIndex, const ctab::StructMemberInfo *memberInfo); D3DConstant(const char *base, RegisterSet registerSet, unsigned registerIndex, unsigned maxRegister, const ctab::StructMemberInfo *memberInfo);
unsigned addStructMembers(const char *base, RegisterSet registerSet, unsigned registerIndex, const ctab::TypeInfo *typeInfo); unsigned addStructMembers(const char *base, RegisterSet registerSet, unsigned registerIndex, unsigned maxRegister, const ctab::TypeInfo *typeInfo);
}; };
class D3DConstantTable 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