1 
2 #include <gtest/gtest.h>
3 #include "Bullet3Common/b3Logging.h"
4 #include "Bullet3Common/b3CommandLineArgs.h"
5 #include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
6 #include "Bullet3OpenCL/BroadphaseCollision/kernels/sapKernels.h"
7 #include "Bullet3OpenCL/BroadphaseCollision/kernels/gridBroadphaseKernels.h"
8 
9 extern int gArgc;
10 extern char** gArgv;
11 
12 namespace
13 {
14 struct CompileBullet3BroadphaseKernels : public ::testing::Test
15 {
16 	cl_context m_clContext;
17 	cl_device_id m_clDevice;
18 	cl_command_queue m_clQueue;
19 	char* m_clDeviceName;
20 	cl_platform_id m_platformId;
21 
CompileBullet3BroadphaseKernels__anon91b0a95c0111::CompileBullet3BroadphaseKernels22 	CompileBullet3BroadphaseKernels()
23 		: m_clDeviceName(0),
24 		  m_clContext(0),
25 		  m_clDevice(0),
26 		  m_clQueue(0),
27 		  m_platformId(0)
28 	{
29 		// You can do set-up work for each test here.
30 		b3CommandLineArgs args(gArgc, gArgv);
31 		int preferredDeviceIndex = -1;
32 		int preferredPlatformIndex = -1;
33 		bool allowCpuOpenCL = false;
34 
35 		initCL();
36 	}
37 
~CompileBullet3BroadphaseKernels__anon91b0a95c0111::CompileBullet3BroadphaseKernels38 	virtual ~CompileBullet3BroadphaseKernels()
39 	{
40 		// You can do clean-up work that doesn't throw exceptions here.
41 		exitCL();
42 	}
43 
44 	// If the constructor and destructor are not enough for setting up
45 	// and cleaning up each test, you can define the following methods:
46 
47 #include "initCL.h"
48 
SetUp__anon91b0a95c0111::CompileBullet3BroadphaseKernels49 	virtual void SetUp()
50 	{
51 		// Code here will be called immediately after the constructor (right
52 		// before each test).
53 	}
54 
TearDown__anon91b0a95c0111::CompileBullet3BroadphaseKernels55 	virtual void TearDown()
56 	{
57 		// Code here will be called immediately after each test (right
58 		// before the destructor).
59 	}
60 };
61 
TEST_F(CompileBullet3BroadphaseKernels,sapKernels)62 TEST_F(CompileBullet3BroadphaseKernels, sapKernels)
63 {
64 	cl_int errNum = 0;
65 	cl_program sapProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, sapCL, &errNum, "", 0, true);
66 	{
67 		ASSERT_EQ(CL_SUCCESS, errNum);
68 		cl_kernel copyAabbsKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "copyAabbsKernel", &errNum, sapProg);
69 		ASSERT_EQ(CL_SUCCESS, errNum);
70 		ASSERT_FALSE(copyAabbsKernel == 0);
71 		clReleaseKernel(copyAabbsKernel);
72 	}
73 	{
74 		cl_kernel sap2Kernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "computePairsKernelTwoArrays", &errNum, sapProg);
75 		ASSERT_EQ(CL_SUCCESS, errNum);
76 		ASSERT_FALSE(sap2Kernel == 0);
77 		clReleaseKernel(sap2Kernel);
78 	}
79 	{
80 		cl_kernel sapKernelBruteForce = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "computePairsKernelBruteForce", &errNum, sapProg);
81 		ASSERT_EQ(CL_SUCCESS, errNum);
82 		ASSERT_FALSE(sapKernelBruteForce == 0);
83 		clReleaseKernel(sapKernelBruteForce);
84 	}
85 	{
86 		cl_kernel sapKernelOriginal = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "computePairsKernelOriginal", &errNum, sapProg);
87 		ASSERT_EQ(CL_SUCCESS, errNum);
88 		ASSERT_FALSE(sapKernelOriginal == 0);
89 		clReleaseKernel(sapKernelOriginal);
90 	}
91 
92 	{
93 		cl_kernel sapKernelBarrier = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "computePairsKernelBarrier", &errNum, sapProg);
94 		ASSERT_EQ(CL_SUCCESS, errNum);
95 		ASSERT_FALSE(sapKernelBarrier == 0);
96 		clReleaseKernel(sapKernelBarrier);
97 	}
98 	{
99 		cl_kernel sapKernelLocalShared = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "computePairsKernelLocalSharedMemory", &errNum, sapProg);
100 		ASSERT_EQ(CL_SUCCESS, errNum);
101 		ASSERT_FALSE(sapKernelLocalShared == 0);
102 		clReleaseKernel(sapKernelLocalShared);
103 	}
104 	{
105 		cl_kernel prepareSumVarianceKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "prepareSumVarianceKernel", &errNum, sapProg);
106 		ASSERT_EQ(CL_SUCCESS, errNum);
107 		ASSERT_FALSE(prepareSumVarianceKernel == 0);
108 		clReleaseKernel(prepareSumVarianceKernel);
109 	}
110 	{
111 		cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "flipFloatKernel", &errNum, sapProg);
112 		ASSERT_EQ(CL_SUCCESS, errNum);
113 		ASSERT_FALSE(k == 0);
114 		clReleaseKernel(k);
115 	}
116 	{
117 		cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, sapCL, "scatterKernel", &errNum, sapProg);
118 		ASSERT_EQ(CL_SUCCESS, errNum);
119 		ASSERT_FALSE(k == 0);
120 		clReleaseKernel(k);
121 	}
122 
123 	clReleaseProgram(sapProg);
124 };
125 
TEST_F(CompileBullet3BroadphaseKernels,gridBroadphaseKernels)126 TEST_F(CompileBullet3BroadphaseKernels, gridBroadphaseKernels)
127 {
128 	cl_int errNum = 0;
129 	cl_program gridProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext, m_clDevice, gridBroadphaseCL, &errNum, "", 0, true);
130 	ASSERT_EQ(CL_SUCCESS, errNum);
131 
132 	{
133 		cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, gridBroadphaseCL, "kCalcHashAABB", &errNum, gridProg);
134 		ASSERT_EQ(CL_SUCCESS, errNum);
135 		clReleaseKernel(k);
136 	}
137 	{
138 		cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, gridBroadphaseCL, "kClearCellStart", &errNum, gridProg);
139 		ASSERT_EQ(CL_SUCCESS, errNum);
140 		clReleaseKernel(k);
141 	}
142 
143 	{
144 		cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, gridBroadphaseCL, "kFindCellStart", &errNum, gridProg);
145 		ASSERT_EQ(CL_SUCCESS, errNum);
146 		clReleaseKernel(k);
147 	}
148 
149 	{
150 		cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice, gridBroadphaseCL, "kFindOverlappingPairs", &errNum, gridProg);
151 		ASSERT_EQ(CL_SUCCESS, errNum);
152 		clReleaseKernel(k);
153 	}
154 
155 	clReleaseProgram(gridProg);
156 }
157 };  // namespace
158