--use_jacobi --allow_opencl_cpu b3LauncherCL constructor takes string, to make it easier to determine failing OpenCL kernel b3SetCustomErrorMessageFunc, printf error and exit(0)
124 lines
3.2 KiB
C++
124 lines
3.2 KiB
C++
#include "GpuDemo.h"
|
|
#include "GpuDemoInternalData.h"
|
|
#include "Bullet3Common/b3Scalar.h"
|
|
#include "Bullet3OpenCL/Initialize/b3OpenCLUtils.h"
|
|
#include "OpenGLWindow/ShapeData.h"
|
|
#include "OpenGLWindow/GLInstancingRenderer.h"
|
|
|
|
bool gAllowCpuOpenCL = false;
|
|
|
|
GpuDemo::GpuDemo()
|
|
:m_clData(0)
|
|
{
|
|
m_clData = new GpuDemoInternalData();
|
|
}
|
|
|
|
GpuDemo::~GpuDemo()
|
|
{
|
|
if (m_clData)
|
|
{
|
|
b3Assert(m_clData->m_clInitialized==false);
|
|
|
|
delete m_clData;
|
|
}
|
|
}
|
|
|
|
void GpuDemo::exitCL()
|
|
{
|
|
if (m_clData->m_clInitialized)
|
|
{
|
|
clReleaseCommandQueue(m_clData->m_clQueue);
|
|
clReleaseContext(m_clData->m_clContext);
|
|
m_clData->m_clInitialized = false;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void GpuDemo::initCL(int preferredDeviceIndex, int preferredPlatformIndex)
|
|
{
|
|
void* glCtx=0;
|
|
void* glDC = 0;
|
|
|
|
|
|
|
|
int ciErrNum = 0;
|
|
|
|
cl_device_type deviceType = CL_DEVICE_TYPE_GPU;
|
|
if (gAllowCpuOpenCL)
|
|
deviceType = CL_DEVICE_TYPE_ALL;
|
|
|
|
|
|
|
|
// if (useInterop)
|
|
// {
|
|
// m_data->m_clContext = b3OpenCLUtils::createContextFromType(deviceType, &ciErrNum, glCtx, glDC);
|
|
// } else
|
|
{
|
|
m_clData->m_clContext = b3OpenCLUtils::createContextFromType(deviceType, &ciErrNum, 0,0,preferredDeviceIndex, preferredPlatformIndex,&m_clData->m_platformId);
|
|
}
|
|
|
|
|
|
oclCHECKERROR(ciErrNum, CL_SUCCESS);
|
|
|
|
int numDev = b3OpenCLUtils::getNumDevices(m_clData->m_clContext);
|
|
|
|
if (numDev>0)
|
|
{
|
|
m_clData->m_clDevice= b3OpenCLUtils::getDevice(m_clData->m_clContext,0);
|
|
m_clData->m_clQueue = clCreateCommandQueue(m_clData->m_clContext, m_clData->m_clDevice, 0, &ciErrNum);
|
|
oclCHECKERROR(ciErrNum, CL_SUCCESS);
|
|
|
|
|
|
b3OpenCLDeviceInfo info;
|
|
b3OpenCLUtils::getDeviceInfo(m_clData->m_clDevice,&info);
|
|
m_clData->m_clDeviceName = info.m_deviceName;
|
|
m_clData->m_clInitialized = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
GpuDemoInternalData* GpuDemo::getInternalData()
|
|
{
|
|
return m_clData;
|
|
}
|
|
|
|
int GpuDemo::registerGraphicsSphereShape(const ConstructionInfo& ci, float radius, bool usePointSprites, int largeSphereThreshold, int mediumSphereThreshold)
|
|
{
|
|
|
|
int strideInBytes = 9*sizeof(float);
|
|
|
|
int graphicsShapeIndex = -1;
|
|
|
|
if (radius>=largeSphereThreshold)
|
|
{
|
|
int numVertices = sizeof(detailed_sphere_vertices)/strideInBytes;
|
|
int numIndices = sizeof(detailed_sphere_indices)/sizeof(int);
|
|
graphicsShapeIndex = ci.m_instancingRenderer->registerShape(&detailed_sphere_vertices[0],numVertices,detailed_sphere_indices,numIndices);
|
|
} else
|
|
{
|
|
|
|
if (usePointSprites)
|
|
{
|
|
int numVertices = sizeof(point_sphere_vertices)/strideInBytes;
|
|
int numIndices = sizeof(point_sphere_indices)/sizeof(int);
|
|
graphicsShapeIndex = ci.m_instancingRenderer->registerShape(&point_sphere_vertices[0],numVertices,point_sphere_indices,numIndices,B3_GL_POINTS);
|
|
} else
|
|
{
|
|
if (radius>=mediumSphereThreshold)
|
|
{
|
|
int numVertices = sizeof(medium_sphere_vertices)/strideInBytes;
|
|
int numIndices = sizeof(medium_sphere_indices)/sizeof(int);
|
|
graphicsShapeIndex = ci.m_instancingRenderer->registerShape(&medium_sphere_vertices[0],numVertices,medium_sphere_indices,numIndices);
|
|
} else
|
|
{
|
|
int numVertices = sizeof(low_sphere_vertices)/strideInBytes;
|
|
int numIndices = sizeof(low_sphere_indices)/sizeof(int);
|
|
graphicsShapeIndex = ci.m_instancingRenderer->registerShape(&low_sphere_vertices[0],numVertices,low_sphere_indices,numIndices);
|
|
}
|
|
}
|
|
}
|
|
return graphicsShapeIndex;
|
|
} |