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