2 * Copyright (C) 2016 Intel Corporation
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 #ifndef MESA_V3D_PACKET_HELPERS_H
25 #define MESA_V3D_PACKET_HELPERS_H
32 #include "util/u_math.h"
39 #define __gen_validate_value(x) VALGRIND_CHECK_MEM_IS_DEFINED(&(x), sizeof(x))
42 #define VG(x) ((void)0)
45 #ifndef __gen_validate_value
46 #define __gen_validate_value(x)
49 #ifndef __gen_address_type
50 #error #define __gen_address_type before including this file
53 #ifndef __gen_user_data
54 #error #define __gen_combine_address before including this file
62 static inline uint64_t
63 __gen_mbo(uint32_t start
, uint32_t end
)
65 return (~0ull >> (64 - (end
- start
+ 1))) << start
;
68 static inline uint64_t
69 __gen_uint(uint64_t v
, uint32_t start
, uint32_t end
)
71 __gen_validate_value(v
);
74 const int width
= end
- start
+ 1;
76 const uint64_t max
= (1ull << width
) - 1;
84 static inline uint64_t
85 __gen_sint(int64_t v
, uint32_t start
, uint32_t end
)
87 const int width
= end
- start
+ 1;
89 __gen_validate_value(v
);
93 const int64_t max
= (1ll << (width
- 1)) - 1;
94 const int64_t min
= -(1ll << (width
- 1));
95 assert(min
<= v
&& v
<= max
);
99 const uint64_t mask
= ~0ull >> (64 - width
);
101 return (v
& mask
) << start
;
104 static inline uint64_t
105 __gen_offset(uint64_t v
, uint32_t start
, uint32_t end
)
107 __gen_validate_value(v
);
109 uint64_t mask
= (~0ull >> (64 - (end
- start
+ 1))) << start
;
111 assert((v
& ~mask
) == 0);
117 static inline uint32_t
120 __gen_validate_value(v
);
121 return ((union __gen_value
) { .f
= (v
) }).dw
;
124 static inline uint64_t
125 __gen_sfixed(float v
, uint32_t start
, uint32_t end
, uint32_t fract_bits
)
127 __gen_validate_value(v
);
129 const float factor
= (1 << fract_bits
);
132 const float max
= ((1 << (end
- start
)) - 1) / factor
;
133 const float min
= -(1 << (end
- start
)) / factor
;
134 assert(min
<= v
&& v
<= max
);
137 const int64_t int_val
= llroundf(v
* factor
);
138 const uint64_t mask
= ~0ull >> (64 - (end
- start
+ 1));
140 return (int_val
& mask
) << start
;
143 static inline uint64_t
144 __gen_ufixed(float v
, uint32_t start
, uint32_t end
, uint32_t fract_bits
)
146 __gen_validate_value(v
);
148 const float factor
= (1 << fract_bits
);
151 const float max
= ((1 << (end
- start
+ 1)) - 1) / factor
;
152 const float min
= 0.0f
;
153 assert(min
<= v
&& v
<= max
);
156 const uint64_t uint_val
= llroundf(v
* factor
);
158 return uint_val
<< start
;
161 static inline uint64_t
162 __gen_unpack_uint(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
165 const int width
= end
- start
+ 1;
166 const uint32_t mask
= (width
== 32 ? ~0 : (1 << width
) - 1 );
168 for (int byte
= start
/ 8; byte
<= end
/ 8; byte
++) {
169 val
|= cl
[byte
] << ((byte
- start
/ 8) * 8);
172 return (val
>> (start
% 8)) & mask
;
175 static inline uint64_t
176 __gen_unpack_sint(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
178 int size
= end
- start
+ 1;
179 int64_t val
= __gen_unpack_uint(cl
, start
, end
);
181 /* Get the sign bit extended. */
182 return (val
<< (64 - size
)) >> (64 - size
);
186 __gen_unpack_sfixed(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
,
187 uint32_t fractional_size
)
189 int32_t bits
= __gen_unpack_sint(cl
, start
, end
);
190 return (float)bits
/ (1 << fractional_size
);
194 __gen_unpack_ufixed(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
,
195 uint32_t fractional_size
)
197 int32_t bits
= __gen_unpack_uint(cl
, start
, end
);
198 return (float)bits
/ (1 << fractional_size
);
202 __gen_unpack_float(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
204 assert(start
% 8 == 0);
205 assert(end
- start
== 31);
207 struct PACKED
{ float f
; } *f
= (void *)(cl
+ (start
/ 8));
213 __gen_unpack_f187(const uint8_t *restrict cl
, uint32_t start
, uint32_t end
)
215 assert(end
- start
== 15);
216 uint32_t bits
= __gen_unpack_uint(cl
, start
, end
);
217 return uif(bits
<< 16);