PcloudStimProducer,OClCollMeshEngn: Produce ambience stim feature

The collation kernel now also produces the ambience stim feature
values into the ambience stimbuff frames.
This commit is contained in:
2025-11-23 07:20:55 -04:00
parent e689063a8c
commit ce690bc3f4
5 changed files with 214 additions and 26 deletions
@@ -56,7 +56,7 @@ static StagingBuffer::IOEngineConstraints openClAmbienceInputConstraints(
// slotStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// slotPadToNBytes: This is dynamically calculated based on the return mode.
sizeof(float),
sizeof(uint32_t),
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
@@ -295,18 +295,29 @@ std::cout << __func__ << ": $$$$$$$ Created PcloudIntensityStimulusBuffer" << st
}
else if (qualeIfaceApi == "pcloudAmbience")
{
// Parse ambienceHighVal from stimBuffApiParams
const std::vector<std::string> ambienceHighValParamNames = {
"high-value",
"high-val"
};
int ambienceHighValInt = device::DeviceAttachmentSpec
::parseOptionalParamAsIntWithSynonyms(
deviceAttachmentSpec->stimBuffApiParams,
ambienceHighValParamNames, 116);
uint32_t ambienceHighVal = static_cast<uint32_t>(ambienceHighValInt);
/* Calculate slotStrideNBytes:
* nDgramsPerStagingBufferFrame * sizeof(float)
* nDgramsPerStagingBufferFrame * sizeof(uint32_t)
*/
size_t slotStrideNBytes = this->nDgramsPerStagingBufferFrame
* sizeof(float);
* sizeof(uint32_t);
// Reuse openClAmbienceInputConstraints, only modify slotPadToNBytes
openClAmbienceInputConstraints.slotPadToNBytes = slotStrideNBytes;
auto ambienceBuffer = std::make_shared<PcloudAmbienceStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs,
openClAmbienceInputConstraints, openClAmbienceInputConstraints,
*smoHooksPtr, CL_MEM_READ_WRITE);
*smoHooksPtr, CL_MEM_READ_WRITE, ambienceHighVal);
std::cout << __func__ << ": $$$$$$$ Created PcloudAmbienceStimulusBuffer" << std::endl;
this->stop();
@@ -337,6 +348,7 @@ private:
AsynchronousLoop frameAssemblyResult;
StimulusFrame& stimulusFrame;
std::optional<std::reference_wrapper<StimulusFrame>> intensityStimFrame;
std::optional<std::reference_wrapper<StimulusFrame>> ambienceStimFrame;
public:
ProduceFrameReq(
@@ -412,8 +424,27 @@ public:
context->intensityStimFrame = std::nullopt;
}
// Check if ambience buffer is attached and acquire frame if so
if (pcloudProducer.ambienceStimulusBuffer)
{
size_t ambienceRingbuffIndex = pcloudProducer
.ambienceStimulusBuffer->ringBuffer.getIndexToProduceInto();
StimulusFrame& ambienceStimFrame = pcloudProducer
.ambienceStimulusBuffer->ringBuffer.getDataAtSlot(
ambienceRingbuffIndex);
ambienceStimFrame.lock.writeAcquire();
context->ambienceStimFrame = std::make_optional(
std::ref(ambienceStimFrame));
}
else {
context->ambienceStimFrame = std::nullopt;
}
pcloudProducer.openClCollatingAndMeshingEngine.compactCollateAndMeshFrameReq(
loop, stimulusFrame, context->intensityStimFrame,
loop, stimulusFrame,
context->intensityStimFrame, context->ambienceStimFrame,
{context, std::bind(
&ProduceFrameReq::produceFrameReq3_compactCollateDone,
context.get(), context,
@@ -428,6 +459,10 @@ public:
if (context->intensityStimFrame.has_value()) {
context->intensityStimFrame->get().lock.writeRelease();
}
// Release ambience frame if it was used
if (context->ambienceStimFrame.has_value()) {
context->ambienceStimFrame->get().lock.writeRelease();
}
SpinLock::Guard lock(pcloudProducer.shouldContinueLock);
if (!pcloudProducer.shouldContinue)