blob: aaf13368f4a983946e827da864131a0de9cda8f7 [file] [log] [blame]
Stephen Hines05f25d22011-08-09 14:21:04 -07001#include "rs_core.rsh"
Alex Sakhartchouk5681ee62011-10-15 09:55:24 -07002#include "rs_graphics.rsh"
Alex Sakhartchoukff522552012-03-21 10:52:59 -07003#include "rs_structs.h"
Alex Sakhartchoukaa08fd62011-11-17 16:01:24 -08004
Stephen Hinescfee7e92012-05-14 18:02:57 -07005/* Function declarations from libRS */
Shih-wei Liaof9728b92011-01-17 18:04:33 -08006extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
7
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -08008/* Implementation of Core Runtime */
9
Jason Samsf7ab3772012-02-29 15:59:43 -080010/*
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080011extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b)
12{
13 uchar4 c;
Jason Sams9d3f8a72011-10-13 17:20:04 -070014 c.x = (uchar)(r * 255.f + 0.5f);
15 c.y = (uchar)(g * 255.f + 0.5f);
16 c.z = (uchar)(b * 255.f + 0.5f);
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080017 c.w = 255;
18 return c;
19}
20
21extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a)
22{
23 uchar4 c;
Jason Sams9d3f8a72011-10-13 17:20:04 -070024 c.x = (uchar)(r * 255.f + 0.5f);
25 c.y = (uchar)(g * 255.f + 0.5f);
26 c.z = (uchar)(b * 255.f + 0.5f);
27 c.w = (uchar)(a * 255.f + 0.5f);
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080028 return c;
29}
30
31extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color)
32{
33 color *= 255.f;
Jason Sams9d3f8a72011-10-13 17:20:04 -070034 color += 0.5f;
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080035 uchar4 c = {color.x, color.y, color.z, 255};
36 return c;
37}
38
39extern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color)
40{
41 color *= 255.f;
Jason Sams9d3f8a72011-10-13 17:20:04 -070042 color += 0.5f;
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080043 uchar4 c = {color.x, color.y, color.z, color.w};
44 return c;
45}
Jason Samsf7ab3772012-02-29 15:59:43 -080046*/
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080047
48extern float4 rsUnpackColor8888(uchar4 c)
49{
Jason Sams9d3f8a72011-10-13 17:20:04 -070050 float4 ret = (float4)0.003921569f;
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080051 ret *= convert_float4(c);
52 return ret;
53}
54
55/////////////////////////////////////////////////////
56// Matrix ops
57/////////////////////////////////////////////////////
58
59extern void __attribute__((overloadable))
60rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v) {
61 m->m[row * 4 + col] = v;
62}
63
64extern float __attribute__((overloadable))
65rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col) {
66 return m->m[row * 4 + col];
67}
68
69extern void __attribute__((overloadable))
70rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v) {
71 m->m[row * 3 + col] = v;
72}
73
74extern float __attribute__((overloadable))
75rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col) {
76 return m->m[row * 3 + col];
77}
78
79extern void __attribute__((overloadable))
80rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v) {
81 m->m[row * 2 + col] = v;
82}
83
84extern float __attribute__((overloadable))
85rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col) {
86 return m->m[row * 2 + col];
87}
88
Jason Sams5bc951c2012-02-27 19:32:15 -080089/*
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080090extern float4 __attribute__((overloadable))
Jason Samsf9931b82011-07-26 17:28:38 -070091rsMatrixMultiply(const rs_matrix4x4 *m, float4 in) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -080092 float4 ret;
93 ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + (m->m[12] * in.w);
94 ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + (m->m[13] * in.w);
95 ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + (m->m[14] * in.w);
96 ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + (m->m[15] * in.w);
97 return ret;
98}
Jason Samsf9931b82011-07-26 17:28:38 -070099extern float4 __attribute__((overloadable))
100rsMatrixMultiply(rs_matrix4x4 *m, float4 in) {
101 return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
102}
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800103
104extern float4 __attribute__((overloadable))
Jason Samsf9931b82011-07-26 17:28:38 -0700105rsMatrixMultiply(const rs_matrix4x4 *m, float3 in) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800106 float4 ret;
107 ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12];
108 ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13];
109 ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14];
110 ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15];
111 return ret;
112}
Jason Samsf9931b82011-07-26 17:28:38 -0700113extern float4 __attribute__((overloadable))
114rsMatrixMultiply(rs_matrix4x4 *m, float3 in) {
115 return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
116}
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800117
118extern float4 __attribute__((overloadable))
Jason Samsf9931b82011-07-26 17:28:38 -0700119rsMatrixMultiply(const rs_matrix4x4 *m, float2 in) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800120 float4 ret;
121 ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + m->m[12];
122 ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + m->m[13];
123 ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + m->m[14];
124 ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + m->m[15];
125 return ret;
126}
Jason Samsf9931b82011-07-26 17:28:38 -0700127extern float4 __attribute__((overloadable))
128rsMatrixMultiply(rs_matrix4x4 *m, float2 in) {
129 return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
130}
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800131
132extern float3 __attribute__((overloadable))
Jason Samsf9931b82011-07-26 17:28:38 -0700133rsMatrixMultiply(const rs_matrix3x3 *m, float3 in) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800134 float3 ret;
135 ret.x = (m->m[0] * in.x) + (m->m[3] * in.y) + (m->m[6] * in.z);
136 ret.y = (m->m[1] * in.x) + (m->m[4] * in.y) + (m->m[7] * in.z);
137 ret.z = (m->m[2] * in.x) + (m->m[5] * in.y) + (m->m[8] * in.z);
138 return ret;
139}
Jason Samsf9931b82011-07-26 17:28:38 -0700140extern float3 __attribute__((overloadable))
141rsMatrixMultiply(rs_matrix3x3 *m, float3 in) {
142 return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
143}
144
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800145extern float3 __attribute__((overloadable))
Jason Samsf9931b82011-07-26 17:28:38 -0700146rsMatrixMultiply(const rs_matrix3x3 *m, float2 in) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800147 float3 ret;
148 ret.x = (m->m[0] * in.x) + (m->m[3] * in.y);
149 ret.y = (m->m[1] * in.x) + (m->m[4] * in.y);
150 ret.z = (m->m[2] * in.x) + (m->m[5] * in.y);
151 return ret;
152}
Jason Samsf9931b82011-07-26 17:28:38 -0700153extern float3 __attribute__((overloadable))
154rsMatrixMultiply(rs_matrix3x3 *m, float2 in) {
155 return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
156}
Jason Sams5bc951c2012-02-27 19:32:15 -0800157*/
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800158
159extern float2 __attribute__((overloadable))
Jason Samsf9931b82011-07-26 17:28:38 -0700160rsMatrixMultiply(const rs_matrix2x2 *m, float2 in) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800161 float2 ret;
162 ret.x = (m->m[0] * in.x) + (m->m[2] * in.y);
163 ret.y = (m->m[1] * in.x) + (m->m[3] * in.y);
164 return ret;
165}
Jason Samsf9931b82011-07-26 17:28:38 -0700166extern float2 __attribute__((overloadable))
167rsMatrixMultiply(rs_matrix2x2 *m, float2 in) {
168 return rsMatrixMultiply((const rs_matrix2x2 *)m, in);
169}
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800170
171/////////////////////////////////////////////////////
172// int ops
173/////////////////////////////////////////////////////
174
Jason Sams17930e12012-04-10 17:21:34 -0700175extern uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high) {
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800176 return amount < low ? low : (amount > high ? high : amount);
Jason Sams17930e12012-04-10 17:21:34 -0700177}
Shih-wei Liao50cdf8f2011-01-26 14:10:25 -0800178extern int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high) {
179 return amount < low ? low : (amount > high ? high : amount);
180}
181extern ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high) {
182 return amount < low ? low : (amount > high ? high : amount);
183}
184extern short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high) {
185 return amount < low ? low : (amount > high ? high : amount);
186}
187extern uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high) {
188 return amount < low ? low : (amount > high ? high : amount);
189}
190extern char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high) {
191 return amount < low ? low : (amount > high ? high : amount);
192}