chrono_batch_render/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
38 / 38
100.0%
Branches:
30 / 30
100.0%
Functions:
5 / 5
100.0%

io/kernels/encoding.h
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 #pragma once
3
4 #include "chrono_batch_render/device/kernels/shared.h"
5
6 namespace chrono::batch_render {
7
8 63498 CHRONO_BATCH_RENDER_SHARED float HalfToFloat(uint bits) {
9 63498 const uint sign = (bits & 0x8000) << 16;
10 63498 const uint exponent = (bits >> 10) & 0x1F;
11 63498 const uint mantissa = bits & 0x3FF;
12
2/2
✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 61445 times.
63497 if (exponent == 0) {
13 2052 return asfloat(sign | asuint(float(mantissa) / 16777216.0f));
14 }
15
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 61443 times.
61445 if (exponent == 31) {
16 3 return asfloat(sign | 0x7F800000 | (mantissa << 13));
17 }
18 61443 return asfloat(sign | ((exponent + 112) << 23) | (mantissa << 13));
19 }
20
21 63764 CHRONO_BATCH_RENDER_SHARED uint FloatToHalf(float value) {
22
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 63761 times.
63764 const uint bits = asuint(value);
23 63764 const uint sign = (bits >> 16) & 0x8000;
24 63764 const uint magnitude = bits & 0x7FFFFFFF;
25
2/2
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 63761 times.
63764 if (magnitude >= 0x7F800000) {
26
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
5 return sign | 0x7C00 | (magnitude > 0x7F800000 ? 0x200u : 0u);
27 }
28
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 63759 times.
63761 if (magnitude >= 0x477FF000) {
29 2 return sign | 0x7C00;
30 }
31
2/2
✓ Branch 0 taken 2074 times.
✓ Branch 1 taken 61685 times.
63759 if (magnitude < 0x38800000) {
32 2074 const uint exponent = magnitude >> 23;
33 2074 const uint shift = 126 - exponent;
34
2/2
✓ Branch 0 taken 2052 times.
✓ Branch 1 taken 22 times.
2074 if (shift > 24) {
35 return sign;
36 }
37 2052 const uint mantissa = (magnitude & 0x7FFFFF) | 0x800000;
38 2052 uint half = mantissa >> shift;
39 2052 const uint rest = mantissa & ((1u << shift) - 1);
40 2052 const uint midway = 1u << (shift - 1);
41
6/6
✓ Branch 0 taken 2051 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 2049 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 1 time.
2052 if (rest > midway || (rest == midway && (half & 1) != 0)) {
42 2 half += 1;
43 }
44 2052 return sign | half;
45 }
46 61685 const uint rounded = magnitude + 0xFFF + ((magnitude >> 13) & 1);
47 61685 return sign | ((rounded - 0x38000000) >> 13);
48 }
49
50 36 CHRONO_BATCH_RENDER_SHARED float DecodeSrgb(float encoded) {
51
2/2
✓ Branch 0 taken 7 times.
✓ Branch 1 taken 29 times.
38 return encoded <= 0.04045f ? encoded / 12.92f : pow((encoded + 0.055f) / 1.055f, 2.4f);
52 }
53
54 14349152 CHRONO_BATCH_RENDER_SHARED float EncodeSrgb(float linear) {
55
2/2
✓ Branch 0 taken 126595 times.
✓ Branch 1 taken 14222557 times.
14349152 const float c = clamp(linear, 0.0f, 1.0f);
56
2/2
✓ Branch 0 taken 9302544 times.
✓ Branch 1 taken 5046608 times.
14349152 return c <= 0.0031308f ? 12.92f * c : 1.055f * pow(c, 1 / 2.4f) - 0.055f;
57 }
58
59 6292279 CHRONO_BATCH_RENDER_SHARED uint EncodeUnorm8(float value) {
60
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 6292278 times.
6292279 return uint(floor(clamp(value, 0.0f, 1.0f) * 255 + 0.5f));
61 }
62
63 }
64