| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974 |
- //
- // Copyright (C) 2002-2005 3Dlabs Inc. Ltd.
- // Copyright (C) 2013 LunarG, Inc.
- // Copyright (C) 2017 ARM Limited.
- //
- // All rights reserved.
- //
- // Redistribution and use in source and binary forms, with or without
- // modification, are permitted provided that the following conditions
- // are met:
- //
- // Redistributions of source code must retain the above copyright
- // notice, this list of conditions and the following disclaimer.
- //
- // Redistributions in binary form must reproduce the above
- // copyright notice, this list of conditions and the following
- // disclaimer in the documentation and/or other materials provided
- // with the distribution.
- //
- // Neither the name of 3Dlabs Inc. Ltd. nor the names of its
- // contributors may be used to endorse or promote products derived
- // from this software without specific prior written permission.
- //
- // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- // FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- // COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- // BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- // LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- // ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- // POSSIBILITY OF SUCH DAMAGE.
- //
- #ifndef _CONSTANT_UNION_INCLUDED_
- #define _CONSTANT_UNION_INCLUDED_
- #include "../Include/Common.h"
- #include "../Include/BaseTypes.h"
- namespace glslang {
- class TConstUnion {
- public:
- POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
- TConstUnion() : iConst(0), type(EbtInt) { }
- void setI8Const(signed char i)
- {
- i8Const = i;
- type = EbtInt8;
- }
- void setU8Const(unsigned char u)
- {
- u8Const = u;
- type = EbtUint8;
- }
- void setI16Const(signed short i)
- {
- i16Const = i;
- type = EbtInt16;
- }
- void setU16Const(unsigned short u)
- {
- u16Const = u;
- type = EbtUint16;
- }
- void setIConst(int i)
- {
- iConst = i;
- type = EbtInt;
- }
- void setUConst(unsigned int u)
- {
- uConst = u;
- type = EbtUint;
- }
- void setI64Const(long long i64)
- {
- i64Const = i64;
- type = EbtInt64;
- }
- void setU64Const(unsigned long long u64)
- {
- u64Const = u64;
- type = EbtUint64;
- }
- void setDConst(double d)
- {
- dConst = d;
- type = EbtDouble;
- }
- void setBConst(bool b)
- {
- bConst = b;
- type = EbtBool;
- }
- void setSConst(const TString* s)
- {
- sConst = s;
- type = EbtString;
- }
- signed char getI8Const() const { return i8Const; }
- unsigned char getU8Const() const { return u8Const; }
- signed short getI16Const() const { return i16Const; }
- unsigned short getU16Const() const { return u16Const; }
- int getIConst() const { return iConst; }
- unsigned int getUConst() const { return uConst; }
- long long getI64Const() const { return i64Const; }
- unsigned long long getU64Const() const { return u64Const; }
- double getDConst() const { return dConst; }
- bool getBConst() const { return bConst; }
- const TString* getSConst() const { return sConst; }
- bool operator==(const signed char i) const
- {
- if (i == i8Const)
- return true;
- return false;
- }
- bool operator==(const unsigned char u) const
- {
- if (u == u8Const)
- return true;
- return false;
- }
- bool operator==(const signed short i) const
- {
- if (i == i16Const)
- return true;
- return false;
- }
- bool operator==(const unsigned short u) const
- {
- if (u == u16Const)
- return true;
- return false;
- }
- bool operator==(const int i) const
- {
- if (i == iConst)
- return true;
- return false;
- }
- bool operator==(const unsigned int u) const
- {
- if (u == uConst)
- return true;
- return false;
- }
- bool operator==(const long long i64) const
- {
- if (i64 == i64Const)
- return true;
- return false;
- }
- bool operator==(const unsigned long long u64) const
- {
- if (u64 == u64Const)
- return true;
- return false;
- }
- bool operator==(const double d) const
- {
- if (d == dConst)
- return true;
- return false;
- }
- bool operator==(const bool b) const
- {
- if (b == bConst)
- return true;
- return false;
- }
- bool operator==(const TConstUnion& constant) const
- {
- if (constant.type != type)
- return false;
- switch (type) {
- case EbtInt:
- if (constant.iConst == iConst)
- return true;
- break;
- case EbtUint:
- if (constant.uConst == uConst)
- return true;
- break;
- case EbtBool:
- if (constant.bConst == bConst)
- return true;
- break;
- case EbtDouble:
- if (constant.dConst == dConst)
- return true;
- break;
- #ifndef GLSLANG_WEB
- case EbtInt16:
- if (constant.i16Const == i16Const)
- return true;
- break;
- case EbtUint16:
- if (constant.u16Const == u16Const)
- return true;
- break;
- case EbtInt8:
- if (constant.i8Const == i8Const)
- return true;
- break;
- case EbtUint8:
- if (constant.u8Const == u8Const)
- return true;
- break;
- case EbtInt64:
- if (constant.i64Const == i64Const)
- return true;
- break;
- case EbtUint64:
- if (constant.u64Const == u64Const)
- return true;
- break;
- #endif
- default:
- assert(false && "Default missing");
- }
- return false;
- }
- bool operator!=(const signed char i) const
- {
- return !operator==(i);
- }
- bool operator!=(const unsigned char u) const
- {
- return !operator==(u);
- }
- bool operator!=(const signed short i) const
- {
- return !operator==(i);
- }
- bool operator!=(const unsigned short u) const
- {
- return !operator==(u);
- }
- bool operator!=(const int i) const
- {
- return !operator==(i);
- }
- bool operator!=(const unsigned int u) const
- {
- return !operator==(u);
- }
- bool operator!=(const long long i) const
- {
- return !operator==(i);
- }
- bool operator!=(const unsigned long long u) const
- {
- return !operator==(u);
- }
- bool operator!=(const float f) const
- {
- return !operator==(f);
- }
- bool operator!=(const bool b) const
- {
- return !operator==(b);
- }
- bool operator!=(const TConstUnion& constant) const
- {
- return !operator==(constant);
- }
- bool operator>(const TConstUnion& constant) const
- {
- assert(type == constant.type);
- switch (type) {
- case EbtInt:
- if (iConst > constant.iConst)
- return true;
- return false;
- case EbtUint:
- if (uConst > constant.uConst)
- return true;
- return false;
- case EbtDouble:
- if (dConst > constant.dConst)
- return true;
- return false;
- #ifndef GLSLANG_WEB
- case EbtInt8:
- if (i8Const > constant.i8Const)
- return true;
- return false;
- case EbtUint8:
- if (u8Const > constant.u8Const)
- return true;
- return false;
- case EbtInt16:
- if (i16Const > constant.i16Const)
- return true;
- return false;
- case EbtUint16:
- if (u16Const > constant.u16Const)
- return true;
- return false;
- case EbtInt64:
- if (i64Const > constant.i64Const)
- return true;
- return false;
- case EbtUint64:
- if (u64Const > constant.u64Const)
- return true;
- return false;
- #endif
- default:
- assert(false && "Default missing");
- return false;
- }
- }
- bool operator<(const TConstUnion& constant) const
- {
- assert(type == constant.type);
- switch (type) {
- #ifndef GLSLANG_WEB
- case EbtInt8:
- if (i8Const < constant.i8Const)
- return true;
- return false;
- case EbtUint8:
- if (u8Const < constant.u8Const)
- return true;
- return false;
- case EbtInt16:
- if (i16Const < constant.i16Const)
- return true;
- return false;
- case EbtUint16:
- if (u16Const < constant.u16Const)
- return true;
- return false;
- case EbtInt64:
- if (i64Const < constant.i64Const)
- return true;
- return false;
- case EbtUint64:
- if (u64Const < constant.u64Const)
- return true;
- return false;
- #endif
- case EbtDouble:
- if (dConst < constant.dConst)
- return true;
- return false;
- case EbtInt:
- if (iConst < constant.iConst)
- return true;
- return false;
- case EbtUint:
- if (uConst < constant.uConst)
- return true;
- return false;
- default:
- assert(false && "Default missing");
- return false;
- }
- }
- TConstUnion operator+(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst + constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst + constant.uConst); break;
- case EbtDouble: returnValue.setDConst(dConst + constant.dConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const + constant.i8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const + constant.i16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const + constant.i64Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const + constant.u8Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const + constant.u16Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const + constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator-(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst - constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst - constant.uConst); break;
- case EbtDouble: returnValue.setDConst(dConst - constant.dConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const - constant.i8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const - constant.i16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const - constant.i64Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const - constant.u8Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const - constant.u16Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const - constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator*(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst * constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst * constant.uConst); break;
- case EbtDouble: returnValue.setDConst(dConst * constant.dConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const * constant.i8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const * constant.i16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const * constant.i64Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const * constant.u8Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const * constant.u16Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const * constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator%(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst % constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst % constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const % constant.i8Const); break;
- case EbtInt16: returnValue.setI8Const(i8Const % constant.i16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const % constant.i64Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const % constant.u8Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const % constant.u16Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const % constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator>>(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- switch (type) {
- #ifndef GLSLANG_WEB
- case EbtInt8:
- switch (constant.type) {
- case EbtInt8: returnValue.setI8Const(i8Const >> constant.i8Const); break;
- case EbtUint8: returnValue.setI8Const(i8Const >> constant.u8Const); break;
- case EbtInt16: returnValue.setI8Const(i8Const >> constant.i16Const); break;
- case EbtUint16: returnValue.setI8Const(i8Const >> constant.u16Const); break;
- case EbtInt: returnValue.setI8Const(i8Const >> constant.iConst); break;
- case EbtUint: returnValue.setI8Const(i8Const >> constant.uConst); break;
- case EbtInt64: returnValue.setI8Const(i8Const >> constant.i64Const); break;
- case EbtUint64: returnValue.setI8Const(i8Const >> constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint8:
- switch (constant.type) {
- case EbtInt8: returnValue.setU8Const(u8Const >> constant.i8Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const >> constant.u8Const); break;
- case EbtInt16: returnValue.setU8Const(u8Const >> constant.i16Const); break;
- case EbtUint16: returnValue.setU8Const(u8Const >> constant.u16Const); break;
- case EbtInt: returnValue.setU8Const(u8Const >> constant.iConst); break;
- case EbtUint: returnValue.setU8Const(u8Const >> constant.uConst); break;
- case EbtInt64: returnValue.setU8Const(u8Const >> constant.i64Const); break;
- case EbtUint64: returnValue.setU8Const(u8Const >> constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtInt16:
- switch (constant.type) {
- case EbtInt8: returnValue.setI16Const(i16Const >> constant.i8Const); break;
- case EbtUint8: returnValue.setI16Const(i16Const >> constant.u8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const >> constant.i16Const); break;
- case EbtUint16: returnValue.setI16Const(i16Const >> constant.u16Const); break;
- case EbtInt: returnValue.setI16Const(i16Const >> constant.iConst); break;
- case EbtUint: returnValue.setI16Const(i16Const >> constant.uConst); break;
- case EbtInt64: returnValue.setI16Const(i16Const >> constant.i64Const); break;
- case EbtUint64: returnValue.setI16Const(i16Const >> constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint16:
- switch (constant.type) {
- case EbtInt8: returnValue.setU16Const(u16Const >> constant.i8Const); break;
- case EbtUint8: returnValue.setU16Const(u16Const >> constant.u8Const); break;
- case EbtInt16: returnValue.setU16Const(u16Const >> constant.i16Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const >> constant.u16Const); break;
- case EbtInt: returnValue.setU16Const(u16Const >> constant.iConst); break;
- case EbtUint: returnValue.setU16Const(u16Const >> constant.uConst); break;
- case EbtInt64: returnValue.setU16Const(u16Const >> constant.i64Const); break;
- case EbtUint64: returnValue.setU16Const(u16Const >> constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- #endif
- case EbtInt:
- switch (constant.type) {
- case EbtInt: returnValue.setIConst(iConst >> constant.iConst); break;
- case EbtUint: returnValue.setIConst(iConst >> constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setIConst(iConst >> constant.i8Const); break;
- case EbtUint8: returnValue.setIConst(iConst >> constant.u8Const); break;
- case EbtInt16: returnValue.setIConst(iConst >> constant.i16Const); break;
- case EbtUint16: returnValue.setIConst(iConst >> constant.u16Const); break;
- case EbtInt64: returnValue.setIConst(iConst >> constant.i64Const); break;
- case EbtUint64: returnValue.setIConst(iConst >> constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint:
- switch (constant.type) {
- case EbtInt: returnValue.setUConst(uConst >> constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst >> constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setUConst(uConst >> constant.i8Const); break;
- case EbtUint8: returnValue.setUConst(uConst >> constant.u8Const); break;
- case EbtInt16: returnValue.setUConst(uConst >> constant.i16Const); break;
- case EbtUint16: returnValue.setUConst(uConst >> constant.u16Const); break;
- case EbtInt64: returnValue.setUConst(uConst >> constant.i64Const); break;
- case EbtUint64: returnValue.setUConst(uConst >> constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- break;
- #ifndef GLSLANG_WEB
- case EbtInt64:
- switch (constant.type) {
- case EbtInt8: returnValue.setI64Const(i64Const >> constant.i8Const); break;
- case EbtUint8: returnValue.setI64Const(i64Const >> constant.u8Const); break;
- case EbtInt16: returnValue.setI64Const(i64Const >> constant.i16Const); break;
- case EbtUint16: returnValue.setI64Const(i64Const >> constant.u16Const); break;
- case EbtInt: returnValue.setI64Const(i64Const >> constant.iConst); break;
- case EbtUint: returnValue.setI64Const(i64Const >> constant.uConst); break;
- case EbtInt64: returnValue.setI64Const(i64Const >> constant.i64Const); break;
- case EbtUint64: returnValue.setI64Const(i64Const >> constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint64:
- switch (constant.type) {
- case EbtInt8: returnValue.setU64Const(u64Const >> constant.i8Const); break;
- case EbtUint8: returnValue.setU64Const(u64Const >> constant.u8Const); break;
- case EbtInt16: returnValue.setU64Const(u64Const >> constant.i16Const); break;
- case EbtUint16: returnValue.setU64Const(u64Const >> constant.u16Const); break;
- case EbtInt: returnValue.setU64Const(u64Const >> constant.iConst); break;
- case EbtUint: returnValue.setU64Const(u64Const >> constant.uConst); break;
- case EbtInt64: returnValue.setU64Const(u64Const >> constant.i64Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const >> constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator<<(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- switch (type) {
- #ifndef GLSLANG_WEB
- case EbtInt8:
- switch (constant.type) {
- case EbtInt8: returnValue.setI8Const(i8Const << constant.i8Const); break;
- case EbtUint8: returnValue.setI8Const(i8Const << constant.u8Const); break;
- case EbtInt16: returnValue.setI8Const(i8Const << constant.i16Const); break;
- case EbtUint16: returnValue.setI8Const(i8Const << constant.u16Const); break;
- case EbtInt: returnValue.setI8Const(i8Const << constant.iConst); break;
- case EbtUint: returnValue.setI8Const(i8Const << constant.uConst); break;
- case EbtInt64: returnValue.setI8Const(i8Const << constant.i64Const); break;
- case EbtUint64: returnValue.setI8Const(i8Const << constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint8:
- switch (constant.type) {
- case EbtInt8: returnValue.setU8Const(u8Const << constant.i8Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const << constant.u8Const); break;
- case EbtInt16: returnValue.setU8Const(u8Const << constant.i16Const); break;
- case EbtUint16: returnValue.setU8Const(u8Const << constant.u16Const); break;
- case EbtInt: returnValue.setU8Const(u8Const << constant.iConst); break;
- case EbtUint: returnValue.setU8Const(u8Const << constant.uConst); break;
- case EbtInt64: returnValue.setU8Const(u8Const << constant.i64Const); break;
- case EbtUint64: returnValue.setU8Const(u8Const << constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtInt16:
- switch (constant.type) {
- case EbtInt8: returnValue.setI16Const(i16Const << constant.i8Const); break;
- case EbtUint8: returnValue.setI16Const(i16Const << constant.u8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const << constant.i16Const); break;
- case EbtUint16: returnValue.setI16Const(i16Const << constant.u16Const); break;
- case EbtInt: returnValue.setI16Const(i16Const << constant.iConst); break;
- case EbtUint: returnValue.setI16Const(i16Const << constant.uConst); break;
- case EbtInt64: returnValue.setI16Const(i16Const << constant.i64Const); break;
- case EbtUint64: returnValue.setI16Const(i16Const << constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint16:
- switch (constant.type) {
- case EbtInt8: returnValue.setU16Const(u16Const << constant.i8Const); break;
- case EbtUint8: returnValue.setU16Const(u16Const << constant.u8Const); break;
- case EbtInt16: returnValue.setU16Const(u16Const << constant.i16Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const << constant.u16Const); break;
- case EbtInt: returnValue.setU16Const(u16Const << constant.iConst); break;
- case EbtUint: returnValue.setU16Const(u16Const << constant.uConst); break;
- case EbtInt64: returnValue.setU16Const(u16Const << constant.i64Const); break;
- case EbtUint64: returnValue.setU16Const(u16Const << constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtInt64:
- switch (constant.type) {
- case EbtInt8: returnValue.setI64Const(i64Const << constant.i8Const); break;
- case EbtUint8: returnValue.setI64Const(i64Const << constant.u8Const); break;
- case EbtInt16: returnValue.setI64Const(i64Const << constant.i16Const); break;
- case EbtUint16: returnValue.setI64Const(i64Const << constant.u16Const); break;
- case EbtInt: returnValue.setI64Const(i64Const << constant.iConst); break;
- case EbtUint: returnValue.setI64Const(i64Const << constant.uConst); break;
- case EbtInt64: returnValue.setI64Const(i64Const << constant.i64Const); break;
- case EbtUint64: returnValue.setI64Const(i64Const << constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint64:
- switch (constant.type) {
- case EbtInt8: returnValue.setU64Const(u64Const << constant.i8Const); break;
- case EbtUint8: returnValue.setU64Const(u64Const << constant.u8Const); break;
- case EbtInt16: returnValue.setU64Const(u64Const << constant.i16Const); break;
- case EbtUint16: returnValue.setU64Const(u64Const << constant.u16Const); break;
- case EbtInt: returnValue.setU64Const(u64Const << constant.iConst); break;
- case EbtUint: returnValue.setU64Const(u64Const << constant.uConst); break;
- case EbtInt64: returnValue.setU64Const(u64Const << constant.i64Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const << constant.u64Const); break;
- default: assert(false && "Default missing");
- }
- break;
- #endif
- case EbtInt:
- switch (constant.type) {
- case EbtInt: returnValue.setIConst(iConst << constant.iConst); break;
- case EbtUint: returnValue.setIConst(iConst << constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setIConst(iConst << constant.i8Const); break;
- case EbtUint8: returnValue.setIConst(iConst << constant.u8Const); break;
- case EbtInt16: returnValue.setIConst(iConst << constant.i16Const); break;
- case EbtUint16: returnValue.setIConst(iConst << constant.u16Const); break;
- case EbtInt64: returnValue.setIConst(iConst << constant.i64Const); break;
- case EbtUint64: returnValue.setIConst(iConst << constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- break;
- case EbtUint:
- switch (constant.type) {
- case EbtInt: returnValue.setUConst(uConst << constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst << constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setUConst(uConst << constant.i8Const); break;
- case EbtUint8: returnValue.setUConst(uConst << constant.u8Const); break;
- case EbtInt16: returnValue.setUConst(uConst << constant.i16Const); break;
- case EbtUint16: returnValue.setUConst(uConst << constant.u16Const); break;
- case EbtInt64: returnValue.setUConst(uConst << constant.i64Const); break;
- case EbtUint64: returnValue.setUConst(uConst << constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- break;
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator&(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst & constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst & constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const & constant.i8Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const & constant.u8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const & constant.i16Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const & constant.u16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const & constant.i64Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const & constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator|(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst | constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst | constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const | constant.i8Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const | constant.u8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const | constant.i16Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const | constant.u16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const | constant.i64Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const | constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator^(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtInt: returnValue.setIConst(iConst ^ constant.iConst); break;
- case EbtUint: returnValue.setUConst(uConst ^ constant.uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(i8Const ^ constant.i8Const); break;
- case EbtUint8: returnValue.setU8Const(u8Const ^ constant.u8Const); break;
- case EbtInt16: returnValue.setI16Const(i16Const ^ constant.i16Const); break;
- case EbtUint16: returnValue.setU16Const(u16Const ^ constant.u16Const); break;
- case EbtInt64: returnValue.setI64Const(i64Const ^ constant.i64Const); break;
- case EbtUint64: returnValue.setU64Const(u64Const ^ constant.u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator~() const
- {
- TConstUnion returnValue;
- switch (type) {
- case EbtInt: returnValue.setIConst(~iConst); break;
- case EbtUint: returnValue.setUConst(~uConst); break;
- #ifndef GLSLANG_WEB
- case EbtInt8: returnValue.setI8Const(~i8Const); break;
- case EbtUint8: returnValue.setU8Const(~u8Const); break;
- case EbtInt16: returnValue.setI16Const(~i16Const); break;
- case EbtUint16: returnValue.setU16Const(~u16Const); break;
- case EbtInt64: returnValue.setI64Const(~i64Const); break;
- case EbtUint64: returnValue.setU64Const(~u64Const); break;
- #endif
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator&&(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtBool: returnValue.setBConst(bConst && constant.bConst); break;
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TConstUnion operator||(const TConstUnion& constant) const
- {
- TConstUnion returnValue;
- assert(type == constant.type);
- switch (type) {
- case EbtBool: returnValue.setBConst(bConst || constant.bConst); break;
- default: assert(false && "Default missing");
- }
- return returnValue;
- }
- TBasicType getType() const { return type; }
- private:
- union {
- signed char i8Const; // used for i8vec, scalar int8s
- unsigned char u8Const; // used for u8vec, scalar uint8s
- signed short i16Const; // used for i16vec, scalar int16s
- unsigned short u16Const; // used for u16vec, scalar uint16s
- int iConst; // used for ivec, scalar ints
- unsigned int uConst; // used for uvec, scalar uints
- long long i64Const; // used for i64vec, scalar int64s
- unsigned long long u64Const; // used for u64vec, scalar uint64s
- bool bConst; // used for bvec, scalar bools
- double dConst; // used for vec, dvec, mat, dmat, scalar floats and doubles
- const TString* sConst; // string constant
- };
- TBasicType type;
- };
- // Encapsulate having a pointer to an array of TConstUnion,
- // which only needs to be allocated if its size is going to be
- // bigger than 0.
- //
- // One convenience is being able to use [] to go inside the array, instead
- // of C++ assuming it as an array of pointers to vectors.
- //
- // General usage is that the size is known up front, and it is
- // created once with the proper size.
- //
- class TConstUnionArray {
- public:
- POOL_ALLOCATOR_NEW_DELETE(GetThreadPoolAllocator())
- TConstUnionArray() : unionArray(nullptr) { }
- virtual ~TConstUnionArray() { }
- explicit TConstUnionArray(int size)
- {
- if (size == 0)
- unionArray = nullptr;
- else
- unionArray = new TConstUnionVector(size);
- }
- TConstUnionArray(const TConstUnionArray& a) = default;
- TConstUnionArray(const TConstUnionArray& a, int start, int size)
- {
- unionArray = new TConstUnionVector(size);
- for (int i = 0; i < size; ++i)
- (*unionArray)[i] = a[start + i];
- }
- // Use this constructor for a smear operation
- TConstUnionArray(int size, const TConstUnion& val)
- {
- unionArray = new TConstUnionVector(size, val);
- }
- int size() const { return unionArray ? (int)unionArray->size() : 0; }
- TConstUnion& operator[](size_t index) { return (*unionArray)[index]; }
- const TConstUnion& operator[](size_t index) const { return (*unionArray)[index]; }
- bool operator==(const TConstUnionArray& rhs) const
- {
- // this includes the case that both are unallocated
- if (unionArray == rhs.unionArray)
- return true;
- if (! unionArray || ! rhs.unionArray)
- return false;
- return *unionArray == *rhs.unionArray;
- }
- bool operator!=(const TConstUnionArray& rhs) const { return ! operator==(rhs); }
- double dot(const TConstUnionArray& rhs)
- {
- assert(rhs.unionArray->size() == unionArray->size());
- double sum = 0.0;
- for (size_t comp = 0; comp < unionArray->size(); ++comp)
- sum += (*this)[comp].getDConst() * rhs[comp].getDConst();
- return sum;
- }
- bool empty() const { return unionArray == nullptr; }
- protected:
- typedef TVector<TConstUnion> TConstUnionVector;
- TConstUnionVector* unionArray;
- };
- } // end namespace glslang
- #endif // _CONSTANT_UNION_INCLUDED_
|