From 7db8824da2132b13a6e25188515996cfae906163 Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Fri, 4 May 2012 13:42:23 -0700 Subject: [PATCH] Reduce dynamic memory allocation in getting unif/varying variants of AtomicTypes --- type.cpp | 17 +++++++++++++++-- type.h | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) 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; };