OClCollMeshEngn: Produce ambience count; set postrin threshold

We modify the semantics/meaning of the ambience stim feature.
It now represents the number of frames whose average intensity
is below the ambienceLowVal.

We can now implement the postrin as the event wherein the number
of frames whose intensity <= ambienceLowVal exceeds
postrin-interest-threshold.
This commit is contained in:
2025-11-28 00:12:18 -04:00
parent 5b19a70c75
commit 280b6f7d1c
7 changed files with 300 additions and 163 deletions
+44 -28
View File
@@ -25,8 +25,7 @@ __kernel void collate(
__global uchar* assembly,
__global float* collation,
__global float* intensityBuffer,
__global uint* ambienceBuffer,
uint ambienceHighVal,
__global float* averageIntensityBuffer,
uint slotStride,
uint nPointsPerSlot,
uint nDgramsPerFrame)
@@ -55,8 +54,9 @@ __kernel void collate(
uint intensityBaseOffset = slotIndex * nPointsPerSlot;
DBG_PRINTF("Running kernel: about to process points in slot.\n");
// Initialize ambience counter for this work item
uint ambienceCount = 0;
// Initialize running average calculation for this work item
float intensitySum = 0.0f;
uint validPointCount = 0;
// Process based on data type using nested ifs (outer) with loops (inner)
if (dataType == 0)
@@ -97,9 +97,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + i] = intensity;
}
// Count high intensity values for ambience buffer
if (intensity >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x == 0.0f && y == 0.0f && z == 0.0f))
{
intensitySum += intensity;
++validPointCount;
}
// Don't write intensity to collation buffer
}
@@ -143,9 +145,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + i] = intensity;
}
// Count high intensity values for ambience buffer
if (intensity >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x == 0.0f && y == 0.0f && z == 0.0f))
{
intensitySum += intensity;
++validPointCount;
}
// Don't write intensity to collation buffer
}
@@ -190,9 +194,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + pointIndex] = intensity1;
}
// Count high intensity values for ambience buffer
if (intensity1 >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x1 == 0.0f && y1 == 0.0f && z1 == 0.0f))
{
intensitySum += intensity1;
++validPointCount;
}
// Don't write intensity to collation buffer
++pointIndex;
@@ -225,9 +231,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + pointIndex] = intensity2;
}
// Count high intensity values for ambience buffer
if (intensity2 >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x2 == 0.0f && y2 == 0.0f && z2 == 0.0f))
{
intensitySum += intensity2;
++validPointCount;
}
// Don't write intensity to collation buffer
++pointIndex;
@@ -273,9 +281,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + pointIndex] = intensity1;
}
// Count high intensity values for ambience buffer
if (intensity1 >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x1 == 0.0f && y1 == 0.0f && z1 == 0.0f))
{
intensitySum += intensity1;
++validPointCount;
}
// Don't write intensity to collation buffer
++pointIndex;
@@ -308,9 +318,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + pointIndex] = intensity2;
}
// Count high intensity values for ambience buffer
if (intensity2 >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x2 == 0.0f && y2 == 0.0f && z2 == 0.0f))
{
intensitySum += intensity2;
++validPointCount;
}
// Don't write intensity to collation buffer
++pointIndex;
@@ -343,9 +355,11 @@ __kernel void collate(
if (intensityBuffer != NULL) {
intensityBuffer[intensityBaseOffset + pointIndex] = intensity3;
}
// Count high intensity values for ambience buffer
if (intensity3 >= (float)ambienceHighVal) {
++ambienceCount;
// Accumulate intensity for average calculation (exclude points where XYZ=0)
if (!(x3 == 0.0f && y3 == 0.0f && z3 == 0.0f))
{
intensitySum += intensity3;
++validPointCount;
}
// Don't write intensity to collation buffer
++pointIndex;
@@ -353,8 +367,10 @@ __kernel void collate(
}
// Unsupported data types are silently ignored
// Write ambience count for this work item (once at the end)
if (ambienceBuffer != NULL) {
ambienceBuffer[slotIndex] = ambienceCount;
// Write average intensity for this work item (once at the end)
if (averageIntensityBuffer != NULL)
{
averageIntensityBuffer[slotIndex] = (validPointCount > 0) ?
(intensitySum / (float)validPointCount) : 0.0f;
}
}