1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
//-*-c-*-
#include "matrix.h"
__device__ Matrix array2matrix(float *a)
{
return make_matrix(a[0], a[1], a[2],
a[3], a[4], a[5],
a[6], a[7], a[8]);
}
__device__ void matrix2array(const Matrix &m, float *a)
{
a[0] = m.a00;
a[1] = m.a01;
a[2] = m.a02;
a[3] = m.a10;
a[4] = m.a11;
a[5] = m.a12;
a[6] = m.a20;
a[7] = m.a21;
a[8] = m.a22;
}
extern "C"
{
__global__ void det(float *a, float *dest)
{
Matrix m = array2matrix(a);
dest[0] = det(m);
}
__global__ void inv(float *a, float *dest)
{
Matrix m = array2matrix(a);
matrix2array(inv(m), dest);
}
__global__ void minusmatrix(float *a, float *dest)
{
matrix2array(-array2matrix(a), dest);
}
__global__ void matrixadd(float *a, float *b, float *dest)
{
matrix2array(array2matrix(a)+array2matrix(b), dest);
}
__global__ void matrixsub(float *a, float *b, float *dest)
{
matrix2array(array2matrix(a)-array2matrix(b), dest);
}
__global__ void matrixmul(float *a, float *b, float *dest)
{
matrix2array(array2matrix(a)*array2matrix(b), dest);
}
__global__ void multiply(float *a, float3 *x, float3 *dest)
{
dest[0] = array2matrix(a)*x[0];
}
__global__ void matrixaddfloat(float *a, float c, float *dest)
{
matrix2array(array2matrix(a)+c, dest);
}
__global__ void matrixsubfloat(float *a, float c, float *dest)
{
matrix2array(array2matrix(a)-c, dest);
}
__global__ void matrixmulfloat(float *a, float c, float *dest)
{
matrix2array(array2matrix(a)*c, dest);
}
__global__ void matrixdivfloat(float *a, float c, float *dest)
{
matrix2array(array2matrix(a)/c, dest);
}
__global__ void floataddmatrix(float *a, float c, float *dest)
{
matrix2array(c+array2matrix(a), dest);
}
__global__ void floatsubmatrix(float *a, float c, float *dest)
{
matrix2array(c-array2matrix(a), dest);
}
__global__ void floatmulmatrix(float *a, float c, float *dest)
{
matrix2array(c*array2matrix(a), dest);
}
__global__ void floatdivmatrix(float *a, float c, float *dest)
{
matrix2array(c/array2matrix(a), dest);
}
__global__ void matrixaddequals(float *a, float *b)
{
Matrix m = array2matrix(a);
m += array2matrix(b);
matrix2array(m,a);
}
__global__ void matrixsubequals(float *a, float *b)
{
Matrix m = array2matrix(a);
m -= array2matrix(b);
matrix2array(m,a);
}
__global__ void matrixaddequalsfloat(float *a, float c)
{
Matrix m = array2matrix(a);
m += c;
matrix2array(m,a);
}
__global__ void matrixsubequalsfloat(float *a, float c)
{
Matrix m = array2matrix(a);
m -= c;
matrix2array(m,a);
}
__global__ void matrixmulequalsfloat(float *a, float c)
{
Matrix m = array2matrix(a);
m *= c;
matrix2array(m,a);
}
__global__ void matrixdivequalsfloat(float *a, float c)
{
Matrix m = array2matrix(a);
m /= c;
matrix2array(m,a);
}
__global__ void outer(float3 a, float3 b, float* dest)
{
matrix2array(outer(a,b), dest);
}
} // extern "c"
|