187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams/* 2a04e30dbb5ab11592b03666bb3d102070759c58eAlex Sakhartchouk * Copyright (C) 2011 The Android Open Source Project 387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * 487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * you may not use this file except in compliance with the License. 687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * You may obtain a copy of the License at 787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * 887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * 1087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * Unless required by applicable law or agreed to in writing, software 1187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * See the License for the specific language governing permissions and 1487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams * limitations under the License. 1587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams */ 1687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 1772f4f4cec34098e179ad5d257b07df3a514fcae2Glenn Kasten#include <cutils/compiler.h> 1872f4f4cec34098e179ad5d257b07df3a514fcae2Glenn Kasten 1987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsContext.h" 2087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsScriptC.h" 2187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix4x4.h" 2287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix3x3.h" 2387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsMatrix2x2.h" 2487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 2587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsdCore.h" 2687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#include "rsdRuntime.h" 2787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 2887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 2987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android; 3087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsusing namespace android::renderscript; 3187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 3287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 3387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_exp10(float v) { 3487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return pow(10.f, v); 3587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 3687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 3752a18464438e9bfbd042c8b6c288f0af444610c1Stephen Hinesstatic float SC_fract(float v, float *iptr) { 3887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int i = (int)floor(v); 3952a18464438e9bfbd042c8b6c288f0af444610c1Stephen Hines iptr[0] = (float)i; 4087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return fmin(v - i, 0x1.fffffep-1f); 4187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 4287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 4387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_log2(float v) { 4487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return log10(v) / log10(2.f); 4587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 4687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 4787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#if 0 4887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_pown(float v, int p) { 4987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return powf(v, (float)p); 5087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 5187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 5287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_powr(float v, float p) { 5387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return powf(v, p); 5487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 5587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams#endif 5687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 5787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsfloat SC_rootn(float v, int r) { 5887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return pow(v, 1.f / r); 5987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 6087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 6187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsfloat SC_rsqrt(float v) { 6287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return 1.f / sqrtf(v); 6387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 6487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 6587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsfloat SC_sincos(float v, float *cosptr) { 6687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams *cosptr = cosf(v); 6787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return sinf(v); 6887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 6987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 7087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams////////////////////////////////////////////////////////////////////////////// 7187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// Integer 7287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams////////////////////////////////////////////////////////////////////////////// 7387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 7487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 7587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint32_t SC_abs_i32(int32_t v) {return abs(v);} 7687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint16_t SC_abs_i16(int16_t v) {return (uint16_t)abs(v);} 7787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint8_t SC_abs_i8(int8_t v) {return (uint8_t)abs(v);} 7887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 7987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint32_t SC_clz_u32(uint32_t v) {return __builtin_clz(v);} 8087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint16_t SC_clz_u16(uint16_t v) {return (uint16_t)__builtin_clz(v);} 8187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint8_t SC_clz_u8(uint8_t v) {return (uint8_t)__builtin_clz(v);} 8287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int32_t SC_clz_i32(int32_t v) {return (int32_t)__builtin_clz((uint32_t)v);} 8387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int16_t SC_clz_i16(int16_t v) {return (int16_t)__builtin_clz(v);} 8487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int8_t SC_clz_i8(int8_t v) {return (int8_t)__builtin_clz(v);} 8587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 8687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint32_t SC_max_u32(uint32_t v, uint32_t v2) {return rsMax(v, v2);} 8787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint16_t SC_max_u16(uint16_t v, uint16_t v2) {return rsMax(v, v2);} 8887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint8_t SC_max_u8(uint8_t v, uint8_t v2) {return rsMax(v, v2);} 8987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int32_t SC_max_i32(int32_t v, int32_t v2) {return rsMax(v, v2);} 9087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int16_t SC_max_i16(int16_t v, int16_t v2) {return rsMax(v, v2);} 9187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int8_t SC_max_i8(int8_t v, int8_t v2) {return rsMax(v, v2);} 9287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 9387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint32_t SC_min_u32(uint32_t v, uint32_t v2) {return rsMin(v, v2);} 9487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint16_t SC_min_u16(uint16_t v, uint16_t v2) {return rsMin(v, v2);} 9587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic uint8_t SC_min_u8(uint8_t v, uint8_t v2) {return rsMin(v, v2);} 9687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int32_t SC_min_i32(int32_t v, int32_t v2) {return rsMin(v, v2);} 9787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int16_t SC_min_i16(int16_t v, int16_t v2) {return rsMin(v, v2);} 9887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int8_t SC_min_i8(int8_t v, int8_t v2) {return rsMin(v, v2);} 9987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 10087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams////////////////////////////////////////////////////////////////////////////// 10187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// Float util 10287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams////////////////////////////////////////////////////////////////////////////// 10387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 10487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_clamp_f32(float amount, float low, float high) { 10587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return amount < low ? low : (amount > high ? high : amount); 10687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 10787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 10887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_max_f32(float v, float v2) { 10987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return rsMax(v, v2); 11087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 11187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 11287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_min_f32(float v, float v2) { 11387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return rsMin(v, v2); 11487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 11587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 11687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_step_f32(float edge, float v) { 11787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams if (v < edge) return 0.f; 11887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return 1.f; 11987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 12087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 12187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_sign_f32(float value) { 12287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams if (value > 0) return 1.f; 12387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams if (value < 0) return -1.f; 12487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return value; 12587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 12687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 12787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadIdentity_4x4(Matrix4x4 *m) { 12887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadIdentity(); 12987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 13087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadIdentity_3x3(Matrix3x3 *m) { 13187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadIdentity(); 13287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 13387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadIdentity_2x2(Matrix2x2 *m) { 13487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadIdentity(); 13587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 13687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 13787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_4x4_f(Matrix4x4 *m, const float *f) { 13887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(f); 13987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 14087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_3x3_f(Matrix3x3 *m, const float *f) { 14187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(f); 14287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 14387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_2x2_f(Matrix2x2 *m, const float *f) { 14487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(f); 14587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 14687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 14787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *s) { 14887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(s); 14987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 15087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_4x4_3x3(Matrix4x4 *m, const Matrix3x3 *s) { 15187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(s); 15287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 15387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_4x4_2x2(Matrix4x4 *m, const Matrix2x2 *s) { 15487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(s); 15587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 15687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *s) { 15787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(s); 15887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 15987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoad_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *s) { 16087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->load(s); 16187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 16287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 16387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadRotate(Matrix4x4 *m, float rot, float x, float y, float z) { 16487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadRotate(rot, x, y, z); 16587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 16687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadScale(Matrix4x4 *m, float x, float y, float z) { 16787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadScale(x, y, z); 16887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 16987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadTranslate(Matrix4x4 *m, float x, float y, float z) { 17087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadTranslate(x, y, z); 17187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 17287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixRotate(Matrix4x4 *m, float rot, float x, float y, float z) { 17387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->rotate(rot, x, y, z); 17487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 17587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixScale(Matrix4x4 *m, float x, float y, float z) { 17687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->scale(x, y, z); 17787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 17887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixTranslate(Matrix4x4 *m, float x, float y, float z) { 17987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->translate(x, y, z); 18087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 18187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 18287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadMultiply_4x4_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *lhs, const Matrix4x4 *rhs) { 18387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadMultiply(lhs, rhs); 18487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 18587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadMultiply_3x3_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *lhs, const Matrix3x3 *rhs) { 18687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadMultiply(lhs, rhs); 18787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 18887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadMultiply_2x2_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *lhs, const Matrix2x2 *rhs) { 18987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadMultiply(lhs, rhs); 19087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 19187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 19287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixMultiply_4x4_4x4(Matrix4x4 *m, const Matrix4x4 *rhs) { 19387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->multiply(rhs); 19487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 19587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixMultiply_3x3_3x3(Matrix3x3 *m, const Matrix3x3 *rhs) { 19687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->multiply(rhs); 19787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 19887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixMultiply_2x2_2x2(Matrix2x2 *m, const Matrix2x2 *rhs) { 19987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->multiply(rhs); 20087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 20187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 20287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadOrtho(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) { 20387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadOrtho(l, r, b, t, n, f); 20487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 20587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadFrustum(Matrix4x4 *m, float l, float r, float b, float t, float n, float f) { 20687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadFrustum(l, r, b, t, n, f); 20787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 20887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixLoadPerspective(Matrix4x4 *m, float fovy, float aspect, float near, float far) { 20987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->loadPerspective(fovy, aspect, near, far); 21087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 21187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 21287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic bool SC_MatrixInverse_4x4(Matrix4x4 *m) { 21387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return m->inverse(); 21487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 21587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic bool SC_MatrixInverseTranspose_4x4(Matrix4x4 *m) { 21687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return m->inverseTranspose(); 21787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 21887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixTranspose_4x4(Matrix4x4 *m) { 21987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->transpose(); 22087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 22187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixTranspose_3x3(Matrix3x3 *m) { 22287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->transpose(); 22387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 22487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic void SC_MatrixTranspose_2x2(Matrix2x2 *m) { 22587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams m->transpose(); 22687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 22787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 22887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_randf(float max) { 22987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r = (float)rand(); 23087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams r *= max; 231b8fa756a727b7816ed4a6c9f9dbadb548f7fa80fJason Sams r /= RAND_MAX; 232b8fa756a727b7816ed4a6c9f9dbadb548f7fa80fJason Sams return r; 23387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 23487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 23587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_randf2(float min, float max) { 23687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams float r = (float)rand(); 237b8fa756a727b7816ed4a6c9f9dbadb548f7fa80fJason Sams r /= RAND_MAX; 23887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams r = r * (max - min) + min; 239b8fa756a727b7816ed4a6c9f9dbadb548f7fa80fJason Sams return r; 24087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 24187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 24287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int SC_randi(int max) { 24387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return (int)SC_randf(max); 24487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 24587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 24687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic int SC_randi2(int min, int max) { 24787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return (int)SC_randf2(min, max); 24887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 24987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 25087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic float SC_frac(float v) { 25187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams int i = (int)floor(v); 25287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return fmin(v - i, 0x1.fffffep-1f); 25387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 25487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 25587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 256e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicCas(volatile int32_t *ptr, int32_t expectedValue, int32_t newValue) { 257e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t prev; 258e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 259e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams do { 260e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t ret = android_atomic_release_cas(expectedValue, newValue, ptr); 261e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams if (!ret) { 262e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // The android cas return 0 if it wrote the value. This means the 263e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // previous value was the expected value and we can return. 264e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return expectedValue; 265e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams } 266e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // We didn't write the value and need to load the "previous" value. 267e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams prev = *ptr; 268e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 269e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // A race condition exists where the expected value could appear after our cas failed 270e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // above. In this case loop until we have a legit previous value or the 271e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // write passes. 272e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams } while (prev == expectedValue); 273e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return prev; 274e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 275e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 276e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 277e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicInc(volatile int32_t *ptr) { 278e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return android_atomic_inc(ptr); 279e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 280e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 281e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicDec(volatile int32_t *ptr) { 282e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return android_atomic_dec(ptr); 283e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 284e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 285e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicAdd(volatile int32_t *ptr, int32_t value) { 286e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return android_atomic_add(value, ptr); 287e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 288e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 289e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicSub(volatile int32_t *ptr, int32_t value) { 290e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t prev, status; 291e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams do { 292e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams prev = *ptr; 293e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams status = android_atomic_release_cas(prev, prev - value, ptr); 29472f4f4cec34098e179ad5d257b07df3a514fcae2Glenn Kasten } while (CC_UNLIKELY(status != 0)); 295e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return prev; 296e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 297e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 298e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicAnd(volatile int32_t *ptr, int32_t value) { 299e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return android_atomic_and(value, ptr); 300e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 301e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 302e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicOr(volatile int32_t *ptr, int32_t value) { 303e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return android_atomic_or(value, ptr); 304e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 305e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 306e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicXor(volatile int32_t *ptr, int32_t value) { 307e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t prev, status; 308e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams do { 309e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams prev = *ptr; 310e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams status = android_atomic_release_cas(prev, prev ^ value, ptr); 31172f4f4cec34098e179ad5d257b07df3a514fcae2Glenn Kasten } while (CC_UNLIKELY(status != 0)); 312e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return prev; 313e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 314e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 315fa54999eb657180fe82b556c75761f37fed599dcStephen Hinesstatic uint32_t SC_AtomicUMin(volatile uint32_t *ptr, uint32_t value) { 316fa54999eb657180fe82b556c75761f37fed599dcStephen Hines uint32_t prev, status; 317fa54999eb657180fe82b556c75761f37fed599dcStephen Hines do { 318fa54999eb657180fe82b556c75761f37fed599dcStephen Hines prev = *ptr; 319fa54999eb657180fe82b556c75761f37fed599dcStephen Hines uint32_t n = rsMin(value, prev); 320fa54999eb657180fe82b556c75761f37fed599dcStephen Hines status = android_atomic_release_cas((int32_t) prev, (int32_t)n, (volatile int32_t*) ptr); 321fa54999eb657180fe82b556c75761f37fed599dcStephen Hines } while (CC_UNLIKELY(status != 0)); 322fa54999eb657180fe82b556c75761f37fed599dcStephen Hines return prev; 323fa54999eb657180fe82b556c75761f37fed599dcStephen Hines} 324fa54999eb657180fe82b556c75761f37fed599dcStephen Hines 325e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicMin(volatile int32_t *ptr, int32_t value) { 326e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t prev, status; 327e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams do { 328e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams prev = *ptr; 329e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t n = rsMin(value, prev); 330e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams status = android_atomic_release_cas(prev, n, ptr); 33172f4f4cec34098e179ad5d257b07df3a514fcae2Glenn Kasten } while (CC_UNLIKELY(status != 0)); 332e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return prev; 333e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 334e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 335fa54999eb657180fe82b556c75761f37fed599dcStephen Hinesstatic uint32_t SC_AtomicUMax(volatile uint32_t *ptr, uint32_t value) { 336fa54999eb657180fe82b556c75761f37fed599dcStephen Hines uint32_t prev, status; 337fa54999eb657180fe82b556c75761f37fed599dcStephen Hines do { 338fa54999eb657180fe82b556c75761f37fed599dcStephen Hines prev = *ptr; 339fa54999eb657180fe82b556c75761f37fed599dcStephen Hines uint32_t n = rsMax(value, prev); 340fa54999eb657180fe82b556c75761f37fed599dcStephen Hines status = android_atomic_release_cas((int32_t) prev, (int32_t) n, (volatile int32_t*) ptr); 341fa54999eb657180fe82b556c75761f37fed599dcStephen Hines } while (CC_UNLIKELY(status != 0)); 342fa54999eb657180fe82b556c75761f37fed599dcStephen Hines return prev; 343fa54999eb657180fe82b556c75761f37fed599dcStephen Hines} 344fa54999eb657180fe82b556c75761f37fed599dcStephen Hines 345e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsstatic int32_t SC_AtomicMax(volatile int32_t *ptr, int32_t value) { 346e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t prev, status; 347e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams do { 348e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams prev = *ptr; 349e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams int32_t n = rsMax(value, prev); 350e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams status = android_atomic_release_cas(prev, n, ptr); 35172f4f4cec34098e179ad5d257b07df3a514fcae2Glenn Kasten } while (CC_UNLIKELY(status != 0)); 352e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams return prev; 353e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams} 354e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 355e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 356e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 35787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams////////////////////////////////////////////////////////////////////////////// 35887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// Class implementation 35987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams////////////////////////////////////////////////////////////////////////////// 36087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 36187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// llvm name mangling ref 36287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// <builtin-type> ::= v # void 36387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= b # bool 36487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= c # char 36587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= a # signed char 36687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= h # unsigned char 36787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= s # short 36887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= t # unsigned short 36987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= i # int 37087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= j # unsigned int 37187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= l # long 37287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= m # unsigned long 37387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= x # long long, __int64 37487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= y # unsigned long long, __int64 37587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= f # float 37687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams// ::= d # double 37787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 37887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsstatic RsdSymbolTable gSyms[] = { 37987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4acosf", (void *)&acosf, true }, 38087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5acoshf", (void *)&acoshf, true }, 38187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4asinf", (void *)&asinf, true }, 38287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5asinhf", (void *)&asinhf, true }, 38387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4atanf", (void *)&atanf, true }, 38487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5atan2ff", (void *)&atan2f, true }, 38587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5atanhf", (void *)&atanhf, true }, 38687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4cbrtf", (void *)&cbrtf, true }, 38787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4ceilf", (void *)&ceilf, true }, 38887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z8copysignff", (void *)©signf, true }, 38987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3cosf", (void *)&cosf, true }, 39087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4coshf", (void *)&coshf, true }, 39187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4erfcf", (void *)&erfcf, true }, 39287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3erff", (void *)&erff, true }, 39387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3expf", (void *)&expf, true }, 39487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4exp2f", (void *)&exp2f, true }, 39587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5exp10f", (void *)&SC_exp10, true }, 39687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5expm1f", (void *)&expm1f, true }, 39787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4fabsf", (void *)&fabsf, true }, 39887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4fdimff", (void *)&fdimf, true }, 39987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5floorf", (void *)&floorf, true }, 40087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3fmafff", (void *)&fmaf, true }, 40187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4fmaxff", (void *)&fmaxf, true }, 40287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4fminff", (void *)&fminf, true }, // float fmin(float, float) 40387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4fmodff", (void *)&fmodf, true }, 40487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5fractfPf", (void *)&SC_fract, true }, 40587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5frexpfPi", (void *)&frexpf, true }, 40687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5hypotff", (void *)&hypotf, true }, 40787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5ilogbf", (void *)&ilogbf, true }, 40887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5ldexpfi", (void *)&ldexpf, true }, 40987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6lgammaf", (void *)&lgammaf, true }, 41087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6lgammafPi", (void *)&lgammaf_r, true }, 41187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3logf", (void *)&logf, true }, 41287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4log2f", (void *)&SC_log2, true }, 41387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5log10f", (void *)&log10f, true }, 41487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5log1pf", (void *)&log1pf, true }, 41587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4logbf", (void *)&logbf, true }, 41687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4modffPf", (void *)&modff, true }, 41787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams //{ "_Z3nanj", (void *)&SC_nan, true }, 41887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z9nextafterff", (void *)&nextafterf, true }, 41987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3powff", (void *)&powf, true }, 42087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z9remainderff", (void *)&remainderf, true }, 42187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6remquoffPi", (void *)&remquof, true }, 42287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4rintf", (void *)&rintf, true }, 42387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5rootnfi", (void *)&SC_rootn, true }, 42487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5roundf", (void *)&roundf, true }, 42587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5rsqrtf", (void *)&SC_rsqrt, true }, 42687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3sinf", (void *)&sinf, true }, 42787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6sincosfPf", (void *)&SC_sincos, true }, 42887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4sinhf", (void *)&sinhf, true }, 42987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4sqrtf", (void *)&sqrtf, true }, 43087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3tanf", (void *)&tanf, true }, 43187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4tanhf", (void *)&tanhf, true }, 43287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6tgammaf", (void *)&tgammaf, true }, 43387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5truncf", (void *)&truncf, true }, 43487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 43587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3absi", (void *)&SC_abs_i32, true }, 43687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3abss", (void *)&SC_abs_i16, true }, 43787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3absc", (void *)&SC_abs_i8, true }, 43887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3clzj", (void *)&SC_clz_u32, true }, 43987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3clzt", (void *)&SC_clz_u16, true }, 44087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3clzh", (void *)&SC_clz_u8, true }, 44187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3clzi", (void *)&SC_clz_i32, true }, 44287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3clzs", (void *)&SC_clz_i16, true }, 44387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3clzc", (void *)&SC_clz_i8, true }, 44487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxjj", (void *)&SC_max_u32, true }, 44587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxtt", (void *)&SC_max_u16, true }, 44687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxhh", (void *)&SC_max_u8, true }, 44787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxii", (void *)&SC_max_i32, true }, 44887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxss", (void *)&SC_max_i16, true }, 44987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxcc", (void *)&SC_max_i8, true }, 45087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3minjj", (void *)&SC_min_u32, true }, 45187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3mintt", (void *)&SC_min_u16, true }, 45287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3minhh", (void *)&SC_min_u8, true }, 45387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3minii", (void *)&SC_min_i32, true }, 45487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3minss", (void *)&SC_min_i16, true }, 45587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3mincc", (void *)&SC_min_i8, true }, 45687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 45787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z5clampfff", (void *)&SC_clamp_f32, true }, 45887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3maxff", (void *)&SC_max_f32, true }, 45987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z3minff", (void *)&SC_min_f32, true }, 46087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4stepff", (void *)&SC_step_f32, true }, 46187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams //{ "smoothstep", (void *)&, true }, 46287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z4signf", (void *)&SC_sign_f32, true }, 46387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 46487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams // matrix 46587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z20rsMatrixLoadIdentityP12rs_matrix4x4", (void *)&SC_MatrixLoadIdentity_4x4, true }, 46687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z20rsMatrixLoadIdentityP12rs_matrix3x3", (void *)&SC_MatrixLoadIdentity_3x3, true }, 46787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z20rsMatrixLoadIdentityP12rs_matrix2x2", (void *)&SC_MatrixLoadIdentity_2x2, true }, 46887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 46987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix4x4PKf", (void *)&SC_MatrixLoad_4x4_f, true }, 47087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix3x3PKf", (void *)&SC_MatrixLoad_3x3_f, true }, 47187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix2x2PKf", (void *)&SC_MatrixLoad_2x2_f, true }, 47287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 47387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix4x4PKS_", (void *)&SC_MatrixLoad_4x4_4x4, true }, 47487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix3x3", (void *)&SC_MatrixLoad_4x4_3x3, true }, 47587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix4x4PK12rs_matrix2x2", (void *)&SC_MatrixLoad_4x4_2x2, true }, 47687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix3x3PKS_", (void *)&SC_MatrixLoad_3x3_3x3, true }, 47787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z12rsMatrixLoadP12rs_matrix2x2PKS_", (void *)&SC_MatrixLoad_2x2_2x2, true }, 47887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 47987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z18rsMatrixLoadRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadRotate, true }, 48087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z17rsMatrixLoadScaleP12rs_matrix4x4fff", (void *)&SC_MatrixLoadScale, true }, 48187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z21rsMatrixLoadTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixLoadTranslate, true }, 48287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z14rsMatrixRotateP12rs_matrix4x4ffff", (void *)&SC_MatrixRotate, true }, 48387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z13rsMatrixScaleP12rs_matrix4x4fff", (void *)&SC_MatrixScale, true }, 48487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z17rsMatrixTranslateP12rs_matrix4x4fff", (void *)&SC_MatrixTranslate, true }, 48587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 48687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z20rsMatrixLoadMultiplyP12rs_matrix4x4PKS_S2_", (void *)&SC_MatrixLoadMultiply_4x4_4x4_4x4, true }, 48787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z16rsMatrixMultiplyP12rs_matrix4x4PKS_", (void *)&SC_MatrixMultiply_4x4_4x4, true }, 48887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z20rsMatrixLoadMultiplyP12rs_matrix3x3PKS_S2_", (void *)&SC_MatrixLoadMultiply_3x3_3x3_3x3, true }, 48987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z16rsMatrixMultiplyP12rs_matrix3x3PKS_", (void *)&SC_MatrixMultiply_3x3_3x3, true }, 49087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z20rsMatrixLoadMultiplyP12rs_matrix2x2PKS_S2_", (void *)&SC_MatrixLoadMultiply_2x2_2x2_2x2, true }, 49187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z16rsMatrixMultiplyP12rs_matrix2x2PKS_", (void *)&SC_MatrixMultiply_2x2_2x2, true }, 49287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 49387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z17rsMatrixLoadOrthoP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadOrtho, true }, 49487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z19rsMatrixLoadFrustumP12rs_matrix4x4ffffff", (void *)&SC_MatrixLoadFrustum, true }, 49587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z23rsMatrixLoadPerspectiveP12rs_matrix4x4ffff", (void *)&SC_MatrixLoadPerspective, true }, 49687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 49787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z15rsMatrixInverseP12rs_matrix4x4", (void *)&SC_MatrixInverse_4x4, true }, 49887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z24rsMatrixInverseTransposeP12rs_matrix4x4", (void *)&SC_MatrixInverseTranspose_4x4, true }, 49987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z17rsMatrixTransposeP12rs_matrix4x4", (void *)&SC_MatrixTranspose_4x4, true }, 500c84b56e55737376b43a00531bffacae7d4716a31yuyan { "_Z17rsMatrixTransposeP12rs_matrix3x3", (void *)&SC_MatrixTranspose_3x3, true }, 501c84b56e55737376b43a00531bffacae7d4716a31yuyan { "_Z17rsMatrixTransposeP12rs_matrix2x2", (void *)&SC_MatrixTranspose_2x2, true }, 50287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 50387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams // RS Math 50487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6rsRandi", (void *)&SC_randi, true }, 50587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6rsRandii", (void *)&SC_randi2, true }, 50687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6rsRandf", (void *)&SC_randf, true }, 50787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6rsRandff", (void *)&SC_randf2, true }, 50887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { "_Z6rsFracf", (void *)&SC_frac, true }, 50987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 510e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams // Atomics 511e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicIncPVi", (void *)&SC_AtomicInc, true }, 512e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicIncPVj", (void *)&SC_AtomicInc, true }, 513e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicDecPVi", (void *)&SC_AtomicDec, true }, 514e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicDecPVj", (void *)&SC_AtomicDec, true }, 515e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicAddPVii", (void *)&SC_AtomicAdd, true }, 516e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicAddPVjj", (void *)&SC_AtomicAdd, true }, 517e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicSubPVii", (void *)&SC_AtomicSub, true }, 518e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicSubPVjj", (void *)&SC_AtomicSub, true }, 519e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicAndPVii", (void *)&SC_AtomicAnd, true }, 520e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicAndPVjj", (void *)&SC_AtomicAnd, true }, 521e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z10rsAtomicOrPVii", (void *)&SC_AtomicOr, true }, 522e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z10rsAtomicOrPVjj", (void *)&SC_AtomicOr, true }, 523e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicXorPVii", (void *)&SC_AtomicXor, true }, 524e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicXorPVjj", (void *)&SC_AtomicXor, true }, 525e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicMinPVii", (void *)&SC_AtomicMin, true }, 526fa54999eb657180fe82b556c75761f37fed599dcStephen Hines { "_Z11rsAtomicMinPVjj", (void *)&SC_AtomicUMin, true }, 527e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicMaxPVii", (void *)&SC_AtomicMax, true }, 528fa54999eb657180fe82b556c75761f37fed599dcStephen Hines { "_Z11rsAtomicMaxPVjj", (void *)&SC_AtomicUMax, true }, 529e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicCasPViii", (void *)&SC_AtomicCas, true }, 530e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams { "_Z11rsAtomicCasPVjjj", (void *)&SC_AtomicCas, true }, 531e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams 53287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams { NULL, NULL, false } 53387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams}; 53487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 53587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Samsconst RsdSymbolTable * rsdLookupSymbolMath(const char *sym) { 53687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams const RsdSymbolTable *syms = gSyms; 53787fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 53887fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams while (syms->mPtr) { 53987fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams if (!strcmp(syms->mName, sym)) { 54087fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return syms; 54187fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams } 54287fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams syms++; 54387fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams } 54487fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams return NULL; 54587fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams} 54687fe59a2f4d4c74539bfa0bff5f9a7e320e99415Jason Sams 547