122 lines
2.4 KiB
C++
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
|