1 /* libs/opengles/matrix.h
2 **
3 ** Copyright 2006, The Android Open Source Project
4 **
5 ** Licensed under the Apache License, Version 2.0 (the "License");
6 ** you may not use this file except in compliance with the License.
7 ** You may obtain a copy of the License at
8 **
9 ** http://www.apache.org/licenses/LICENSE-2.0
10 **
11 ** Unless required by applicable law or agreed to in writing, software
12 ** distributed under the License is distributed on an "AS IS" BASIS,
13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 ** See the License for the specific language governing permissions and
15 ** limitations under the License.
16 */
17
18 #ifndef ANDROID_OPENGLES_MATRIX_H
19 #define ANDROID_OPENGLES_MATRIX_H
20
21 #include <stdint.h>
22 #include <stddef.h>
23 #include <sys/types.h>
24 #include <utils/Log.h>
25
26 #include <private/pixelflinger/ggl_context.h>
27
28 #include <GLES/gl.h>
29
30 namespace android {
31
32 const int OGLES_MODELVIEW_STACK_DEPTH = 16;
33 const int OGLES_PROJECTION_STACK_DEPTH = 2;
34 const int OGLES_TEXTURE_STACK_DEPTH = 2;
35
36 void ogles_init_matrix(ogles_context_t*);
37 void ogles_uninit_matrix(ogles_context_t*);
38 void ogles_invalidate_perspective(ogles_context_t* c);
39 void ogles_validate_transform_impl(ogles_context_t* c, uint32_t want);
40
41 int ogles_surfaceport(ogles_context_t* c, GLint x, GLint y);
42
43 void ogles_scissor(ogles_context_t* c,
44 GLint x, GLint y, GLsizei w, GLsizei h);
45
46 void ogles_viewport(ogles_context_t* c,
47 GLint x, GLint y, GLsizei w, GLsizei h);
48
ogles_validate_transform(ogles_context_t * c,uint32_t want)49 inline void ogles_validate_transform(
50 ogles_context_t* c, uint32_t want)
51 {
52 if (c->transforms.dirty & want)
53 ogles_validate_transform_impl(c, want);
54 }
55
56 // ----------------------------------------------------------------------------
57
58 inline
vsquare3(GLfixed a,GLfixed b,GLfixed c)59 GLfixed vsquare3(GLfixed a, GLfixed b, GLfixed c)
60 {
61 #if defined(__arm__) && !defined(__thumb__)
62
63 GLfixed r;
64 int32_t t;
65 asm(
66 "smull %0, %1, %2, %2 \n"
67 "smlal %0, %1, %3, %3 \n"
68 "smlal %0, %1, %4, %4 \n"
69 "movs %0, %0, lsr #16 \n"
70 "adc %0, %0, %1, lsl #16 \n"
71 : "=&r"(r), "=&r"(t)
72 : "%r"(a), "r"(b), "r"(c)
73 : "cc"
74 );
75 return r;
76
77 #elif defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6
78
79 GLfixed res;
80 int32_t t1,t2,t3;
81 asm(
82 "mult %[a], %[a] \r\n"
83 "li %[res],0x8000 \r\n"
84 "madd %[b],%[b] \r\n"
85 "move %[t3],$zero \r\n"
86 "madd %[c],%[c] \r\n"
87 "mflo %[t1]\r\n"
88 "mfhi %[t2]\r\n"
89 "addu %[t1],%[res],%[t1]\r\n" /*add 0x8000*/
90 "sltu %[t3],%[t1],%[res]\r\n"
91 "addu %[t2],%[t2],%[t3]\r\n"
92 "srl %[res],%[t1],16\r\n"
93 "sll %[t2],%[t2],16\r\n"
94 "or %[res],%[res],%[t2]\r\n"
95 : [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2),[t3]"=&r"(t3)
96 : [a] "r" (a),[b] "r" (b),[c] "r" (c)
97 : "%hi","%lo"
98 );
99 return res;
100
101 #else
102
103 return (( int64_t(a)*a +
104 int64_t(b)*b +
105 int64_t(c)*c + 0x8000)>>16);
106
107 #endif
108 }
109
mla2a(GLfixed a0,GLfixed b0,GLfixed a1,GLfixed b1,GLfixed c)110 static inline GLfixed mla2a( GLfixed a0, GLfixed b0,
111 GLfixed a1, GLfixed b1,
112 GLfixed c)
113 {
114 #if defined(__arm__) && !defined(__thumb__)
115
116 GLfixed r;
117 int32_t t;
118 asm(
119 "smull %0, %1, %2, %3 \n"
120 "smlal %0, %1, %4, %5 \n"
121 "add %0, %6, %0, lsr #16 \n"
122 "add %0, %0, %1, lsl #16 \n"
123 : "=&r"(r), "=&r"(t)
124 : "%r"(a0), "r"(b0),
125 "%r"(a1), "r"(b1),
126 "r"(c)
127 :
128 );
129 return r;
130
131 #else
132
133 return (( int64_t(a0)*b0 +
134 int64_t(a1)*b1)>>16) + c;
135
136 #endif
137 }
138
mla3a(GLfixed a0,GLfixed b0,GLfixed a1,GLfixed b1,GLfixed a2,GLfixed b2,GLfixed c)139 static inline GLfixed mla3a( GLfixed a0, GLfixed b0,
140 GLfixed a1, GLfixed b1,
141 GLfixed a2, GLfixed b2,
142 GLfixed c)
143 {
144 #if defined(__arm__) && !defined(__thumb__)
145
146 GLfixed r;
147 int32_t t;
148 asm(
149 "smull %0, %1, %2, %3 \n"
150 "smlal %0, %1, %4, %5 \n"
151 "smlal %0, %1, %6, %7 \n"
152 "add %0, %8, %0, lsr #16 \n"
153 "add %0, %0, %1, lsl #16 \n"
154 : "=&r"(r), "=&r"(t)
155 : "%r"(a0), "r"(b0),
156 "%r"(a1), "r"(b1),
157 "%r"(a2), "r"(b2),
158 "r"(c)
159 :
160 );
161 return r;
162
163 #elif defined(__mips__) && !defined(__LP64__) && __mips_isa_rev < 6
164
165 GLfixed res;
166 int32_t t1,t2;
167 asm(
168 "mult %[a0],%[b0] \r\n"
169 "madd %[a1],%[b1] \r\n"
170 "madd %[a2],%[b2] \r\n"
171 "mflo %[t2]\r\n"
172 "mfhi %[t1]\r\n"
173 "srl %[t2],%[t2],16\r\n"
174 "sll %[t1],%[t1],16\r\n"
175 "or %[t2],%[t2],%[t1]\r\n"
176 "addu %[res],%[t2],%[c]"
177 : [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2)
178 : [a0] "r" (a0),[b0] "r" (b0),[a1] "r" (a1),[b1] "r" (b1),[a2] "r" (a2),[b2] "r" (b2),[c] "r" (c)
179 : "%hi","%lo"
180 );
181 return res;
182
183 #else
184
185 return (( int64_t(a0)*b0 +
186 int64_t(a1)*b1 +
187 int64_t(a2)*b2)>>16) + c;
188
189 #endif
190 }
191
192 // b0, b1, b2 are signed 16-bit quanities
193 // that have been shifted right by 'shift' bits relative to normal
194 // S16.16 fixed point
mla3a16(GLfixed a0,int32_t b1b0,GLfixed a1,GLfixed a2,int32_t b2,GLint shift,GLfixed c)195 static inline GLfixed mla3a16( GLfixed a0, int32_t b1b0,
196 GLfixed a1,
197 GLfixed a2, int32_t b2,
198 GLint shift,
199 GLfixed c)
200 {
201 #if defined(__arm__) && !defined(__thumb__)
202
203 GLfixed r;
204 asm(
205 "smulwb %0, %1, %2 \n"
206 "smlawt %0, %3, %2, %0 \n"
207 "smlawb %0, %4, %5, %0 \n"
208 "add %0, %7, %0, lsl %6 \n"
209 : "=&r"(r)
210 : "r"(a0), "r"(b1b0),
211 "r"(a1),
212 "r"(a2), "r"(b2),
213 "r"(shift),
214 "r"(c)
215 :
216 );
217 return r;
218
219 #else
220
221 int32_t accum;
222 int16_t b0 = b1b0 & 0xffff;
223 int16_t b1 = (b1b0 >> 16) & 0xffff;
224 accum = int64_t(a0)*int16_t(b0) >> 16;
225 accum += int64_t(a1)*int16_t(b1) >> 16;
226 accum += int64_t(a2)*int16_t(b2) >> 16;
227 accum = (accum << shift) + c;
228 return accum;
229
230 #endif
231 }
232
233
mla3a16_btb(GLfixed a0,GLfixed a1,GLfixed a2,int32_t b1b0,int32_t xxb2,GLint shift,GLfixed c)234 static inline GLfixed mla3a16_btb( GLfixed a0,
235 GLfixed a1,
236 GLfixed a2,
237 int32_t b1b0, int32_t xxb2,
238 GLint shift,
239 GLfixed c)
240 {
241 #if defined(__arm__) && !defined(__thumb__)
242
243 GLfixed r;
244 asm(
245 "smulwb %0, %1, %4 \n"
246 "smlawt %0, %2, %4, %0 \n"
247 "smlawb %0, %3, %5, %0 \n"
248 "add %0, %7, %0, lsl %6 \n"
249 : "=&r"(r)
250 : "r"(a0),
251 "r"(a1),
252 "r"(a2),
253 "r"(b1b0), "r"(xxb2),
254 "r"(shift),
255 "r"(c)
256 :
257 );
258 return r;
259
260 #else
261
262 int32_t accum;
263 int16_t b0 = b1b0 & 0xffff;
264 int16_t b1 = (b1b0 >> 16) & 0xffff;
265 int16_t b2 = xxb2 & 0xffff;
266 accum = int64_t(a0)*int16_t(b0) >> 16;
267 accum += int64_t(a1)*int16_t(b1) >> 16;
268 accum += int64_t(a2)*int16_t(b2) >> 16;
269 accum = (accum << shift) + c;
270 return accum;
271
272 #endif
273 }
274
mla3a16_btt(GLfixed a0,GLfixed a1,GLfixed a2,int32_t b1b0,int32_t b2xx,GLint shift,GLfixed c)275 static inline GLfixed mla3a16_btt( GLfixed a0,
276 GLfixed a1,
277 GLfixed a2,
278 int32_t b1b0, int32_t b2xx,
279 GLint shift,
280 GLfixed c)
281 {
282 #if defined(__arm__) && !defined(__thumb__)
283
284 GLfixed r;
285 asm(
286 "smulwb %0, %1, %4 \n"
287 "smlawt %0, %2, %4, %0 \n"
288 "smlawt %0, %3, %5, %0 \n"
289 "add %0, %7, %0, lsl %6 \n"
290 : "=&r"(r)
291 : "r"(a0),
292 "r"(a1),
293 "r"(a2),
294 "r"(b1b0), "r"(b2xx),
295 "r"(shift),
296 "r"(c)
297 :
298 );
299 return r;
300
301 #else
302
303 int32_t accum;
304 int16_t b0 = b1b0 & 0xffff;
305 int16_t b1 = (b1b0 >> 16) & 0xffff;
306 int16_t b2 = (b2xx >> 16) & 0xffff;
307 accum = int64_t(a0)*int16_t(b0) >> 16;
308 accum += int64_t(a1)*int16_t(b1) >> 16;
309 accum += int64_t(a2)*int16_t(b2) >> 16;
310 accum = (accum << shift) + c;
311 return accum;
312
313 #endif
314 }
315
mla3(GLfixed a0,GLfixed b0,GLfixed a1,GLfixed b1,GLfixed a2,GLfixed b2)316 static inline GLfixed mla3( GLfixed a0, GLfixed b0,
317 GLfixed a1, GLfixed b1,
318 GLfixed a2, GLfixed b2)
319 {
320 #if defined(__arm__) && !defined(__thumb__)
321
322 GLfixed r;
323 int32_t t;
324 asm(
325 "smull %0, %1, %2, %3 \n"
326 "smlal %0, %1, %4, %5 \n"
327 "smlal %0, %1, %6, %7 \n"
328 "movs %0, %0, lsr #16 \n"
329 "adc %0, %0, %1, lsl #16 \n"
330 : "=&r"(r), "=&r"(t)
331 : "%r"(a0), "r"(b0),
332 "%r"(a1), "r"(b1),
333 "%r"(a2), "r"(b2)
334 : "cc"
335 );
336 return r;
337
338 #else
339
340 return (( int64_t(a0)*b0 +
341 int64_t(a1)*b1 +
342 int64_t(a2)*b2 + 0x8000)>>16);
343
344 #endif
345 }
346
mla4(GLfixed a0,GLfixed b0,GLfixed a1,GLfixed b1,GLfixed a2,GLfixed b2,GLfixed a3,GLfixed b3)347 static inline GLfixed mla4( GLfixed a0, GLfixed b0,
348 GLfixed a1, GLfixed b1,
349 GLfixed a2, GLfixed b2,
350 GLfixed a3, GLfixed b3)
351 {
352 #if defined(__arm__) && !defined(__thumb__)
353
354 GLfixed r;
355 int32_t t;
356 asm(
357 "smull %0, %1, %2, %3 \n"
358 "smlal %0, %1, %4, %5 \n"
359 "smlal %0, %1, %6, %7 \n"
360 "smlal %0, %1, %8, %9 \n"
361 "movs %0, %0, lsr #16 \n"
362 "adc %0, %0, %1, lsl #16 \n"
363 : "=&r"(r), "=&r"(t)
364 : "%r"(a0), "r"(b0),
365 "%r"(a1), "r"(b1),
366 "%r"(a2), "r"(b2),
367 "%r"(a3), "r"(b3)
368 : "cc"
369 );
370 return r;
371
372 #else
373
374 return (( int64_t(a0)*b0 +
375 int64_t(a1)*b1 +
376 int64_t(a2)*b2 +
377 int64_t(a3)*b3 + 0x8000)>>16);
378
379 #endif
380 }
381
382 inline
dot4(const GLfixed * a,const GLfixed * b)383 GLfixed dot4(const GLfixed* a, const GLfixed* b)
384 {
385 return mla4(a[0], b[0], a[1], b[1], a[2], b[2], a[3], b[3]);
386 }
387
388
389 inline
dot3(const GLfixed * a,const GLfixed * b)390 GLfixed dot3(const GLfixed* a, const GLfixed* b)
391 {
392 return mla3(a[0], b[0], a[1], b[1], a[2], b[2]);
393 }
394
395
396 }; // namespace android
397
398 #endif // ANDROID_OPENGLES_MATRIX_H
399
400