blob: 870acb6f90343d2db6ce18420ad505045c469496 [file] [log] [blame]
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00001//
Nicolas Capens01df23e2014-06-11 10:56:03 -04002// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang0a73dd82014-11-19 16:18:08 -05007#ifndef COMPILER_TRANSLATOR_CONSTANTUNION_H_
8#define COMPILER_TRANSLATOR_CONSTANTUNION_H_
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +00009
alokp@chromium.org4e4facd2010-06-02 15:21:22 +000010#include <assert.h>
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000011
Jamie Madill47cb73a2016-09-09 11:41:44 -040012#include "compiler/translator/Common.h"
Jamie Madill6ba6ead2015-05-04 14:21:21 -040013#include "compiler/translator/BaseTypes.h"
14
Jamie Madill45bcc782016-11-07 13:58:48 -050015namespace sh
16{
17
Jamie Madill47cb73a2016-09-09 11:41:44 -040018class TDiagnostics;
19
20class TConstantUnion
21{
22 public:
Alok Priyadarshi8156b6b2013-09-23 14:56:58 -040023 POOL_ALLOCATOR_NEW_DELETE();
Jamie Madill47cb73a2016-09-09 11:41:44 -040024 TConstantUnion();
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000025
Jamie Madill47cb73a2016-09-09 11:41:44 -040026 bool cast(TBasicType newType, const TConstantUnion &constant);
Nicolas Capens01df23e2014-06-11 10:56:03 -040027
Jamie Madilld7b1ab52016-12-12 14:42:19 -050028 void setIConst(int i)
29 {
30 iConst = i;
31 type = EbtInt;
32 }
33 void setUConst(unsigned int u)
34 {
35 uConst = u;
36 type = EbtUInt;
37 }
38 void setFConst(float f)
39 {
40 fConst = f;
41 type = EbtFloat;
42 }
43 void setBConst(bool b)
44 {
45 bConst = b;
46 type = EbtBool;
47 }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000048
Andrei Volykhina5527072017-03-22 16:46:30 +030049 void setYuvCscStandardEXTConst(TYuvCscStandardEXT s)
50 {
51 yuvCscStandardEXTConst = s;
52 type = EbtYuvCscStandardEXT;
53 }
54
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000055 int getIConst() const { return iConst; }
Nicolas Capensc0f7c612013-06-05 11:46:09 -040056 unsigned int getUConst() const { return uConst; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000057 float getFConst() const { return fConst; }
58 bool getBConst() const { return bConst; }
Andrei Volykhina5527072017-03-22 16:46:30 +030059 TYuvCscStandardEXT getYuvCscStandardEXTConst() const { return yuvCscStandardEXTConst; }
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +000060
Jamie Madill47cb73a2016-09-09 11:41:44 -040061 bool operator==(const int i) const;
62 bool operator==(const unsigned int u) const;
63 bool operator==(const float f) const;
64 bool operator==(const bool b) const;
Andrei Volykhina5527072017-03-22 16:46:30 +030065 bool operator==(const TYuvCscStandardEXT s) const;
Jamie Madill47cb73a2016-09-09 11:41:44 -040066 bool operator==(const TConstantUnion &constant) const;
67 bool operator!=(const int i) const;
68 bool operator!=(const unsigned int u) const;
69 bool operator!=(const float f) const;
70 bool operator!=(const bool b) const;
Andrei Volykhina5527072017-03-22 16:46:30 +030071 bool operator!=(const TYuvCscStandardEXT s) const;
Jamie Madill47cb73a2016-09-09 11:41:44 -040072 bool operator!=(const TConstantUnion &constant) const;
73 bool operator>(const TConstantUnion &constant) const;
74 bool operator<(const TConstantUnion &constant) const;
75 static TConstantUnion add(const TConstantUnion &lhs,
76 const TConstantUnion &rhs,
Jamie Madill5db69f52016-09-15 12:47:32 -040077 TDiagnostics *diag,
78 const TSourceLoc &line);
Jamie Madill47cb73a2016-09-09 11:41:44 -040079 static TConstantUnion sub(const TConstantUnion &lhs,
80 const TConstantUnion &rhs,
Jamie Madill5db69f52016-09-15 12:47:32 -040081 TDiagnostics *diag,
82 const TSourceLoc &line);
Jamie Madill47cb73a2016-09-09 11:41:44 -040083 static TConstantUnion mul(const TConstantUnion &lhs,
84 const TConstantUnion &rhs,
Jamie Madill5db69f52016-09-15 12:47:32 -040085 TDiagnostics *diag,
86 const TSourceLoc &line);
Jamie Madill47cb73a2016-09-09 11:41:44 -040087 TConstantUnion operator%(const TConstantUnion &constant) const;
Jamie Madill596018c2016-09-21 12:57:03 -040088 static TConstantUnion rshift(const TConstantUnion &lhs,
89 const TConstantUnion &rhs,
90 TDiagnostics *diag,
91 const TSourceLoc &line);
92 static TConstantUnion lshift(const TConstantUnion &lhs,
93 const TConstantUnion &rhs,
94 TDiagnostics *diag,
95 const TSourceLoc &line);
Jamie Madill47cb73a2016-09-09 11:41:44 -040096 TConstantUnion operator&(const TConstantUnion &constant) const;
97 TConstantUnion operator|(const TConstantUnion &constant) const;
98 TConstantUnion operator^(const TConstantUnion &constant) const;
99 TConstantUnion operator&&(const TConstantUnion &constant) const;
100 TConstantUnion operator||(const TConstantUnion &constant) const;
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000101
alokp@chromium.org76b82082010-03-24 17:59:39 +0000102 TBasicType getType() const { return type; }
Jamie Madill47cb73a2016-09-09 11:41:44 -0400103 private:
104 union {
105 int iConst; // used for ivec, scalar ints
106 unsigned int uConst; // used for uvec, scalar uints
107 bool bConst; // used for bvec, scalar bools
108 float fConst; // used for vec, mat, scalar floats
Andrei Volykhina5527072017-03-22 16:46:30 +0300109 TYuvCscStandardEXT yuvCscStandardEXTConst;
Jamie Madill47cb73a2016-09-09 11:41:44 -0400110 };
daniel@transgaming.com4f39fd92010-03-08 20:26:45 +0000111
112 TBasicType type;
113};
114
Jamie Madill45bcc782016-11-07 13:58:48 -0500115} // namespace sh
116
Jamie Madilld7b1ab52016-12-12 14:42:19 -0500117#endif // COMPILER_TRANSLATOR_CONSTANTUNION_H_