xref: /aosp_15_r20/external/mesa3d/src/amd/addrlib/src/core/coord.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2 ************************************************************************************************************************
3 *
4 *  Copyright (C) 2007-2022 Advanced Micro Devices, Inc.  All rights reserved.
5 *  SPDX-License-Identifier: MIT
6 *
7 ***********************************************************************************************************************/
8 
9 // Class used to define a coordinate bit
10 
11 #ifndef __COORD_H
12 #define __COORD_H
13 
14 namespace Addr
15 {
16 namespace V2
17 {
18 #if defined(__cplusplus)
19 #if defined(_MSC_VER)
20     #if _MSC_VER >= 1900
21         #define ADDR_CPP11_COMPILER TRUE
22     #endif
23 #else
24     #if __cplusplus >= 201103L
25         #define ADDR_CPP11_COMPILER TRUE
26     #endif
27 #endif
28 #endif
29 
30 #if defined(ADDR_CPP11_COMPILER)
31 enum Dim : INT_8
32 #else
33 enum Dim
34 #endif
35 {
36    DIM_X,
37    DIM_Y,
38    DIM_Z,
39    DIM_S,
40    DIM_M,
41    NUM_DIMS
42 };
43 
44 class Coordinate
45 {
46 public:
47     Coordinate();
48     Coordinate(enum Dim dim, INT_32 n);
49 
50     VOID set(enum Dim dim, INT_32 n);
51     UINT_32 ison(const UINT_32 *coords) const;
52     enum Dim getdim();
53     INT_8   getord();
54 
55     BOOL_32 operator==(const Coordinate& b);
56     BOOL_32 operator<(const Coordinate& b);
57     BOOL_32 operator>(const Coordinate& b);
58     BOOL_32 operator<=(const Coordinate& b);
59     BOOL_32 operator>=(const Coordinate& b);
60     BOOL_32 operator!=(const Coordinate& b);
61     Coordinate& operator++(INT_32);
62 
63 private:
64     enum Dim dim;
65     INT_8 ord;
66 };
67 
68 class CoordTerm
69 {
70 public:
71     CoordTerm();
72     VOID Clear();
73     VOID add(Coordinate& co);
74     VOID add(CoordTerm& cl);
75     BOOL_32 remove(Coordinate& co);
76     BOOL_32 Exists(Coordinate& co);
77     VOID copyto(CoordTerm& cl);
78     UINT_32 getsize();
79     UINT_32 getxor(const UINT_32 *coords) const;
80 
81     VOID getsmallest(Coordinate& co);
82     UINT_32 Filter(INT_8 f, Coordinate& co, UINT_32 start = 0, enum Dim axis = NUM_DIMS);
83     Coordinate& operator[](UINT_32 i);
84     BOOL_32 operator==(const CoordTerm& b);
85     BOOL_32 operator!=(const CoordTerm& b);
86     BOOL_32 exceedRange(const UINT_32 *ranges);
87 
88 private:
89     static const UINT_32 MaxCoords = 8;
90     UINT_32 num_coords;
91     Coordinate m_coord[MaxCoords];
92 };
93 
94 class CoordEq
95 {
96 public:
97     CoordEq();
98     VOID remove(Coordinate& co);
99     BOOL_32 Exists(Coordinate& co);
100     VOID resize(UINT_32 n);
101     UINT_32 getsize();
102     virtual UINT_64 solve(const UINT_32 *coords) const;
103     virtual VOID solveAddr(UINT_64 addr, UINT_32 sliceInM,
104                            UINT_32 *coords) const;
105 
106     VOID copy(CoordEq& o, UINT_32 start = 0, UINT_32 num = 0xFFFFFFFF);
107     VOID reverse(UINT_32 start = 0, UINT_32 num = 0xFFFFFFFF);
108     VOID xorin(CoordEq& x, UINT_32 start = 0);
109     UINT_32 Filter(INT_8 f, Coordinate& co, UINT_32 start = 0, enum Dim axis = NUM_DIMS);
110     VOID shift(INT_32 amount, INT_32 start = 0);
111     virtual CoordTerm& operator[](UINT_32 i);
112     VOID mort2d(Coordinate& c0, Coordinate& c1, UINT_32 start = 0, UINT_32 end = 0);
113     VOID mort3d(Coordinate& c0, Coordinate& c1, Coordinate& c2, UINT_32 start = 0, UINT_32 end = 0);
114 
115     BOOL_32 operator==(const CoordEq& b);
116     BOOL_32 operator!=(const CoordEq& b);
117 
118 private:
119     static const UINT_32 MaxEqBits = 64;
120     UINT_32 m_numBits;
121 
122     CoordTerm m_eq[MaxEqBits];
123 };
124 
125 } // V2
126 } // Addr
127 
128 #endif
129 
130