Files
salmanoff/stimBuffApis/livoxGen1/openClSplittingEngine.cpp
T

122 lines
2.4 KiB
C++

#include <stdexcept>
#include <iostream>
#include <cstring>
#include "openClSplittingEngine.h"
#include "pcloudStimulusBuffer.h"
namespace smo {
namespace stim_buff {
OpenClSplittingEngine::OpenClSplittingEngine(PcloudStimulusBuffer& parent_)
: parent(parent_),
platform(nullptr),
device(nullptr),
context(nullptr),
commandQueue(nullptr),
program(nullptr),
kernel(nullptr),
isSetup(false),
assemblyBuffer(nullptr),
xyzBuffer(nullptr),
intensityBuffer(nullptr)
{
}
OpenClSplittingEngine::~OpenClSplittingEngine()
{
finalize();
}
bool OpenClSplittingEngine::setup()
{
if (isSetup) {
return true;
}
cl_int err;
cl_queue_properties queueProps[] = {CL_QUEUE_PROPERTIES, 0, 0};
// Get platform
cl_uint numPlatforms;
err = clGetPlatformIDs(1, &platform, &numPlatforms);
if (err != CL_SUCCESS || numPlatforms == 0) {
std::cerr << __func__ << ": failed to get OpenCL platform: "
<< err << std::endl;
return false;
}
// Get device
err = clGetDeviceIDs(platform, CL_DEVICE_TYPE_GPU, 1, &device, nullptr);
if (err != CL_SUCCESS) {
std::cerr << __func__ << ": failed to get GPU device: "
<< err << std::endl;
return false;
}
// Create context
context = clCreateContext(nullptr, 1, &device, nullptr, nullptr, &err);
if (err != CL_SUCCESS || !context) {
std::cerr << __func__ << ": failed to create OpenCL context: "
<< err << std::endl;
goto cleanup;
}
// Create command queue
commandQueue = clCreateCommandQueueWithProperties(
context, device, queueProps, &err);
if (err != CL_SUCCESS || !commandQueue) {
std::cerr << __func__ << ": failed to create command queue: "
<< err << std::endl;
goto cleanup;
}
// TODO: Create program and kernel
// TODO: Create buffers
isSetup = true;
return true;
cleanup:
finalize();
return false;
}
void OpenClSplittingEngine::finalize()
{
if (intensityBuffer) {
clReleaseMemObject(intensityBuffer);
intensityBuffer = nullptr;
}
if (xyzBuffer) {
clReleaseMemObject(xyzBuffer);
xyzBuffer = nullptr;
}
if (assemblyBuffer) {
clReleaseMemObject(assemblyBuffer);
assemblyBuffer = nullptr;
}
if (kernel) {
clReleaseKernel(kernel);
kernel = nullptr;
}
if (program) {
clReleaseProgram(program);
program = nullptr;
}
if (commandQueue) {
clReleaseCommandQueue(commandQueue);
commandQueue = nullptr;
}
if (context) {
clReleaseContext(context);
context = nullptr;
}
device = nullptr;
platform = nullptr;
isSetup = false;
}
} // namespace stim_buff
} // namespace smo