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