105f25d2a959ad25f3bcad0e0ccbcad92011bf925Stephen Hines#include "rs_core.rsh"
25681ee64c240eb79bc5a80ab5faf831d91e1f2e6Alex Sakhartchouk#include "rs_graphics.rsh"
3d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines/*****************************************************************************
4d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * CAUTION
5d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines *
6d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * The following structure layout provides a more efficient way to access
7d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * internal members of the C++ class Allocation owned by librs. Unfortunately,
8d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * since this class has virtual members, we can't simply use offsetof() or any
9d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * other compiler trickery to dynamically get the appropriate values at
10d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * build-time. This layout may need to be updated whenever
11d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * frameworks/base/libs/rs/rsAllocation.h is modified.
12d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines *
13d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * Having the layout information available in this file allows us to
14d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * accelerate functionality like rsAllocationGetDimX(). Without this
15d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * information, we would not be able to inline the bitcode, thus resulting in
16d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * potential runtime performance penalties for tight loops operating on
17d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines * allocations.
18d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines *
19d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines *****************************************************************************/
20d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinestypedef struct Allocation {
21d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    char __pad[44];
225681ee64c240eb79bc5a80ab5faf831d91e1f2e6Alex Sakhartchouk    struct {
235681ee64c240eb79bc5a80ab5faf831d91e1f2e6Alex Sakhartchouk        struct {
24d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            uint32_t dimensionX;
25d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            uint32_t dimensionY;
26d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            uint32_t dimensionZ;
27d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            uint32_t elementSizeBytes;
28d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            bool hasMipmaps;
29d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            bool hasFaces;
30d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            bool hasReferences;
31d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        } state;
32d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
33d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        struct DrvState {
34d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines            void * mallocPtr;
35d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        } drvState;
36d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    } mHal;
37d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines} Allocation_t;
38d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
3950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao/* Declaration of 4 basic functions in libRS */
4050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable))
4150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    rsDebug(const char *, float, float);
4250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable))
4350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    rsDebug(const char *, float, float, float);
4450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable))
4550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    rsDebug(const char *, float, float, float, float);
46f9728b9705e0cff1ee7151daeb21944320b438daShih-wei Liaoextern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
47f9728b9705e0cff1ee7151daeb21944320b438daShih-wei Liao
4850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao/* Implementation of Core Runtime */
4950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
5050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable)) rsDebug(const char *s, float2 v) {
5150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    rsDebug(s, v.x, v.y);
5250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
5350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
5450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable)) rsDebug(const char *s, float3 v) {
5550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    rsDebug(s, v.x, v.y, v.z);
5650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
5750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
5850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable)) rsDebug(const char *s, float4 v) {
5950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    rsDebug(s, v.x, v.y, v.z, v.w);
6050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
6150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
6250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b)
6350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao{
6450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    uchar4 c;
659d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.x = (uchar)(r * 255.f + 0.5f);
669d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.y = (uchar)(g * 255.f + 0.5f);
679d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.z = (uchar)(b * 255.f + 0.5f);
6850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    c.w = 255;
6950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return c;
7050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
7150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
7250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a)
7350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao{
7450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    uchar4 c;
759d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.x = (uchar)(r * 255.f + 0.5f);
769d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.y = (uchar)(g * 255.f + 0.5f);
779d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.z = (uchar)(b * 255.f + 0.5f);
789d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    c.w = (uchar)(a * 255.f + 0.5f);
7950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return c;
8050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
8150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
8250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color)
8350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao{
8450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    color *= 255.f;
859d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    color += 0.5f;
8650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    uchar4 c = {color.x, color.y, color.z, 255};
8750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return c;
8850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
8950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
9050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color)
9150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao{
9250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    color *= 255.f;
939d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    color += 0.5f;
9450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    uchar4 c = {color.x, color.y, color.z, color.w};
9550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return c;
9650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
9750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
9850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float4 rsUnpackColor8888(uchar4 c)
9950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao{
1009d3f8a71dd04d606d7f677ec9512d00f374f1e7aJason Sams    float4 ret = (float4)0.003921569f;
10150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret *= convert_float4(c);
10250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
10350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
10450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
10550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao/////////////////////////////////////////////////////
10650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao// Matrix ops
10750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao/////////////////////////////////////////////////////
10850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
10950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable))
11050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei LiaorsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v) {
11150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    m->m[row * 4 + col] = v;
11250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
11350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
11450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float __attribute__((overloadable))
11550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei LiaorsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col) {
11650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return m->m[row * 4 + col];
11750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
11850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
11950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable))
12050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei LiaorsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v) {
12150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    m->m[row * 3 + col] = v;
12250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
12350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
12450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float __attribute__((overloadable))
12550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei LiaorsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col) {
12650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return m->m[row * 3 + col];
12750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
12850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
12950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern void __attribute__((overloadable))
13050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei LiaorsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v) {
13150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    m->m[row * 2 + col] = v;
13250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
13350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
13450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float __attribute__((overloadable))
13550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei LiaorsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col) {
13650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return m->m[row * 2 + col];
13750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
13850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
13950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
14050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float4 __attribute__((overloadable))
141f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float4 in) {
14250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    float4 ret;
14350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + (m->m[12] * in.w);
14450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + (m->m[13] * in.w);
14550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + (m->m[14] * in.w);
14650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + (m->m[15] * in.w);
14750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
14850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
149f9931b82453072d66b04b94bf30544df8f447eecJason Samsextern float4 __attribute__((overloadable))
150f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(rs_matrix4x4 *m, float4 in) {
151f9931b82453072d66b04b94bf30544df8f447eecJason Sams    return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
152f9931b82453072d66b04b94bf30544df8f447eecJason Sams}
15350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
15450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float4 __attribute__((overloadable))
155f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float3 in) {
15650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    float4 ret;
15750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12];
15850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13];
15950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14];
16050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15];
16150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
16250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
163f9931b82453072d66b04b94bf30544df8f447eecJason Samsextern float4 __attribute__((overloadable))
164f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(rs_matrix4x4 *m, float3 in) {
165f9931b82453072d66b04b94bf30544df8f447eecJason Sams    return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
166f9931b82453072d66b04b94bf30544df8f447eecJason Sams}
16750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
16850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float4 __attribute__((overloadable))
169f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float2 in) {
17050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    float4 ret;
17150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + m->m[12];
17250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + m->m[13];
17350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + m->m[14];
17450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + m->m[15];
17550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
17650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
177f9931b82453072d66b04b94bf30544df8f447eecJason Samsextern float4 __attribute__((overloadable))
178f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(rs_matrix4x4 *m, float2 in) {
179f9931b82453072d66b04b94bf30544df8f447eecJason Sams    return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
180f9931b82453072d66b04b94bf30544df8f447eecJason Sams}
18150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
18250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float3 __attribute__((overloadable))
183f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float3 in) {
18450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    float3 ret;
18550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.x = (m->m[0] * in.x) + (m->m[3] * in.y) + (m->m[6] * in.z);
18650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.y = (m->m[1] * in.x) + (m->m[4] * in.y) + (m->m[7] * in.z);
18750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.z = (m->m[2] * in.x) + (m->m[5] * in.y) + (m->m[8] * in.z);
18850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
18950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
190f9931b82453072d66b04b94bf30544df8f447eecJason Samsextern float3 __attribute__((overloadable))
191f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(rs_matrix3x3 *m, float3 in) {
192f9931b82453072d66b04b94bf30544df8f447eecJason Sams    return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
193f9931b82453072d66b04b94bf30544df8f447eecJason Sams}
194f9931b82453072d66b04b94bf30544df8f447eecJason Sams
19550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
19650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float3 __attribute__((overloadable))
197f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float2 in) {
19850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    float3 ret;
19950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.x = (m->m[0] * in.x) + (m->m[3] * in.y);
20050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.y = (m->m[1] * in.x) + (m->m[4] * in.y);
20150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.z = (m->m[2] * in.x) + (m->m[5] * in.y);
20250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
20350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
204f9931b82453072d66b04b94bf30544df8f447eecJason Samsextern float3 __attribute__((overloadable))
205f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(rs_matrix3x3 *m, float2 in) {
206f9931b82453072d66b04b94bf30544df8f447eecJason Sams    return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
207f9931b82453072d66b04b94bf30544df8f447eecJason Sams}
20850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
20950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern float2 __attribute__((overloadable))
210f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(const rs_matrix2x2 *m, float2 in) {
21150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    float2 ret;
21250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.x = (m->m[0] * in.x) + (m->m[2] * in.y);
21350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    ret.y = (m->m[1] * in.x) + (m->m[3] * in.y);
21450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return ret;
21550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
216f9931b82453072d66b04b94bf30544df8f447eecJason Samsextern float2 __attribute__((overloadable))
217f9931b82453072d66b04b94bf30544df8f447eecJason SamsrsMatrixMultiply(rs_matrix2x2 *m, float2 in) {
218f9931b82453072d66b04b94bf30544df8f447eecJason Sams    return rsMatrixMultiply((const rs_matrix2x2 *)m, in);
219f9931b82453072d66b04b94bf30544df8f447eecJason Sams}
22050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
22150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao/////////////////////////////////////////////////////
22250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao// int ops
22350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao/////////////////////////////////////////////////////
22450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao
22550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high) {
22650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return amount < low ? low : (amount > high ? high : amount);
22750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
22850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high) {
22950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return amount < low ? low : (amount > high ? high : amount);
23050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
23150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high) {
23250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return amount < low ? low : (amount > high ? high : amount);
23350cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
23450cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high) {
23550cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return amount < low ? low : (amount > high ? high : amount);
23650cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
23750cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high) {
23850cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return amount < low ? low : (amount > high ? high : amount);
23950cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
24050cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liaoextern char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high) {
24150cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao    return amount < low ? low : (amount > high ? high : amount);
24250cdf8f0f96362b03fc0476381bd853298c94439Shih-wei Liao}
243d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
244d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines// Opaque Allocation type operations
245d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern uint32_t __attribute__((overloadable))
246d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    rsAllocationGetDimX(rs_allocation a) {
247d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
248d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return alloc->mHal.state.dimensionX;
249d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
250d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
251d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern uint32_t __attribute__((overloadable))
252d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsAllocationGetDimY(rs_allocation a) {
253d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
254d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return alloc->mHal.state.dimensionY;
255d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
256d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
257d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern uint32_t __attribute__((overloadable))
258d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsAllocationGetDimZ(rs_allocation a) {
259d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
260d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return alloc->mHal.state.dimensionZ;
261d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
262d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
263d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern uint32_t __attribute__((overloadable))
264d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsAllocationGetDimLOD(rs_allocation a) {
265d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
266d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return alloc->mHal.state.hasMipmaps;
267d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
268d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
269d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern uint32_t __attribute__((overloadable))
270d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsAllocationGetDimFaces(rs_allocation a) {
271d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
272d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return alloc->mHal.state.hasFaces;
273d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
274d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
275d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern const void * __attribute__((overloadable))
276d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x) {
277d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
278d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.mallocPtr;
279d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
280d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return &p[eSize * x];
281d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
282d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
283d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern const void * __attribute__((overloadable))
284d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y) {
285d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
286d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.mallocPtr;
287d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
288d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint32_t dimX = alloc->mHal.state.dimensionX;
289d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return &p[eSize * (x + y * dimX)];
290d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
291d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines
292d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hinesextern const void * __attribute__((overloadable))
293d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines        rsGetElementAt(rs_allocation a, uint32_t x, uint32_t y, uint32_t z) {
294d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    Allocation_t *alloc = (Allocation_t *)a.p;
295d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint8_t *p = (const uint8_t *)alloc->mHal.drvState.mallocPtr;
296d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint32_t eSize = alloc->mHal.state.elementSizeBytes;
297d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint32_t dimX = alloc->mHal.state.dimensionX;
298d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    const uint32_t dimY = alloc->mHal.state.dimensionY;
299d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines    return &p[eSize * (x + y * dimX + z * dimX * dimY)];
300d4740c5d3539b57ef172d83dece278363cb9f3b1Stephen Hines}
301