@@ -85,7 +85,15 @@ struct ClusterNative {
8585 }
8686
8787 GPUd () uint16_t getQmax () const { return qMax; }
88- GPUd () uint16_t getQtot () const { return qTot; }
88+ GPUd () uint16_t getQtot () const
89+ {
90+ if (isSaturated ()) [[unlikely]] {
91+ // Check for overflow, so return type can stay uint16
92+ auto sqtot = getSaturatedQtot ();
93+ return sqtot <= UINT16_MAX ? sqtot : UINT16_MAX;
94+ }
95+ return qTot;
96+ }
8997 GPUd () uint8_t getFlags () const { return timeFlagsPacked >> 24 ; }
9098 GPUd () uint32_t getTimePacked () const { return timeFlagsPacked & 0xFFFFFF ; }
9199 GPUd () void setTimePackedFlags (uint32_t timePacked, uint8_t flags)
@@ -121,7 +129,13 @@ struct ClusterNative {
121129 // / Y = (12.4 - 0.5 * (66 - 1)) * 4.16mm = -83.616mm
122130 GPUd () float getPad () const { return unpackPad (padPacked); }
123131 GPUd () void setPad (float pad) { padPacked = packPad (pad); }
124- GPUd () float getSigmaTime () const { return float (sigmaTimePacked) * (1 .f / scaleSigmaTimePacked); }
132+ GPUd () float getSigmaTime () const
133+ {
134+ if (isSaturated ()) [[unlikely]] {
135+ return 0 ;
136+ }
137+ return float (sigmaTimePacked) * (1 .f / scaleSigmaTimePacked);
138+ }
125139 GPUd () void setSigmaTime (float sigmaTime)
126140 {
127141 uint32_t tmp = sigmaTime * scaleSigmaTimePacked + 0.5 ;
@@ -147,7 +161,7 @@ struct ClusterNative {
147161 if (qtot > maxSaturatedQTot) {
148162 qtot = maxSaturatedQTot;
149163 }
150- this ->qTot = qtot / scaleSaturatedQTot;
164+ this ->qTot = ( qtot + scaleSaturatedQTot / 2 ) / scaleSaturatedQTot;
151165 }
152166
153167 GPUd () uint32_t getSaturatedQtot () const
0 commit comments