testExecuteBullet3NarrowphaseKernels.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439
  1. #include <gtest/gtest.h>
  2. #include "Bullet3Common/b3Logging.h"
  3. #include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
  4. #include "Bullet3Common/b3CommandLineArgs.h"
  5. #include "Bullet3OpenCL/NarrowphaseCollision/kernels/satKernels.h"
  6. #include "Bullet3OpenCL/NarrowphaseCollision/kernels/mprKernels.h"
  7. #include "Bullet3OpenCL/NarrowphaseCollision/kernels/satConcaveKernels.h"
  8. #include "Bullet3OpenCL/NarrowphaseCollision/kernels/satClipHullContacts.h"
  9. #include "Bullet3OpenCL/NarrowphaseCollision/kernels/bvhTraversal.h"
  10. #include "Bullet3OpenCL/NarrowphaseCollision/kernels/primitiveContacts.h"
  11. #ifdef B3_USE_ZLIB
  12. #include "minizip/unzip.h"
  13. #endif
  14. #include "Bullet3OpenCL/ParallelPrimitives/b3LauncherCL.h"
  15. extern int gArgc;
  16. extern char** gArgv;
  17. namespace
  18. {
  19. struct ExecuteBullet3NarrowphaseKernels : 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. ExecuteBullet3NarrowphaseKernels()
  27. :m_clDeviceName(0),
  28. m_clContext(0),
  29. m_clDevice(0),
  30. m_clQueue(0),
  31. m_platformId(0)
  32. {
  33. // You can do set-up work for each test here.
  34. initCL();
  35. }
  36. virtual ~ExecuteBullet3NarrowphaseKernels()
  37. {
  38. // You can do clean-up work that doesn't throw exceptions here.
  39. exitCL();
  40. }
  41. // If the constructor and destructor are not enough for setting up
  42. // and cleaning up each test, you can define the following methods:
  43. #include "initCL.h"
  44. virtual void SetUp()
  45. {
  46. // Code here will be called immediately after the constructor (right
  47. // before each test).
  48. }
  49. virtual void TearDown()
  50. {
  51. // Code here will be called immediately after each test (right
  52. // before the destructor).
  53. }
  54. };
  55. #if 0
  56. TEST_F(ExecuteBullet3NarrowphaseKernels,satKernelsCL)
  57. {
  58. cl_int errNum=0;
  59. char flags[1024]={0};
  60. cl_program satProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext,m_clDevice,satKernelsCL,&errNum,flags,0,true);
  61. ASSERT_EQ(CL_SUCCESS,errNum);
  62. {
  63. cl_kernel m_findSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satKernelsCL, "findSeparatingAxisKernel",&errNum,satProg );
  64. ASSERT_EQ(CL_SUCCESS,errNum);
  65. clReleaseKernel(m_findSeparatingAxisKernel );
  66. }
  67. {
  68. cl_kernel m_findSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satKernelsCL, "findSeparatingAxisVertexFaceKernel",&errNum,satProg );
  69. ASSERT_EQ(CL_SUCCESS,errNum);
  70. clReleaseKernel(m_findSeparatingAxisVertexFaceKernel);
  71. }
  72. {
  73. cl_kernel m_findSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satKernelsCL, "findSeparatingAxisEdgeEdgeKernel",&errNum,satProg );
  74. ASSERT_EQ(CL_SUCCESS,errNum);
  75. clReleaseKernel(m_findSeparatingAxisEdgeEdgeKernel);
  76. }
  77. {
  78. cl_kernel m_findConcaveSeparatingAxisKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satKernelsCL, "findConcaveSeparatingAxisKernel",&errNum,satProg );
  79. ASSERT_EQ(CL_SUCCESS,errNum);
  80. clReleaseKernel(m_findConcaveSeparatingAxisKernel );
  81. }
  82. {
  83. cl_kernel m_findCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satKernelsCL, "findCompoundPairsKernel",&errNum,satProg );
  84. ASSERT_EQ(CL_SUCCESS,errNum);
  85. clReleaseKernel(m_findCompoundPairsKernel);
  86. }
  87. {
  88. cl_kernel m_processCompoundPairsKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satKernelsCL, "processCompoundPairsKernel",&errNum,satProg );
  89. ASSERT_EQ(CL_SUCCESS,errNum);
  90. clReleaseKernel(m_processCompoundPairsKernel);
  91. }
  92. clReleaseProgram(satProg);
  93. }
  94. TEST_F(ExecuteBullet3NarrowphaseKernels,satConcaveKernelsCL)
  95. {
  96. cl_int errNum=0;
  97. char flags[1024]={0};
  98. cl_program satConcaveProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext,m_clDevice,satConcaveKernelsCL,&errNum,flags,0,true);
  99. ASSERT_EQ(CL_SUCCESS,errNum);
  100. {
  101. cl_kernel m_findConcaveSeparatingAxisVertexFaceKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satConcaveKernelsCL, "findConcaveSeparatingAxisVertexFaceKernel",&errNum,satConcaveProg );
  102. ASSERT_EQ(CL_SUCCESS,errNum);
  103. clReleaseKernel(m_findConcaveSeparatingAxisVertexFaceKernel);
  104. }
  105. {
  106. cl_kernel m_findConcaveSeparatingAxisEdgeEdgeKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satConcaveKernelsCL, "findConcaveSeparatingAxisEdgeEdgeKernel",&errNum,satConcaveProg );
  107. ASSERT_EQ(CL_SUCCESS,errNum);
  108. clReleaseKernel(m_findConcaveSeparatingAxisEdgeEdgeKernel);
  109. }
  110. clReleaseProgram(satConcaveProg);
  111. }
  112. TEST_F(ExecuteBullet3NarrowphaseKernels,satClipKernelsCL)
  113. {
  114. char flags[1024]={0};
  115. cl_int errNum=0;
  116. //#ifdef CL_PLATFORM_INTEL
  117. // sprintf(flags,"-g -s \"%s\"","C:/develop/bullet3_experiments2/opencl/gpu_narrowphase/kernels/satClipHullContacts.cl");
  118. //#endif
  119. cl_program satClipContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext,m_clDevice,satClipKernelsCL,&errNum,flags,0,true);
  120. ASSERT_EQ(CL_SUCCESS,errNum);
  121. {
  122. cl_kernel m_clipHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satClipKernelsCL, "clipHullHullKernel",&errNum,satClipContactsProg);
  123. ASSERT_EQ(CL_SUCCESS,errNum);
  124. clReleaseKernel(m_clipHullHullKernel);
  125. }
  126. {
  127. cl_kernel m_clipCompoundsHullHullKernel = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satClipKernelsCL, "clipCompoundsHullHullKernel",&errNum,satClipContactsProg);
  128. ASSERT_EQ(CL_SUCCESS,errNum);
  129. clReleaseKernel(m_clipCompoundsHullHullKernel);
  130. }
  131. {
  132. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satClipKernelsCL, "findClippingFacesKernel",&errNum,satClipContactsProg);
  133. ASSERT_EQ(CL_SUCCESS,errNum);
  134. clReleaseKernel(k);
  135. }
  136. {
  137. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satClipKernelsCL, "clipFacesAndFindContactsKernel",&errNum,satClipContactsProg);
  138. ASSERT_EQ(CL_SUCCESS,errNum);
  139. clReleaseKernel(k);
  140. }
  141. {
  142. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satClipKernelsCL, "clipHullHullConcaveConvexKernel",&errNum,satClipContactsProg);
  143. ASSERT_EQ(CL_SUCCESS,errNum);
  144. clReleaseKernel(k);
  145. }
  146. {
  147. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,satClipKernelsCL,
  148. "newContactReductionKernel",&errNum,satClipContactsProg);
  149. ASSERT_EQ(CL_SUCCESS,errNum);
  150. clReleaseKernel(k);
  151. }
  152. clReleaseProgram(satClipContactsProg);
  153. }
  154. TEST_F(ExecuteBullet3NarrowphaseKernels,bvhTraversalKernels)
  155. {
  156. cl_int errNum=0;
  157. cl_program bvhTraversalProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext,m_clDevice,bvhTraversalKernelCL,&errNum,"",0,true);
  158. ASSERT_EQ(CL_SUCCESS,errNum);
  159. {
  160. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,bvhTraversalKernelCL, "bvhTraversalKernel",&errNum,bvhTraversalProg,"");
  161. ASSERT_EQ(CL_SUCCESS,errNum);
  162. clReleaseKernel(k);
  163. }
  164. clReleaseProgram(bvhTraversalProg);
  165. }
  166. TEST_F(ExecuteBullet3NarrowphaseKernels,primitiveContactsKernelsCL)
  167. {
  168. cl_int errNum=0;
  169. cl_program primitiveContactsProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext,m_clDevice,primitiveContactsKernelsCL,&errNum,"",0,true);
  170. ASSERT_EQ(CL_SUCCESS,errNum);
  171. {
  172. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,primitiveContactsKernelsCL, "primitiveContactsKernel",&errNum,primitiveContactsProg,"");
  173. ASSERT_EQ(CL_SUCCESS,errNum);
  174. clReleaseKernel(k);
  175. }
  176. {
  177. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,primitiveContactsKernelsCL, "findConcaveSphereContactsKernel",&errNum,primitiveContactsProg );
  178. ASSERT_EQ(CL_SUCCESS,errNum);
  179. clReleaseKernel(k);
  180. }
  181. {
  182. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,primitiveContactsKernelsCL, "processCompoundPairsPrimitivesKernel",&errNum,primitiveContactsProg,"");
  183. ASSERT_EQ(CL_SUCCESS,errNum);
  184. clReleaseKernel(k);
  185. }
  186. clReleaseProgram(primitiveContactsProg);
  187. }
  188. #endif
  189. unsigned char* openFile(const char* fileName, int* sizeInBytesPtr)
  190. {
  191. *sizeInBytesPtr=0;
  192. unsigned char* buffer = 0;
  193. const char* prefix[]={"./","./data/","../data/","../../data/","../../../data/","../../../../data/"};
  194. int numPrefixes = sizeof(prefix)/sizeof(const char*);
  195. char relativeFileName[1024];
  196. #ifdef B3_USE_ZLIB
  197. {
  198. FILE* f=0;
  199. int result = 0;
  200. for (int i=0;!f && i<numPrefixes;i++)
  201. {
  202. sprintf(relativeFileName,"%s%s",prefix[i],"unittest_data.zip");
  203. f = fopen(relativeFileName,"rb");
  204. }
  205. if (f)
  206. {
  207. fclose(f);
  208. unzFile zipfile = unzOpen( relativeFileName);
  209. if ( zipfile == NULL )
  210. {
  211. printf( "%s: not found\n" ,relativeFileName);
  212. }
  213. // Get info about the zip file
  214. unz_global_info global_info;
  215. result = unzGetGlobalInfo( zipfile, &global_info ) ;
  216. if (result != UNZ_OK )
  217. {
  218. b3Printf( "could not read file global info\n" );
  219. unzClose( zipfile );
  220. } else
  221. {
  222. result = unzLocateFile(zipfile, fileName, 0);
  223. if (result == UNZ_OK)
  224. {
  225. unz_file_info info;
  226. result = unzGetCurrentFileInfo( zipfile, &info, NULL, 0, NULL, 0, NULL, 0 );
  227. if ( result != UNZ_OK )
  228. {
  229. b3Printf("unzGetCurrentFileInfo() != UNZ_OK (%d)\n", result);
  230. } else
  231. {
  232. result = unzOpenCurrentFile(zipfile);
  233. if (result == UNZ_OK)
  234. {
  235. buffer = (unsigned char*)malloc(info.uncompressed_size);
  236. result = unzReadCurrentFile(zipfile,buffer,info.uncompressed_size);
  237. if (result <0)
  238. {
  239. free(buffer);
  240. buffer=0;
  241. } else
  242. {
  243. *sizeInBytesPtr= info.uncompressed_size;
  244. }
  245. unzCloseCurrentFile(zipfile);
  246. } else
  247. {
  248. b3Printf("cannot open file %s!\n", fileName);
  249. }
  250. }
  251. } else
  252. {
  253. b3Printf("cannot find file %s\n", fileName);
  254. }
  255. unzClose( zipfile );
  256. }
  257. }
  258. }
  259. #endif//B3_USE_ZLIB
  260. if (!buffer)
  261. {
  262. FILE* f=0;
  263. int result = 0;
  264. for (int i=0;!f && i<numPrefixes;i++)
  265. {
  266. sprintf(relativeFileName,"%s%s",prefix[i],fileName);
  267. f = fopen(relativeFileName,"rb");
  268. }
  269. //first try from data.zip, otherwise directly load the file from disk
  270. if (f)
  271. {
  272. int sizeInBytes=0;
  273. if (fseek(f, 0, SEEK_END) || (sizeInBytes = ftell(f)) == EOF || fseek(f, 0, SEEK_SET))
  274. {
  275. b3Printf("error, cannot get file size\n");
  276. }
  277. buffer = (unsigned char*) malloc(sizeInBytes);
  278. int actualRead = fread(buffer,sizeInBytes,1,f);
  279. if (actualRead != 1)
  280. {
  281. free(buffer);
  282. buffer=0;
  283. } else
  284. {
  285. *sizeInBytesPtr = sizeInBytes;
  286. }
  287. fclose(f);
  288. }
  289. }
  290. return buffer;
  291. }
  292. void testLauncher(const char* fileName2, b3LauncherCL& launcher, cl_context ctx)
  293. {
  294. int sizeInBytes=0;
  295. unsigned char* buf = openFile(fileName2,&sizeInBytes);
  296. ASSERT_FALSE(buf==NULL);
  297. if (buf)
  298. {
  299. int serializedBytes = launcher.deserializeArgs(buf, sizeInBytes,ctx);
  300. int num = *(int*)&buf[serializedBytes];
  301. launcher.launch1D( num);
  302. free(buf);
  303. //this clFinish is for testing on errors
  304. }
  305. }
  306. TEST_F(ExecuteBullet3NarrowphaseKernels,mprKernelsCL)
  307. {
  308. cl_int errNum=0;
  309. const char* srcConcave = satConcaveKernelsCL;
  310. char flags[1024]={0};
  311. cl_program mprProg = b3OpenCLUtils::compileCLProgramFromString(m_clContext,m_clDevice,mprKernelsCL,&errNum,flags,0,true);
  312. ASSERT_EQ(CL_SUCCESS,errNum);
  313. {
  314. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,mprKernelsCL, "mprPenetrationKernel",&errNum,mprProg );
  315. ASSERT_EQ(CL_SUCCESS,errNum);
  316. if (1)
  317. {
  318. const char* fileNames[]={"mprPenetrationKernel60.bin","mprPenetrationKernel61.bin","mprPenetrationKernel70.bin","mprPenetrationKernel128.bin"};
  319. int results[] = {0,1,46,98};
  320. int numTests = sizeof(fileNames)/sizeof(const char*);
  321. for (int i=0;i<numTests;i++)
  322. {
  323. b3LauncherCL launcher(m_clQueue, k,fileNames[i]);
  324. testLauncher(fileNames[i],launcher, m_clContext);
  325. clFinish(m_clQueue);
  326. ASSERT_EQ(launcher.getNumArguments(),11);
  327. b3KernelArgData data = launcher.getArgument(8);
  328. ASSERT_TRUE(data.m_isBuffer);
  329. b3OpenCLArray<int> totalContactsOut(this->m_clContext,this->m_clQueue);
  330. totalContactsOut.setFromOpenCLBuffer(data.m_clBuffer,1);
  331. int numContacts = totalContactsOut.at(0);
  332. ASSERT_EQ(results[i],numContacts);
  333. }
  334. //printf("numContacts = %d\n",numContacts);
  335. //nContacts = m_totalContactsOut.at(0);
  336. }
  337. clReleaseKernel(k);
  338. }
  339. {
  340. cl_kernel k = b3OpenCLUtils::compileCLKernelFromString(m_clContext, m_clDevice,mprKernelsCL, "findSeparatingAxisUnitSphereKernel",&errNum,mprProg );
  341. ASSERT_EQ(CL_SUCCESS,errNum);
  342. clReleaseKernel(k);
  343. }
  344. clReleaseProgram(mprProg);
  345. }
  346. };