Stimulus[Buffer|Frame]: initial impl, unoptimized for mem use

This commit is contained in:
2025-11-16 16:09:35 -04:00
parent a4493b26a1
commit 3f04d1b387
9 changed files with 152 additions and 98 deletions
+6 -2
View File
@@ -3,6 +3,7 @@
#include <memory>
#include <user/stimulusBuffer.h>
#include <user/stagingBuffer.h>
namespace smo {
namespace stim_buff {
@@ -21,9 +22,12 @@ public:
StimulusProducer& parent,
const std::shared_ptr<device::DeviceAttachmentSpec>& deviceAttachmentSpec,
int histbuffMs,
const SpMcRingBuffer::InputEngineConstraints& ringBufferConstraints)
const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
size_t nSlotsPerStimFrame)
: StimulusBuffer(
parent, deviceAttachmentSpec, histbuffMs, ringBufferConstraints)
parent, deviceAttachmentSpec, histbuffMs,
inputEngineConstraints, outputEngineConstraints, nSlotsPerStimFrame)
{}
~MeshStimulusBuffer() = default;
@@ -3,6 +3,7 @@
#include <memory>
#include <user/stimulusBuffer.h>
#include <user/stagingBuffer.h>
namespace smo {
namespace stim_buff {
@@ -21,9 +22,12 @@ public:
StimulusProducer& parent,
const std::shared_ptr<device::DeviceAttachmentSpec>& deviceAttachmentSpec,
int histbuffMs,
const SpMcRingBuffer::InputEngineConstraints& ringBufferConstraints)
const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
size_t nSlotsPerStimFrame)
: StimulusBuffer(
parent, deviceAttachmentSpec, histbuffMs, ringBufferConstraints)
parent, deviceAttachmentSpec, histbuffMs,
inputEngineConstraints, outputEngineConstraints, nSlotsPerStimFrame)
{}
~PcloudAmbienceStimulusBuffer() = default;
@@ -3,6 +3,7 @@
#include <memory>
#include <user/stimulusBuffer.h>
#include <user/stagingBuffer.h>
namespace smo {
namespace stim_buff {
@@ -22,9 +23,12 @@ public:
const std::shared_ptr<device::DeviceAttachmentSpec>
&deviceAttachmentSpec,
int histbuffMs,
const SpMcRingBuffer::InputEngineConstraints& ringBufferConstraints)
const StagingBuffer::IOEngineConstraints& inputEngineConstraints,
const StagingBuffer::IOEngineConstraints& outputEngineConstraints,
size_t nSlotsPerStimFrame)
: StimulusBuffer(
parent, deviceAttachmentSpec, histbuffMs, ringBufferConstraints)
parent, deviceAttachmentSpec, histbuffMs,
inputEngineConstraints, outputEngineConstraints, nSlotsPerStimFrame)
{}
~PcloudIntensityStimulusBuffer() = default;
@@ -7,8 +7,9 @@
#include <componentThread.h>
#include <asynchronousLoop.h>
#include <user/stimulusFrame.h>
#include "pcloudStimulusProducer.h"
#include <user/frameAssemblyDesc.h>
#include <livoxProto1/device.h>
#include "pcloudStimulusProducer.h"
namespace smo {
namespace stim_buff {
@@ -16,8 +17,15 @@ namespace stim_buff {
extern const SmoCallbacks* smoHooksPtr;
// OpenCL kernels are used to collate and produce our StimFrames.
static SpMcRingBuffer::InputEngineConstraints openClInputConstraints(
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)), sizeof(void *));
static StagingBuffer::IOEngineConstraints openClInputConstraints(
// slotStartAlignmentByteVal (page alignment)
sizeof(float) * 3,
// slotPadToNBytes (pointer size)
sizeof(void *),
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)));
static StagingBuffer::IOEngineConstraints openClIntensityInputConstraints(
// slotStartAlignmentByteVal (page alignment)
@@ -27,7 +35,17 @@ static StagingBuffer::IOEngineConstraints openClIntensityInputConstraints(
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
sizeof(void *));
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)));
static StagingBuffer::IOEngineConstraints openClAmbienceInputConstraints(
// slotStartAlignmentByteVal (page alignment)
sizeof(float),
// slotPadToNBytes (pointer size)
sizeof(void *),
// frameStartAlignmentByteVal (page alignment)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
// framePadToNBytes (pointer size)
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)));
PcloudStimulusProducer::PcloudStimulusProducer(
const std::shared_ptr<device::DeviceAttachmentSpec> &deviceAttachmentSpec,
@@ -37,6 +55,7 @@ PcloudStimulusProducer::PcloudStimulusProducer(
: StimulusProducer(
deviceAttachmentSpec,
device->componentThread->getIoService()),
nDgramsPerStagingBufferFrame(nDgramsPerStagingBufferFrame),
device(device),
formatDesc(formatDesc),
openClCollatingAndMeshingEngine(*this),
@@ -46,6 +65,10 @@ assemblyBuffer(
nDgramsPerStagingBufferFrame),
ioUringAssemblyEngine(*this, nDgramsPerStagingBufferFrame),
collationBuffer(
StagingBuffer::IOEngineConstraints::openClInputConstraints,
StagingBuffer::IOEngineConstraints::openClInputConstraints,
nDgramsPerStagingBufferFrame),
tempStimulusFrame(
StagingBuffer::IOEngineConstraints::openClInputConstraints,
StagingBuffer::IOEngineConstraints::openClInputConstraints,
nDgramsPerStagingBufferFrame)
@@ -181,30 +204,47 @@ PcloudStimulusProducer::getOrCreateAttachedStimulusBuffer(
// Parse qualeIfaceApi to determine buffer type
const std::string& qualeIfaceApi = deviceAttachmentSpec->qualeIfaceApi;
// Calculate nPointsPerStimFrame based on return mode
size_t nPointsPerDgram = livoxProto1::Device::getNPointsPerDgram(
static_cast<int>(device->currentReturnMode));
size_t nPointsPerStimFrame = this->nDgramsPerStagingBufferFrame
* nPointsPerDgram;
if (qualeIfaceApi == "mesh")
{
std::cout << __func__ << ": $$$$$$$ Creating MeshStimulusBuffer" << std::endl;
auto meshBuffer = std::make_shared<MeshStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs, openClInputConstraints);
*this, deviceAttachmentSpec, histbuffMs,
openClInputConstraints, openClInputConstraints,
nPointsPerStimFrame);
std::cout << __func__ << ": $$$$$$$ Created MeshStimulusBuffer" << std::endl;
meshStimulusBuffer = meshBuffer;
attachedStimulusBuffers.push_back(meshBuffer);
return meshBuffer;
}
else if (qualeIfaceApi == "pcloudIntensity")
{
std::cout << __func__ << ": $$$$$$$ Creating PcloudIntensityStimulusBuffer" << std::endl;
auto intensityBuffer = std::make_shared<PcloudIntensityStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs,
openClInputConstraints);
openClIntensityInputConstraints, openClIntensityInputConstraints,
nPointsPerStimFrame);
std::cout << __func__ << ": $$$$$$$ Created PcloudIntensityStimulusBuffer" << std::endl;
intensityStimulusBuffer = intensityBuffer;
attachedStimulusBuffers.push_back(intensityBuffer);
return intensityBuffer;
}
else if (qualeIfaceApi == "pcloudAmbience")
{
std::cout << __func__ << ": $$$$$$$ Creating PcloudAmbienceStimulusBuffer" << std::endl;
auto ambienceBuffer = std::make_shared<PcloudAmbienceStimulusBuffer>(
*this, deviceAttachmentSpec, histbuffMs, openClInputConstraints);
*this, deviceAttachmentSpec, histbuffMs,
openClAmbienceInputConstraints, openClAmbienceInputConstraints,
nDgramsPerStagingBufferFrame);
std::cout << __func__ << ": $$$$$$$ Created PcloudAmbienceStimulusBuffer" << std::endl;
ambienceStimulusBuffer = ambienceBuffer;
attachedStimulusBuffers.push_back(ambienceBuffer);
return ambienceBuffer;
@@ -79,6 +79,7 @@ protected:
public:
void produceFrameReq(smo::Callback<produceFrameReqCbFn> callback);
size_t nDgramsPerStagingBufferFrame;
std::shared_ptr<livoxProto1::Device> device;
PcloudFormatDesc formatDesc;
OpenClCollatingAndMeshingEngine openClCollatingAndMeshingEngine;