#ifndef _LIVOX_GEN1_OPENCL_COLLATING_AND_MESHING_ENGINE_H #define _LIVOX_GEN1_OPENCL_COLLATING_AND_MESHING_ENGINE_H #include #include #include #include #include #define CL_TARGET_OPENCL_VERSION 300 #include #include "stagingBuffer.h" namespace smo { namespace stim_buff { class PcloudStimulusBuffer; class OpenClCollatingAndMeshingEngine { public: explicit OpenClCollatingAndMeshingEngine(PcloudStimulusBuffer& parent); ~OpenClCollatingAndMeshingEngine(); // Non-copyable, movable OpenClCollatingAndMeshingEngine( const OpenClCollatingAndMeshingEngine&) = delete; OpenClCollatingAndMeshingEngine& operator=( const OpenClCollatingAndMeshingEngine&) = delete; OpenClCollatingAndMeshingEngine( OpenClCollatingAndMeshingEngine&&) = default; OpenClCollatingAndMeshingEngine& operator=( OpenClCollatingAndMeshingEngine&&) = default; bool setup(); void finalize(); // Callback function type for collateFrameReq typedef std::function collateFrameReqCbFn; void start( StagingBuffer& assemblyBuff, StagingBuffer& collationBuff, collateFrameReqCbFn callback, uint32_t nSucceeded); void stop(); private: PcloudStimulusBuffer& parent; // OpenCL infrastructure cl_platform_id platform; cl_device_id device; cl_context context; cl_command_queue commandQueue; cl_program program; cl_kernel kernel; bool isSetup; // OpenCL buffers cl_mem clAssemblyBuffer; cl_mem clCollationBuffer; // State tracking bool isRunning; cl_event currentKernelEvent; bool memoryPinned; // Memory pinning tracking void* assemblyBufferPtr; size_t assemblyBufferSize; void* collationBufferPtr; size_t collationBufferSize; // Callback storage collateFrameReqCbFn collateFrameReqCb; // Static callback for OpenCL event static void CL_CALLBACK kernelEventCallback( cl_event event, cl_int event_command_exec_status, void* user_data); }; } // namespace stim_buff } // namespace smo #endif // _LIVOX_GEN1_OPENCL_COLLATING_AND_MESHING_ENGINE_H