35 const void *src_buffer,
56 const void *src_buffer,
113 bool needs_conversion_ =
false;
163 void convert(
void *device_data,
const void *src_data,
const uint vertex_len)
const;
177 void update_conversion_flags(
const GPUVertFormat &vertex_format,
179 void update_conversion_flags(
const GPUVertAttr &vertex_attribute,
186 void make_device_compatible(
GPUVertAttr &vertex_attribute,
188 bool &needs_repack)
const;
190 void convert_row(
void *device_row_data,
const void *source_row_data)
const;
191 void convert_attribute(
void *device_row_data,
192 const void *source_row_data,
206template<
bool HasSignBit, u
int8_t MantissaBitLen, u
int8_t ExponentBitLen>
254 if constexpr (HasSignBit) {
261 return floating_point_number & ~(1 <<
SIGN_SHIFT);
266 if constexpr (!HasSignBit) {
267 return floating_point_number;
291 typename DestinationFormat,
296 typename SourceFormat,
305 bool ClampNegativeToZero =
true>
308 bool is_signed = SourceFormat::is_signed(value);
309 uint32_t mantissa = SourceFormat::get_mantissa(value);
310 int32_t exponent = SourceFormat::get_exponent(value);
312 const bool is_nan = (exponent == SourceFormat::EXPONENT_SPECIAL_MASK) && mantissa;
313 const bool is_inf = (exponent == SourceFormat::EXPONENT_SPECIAL_MASK) && (mantissa == 0);
314 const bool is_zero = (exponent == 0 && mantissa == 0);
317 if constexpr (!DestinationFormat::HAS_SIGN && ClampNegativeToZero) {
318 if (is_signed && !is_nan) {
327 exponent = DestinationFormat::EXPONENT_SPECIAL_MASK;
330 exponent = DestinationFormat::EXPONENT_SPECIAL_MASK;
331 mantissa = DestinationFormat::MANTISSA_NAN_MASK;
335 exponent -= SourceFormat::EXPONENT_BIAS;
337 if constexpr (SourceFormat::EXPONENT_LEN > DestinationFormat::EXPONENT_LEN) {
338 if (exponent > DestinationFormat::EXPONENT_BIAS) {
340 mantissa = SourceFormat::MANTISSA_MASK;
342 else if (exponent < -DestinationFormat::EXPONENT_BIAS) {
346 exponent += DestinationFormat::EXPONENT_BIAS;
349 if constexpr (SourceFormat::MANTISSA_LEN > DestinationFormat::MANTISSA_LEN) {
350 mantissa = mantissa >> (SourceFormat::MANTISSA_LEN - DestinationFormat::MANTISSA_LEN);
352 else if constexpr (SourceFormat::MANTISSA_LEN < DestinationFormat::MANTISSA_LEN) {
353 mantissa = mantissa << (DestinationFormat::MANTISSA_LEN - SourceFormat::MANTISSA_LEN);
358 result = DestinationFormat::set_sign(is_signed, result);
359 result = DestinationFormat::set_exponent(exponent, result);
360 result = DestinationFormat::set_mantissa(mantissa, result);
ccl_device_inline bool is_zero(const float2 a)
bool conversion_needed(const GPUVertFormat &vertex_format)
void convert_host_to_device(void *dst_buffer, const void *src_buffer, size_t buffer_size, eGPUDataFormat host_format, eGPUTextureFormat host_texture_format, eGPUTextureFormat device_format)
void convert_device_to_host(void *dst_buffer, const void *src_buffer, size_t buffer_size, eGPUDataFormat host_format, eGPUTextureFormat host_texture_format, eGPUTextureFormat device_format)
void convert_in_place(void *data, const GPUVertFormat &vertex_format, const uint vertex_len)
uint32_t convert_float_formats(uint32_t value)