diff --git a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp index 3d452b0..fd3ab4b 100644 --- a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp +++ b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.cpp @@ -22,10 +22,10 @@ context(nullptr), commandQueue(nullptr), slotCompactorProgram(nullptr), collateProgram(nullptr), slotCompactorKernel(nullptr), collateKernel(nullptr), -isSetup(false), clAssemblyBuffer(nullptr), clCollationBuffer(nullptr), -isRunning(false), +compactIsSetup(false), compactIsRunning(false), +collateIsSetup(false), collateIsRunning(false), currentCompactKernelEvent(nullptr), currentCollateKernelEvent(nullptr), assemblyBufferPtr(nullptr), assemblyBufferSize(0), @@ -42,7 +42,7 @@ OpenClCollatingAndMeshingEngine::~OpenClCollatingAndMeshingEngine() bool OpenClCollatingAndMeshingEngine::setup() { - if (isSetup) { + if (compactIsSetup && collateIsSetup) { return true; } @@ -143,7 +143,8 @@ bool OpenClCollatingAndMeshingEngine::setup() goto cleanup; } - isSetup = true; + compactIsSetup = true; + collateIsSetup = true; return true; cleanup: @@ -209,8 +210,10 @@ void OpenClCollatingAndMeshingEngine::finalize() // Reset state variables device = nullptr; platform = nullptr; - isSetup = false; - isRunning = false; + compactIsSetup = false; + compactIsRunning = false; + collateIsSetup = false; + collateIsRunning = false; currentCompactKernelEvent = nullptr; currentCollateKernelEvent = nullptr; assemblyBufferPtr = nullptr; @@ -227,7 +230,7 @@ void CL_CALLBACK OpenClCollatingAndMeshingEngine::compactKernelEventCallback( OpenClCollatingAndMeshingEngine* engine = static_cast(user_data); - if (!engine || !engine->isRunning || !engine->compactKernelCb) + if (!engine || !engine->compactIsRunning || !engine->compactKernelCb) { return; } // Post to io_service to call callback on the correct thread @@ -245,7 +248,7 @@ void CL_CALLBACK OpenClCollatingAndMeshingEngine::collateKernelEventCallback( OpenClCollatingAndMeshingEngine* engine = static_cast(user_data); - if (!engine || !engine->isRunning || !engine->collateKernelCb) + if (!engine || !engine->collateIsRunning || !engine->collateKernelCb) { return; } // Post to io_service to call callback on the correct thread @@ -286,7 +289,9 @@ bool OpenClCollatingAndMeshingEngine::startCompactKernel( validateBuffers, 1, // globalWorkSize compactKernelEventCallback, - "slotCompactor"); + "slotCompactor", + compactIsSetup, + compactIsRunning); } bool OpenClCollatingAndMeshingEngine::startCollateKernel( @@ -327,7 +332,9 @@ bool OpenClCollatingAndMeshingEngine::startCollateKernel( validateBuffers, globalWorkSize, collateKernelEventCallback, - "collateDgrams"); + "collateDgrams", + collateIsSetup, + collateIsRunning); } bool OpenClCollatingAndMeshingEngine::compileAndPrepareKernel( @@ -549,43 +556,48 @@ bool OpenClCollatingAndMeshingEngine::setupCollateDgramsArgs( void OpenClCollatingAndMeshingEngine::stop() { - if (!isRunning) { - return; // No-op if not running - } - - // Cancel kernel execution if possible - if (currentCompactKernelEvent) + // Stop compact kernel if running + if (compactIsRunning && currentCompactKernelEvent) { - // Note: OpenCL doesn't have a standard way to cancel kernel execution - // We can try to wait for it to complete or just release the event - // For now, we'll just wait for it to complete clWaitForEvents(1, ¤tCompactKernelEvent); clReleaseEvent(currentCompactKernelEvent); currentCompactKernelEvent = nullptr; + compactIsRunning = false; } - if (currentCollateKernelEvent) + // Stop collate kernel if running + if (collateIsRunning && currentCollateKernelEvent) { - // Note: OpenCL doesn't have a standard way to cancel kernel execution - // We can try to wait for it to complete or just release the event - // For now, we'll just wait for it to complete clWaitForEvents(1, ¤tCollateKernelEvent); clReleaseEvent(currentCollateKernelEvent); currentCollateKernelEvent = nullptr; + collateIsRunning = false; } - - isRunning = false; } void OpenClCollatingAndMeshingEngine::stopCompactKernel() { - stop(); + // Stop only compact kernel + if (compactIsRunning && currentCompactKernelEvent) + { + clWaitForEvents(1, ¤tCompactKernelEvent); + clReleaseEvent(currentCompactKernelEvent); + currentCompactKernelEvent = nullptr; + compactIsRunning = false; + } compactKernelCb = [](cl_int){}; } void OpenClCollatingAndMeshingEngine::stopCollateKernel() { - stop(); + // Stop only collate kernel + if (collateIsRunning && currentCollateKernelEvent) + { + clWaitForEvents(1, ¤tCollateKernelEvent); + clReleaseEvent(currentCollateKernelEvent); + currentCollateKernelEvent = nullptr; + collateIsRunning = false; + } collateKernelCb = [](cl_int){}; } diff --git a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h index 7bd9825..e747897 100644 --- a/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h +++ b/stimBuffApis/livoxGen1/openClCollatingAndMeshingEngine.h @@ -71,7 +71,10 @@ private: cl_mem clCollationBuffer; // State tracking - bool isRunning; + bool compactIsSetup; + bool compactIsRunning; + bool collateIsSetup; + bool collateIsRunning; cl_event currentCompactKernelEvent; cl_event currentCollateKernelEvent; @@ -112,7 +115,9 @@ private: ValidateBuffersFn validateBuffersFn, size_t globalWorkSize, void (CL_CALLBACK *eventCallback)(cl_event, cl_int, void*), - const char* kernelName) + const char* kernelName, + bool& isSetup, + bool& isRunning) { if (!isSetup) {