1*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
2*35238bceSAndroid Build Coastguard Worker * drawElements Quality Program Tester Core
3*35238bceSAndroid Build Coastguard Worker * ----------------------------------------
4*35238bceSAndroid Build Coastguard Worker *
5*35238bceSAndroid Build Coastguard Worker * Copyright 2014 The Android Open Source Project
6*35238bceSAndroid Build Coastguard Worker *
7*35238bceSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
8*35238bceSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
9*35238bceSAndroid Build Coastguard Worker * You may obtain a copy of the License at
10*35238bceSAndroid Build Coastguard Worker *
11*35238bceSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
12*35238bceSAndroid Build Coastguard Worker *
13*35238bceSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
14*35238bceSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
15*35238bceSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16*35238bceSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
17*35238bceSAndroid Build Coastguard Worker * limitations under the License.
18*35238bceSAndroid Build Coastguard Worker *
19*35238bceSAndroid Build Coastguard Worker *//*!
20*35238bceSAndroid Build Coastguard Worker * \file
21*35238bceSAndroid Build Coastguard Worker * \brief Utility class to build seeds from different data types.
22*35238bceSAndroid Build Coastguard Worker *
23*35238bceSAndroid Build Coastguard Worker * Values are first XORed with type specifig mask, which makes sure that
24*35238bceSAndroid Build Coastguard Worker * two values with different types, but same bit presentation produce
25*35238bceSAndroid Build Coastguard Worker * different results. Then values are passed through 32 bit crc.
26*35238bceSAndroid Build Coastguard Worker *//*--------------------------------------------------------------------*/
27*35238bceSAndroid Build Coastguard Worker
28*35238bceSAndroid Build Coastguard Worker #include "tcuSeedBuilder.hpp"
29*35238bceSAndroid Build Coastguard Worker
30*35238bceSAndroid Build Coastguard Worker #include "deMemory.h"
31*35238bceSAndroid Build Coastguard Worker
32*35238bceSAndroid Build Coastguard Worker namespace tcu
33*35238bceSAndroid Build Coastguard Worker {
34*35238bceSAndroid Build Coastguard Worker
35*35238bceSAndroid Build Coastguard Worker namespace
36*35238bceSAndroid Build Coastguard Worker {
37*35238bceSAndroid Build Coastguard Worker
advanceCrc32(uint32_t oldCrc,size_t len,const uint8_t * data)38*35238bceSAndroid Build Coastguard Worker uint32_t advanceCrc32(uint32_t oldCrc, size_t len, const uint8_t *data)
39*35238bceSAndroid Build Coastguard Worker {
40*35238bceSAndroid Build Coastguard Worker const uint32_t generator = 0x04C11DB7u;
41*35238bceSAndroid Build Coastguard Worker uint32_t crc = oldCrc;
42*35238bceSAndroid Build Coastguard Worker
43*35238bceSAndroid Build Coastguard Worker for (size_t i = 0; i < len; i++)
44*35238bceSAndroid Build Coastguard Worker {
45*35238bceSAndroid Build Coastguard Worker const uint32_t current = static_cast<uint32_t>(data[i]);
46*35238bceSAndroid Build Coastguard Worker crc = crc ^ current;
47*35238bceSAndroid Build Coastguard Worker
48*35238bceSAndroid Build Coastguard Worker for (size_t bitNdx = 0; bitNdx < 8; bitNdx++)
49*35238bceSAndroid Build Coastguard Worker {
50*35238bceSAndroid Build Coastguard Worker if (crc & 1u)
51*35238bceSAndroid Build Coastguard Worker crc = (crc >> 1u) ^ generator;
52*35238bceSAndroid Build Coastguard Worker else
53*35238bceSAndroid Build Coastguard Worker crc = (crc >> 1u);
54*35238bceSAndroid Build Coastguard Worker }
55*35238bceSAndroid Build Coastguard Worker }
56*35238bceSAndroid Build Coastguard Worker
57*35238bceSAndroid Build Coastguard Worker return crc;
58*35238bceSAndroid Build Coastguard Worker }
59*35238bceSAndroid Build Coastguard Worker
60*35238bceSAndroid Build Coastguard Worker } // namespace
61*35238bceSAndroid Build Coastguard Worker
SeedBuilder(void)62*35238bceSAndroid Build Coastguard Worker SeedBuilder::SeedBuilder(void) : m_hash(0xccf139d7u)
63*35238bceSAndroid Build Coastguard Worker {
64*35238bceSAndroid Build Coastguard Worker }
65*35238bceSAndroid Build Coastguard Worker
feed(size_t size,const void * ptr)66*35238bceSAndroid Build Coastguard Worker void SeedBuilder::feed(size_t size, const void *ptr)
67*35238bceSAndroid Build Coastguard Worker {
68*35238bceSAndroid Build Coastguard Worker m_hash = advanceCrc32(m_hash, size, (const uint8_t *)ptr);
69*35238bceSAndroid Build Coastguard Worker }
70*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,bool value)71*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, bool value)
72*35238bceSAndroid Build Coastguard Worker {
73*35238bceSAndroid Build Coastguard Worker const uint8_t val = (value ? 54 : 7);
74*35238bceSAndroid Build Coastguard Worker
75*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(val), &val);
76*35238bceSAndroid Build Coastguard Worker return builder;
77*35238bceSAndroid Build Coastguard Worker }
78*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,int8_t value)79*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, int8_t value)
80*35238bceSAndroid Build Coastguard Worker {
81*35238bceSAndroid Build Coastguard Worker const int8_t val = value ^ 75;
82*35238bceSAndroid Build Coastguard Worker
83*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(val), &val);
84*35238bceSAndroid Build Coastguard Worker return builder;
85*35238bceSAndroid Build Coastguard Worker }
86*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,uint8_t value)87*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, uint8_t value)
88*35238bceSAndroid Build Coastguard Worker {
89*35238bceSAndroid Build Coastguard Worker const uint8_t val = value ^ 140u;
90*35238bceSAndroid Build Coastguard Worker
91*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(val), &val);
92*35238bceSAndroid Build Coastguard Worker return builder;
93*35238bceSAndroid Build Coastguard Worker }
94*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,int16_t value)95*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, int16_t value)
96*35238bceSAndroid Build Coastguard Worker {
97*35238bceSAndroid Build Coastguard Worker const int16_t val = value ^ 555;
98*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
99*35238bceSAndroid Build Coastguard Worker (uint8_t)(((uint16_t)val) & 0xFFu),
100*35238bceSAndroid Build Coastguard Worker (uint8_t)(((uint16_t)val) >> 8),
101*35238bceSAndroid Build Coastguard Worker };
102*35238bceSAndroid Build Coastguard Worker
103*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
104*35238bceSAndroid Build Coastguard Worker return builder;
105*35238bceSAndroid Build Coastguard Worker }
106*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,uint16_t value)107*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, uint16_t value)
108*35238bceSAndroid Build Coastguard Worker {
109*35238bceSAndroid Build Coastguard Worker const uint16_t val = value ^ 37323u;
110*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
111*35238bceSAndroid Build Coastguard Worker (uint8_t)(val & 0xFFu),
112*35238bceSAndroid Build Coastguard Worker (uint8_t)(val >> 8),
113*35238bceSAndroid Build Coastguard Worker };
114*35238bceSAndroid Build Coastguard Worker
115*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
116*35238bceSAndroid Build Coastguard Worker return builder;
117*35238bceSAndroid Build Coastguard Worker }
118*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,int32_t value)119*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, int32_t value)
120*35238bceSAndroid Build Coastguard Worker {
121*35238bceSAndroid Build Coastguard Worker const int32_t val = value ^ 53054741;
122*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
123*35238bceSAndroid Build Coastguard Worker (uint8_t)(((uint32_t)val) & 0xFFu),
124*35238bceSAndroid Build Coastguard Worker (uint8_t)((((uint32_t)val) >> 8) & 0xFFu),
125*35238bceSAndroid Build Coastguard Worker (uint8_t)((((uint32_t)val) >> 16) & 0xFFu),
126*35238bceSAndroid Build Coastguard Worker (uint8_t)((((uint32_t)val) >> 24) & 0xFFu),
127*35238bceSAndroid Build Coastguard Worker };
128*35238bceSAndroid Build Coastguard Worker
129*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
130*35238bceSAndroid Build Coastguard Worker return builder;
131*35238bceSAndroid Build Coastguard Worker }
132*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,uint32_t value)133*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, uint32_t value)
134*35238bceSAndroid Build Coastguard Worker {
135*35238bceSAndroid Build Coastguard Worker const uint32_t val = value ^ 1977303630u;
136*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
137*35238bceSAndroid Build Coastguard Worker (uint8_t)(val & 0xFFu),
138*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 8) & 0xFFu),
139*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 16) & 0xFFu),
140*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 24) & 0xFFu),
141*35238bceSAndroid Build Coastguard Worker };
142*35238bceSAndroid Build Coastguard Worker
143*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
144*35238bceSAndroid Build Coastguard Worker return builder;
145*35238bceSAndroid Build Coastguard Worker }
146*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,int64_t value)147*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, int64_t value)
148*35238bceSAndroid Build Coastguard Worker {
149*35238bceSAndroid Build Coastguard Worker const int64_t val = value ^ 772935234179004386ll;
150*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
151*35238bceSAndroid Build Coastguard Worker (uint8_t)(((uint64_t)val) & 0xFFu), (uint8_t)((((uint64_t)val) >> 8) & 0xFFu),
152*35238bceSAndroid Build Coastguard Worker (uint8_t)((((uint64_t)val) >> 16) & 0xFFu), (uint8_t)((((uint64_t)val) >> 24) & 0xFFu),
153*35238bceSAndroid Build Coastguard Worker
154*35238bceSAndroid Build Coastguard Worker (uint8_t)((((uint64_t)val) >> 32) & 0xFFu), (uint8_t)((((uint64_t)val) >> 40) & 0xFFu),
155*35238bceSAndroid Build Coastguard Worker (uint8_t)((((uint64_t)val) >> 48) & 0xFFu), (uint8_t)((((uint64_t)val) >> 56) & 0xFFu),
156*35238bceSAndroid Build Coastguard Worker };
157*35238bceSAndroid Build Coastguard Worker
158*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
159*35238bceSAndroid Build Coastguard Worker return builder;
160*35238bceSAndroid Build Coastguard Worker }
161*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,uint64_t value)162*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, uint64_t value)
163*35238bceSAndroid Build Coastguard Worker {
164*35238bceSAndroid Build Coastguard Worker const uint64_t val = value ^ 4664937258000467599ull;
165*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
166*35238bceSAndroid Build Coastguard Worker (uint8_t)(val & 0xFFu), (uint8_t)((val >> 8) & 0xFFu),
167*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 16) & 0xFFu), (uint8_t)((val >> 24) & 0xFFu),
168*35238bceSAndroid Build Coastguard Worker
169*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 32) & 0xFFu), (uint8_t)((val >> 40) & 0xFFu),
170*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 48) & 0xFFu), (uint8_t)((val >> 56) & 0xFFu),
171*35238bceSAndroid Build Coastguard Worker };
172*35238bceSAndroid Build Coastguard Worker
173*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
174*35238bceSAndroid Build Coastguard Worker return builder;
175*35238bceSAndroid Build Coastguard Worker }
176*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,float value)177*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, float value)
178*35238bceSAndroid Build Coastguard Worker {
179*35238bceSAndroid Build Coastguard Worker // \note Assume that float has same endianess as uint32.
180*35238bceSAndroid Build Coastguard Worker uint32_t val;
181*35238bceSAndroid Build Coastguard Worker
182*35238bceSAndroid Build Coastguard Worker deMemcpy(&val, &value, sizeof(uint32_t));
183*35238bceSAndroid Build Coastguard Worker
184*35238bceSAndroid Build Coastguard Worker {
185*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
186*35238bceSAndroid Build Coastguard Worker (uint8_t)(val & 0xFFu),
187*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 8) & 0xFFu),
188*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 16) & 0xFFu),
189*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 24) & 0xFFu),
190*35238bceSAndroid Build Coastguard Worker };
191*35238bceSAndroid Build Coastguard Worker
192*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
193*35238bceSAndroid Build Coastguard Worker return builder;
194*35238bceSAndroid Build Coastguard Worker }
195*35238bceSAndroid Build Coastguard Worker }
196*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,double value)197*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, double value)
198*35238bceSAndroid Build Coastguard Worker {
199*35238bceSAndroid Build Coastguard Worker // \note Assume that double has same endianess as uint64.
200*35238bceSAndroid Build Coastguard Worker uint64_t val;
201*35238bceSAndroid Build Coastguard Worker
202*35238bceSAndroid Build Coastguard Worker deMemcpy(&val, &value, sizeof(uint64_t));
203*35238bceSAndroid Build Coastguard Worker
204*35238bceSAndroid Build Coastguard Worker const uint8_t data[] = {
205*35238bceSAndroid Build Coastguard Worker (uint8_t)(val & 0xFFu), (uint8_t)((val >> 8) & 0xFFu),
206*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 16) & 0xFFu), (uint8_t)((val >> 24) & 0xFFu),
207*35238bceSAndroid Build Coastguard Worker
208*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 32) & 0xFFu), (uint8_t)((val >> 40) & 0xFFu),
209*35238bceSAndroid Build Coastguard Worker (uint8_t)((val >> 48) & 0xFFu), (uint8_t)((val >> 56) & 0xFFu),
210*35238bceSAndroid Build Coastguard Worker };
211*35238bceSAndroid Build Coastguard Worker
212*35238bceSAndroid Build Coastguard Worker builder.feed(sizeof(data), data);
213*35238bceSAndroid Build Coastguard Worker return builder;
214*35238bceSAndroid Build Coastguard Worker }
215*35238bceSAndroid Build Coastguard Worker
operator <<(SeedBuilder & builder,const std::string & value)216*35238bceSAndroid Build Coastguard Worker SeedBuilder &operator<<(SeedBuilder &builder, const std::string &value)
217*35238bceSAndroid Build Coastguard Worker {
218*35238bceSAndroid Build Coastguard Worker builder.feed(value.length(), value.c_str());
219*35238bceSAndroid Build Coastguard Worker return builder;
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker
222*35238bceSAndroid Build Coastguard Worker } // namespace tcu
223