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 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 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 #else 78 79 return (( int64_t(a)*a + 80 int64_t(b)*b + 81 int64_t(c)*c + 0x8000)>>16); 82 83 #endif 84 } 85 86 static inline GLfixed mla2a( GLfixed a0, GLfixed b0, 87 GLfixed a1, GLfixed b1, 88 GLfixed c) 89 { 90 #if defined(__arm__) && !defined(__thumb__) 91 92 GLfixed r; 93 int32_t t; 94 asm( 95 "smull %0, %1, %2, %3 \n" 96 "smlal %0, %1, %4, %5 \n" 97 "add %0, %6, %0, lsr #16 \n" 98 "add %0, %0, %1, lsl #16 \n" 99 : "=&r"(r), "=&r"(t) 100 : "%r"(a0), "r"(b0), 101 "%r"(a1), "r"(b1), 102 "r"(c) 103 : 104 ); 105 return r; 106 107 #else 108 109 return (( int64_t(a0)*b0 + 110 int64_t(a1)*b1)>>16) + c; 111 112 #endif 113 } 114 115 static inline GLfixed mla3a( GLfixed a0, GLfixed b0, 116 GLfixed a1, GLfixed b1, 117 GLfixed a2, GLfixed b2, 118 GLfixed c) 119 { 120 #if defined(__arm__) && !defined(__thumb__) 121 122 GLfixed r; 123 int32_t t; 124 asm( 125 "smull %0, %1, %2, %3 \n" 126 "smlal %0, %1, %4, %5 \n" 127 "smlal %0, %1, %6, %7 \n" 128 "add %0, %8, %0, lsr #16 \n" 129 "add %0, %0, %1, lsl #16 \n" 130 : "=&r"(r), "=&r"(t) 131 : "%r"(a0), "r"(b0), 132 "%r"(a1), "r"(b1), 133 "%r"(a2), "r"(b2), 134 "r"(c) 135 : 136 ); 137 return r; 138 139 #else 140 141 return (( int64_t(a0)*b0 + 142 int64_t(a1)*b1 + 143 int64_t(a2)*b2)>>16) + c; 144 145 #endif 146 } 147 148 // b0, b1, b2 are signed 16-bit quanities 149 // that have been shifted right by 'shift' bits relative to normal 150 // S16.16 fixed point 151 static inline GLfixed mla3a16( GLfixed a0, int32_t b1b0, 152 GLfixed a1, 153 GLfixed a2, int32_t b2, 154 GLint shift, 155 GLfixed c) 156 { 157 #if defined(__arm__) && !defined(__thumb__) 158 159 GLfixed r; 160 asm( 161 "smulwb %0, %1, %2 \n" 162 "smlawt %0, %3, %2, %0 \n" 163 "smlawb %0, %4, %5, %0 \n" 164 "add %0, %7, %0, lsl %6 \n" 165 : "=&r"(r) 166 : "r"(a0), "r"(b1b0), 167 "r"(a1), 168 "r"(a2), "r"(b2), 169 "r"(shift), 170 "r"(c) 171 : 172 ); 173 return r; 174 175 #else 176 177 int32_t accum; 178 int16_t b0 = b1b0 & 0xffff; 179 int16_t b1 = (b1b0 >> 16) & 0xffff; 180 accum = int64_t(a0)*int16_t(b0) >> 16; 181 accum += int64_t(a1)*int16_t(b1) >> 16; 182 accum += int64_t(a2)*int16_t(b2) >> 16; 183 accum = (accum << shift) + c; 184 return accum; 185 186 #endif 187 } 188 189 190 static inline GLfixed mla3a16_btb( GLfixed a0, 191 GLfixed a1, 192 GLfixed a2, 193 int32_t b1b0, int32_t xxb2, 194 GLint shift, 195 GLfixed c) 196 { 197 #if defined(__arm__) && !defined(__thumb__) 198 199 GLfixed r; 200 asm( 201 "smulwb %0, %1, %4 \n" 202 "smlawt %0, %2, %4, %0 \n" 203 "smlawb %0, %3, %5, %0 \n" 204 "add %0, %7, %0, lsl %6 \n" 205 : "=&r"(r) 206 : "r"(a0), 207 "r"(a1), 208 "r"(a2), 209 "r"(b1b0), "r"(xxb2), 210 "r"(shift), 211 "r"(c) 212 : 213 ); 214 return r; 215 216 #else 217 218 int32_t accum; 219 int16_t b0 = b1b0 & 0xffff; 220 int16_t b1 = (b1b0 >> 16) & 0xffff; 221 int16_t b2 = xxb2 & 0xffff; 222 accum = int64_t(a0)*int16_t(b0) >> 16; 223 accum += int64_t(a1)*int16_t(b1) >> 16; 224 accum += int64_t(a2)*int16_t(b2) >> 16; 225 accum = (accum << shift) + c; 226 return accum; 227 228 #endif 229 } 230 231 static inline GLfixed mla3a16_btt( GLfixed a0, 232 GLfixed a1, 233 GLfixed a2, 234 int32_t b1b0, int32_t b2xx, 235 GLint shift, 236 GLfixed c) 237 { 238 #if defined(__arm__) && !defined(__thumb__) 239 240 GLfixed r; 241 asm( 242 "smulwb %0, %1, %4 \n" 243 "smlawt %0, %2, %4, %0 \n" 244 "smlawt %0, %3, %5, %0 \n" 245 "add %0, %7, %0, lsl %6 \n" 246 : "=&r"(r) 247 : "r"(a0), 248 "r"(a1), 249 "r"(a2), 250 "r"(b1b0), "r"(b2xx), 251 "r"(shift), 252 "r"(c) 253 : 254 ); 255 return r; 256 257 #else 258 259 int32_t accum; 260 int16_t b0 = b1b0 & 0xffff; 261 int16_t b1 = (b1b0 >> 16) & 0xffff; 262 int16_t b2 = (b2xx >> 16) & 0xffff; 263 accum = int64_t(a0)*int16_t(b0) >> 16; 264 accum += int64_t(a1)*int16_t(b1) >> 16; 265 accum += int64_t(a2)*int16_t(b2) >> 16; 266 accum = (accum << shift) + c; 267 return accum; 268 269 #endif 270 } 271 272 static inline GLfixed mla3( GLfixed a0, GLfixed b0, 273 GLfixed a1, GLfixed b1, 274 GLfixed a2, GLfixed b2) 275 { 276 #if defined(__arm__) && !defined(__thumb__) 277 278 GLfixed r; 279 int32_t t; 280 asm( 281 "smull %0, %1, %2, %3 \n" 282 "smlal %0, %1, %4, %5 \n" 283 "smlal %0, %1, %6, %7 \n" 284 "movs %0, %0, lsr #16 \n" 285 "adc %0, %0, %1, lsl #16 \n" 286 : "=&r"(r), "=&r"(t) 287 : "%r"(a0), "r"(b0), 288 "%r"(a1), "r"(b1), 289 "%r"(a2), "r"(b2) 290 : "cc" 291 ); 292 return r; 293 294 #else 295 296 return (( int64_t(a0)*b0 + 297 int64_t(a1)*b1 + 298 int64_t(a2)*b2 + 0x8000)>>16); 299 300 #endif 301 } 302 303 static inline GLfixed mla4( GLfixed a0, GLfixed b0, 304 GLfixed a1, GLfixed b1, 305 GLfixed a2, GLfixed b2, 306 GLfixed a3, GLfixed b3) 307 { 308 #if defined(__arm__) && !defined(__thumb__) 309 310 GLfixed r; 311 int32_t t; 312 asm( 313 "smull %0, %1, %2, %3 \n" 314 "smlal %0, %1, %4, %5 \n" 315 "smlal %0, %1, %6, %7 \n" 316 "smlal %0, %1, %8, %9 \n" 317 "movs %0, %0, lsr #16 \n" 318 "adc %0, %0, %1, lsl #16 \n" 319 : "=&r"(r), "=&r"(t) 320 : "%r"(a0), "r"(b0), 321 "%r"(a1), "r"(b1), 322 "%r"(a2), "r"(b2), 323 "%r"(a3), "r"(b3) 324 : "cc" 325 ); 326 return r; 327 328 #else 329 330 return (( int64_t(a0)*b0 + 331 int64_t(a1)*b1 + 332 int64_t(a2)*b2 + 333 int64_t(a3)*b3 + 0x8000)>>16); 334 335 #endif 336 } 337 338 inline 339 GLfixed dot4(const GLfixed* a, const GLfixed* b) 340 { 341 return mla4(a[0], b[0], a[1], b[1], a[2], b[2], a[3], b[3]); 342 } 343 344 345 inline 346 GLfixed dot3(const GLfixed* a, const GLfixed* b) 347 { 348 return mla3(a[0], b[0], a[1], b[1], a[2], b[2]); 349 } 350 351 352 }; // namespace android 353 354 #endif // ANDROID_OPENGLES_MATRIX_H 355 356