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 | 63497 | if (exponent == 0) { | |
| 13 | 2052 | return asfloat(sign | asuint(float(mantissa) / 16777216.0f)); | |
| 14 | } | ||
| 15 | 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 | 63764 | const uint bits = asuint(value); | |
| 23 | 63764 | const uint sign = (bits >> 16) & 0x8000; | |
| 24 | 63764 | const uint magnitude = bits & 0x7FFFFFFF; | |
| 25 | 63764 | if (magnitude >= 0x7F800000) { | |
| 26 | 5 | return sign | 0x7C00 | (magnitude > 0x7F800000 ? 0x200u : 0u); | |
| 27 | } | ||
| 28 | 63761 | if (magnitude >= 0x477FF000) { | |
| 29 | 2 | return sign | 0x7C00; | |
| 30 | } | ||
| 31 | 63759 | if (magnitude < 0x38800000) { | |
| 32 | 2074 | const uint exponent = magnitude >> 23; | |
| 33 | 2074 | const uint shift = 126 - exponent; | |
| 34 | 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 | 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 | 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 | 14349152 | const float c = clamp(linear, 0.0f, 1.0f); | |
| 56 | 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 | 6292279 | return uint(floor(clamp(value, 0.0f, 1.0f) * 255 + 0.5f)); | |
| 61 | } | ||
| 62 | |||
| 63 | } | ||
| 64 |