171 bool is_signed = SourceFormat::is_signed(value);
172 uint32_t mantissa = SourceFormat::get_mantissa(value);
173 int32_t exponent = SourceFormat::get_exponent(value);
175 const bool is_nan = (exponent == SourceFormat::EXPONENT_SPECIAL_MASK) && mantissa;
176 const bool is_inf = (exponent == SourceFormat::EXPONENT_SPECIAL_MASK) && (mantissa == 0);
177 const bool is_zero = (exponent == 0 && mantissa == 0);
180 if constexpr (!DestinationFormat::HAS_SIGN && ClampNegativeToZero) {
181 if (is_signed && !is_nan) {
190 exponent = DestinationFormat::EXPONENT_SPECIAL_MASK;
193 exponent = DestinationFormat::EXPONENT_SPECIAL_MASK;
194 mantissa = DestinationFormat::MANTISSA_NAN_MASK;
198 exponent -= SourceFormat::EXPONENT_BIAS;
200 if constexpr (SourceFormat::EXPONENT_LEN > DestinationFormat::EXPONENT_LEN) {
201 if (exponent > DestinationFormat::EXPONENT_BIAS) {
203 mantissa = SourceFormat::MANTISSA_MASK;
205 else if (exponent < -DestinationFormat::EXPONENT_BIAS) {
209 exponent += DestinationFormat::EXPONENT_BIAS;
212 if constexpr (SourceFormat::MANTISSA_LEN > DestinationFormat::MANTISSA_LEN) {
213 mantissa = mantissa >> (SourceFormat::MANTISSA_LEN - DestinationFormat::MANTISSA_LEN);
215 else if constexpr (SourceFormat::MANTISSA_LEN < DestinationFormat::MANTISSA_LEN) {
216 mantissa = mantissa << (DestinationFormat::MANTISSA_LEN - SourceFormat::MANTISSA_LEN);
221 result = DestinationFormat::set_sign(is_signed,
result);
222 result = DestinationFormat::set_exponent(exponent,
result);
223 result = DestinationFormat::set_mantissa(mantissa,
result);
void convert_host_to_device(void *dst_buffer, const void *src_buffer, size_t buffer_size, eGPUDataFormat host_format, TextureFormat host_texture_format, TextureFormat device_format)
void convert_device_to_host(void *dst_buffer, const void *src_buffer, size_t buffer_size, eGPUDataFormat host_format, TextureFormat host_texture_format, TextureFormat device_format)