rs_math.rsh revision 9df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0
19df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/** @file rs_math.rsh
29df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *  \brief todo-jsams
39df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
49df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *  todo-jsams
59df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
69df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
7c4cdf4586a0210a0e4b7b9bf38e8973b31d17ea1Jason Sams#ifndef __RS_MATH_RSH__
8c4cdf4586a0210a0e4b7b9bf38e8973b31d17ea1Jason Sams#define __RS_MATH_RSH__
9c4cdf4586a0210a0e4b7b9bf38e8973b31d17ea1Jason Sams
109df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
119df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
1209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
139df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
15c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
16c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_element *dst, rs_element src);
179df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
189df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
199df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
20c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
21c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_type *dst, rs_type src);
229df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
239df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
249df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
25c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
26c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_allocation *dst, rs_allocation src);
279df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
289df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
299df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
30c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
31c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_sampler *dst, rs_sampler src);
329df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
339df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
349df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
35c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
36c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_script *dst, rs_script src);
379df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
389df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
399df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
40c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
41c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_mesh *dst, rs_mesh src);
429df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
439df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Copy reference to the specified object.
449df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
459df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param dst
469df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param src
479df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
48c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
49c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_program_fragment *dst, rs_program_fragment src);
509df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
519df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
529df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
53c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
54c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_program_vertex *dst, rs_program_vertex src);
559df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
569df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
579df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
58c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
59c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_program_raster *dst, rs_program_raster src);
609df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
619df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
629df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
63c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
64c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_program_store *dst, rs_program_store src);
659df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
669df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
679df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
68c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
69c093685672e54657d87b953d44e514803889486cJason Sams    rsSetObject(rs_font *dst, rs_font src);
70c093685672e54657d87b953d44e514803889486cJason Sams
7109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
7209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Sets the object to NULL.
7309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
7409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return bool
7509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
76c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
77c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_element *dst);
789df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
799df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
809df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
81c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
82c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_type *dst);
839df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
849df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
859df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
86c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
87c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_allocation *dst);
889df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
899df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
909df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
91c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
92c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_sampler *dst);
939df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
949df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
959df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
96c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
97c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_script *dst);
989df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
999df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1009df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
101c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
102c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_mesh *dst);
1039df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1049df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1059df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
106c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
107c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_program_fragment *dst);
1089df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1099df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1109df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
111c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
112c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_program_vertex *dst);
1139df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1149df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1159df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
116c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
117c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_program_raster *dst);
1189df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1199df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1209df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
121c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
122c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_program_store *dst);
1239df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1249df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1259df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
126c093685672e54657d87b953d44e514803889486cJason Samsextern void __attribute__((overloadable))
127c093685672e54657d87b953d44e514803889486cJason Sams    rsClearObject(rs_font *dst);
128c093685672e54657d87b953d44e514803889486cJason Sams
12909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
1309df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
13109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
132c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
133c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_element);
1349df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1359df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1369df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
137c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
138c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_type);
1399df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1409df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1419df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
142c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
143c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_allocation);
1449df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1459df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Tests if the object is valid.  Returns true if the object is valid, false if
1469df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * it is NULL.
1479df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
1489df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @return bool
1499df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
1509df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
151c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
152c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_sampler);
1539df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1549df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1559df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
156c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
157c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_script);
1589df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1599df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1609df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
161c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
162c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_mesh);
1639df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1649df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1659df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
166c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
167c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_program_fragment);
1689df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1699df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1709df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
171c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
172c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_program_vertex);
1739df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1749df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1759df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
176c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
177c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_program_raster);
1789df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1799df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1809df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
181c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
182c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_program_store);
1839df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
1849df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
1859df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
186c093685672e54657d87b953d44e514803889486cJason Samsextern bool __attribute__((overloadable))
187c093685672e54657d87b953d44e514803889486cJason Sams    rsIsObject(rs_font);
188c093685672e54657d87b953d44e514803889486cJason Sams
189c093685672e54657d87b953d44e514803889486cJason Sams
19009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
19109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Returns the Allocation for a given pointer.  The pointer should point within
19209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * a valid allocation.  The results are undefined if the pointer is not from a
19309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * valid allocation.
19409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
195ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsextern rs_allocation __attribute__((overloadable))
196ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    rsGetAllocation(const void *);
1977349547db61d2d458b31c074b902d56d082e5d84Jason Sams
19809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
19909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Query the dimension of an allocation.
20009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
20109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uint32_t The X dimension of the allocation.
20209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
203ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsextern uint32_t __attribute__((overloadable))
204ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    rsAllocationGetDimX(rs_allocation);
20509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
20609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
20709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Query the dimension of an allocation.
20809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
20909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uint32_t The Y dimension of the allocation.
21009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
211ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsextern uint32_t __attribute__((overloadable))
212ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    rsAllocationGetDimY(rs_allocation);
21309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
21409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
21509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Query the dimension of an allocation.
21609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
21709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uint32_t The Z dimension of the allocation.
21809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
219ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsextern uint32_t __attribute__((overloadable))
220ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    rsAllocationGetDimZ(rs_allocation);
22109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
22209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
22309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Query an allocation for the presence of more than one LOD.
22409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
22509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uint32_t Returns 1 if more than one LOD is present, 0 otherwise.
22609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
227ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsextern uint32_t __attribute__((overloadable))
228ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    rsAllocationGetDimLOD(rs_allocation);
22909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
23009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
23109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Query an allocation for the presence of more than one face.
23209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
23309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uint32_t Returns 1 if more than one face is present, 0 otherwise.
23409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
235ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Samsextern uint32_t __attribute__((overloadable))
236ef5867a6785807f90cfe8af26da4b964ee8ebee4Jason Sams    rsAllocationGetDimFaces(rs_allocation);
23722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
23874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk/**
23974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * Copy part of an allocation from another allocation.
24074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *
24174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstAlloc Allocation to copy data into.
24274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstOff The offset of the first element to be copied in
24374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *               the destination allocation.
24474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstMip Mip level in the destination allocation.
24574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param count The number of elements to be copied.
24674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcAlloc The source data allocation.
24774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcOff The offset of the first element in data to be
24874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *               copied in the source allocation.
24974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcMip Mip level in the source allocation.
25074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk */
25174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukextern void __attribute__((overloadable))
25274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    rsAllocationCopy1DRange(rs_allocation dstAlloc,
25374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstOff, uint32_t dstMip,
25474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t count,
25574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            rs_allocation srcAlloc,
25674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcOff, uint32_t srcMip);
25774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
25874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk/**
25974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * Copy a rectangular region into the allocation from another
26074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * allocation.
26174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *
26274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstAlloc allocation to copy data into.
26374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstXoff X offset of the region to update in the
26474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *                destination allocation.
26574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstYoff Y offset of the region to update in the
26674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *                destination allocation.
26774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstMip Mip level in the destination allocation.
26874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param dstFace Cubemap face of the destination allocation,
26974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *                ignored for allocations that aren't cubemaps.
27074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param width Width of the incoming region to update.
27174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param height Height of the incoming region to update.
27274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcAlloc The source data allocation.
27374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcXoff X offset in data of the source allocation.
27474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcYoff Y offset in data of the source allocation.
27574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcMip Mip level in the source allocation.
27674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk * @param srcFace Cubemap face of the source allocation,
27774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk *                ignored for allocations that aren't cubemaps.
27874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk */
27974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchoukextern void __attribute__((overloadable))
28074a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk    rsAllocationCopy2DRange(rs_allocation dstAlloc,
28174a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstXoff, uint32_t dstYoff,
28274a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t dstMip,
28374a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            rs_allocation_cubemap_face dstFace,
28474a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t width, uint32_t height,
28574a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            rs_allocation srcAlloc,
28674a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcXoff, uint32_t srcYoff,
28774a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            uint32_t srcMip,
28874a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk                            rs_allocation_cubemap_face srcFace);
28974a827988567a9d65954bb0d825a3ba4a97e2947Alex Sakhartchouk
2909df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
2919df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
2929df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Extract a single element from an allocation.
2939df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
2947bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsextern const void * __attribute__((overloadable))
2957bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    rsGetElementAt(rs_allocation, uint32_t x);
2969df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
2979df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
2989df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
2997bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsextern const void * __attribute__((overloadable))
3007bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    rsGetElementAt(rs_allocation, uint32_t x, uint32_t y);
3019df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3029df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
3039df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3047bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Samsextern const void * __attribute__((overloadable))
3057bf29ddc35450d8064541c42c99a1f48be6cf0ddJason Sams    rsGetElementAt(rs_allocation, uint32_t x, uint32_t y, uint32_t z);
30622fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3079df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3089df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Return a random value between 0 (or min_value) and max_malue.
3099df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3107349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern int __attribute__((overloadable))
3117349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(int max_value);
3129df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3139df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
3149df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3157349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern int __attribute__((overloadable))
3167349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(int min_value, int max_value);
3179df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3189df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
3199df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3207349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern float __attribute__((overloadable))
3217349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(float max_value);
3229df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3239df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
3249df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3257349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern float __attribute__((overloadable))
3267349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsRand(float min_value, float max_value);
3277349547db61d2d458b31c074b902d56d082e5d84Jason Sams
3289df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3299df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Returns the fractional part of a float
3309df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3317349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern float __attribute__((overloadable))
3327349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsFrac(float);
33322fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
3349df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3359df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Send a message back to the client.  Will not block and returns true
3369df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * if the message was sendable and false if the fifo was full.
3379df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * A message ID is required.  Data payload is optional.
3389df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3397349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern bool __attribute__((overloadable))
3407349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsSendToClient(int cmdID);
3419df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3429df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
3439df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3447349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern bool __attribute__((overloadable))
3457349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsSendToClient(int cmdID, const void *data, uint len);
3469df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3479df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Send a message back to the client, blocking until the message is queued.
3489df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * A message ID is required.  Data payload is optional.
3499df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3507349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern void __attribute__((overloadable))
3517349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsSendToClientBlocking(int cmdID);
3529df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3539df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
3549df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
3557349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern void __attribute__((overloadable))
3567349547db61d2d458b31c074b902d56d082e5d84Jason Sams    rsSendToClientBlocking(int cmdID, const void *data, uint len);
35722fa371bf64b8aae786acfe5d711af21afb13a93Jason Sams
358dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams
3599df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3609df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Launch order hint for rsForEach calls.  This provides a hint to the system to
3619df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * determine in which order the root function of the target is called with each
3629df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * cell of the allocation.
3639df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
3649df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * This is a hint and implementations may not obey the order.
3659df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
366dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Samsenum rs_for_each_strategy {
367dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    RS_FOR_EACH_STRATEGY_SERIAL,
368dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    RS_FOR_EACH_STRATEGY_DONT_CARE,
369dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    RS_FOR_EACH_STRATEGY_DST_LINEAR,
370dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    RS_FOR_EACH_STRATEGY_TILE_SMALL,
371dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    RS_FOR_EACH_STRATEGY_TILE_MEDIUM,
372dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    RS_FOR_EACH_STRATEGY_TILE_LARGE
373dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams};
374dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams
3759df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams
3769df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3779df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Structure to provide extra information to a rsForEach call.  Primarly used to
3789df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * restrict the call to a subset of cells in the allocation.
3799df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
380ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Samstypedef struct rs_script_call {
381dd663fa8367bfacb6c77b368f91adf614cd0bebaJason Sams    enum rs_for_each_strategy strategy;
382479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t xStart;
383479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t xEnd;
384479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t yStart;
385479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t yEnd;
386479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t zStart;
387479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t zEnd;
388479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t arrayStart;
389479e2924807e1fff79de2e0bee2a67939d8659eeJason Sams    uint32_t arrayEnd;
390ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams} rs_script_call_t;
391ace3e01f07252ee0fa47fcf1ac48864d8220b90eJason Sams
3929df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
3939df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Make a script to script call to launch work. One of the input or output is
3949df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * required to be a valid object. The input and output must be of the same
3959df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * dimensions.
3969df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * API 10-13
3979df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
3989df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param script The target script to call
3999df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param input The allocation to source data from
4009df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param output the allocation to write date into
4019df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param usrData The user definied params to pass to the root script.  May be
4029df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *                NULL.
4039df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param sc Extra control infomation used to select a sub-region of the
4049df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *           allocation to be processed or suggest a walking strategy.  May be
4059df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *           NULL.
4069df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
4079df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *  */
408eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#if !defined(RS_VERSION) || (RS_VERSION < 14)
409eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Samsextern void __attribute__((overloadable))
4109df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams    rsForEach(rs_script script script, rs_allocation input,
411eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams              rs_allocation output, const void * usrData,
4129df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams              const rs_script_call_t *sc);
4139df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
4149df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
4159df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
416eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Samsextern void __attribute__((overloadable))
417eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams    rsForEach(rs_script script, rs_allocation input,
418eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams              rs_allocation output, const void * usrData);
419eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#else
420c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams
4219df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
4229df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * Make a script to script call to launch work. One of the input or output is
4239df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * required to be a valid object. The input and output must be of the same
4249df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * dimensions.
4259df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * API 14+
4269df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
4279df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param script The target script to call
4289df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param input The allocation to source data from
4299df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param output the allocation to write date into
4309df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param usrData The user definied params to pass to the root script.  May be
4319df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *                NULL.
4329df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param usrDataLen The size of the userData structure.  This will be used to
4339df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *                   perform a shallow copy of the data if necessary.
4349df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * @param sc Extra control infomation used to select a sub-region of the
4359df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *           allocation to be processed or suggest a walking strategy.  May be
4369df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *           NULL.
4379df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams *
4389df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
439c500e74d0848b721bf01cf0ab344a6adb035c312Jason Samsextern void __attribute__((overloadable))
440c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams    rsForEach(rs_script script, rs_allocation input, rs_allocation output,
4419df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams              const void * usrData, size_t usrDataLen, const rs_script_call_t *);
4429df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
4439df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
4449df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
4457349547db61d2d458b31c074b902d56d082e5d84Jason Samsextern void __attribute__((overloadable))
446c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams    rsForEach(rs_script script, rs_allocation input, rs_allocation output,
4479df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams              const void * usrData, size_t usrDataLen);
4489df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams/**
4499df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams * \overload
4509df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams */
4519df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Samsextern void __attribute__((overloadable))
4529df3b2b03e6bbe26d5fa7daae49b26fd9f15eaa0Jason Sams    rsForEach(rs_script script, rs_allocation input, rs_allocation output);
453c500e74d0848b721bf01cf0ab344a6adb035c312Jason Sams#endif
454c61346b91434307c5003029017b54ce9c49112beJason Sams
455e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
456e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
457e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic add one to the value at addr.
458e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Equal to rsAtomicAdd(addr, 1)
459e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
460e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to increment
461e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
462e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
463e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
464e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
465e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicInc(volatile int32_t* addr);
466e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
467e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic add one to the value at addr.
468e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Equal to rsAtomicAdd(addr, 1)
469e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
470e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to increment
471e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
472e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
473e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
474e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
475e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicInc(volatile uint32_t* addr);
476e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
477e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
478e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1)
479e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
480e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to decrement
481e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
482e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
483e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
484e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
485e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicDec(volatile int32_t* addr);
486e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
487e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic subtract one from the value at addr. Equal to rsAtomicSub(addr, 1)
488e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
489e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to decrement
490e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
491e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
492e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
493e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
494e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicDec(volatile uint32_t* addr);
495e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
496e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
497e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic add a value to the value at addr.  addr[0] += value
498e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
499e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
500e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to add to the value at addr
501e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
502e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
503e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
504e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
505e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicAdd(volatile int32_t* addr, int32_t value);
506e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
507e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic add a value to the value at addr.  addr[0] += value
508e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
509e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
510e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to add to the value at addr
511e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
512e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
513e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
514e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
515e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicAdd(volatile uint32_t* addr, uint32_t value);
516e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
517e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
518e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Subtract a value from the value at addr.  addr[0] -= value
519e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
520e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
521e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to subtract from the value at addr
522e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
523e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
524e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
525e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
526e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicSub(volatile int32_t* addr, int32_t value);
527e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
528e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Subtract a value from the value at addr.  addr[0] -= value
529e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
530e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
531e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to subtract from the value at addr
532e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
533e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
534e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
535e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
536e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicSub(volatile uint32_t* addr, uint32_t value);
537e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
538e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
539e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Bitwise and a value from the value at addr.  addr[0] &= value
540e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
541e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
542e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to and with the value at addr
543e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
544e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
545e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
546e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
547e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicAnd(volatile int32_t* addr, int32_t value);
548e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
549e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Bitwise and a value from the value at addr.  addr[0] &= value
550e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
551e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
552e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to and with the value at addr
553e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
554e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
555e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
556e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
557e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicAnd(volatile uint32_t* addr, uint32_t value);
558e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
559e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
560e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Bitwise or a value from the value at addr.  addr[0] |= value
561e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
562e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
563e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to or with the value at addr
564e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
565e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
566e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
567e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
568e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicOr(volatile int32_t* addr, int32_t value);
569e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
570e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Bitwise or a value from the value at addr.  addr[0] |= value
571e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
572e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
573e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to or with the value at addr
574e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
575e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
576e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
577e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
578e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicOr(volatile uint32_t* addr, uint32_t value);
579e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
580e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
581e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Bitwise xor a value from the value at addr.  addr[0] ^= value
582e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
583e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
584e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to xor with the value at addr
585e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
586e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
587e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
588e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
589e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicXor(volatile uint32_t* addr, uint32_t value);
590e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
591e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Bitwise xor a value from the value at addr.  addr[0] ^= value
592e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
593e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
594e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value Amount to xor with the value at addr
595e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
596e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
597e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
598e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
599e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicXor(volatile int32_t* addr, int32_t value);
600e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
601e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
602e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Set the value at addr to the min of addr and value
603e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * addr[0] = rsMin(addr[0], value)
604e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
605e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
606e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value comparison value
607e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
608e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
609e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
610e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
611e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicMin(volatile uint32_t* addr, uint32_t value);
612e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
613e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Set the value at addr to the min of addr and value
614e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * addr[0] = rsMin(addr[0], value)
615e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
616e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
617e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value comparison value
618e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
619e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
620e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
621e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
622e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicMin(volatile int32_t* addr, int32_t value);
623e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
624e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
625e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Set the value at addr to the max of addr and value
626e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * addr[0] = rsMax(addr[0], value)
627e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
628e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
629e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value comparison value
630e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
631e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
632e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
633e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
634e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicMax(volatile uint32_t* addr, uint32_t value);
635e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
636e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Atomic Set the value at addr to the max of addr and value
637e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * addr[0] = rsMin(addr[0], value)
638e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
639e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr Address of value to modify
640e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param value comparison value
641e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
642e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
643e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
644e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
645e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicMax(volatile int32_t* addr, int32_t value);
646e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
647e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
648e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Compare-and-set operation with a full memory barrier.
649e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
650e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * If the value at addr matches compareValue then newValue is written.
651e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
652e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr The address to compare and replace if the compare passes.
653e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param compareValue The value to test addr[0] against.
654e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param newValue The value to write if the test passes.
655e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
656e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
657e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
658e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern int32_t __attribute__((overloadable))
659e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicCas(volatile int32_t* addr, int32_t compareValue, int32_t newValue);
660e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
661e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams/**
662e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * Compare-and-set operation with a full memory barrier.
663e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
664e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * If the value at addr matches compareValue then newValue is written.
665e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
666e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param addr The address to compare and replace if the compare passes.
667e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param compareValue The value to test addr[0] against.
668e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @param newValue The value to write if the test passes.
669e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams *
670e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams * @return old value
671e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams */
672e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Samsextern uint32_t __attribute__((overloadable))
673e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams    rsAtomicCas(volatile uint32_t* addr, int32_t compareValue, int32_t newValue);
674e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
675e1eb6156604d0a4cc4b7e7353aa2fc8dc4d8eadeJason Sams
676c4cdf4586a0210a0e4b7b9bf38e8973b31d17ea1Jason Sams#endif
677