1
2 #include <gtest/gtest.h>
3 #include "Bullet3Common/b3Logging.h"
4 #include "Bullet3Common/b3CommandLineArgs.h"
5 #include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
6
7 #include "Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h"
8 #include "Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h"
9 #include "Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h"
10 #include "Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h"
11 #include "Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h"
12 #include "Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h"
13
14 extern int gArgc;
15 extern char** gArgv;
16
17 namespace
18 {
19 struct CompileBullet3NarrowphaseKernels : public ::testing::Test
20 {
21 cl_context m_clContext;
22 cl_device_id m_clDevice;
23 cl_command_queue m_clQueue;
24 char* m_clDeviceName;
25 cl_platform_id m_platformId;
26
CompileBullet3NarrowphaseKernels__anon5fc4d66d0111::CompileBullet3NarrowphaseKernels27 CompileBullet3NarrowphaseKernels()
28 : m_clDeviceName(0),
29 m_clContext(0),
30 m_clDevice(0),
31 m_clQueue(0),
32 m_platformId(0)
33 {
34 // You can do set-up work for each test here.
35 b3CommandLineArgs args(gArgc, gArgv);
36 int preferredDeviceIndex = -1;
37 int preferredPlatformIndex = -1;
38 bool allowCpuOpenCL = false;
39
40 initCL();
41 }
42
~CompileBullet3NarrowphaseKernels__anon5fc4d66d0111::CompileBullet3NarrowphaseKernels43 virtual ~CompileBullet3NarrowphaseKernels()
44 {
45 // You can do clean-up work that doesn't throw exceptions here.
46 exitCL();
47 }
48
49 // If the constructor and destructor are not enough for setting up
50 // and cleaning up each test, you can define the following methods:
51
52 #include "initCL.h"
53
SetUp__anon5fc4d66d0111::CompileBullet3NarrowphaseKernels54 virtual void SetUp()
55 {
56 // Code here will be called immediately after the constructor (right
57 // before each test).
58 }
59
TearDown__anon5fc4d66d0111::CompileBullet3NarrowphaseKernels60 virtual void TearDown()
61 {
62 // Code here will be called immediately after each test (right
63 // before the destructor).
64 }
65 };
66
TEST_F(CompileBullet3NarrowphaseKernels,satKernelsCL)67 TEST_F(CompileBullet3NarrowphaseKernels, satKernelsCL)
68 {
69 cl_int errNum = 0;
70
71 char flags[1024] = {0};
72
73 cl_program satProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, satKernelsCL, &errNum, flags, 0, true);
74 ASSERT_EQ(CL_SUCCESS, errNum);
75
76 {
77 cl_kernel m_findSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satKernelsCL, "findSeparatingAxisKernel", &errNum, satProg);
78 ASSERT_EQ(CL_SUCCESS, errNum);
79 clReleaseKernel(m_findSeparatingAxisKernel);
80 }
81
82 {
83 cl_kernel m_findSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satKernelsCL, "findSeparatingAxisVertexFaceKernel", &errNum, satProg);
84 ASSERT_EQ(CL_SUCCESS, errNum);
85 clReleaseKernel(m_findSeparatingAxisVertexFaceKernel);
86 }
87
88 {
89 cl_kernel m_findSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satKernelsCL, "findSeparatingAxisEdgeEdgeKernel", &errNum, satProg);
90 ASSERT_EQ(CL_SUCCESS, errNum);
91 clReleaseKernel(m_findSeparatingAxisEdgeEdgeKernel);
92 }
93
94 {
95 cl_kernel m_findConcaveSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satKernelsCL, "findConcaveSeparatingAxisKernel", &errNum, satProg);
96 ASSERT_EQ(CL_SUCCESS, errNum);
97 clReleaseKernel(m_findConcaveSeparatingAxisKernel);
98 }
99
100 {
101 cl_kernel m_findCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satKernelsCL, "findCompoundPairsKernel", &errNum, satProg);
102 ASSERT_EQ(CL_SUCCESS, errNum);
103 clReleaseKernel(m_findCompoundPairsKernel);
104 }
105
106 {
107 cl_kernel m_processCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satKernelsCL, "processCompoundPairsKernel", &errNum, satProg);
108 ASSERT_EQ(CL_SUCCESS, errNum);
109 clReleaseKernel(m_processCompoundPairsKernel);
110 }
111
112 clReleaseProgram(satProg);
113 }
114
TEST_F(CompileBullet3NarrowphaseKernels,satConcaveKernelsCL)115 TEST_F(CompileBullet3NarrowphaseKernels, satConcaveKernelsCL)
116 {
117 cl_int errNum = 0;
118
119 char flags[1024] = {0};
120
121 cl_program satConcaveProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, satConcaveKernelsCL, &errNum, flags, 0, true);
122 ASSERT_EQ(CL_SUCCESS, errNum);
123
124 {
125 cl_kernel m_findConcaveSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satConcaveKernelsCL, "findConcaveSeparatingAxisVertexFaceKernel", &errNum, satConcaveProg);
126 ASSERT_EQ(CL_SUCCESS, errNum);
127 clReleaseKernel(m_findConcaveSeparatingAxisVertexFaceKernel);
128 }
129
130 {
131 cl_kernel m_findConcaveSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satConcaveKernelsCL, "findConcaveSeparatingAxisEdgeEdgeKernel", &errNum, satConcaveProg);
132 ASSERT_EQ(CL_SUCCESS, errNum);
133 clReleaseKernel(m_findConcaveSeparatingAxisEdgeEdgeKernel);
134 }
135
136 clReleaseProgram(satConcaveProg);
137 }
138
TEST_F(CompileBullet3NarrowphaseKernels,satClipKernelsCL)139 TEST_F(CompileBullet3NarrowphaseKernels, satClipKernelsCL)
140 {
141 char flags[1024] = {0};
142 cl_int errNum = 0;
143 //#ifdef CL_PLATFORM_INTEL
144 // sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/satClipHullContacts.cl");
145 //#endif
146
147 cl_program satClipContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, satClipKernelsCL, &errNum, flags, 0, true);
148 ASSERT_EQ(CL_SUCCESS, errNum);
149
150 {
151 cl_kernel m_clipHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satClipKernelsCL, "clipHullHullKernel", &errNum, satClipContactsProg);
152 ASSERT_EQ(CL_SUCCESS, errNum);
153 clReleaseKernel(m_clipHullHullKernel);
154 }
155
156 {
157 cl_kernel m_clipCompoundsHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satClipKernelsCL, "clipCompoundsHullHullKernel", &errNum, satClipContactsProg);
158 ASSERT_EQ(CL_SUCCESS, errNum);
159 clReleaseKernel(m_clipCompoundsHullHullKernel);
160 }
161
162 {
163 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satClipKernelsCL, "findClippingFacesKernel", &errNum, satClipContactsProg);
164 ASSERT_EQ(CL_SUCCESS, errNum);
165 clReleaseKernel(k);
166 }
167
168 {
169 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satClipKernelsCL, "clipFacesAndFindContactsKernel", &errNum, satClipContactsProg);
170 ASSERT_EQ(CL_SUCCESS, errNum);
171 clReleaseKernel(k);
172 }
173
174 {
175 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satClipKernelsCL, "clipHullHullConcaveConvexKernel", &errNum, satClipContactsProg);
176 ASSERT_EQ(CL_SUCCESS, errNum);
177 clReleaseKernel(k);
178 }
179
180 {
181 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, satClipKernelsCL,
182 "newContactReductionKernel", &errNum, satClipContactsProg);
183 ASSERT_EQ(CL_SUCCESS, errNum);
184 clReleaseKernel(k);
185 }
186
187 clReleaseProgram(satClipContactsProg);
188 }
189
TEST_F(CompileBullet3NarrowphaseKernels,bvhTraversalKernels)190 TEST_F(CompileBullet3NarrowphaseKernels, bvhTraversalKernels)
191 {
192 cl_int errNum = 0;
193 cl_program bvhTraversalProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, bvhTraversalKernelCL, &errNum, "", 0, true);
194 ASSERT_EQ(CL_SUCCESS, errNum);
195
196 {
197 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, bvhTraversalKernelCL, "bvhTraversalKernel", &errNum, bvhTraversalProg, "");
198 ASSERT_EQ(CL_SUCCESS, errNum);
199 clReleaseKernel(k);
200 }
201 clReleaseProgram(bvhTraversalProg);
202 }
203
TEST_F(CompileBullet3NarrowphaseKernels,primitiveContactsKernelsCL)204 TEST_F(CompileBullet3NarrowphaseKernels, primitiveContactsKernelsCL)
205 {
206 cl_int errNum = 0;
207 cl_program primitiveContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, primitiveContactsKernelsCL, &errNum, "", 0, true);
208 ASSERT_EQ(CL_SUCCESS, errNum);
209
210 {
211 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, primitiveContactsKernelsCL, "primitiveContactsKernel", &errNum, primitiveContactsProg, "");
212 ASSERT_EQ(CL_SUCCESS, errNum);
213 clReleaseKernel(k);
214 }
215
216 {
217 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, primitiveContactsKernelsCL, "findConcaveSphereContactsKernel", &errNum, primitiveContactsProg);
218 ASSERT_EQ(CL_SUCCESS, errNum);
219 clReleaseKernel(k);
220 }
221
222 {
223 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, primitiveContactsKernelsCL, "processCompoundPairsPrimitivesKernel", &errNum, primitiveContactsProg, "");
224 ASSERT_EQ(CL_SUCCESS, errNum);
225 clReleaseKernel(k);
226 }
227
228 clReleaseProgram(primitiveContactsProg);
229 }
230
TEST_F(CompileBullet3NarrowphaseKernels,mprKernelsCL)231 TEST_F(CompileBullet3NarrowphaseKernels, mprKernelsCL)
232 {
233 cl_int errNum = 0;
234 const char* srcConcave = satConcaveKernelsCL;
235 char flags[1024] = {0};
236 cl_program mprProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, mprKernelsCL, &errNum, flags, 0, true);
237 ASSERT_EQ(CL_SUCCESS, errNum);
238
239 {
240 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, mprKernelsCL, "mprPenetrationKernel", &errNum, mprProg);
241 ASSERT_EQ(CL_SUCCESS, errNum);
242 clReleaseKernel(k);
243 }
244
245 {
246 cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, mprKernelsCL, "findSeparatingAxisUnitSphereKernel", &errNum, mprProg);
247 ASSERT_EQ(CL_SUCCESS, errNum);
248 clReleaseKernel(k);
249 }
250
251 clReleaseProgram(mprProg);
252 }
253
254 }; // namespace
255