OClCollMeshEngn,PcloudStimProd: Produce into intensity stimbuff
PcloudStimulusBuffer::produceFrameReq(): Now correctly produces into the stim frames for the PcloudIntensityStimulusBuffer object that's attached to the PcloudStimulusProducer. If there's no attached I stimbuff, then the OpenCL kernel will simply not write out the intensity data. This is the first moment when we actually use the SP-MC ringbuffer properly and actually cycle through the frames, producing into them one by one.
This commit is contained in:
@@ -22,9 +22,9 @@ static StagingBuffer::IOEngineConstraints openClInputConstraints(
|
||||
* This should eventually be aligned to 4B and padded to 12B.
|
||||
*/
|
||||
// slotStartAlignmentByteVal (page alignment)
|
||||
sizeof(float) * 4,
|
||||
// slotPadToNBytes (pointer size)
|
||||
sizeof(float) * 4,
|
||||
sizeof(float),
|
||||
// slotPadToNBytes (XYZ = 3 floats per point)
|
||||
sizeof(float) * 3,
|
||||
// frameStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
// framePadToNBytes (pointer size)
|
||||
@@ -34,7 +34,7 @@ static StagingBuffer::IOEngineConstraints openClInputConstraints(
|
||||
static StagingBuffer::IOEngineConstraints openClMeshInputConstraints(
|
||||
// slotStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
// slotPadToNBytes (pointer size)
|
||||
// slotPadToNBytes: This is dynamically calculated based on the return mode.
|
||||
sizeof(float) * 3,
|
||||
// frameStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
@@ -44,7 +44,7 @@ static StagingBuffer::IOEngineConstraints openClMeshInputConstraints(
|
||||
static StagingBuffer::IOEngineConstraints openClIntensityInputConstraints(
|
||||
// slotStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
// slotPadToNBytes (intensity value size)
|
||||
// slotPadToNBytes: This is dynamically calculated based on the return mode.
|
||||
sizeof(float),
|
||||
// frameStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
@@ -54,7 +54,7 @@ static StagingBuffer::IOEngineConstraints openClIntensityInputConstraints(
|
||||
static StagingBuffer::IOEngineConstraints openClAmbienceInputConstraints(
|
||||
// slotStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
// slotPadToNBytes (pointer size)
|
||||
// slotPadToNBytes: This is dynamically calculated based on the return mode.
|
||||
sizeof(float),
|
||||
// frameStartAlignmentByteVal (page alignment)
|
||||
static_cast<size_t>(sysconf(_SC_PAGE_SIZE)),
|
||||
@@ -335,6 +335,7 @@ private:
|
||||
PcloudStimulusProducer& pcloudProducer;
|
||||
AsynchronousLoop frameAssemblyResult;
|
||||
StimulusFrame& stimulusFrame;
|
||||
std::optional<std::reference_wrapper<StimulusFrame>> intensityStimFrame;
|
||||
|
||||
public:
|
||||
ProduceFrameReq(
|
||||
@@ -392,8 +393,26 @@ public:
|
||||
|
||||
context->frameAssemblyResult = loop;
|
||||
|
||||
// Check if intensity buffer is attached and acquire frame if so
|
||||
if (pcloudProducer.intensityStimulusBuffer)
|
||||
{
|
||||
size_t intensityRingbuffIndex = pcloudProducer
|
||||
.intensityStimulusBuffer->ringBuffer.getIndexToProduceInto();
|
||||
|
||||
StimulusFrame& intensityStimFrame = pcloudProducer
|
||||
.intensityStimulusBuffer->ringBuffer.getDataAtSlot(
|
||||
intensityRingbuffIndex);
|
||||
|
||||
intensityStimFrame.lock.writeAcquire();
|
||||
context->intensityStimFrame = std::make_optional(
|
||||
std::ref(intensityStimFrame));
|
||||
}
|
||||
else {
|
||||
context->intensityStimFrame = std::nullopt;
|
||||
}
|
||||
|
||||
pcloudProducer.openClCollatingAndMeshingEngine.compactCollateAndMeshFrameReq(
|
||||
loop, stimulusFrame,
|
||||
loop, stimulusFrame, context->intensityStimFrame,
|
||||
{context, std::bind(
|
||||
&ProduceFrameReq::produceFrameReq3_compactCollateDone,
|
||||
context.get(), context,
|
||||
@@ -404,6 +423,11 @@ public:
|
||||
[[maybe_unused]] std::shared_ptr<ProduceFrameReq> context,
|
||||
bool success, StimulusFrame& /*stimulusFrame*/)
|
||||
{
|
||||
// Release intensity frame if it was used
|
||||
if (context->intensityStimFrame.has_value()) {
|
||||
context->intensityStimFrame->get().lock.writeRelease();
|
||||
}
|
||||
|
||||
SpinLock::Guard lock(pcloudProducer.shouldContinueLock);
|
||||
if (!pcloudProducer.shouldContinue)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user