diff --git a/type.cpp b/type.cpp index d73e2786..a492af1d 100644 --- a/type.cpp +++ b/type.cpp @@ -186,6 +186,7 @@ const AtomicType *AtomicType::Void = AtomicType::AtomicType(BasicType bt, Variability v, bool ic) : Type(ATOMIC_TYPE), basicType(bt), variability(v), isConst(ic) { asOtherConstType = NULL; + asUniformType = asVaryingType = NULL; } @@ -290,7 +291,13 @@ AtomicType::GetAsVaryingType() const { Assert(basicType != TYPE_VOID); if (variability == Variability::Varying) return this; - return new AtomicType(basicType, Variability::Varying, isConst); + + if (asVaryingType == NULL) { + asVaryingType = new AtomicType(basicType, Variability::Varying, isConst); + if (variability == Variability::Uniform) + asVaryingType->asUniformType = this; + } + return asVaryingType; } @@ -299,7 +306,13 @@ AtomicType::GetAsUniformType() const { Assert(basicType != TYPE_VOID); if (variability == Variability::Uniform) return this; - return new AtomicType(basicType, Variability::Uniform, isConst); + + if (asUniformType == NULL) { + asUniformType = new AtomicType(basicType, Variability::Uniform, isConst); + if (variability == Variability::Varying) + asUniformType->asVaryingType = this; + } + return asUniformType; } diff --git a/type.h b/type.h index c58a4ce9..8c3e8de2 100644 --- a/type.h +++ b/type.h @@ -333,7 +333,7 @@ private: const bool isConst; AtomicType(BasicType basicType, Variability v, bool isConst); - mutable const AtomicType *asOtherConstType; + mutable const AtomicType *asOtherConstType, *asUniformType, *asVaryingType; };