Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /**
  2.  * \file format_utils.h
  3.  * A collection of format conversion utility functions.
  4.  */
  5.  
  6. /*
  7.  * Mesa 3-D graphics library
  8.  *
  9.  * Copyright (C) 1999-2006  Brian Paul  All Rights Reserved.
  10.  * Copyright (C) 2014  Intel Corporation  All Rights Reserved.
  11.  *
  12.  * Permission is hereby granted, free of charge, to any person obtaining a
  13.  * copy of this software and associated documentation files (the "Software"),
  14.  * to deal in the Software without restriction, including without limitation
  15.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  16.  * and/or sell copies of the Software, and to permit persons to whom the
  17.  * Software is furnished to do so, subject to the following conditions:
  18.  *
  19.  * The above copyright notice and this permission notice shall be included
  20.  * in all copies or substantial portions of the Software.
  21.  *
  22.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  23.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  24.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  25.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  26.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  27.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  28.  * OTHER DEALINGS IN THE SOFTWARE.
  29.  */
  30.  
  31. #ifndef FORMAT_UTILS_H
  32. #define FORMAT_UTILS_H
  33.  
  34. #include "imports.h"
  35. #include "macros.h"
  36.  
  37. extern const mesa_array_format RGBA32_FLOAT;
  38. extern const mesa_array_format RGBA8_UBYTE;
  39. extern const mesa_array_format RGBA32_UINT;
  40. extern const mesa_array_format RGBA32_INT;
  41.  
  42. /* Only guaranteed to work for BITS <= 32 */
  43. #define MAX_UINT(BITS) ((BITS) == 32 ? UINT32_MAX : ((1u << (BITS)) - 1))
  44. #define MAX_INT(BITS) ((int)MAX_UINT((BITS) - 1))
  45. #define MIN_INT(BITS) ((BITS) == 32 ? INT32_MIN : (-(1 << (BITS - 1))))
  46.  
  47. /* Extends an integer of size SRC_BITS to one of size DST_BITS linearly */
  48. #define EXTEND_NORMALIZED_INT(X, SRC_BITS, DST_BITS) \
  49.       (((X) * (int)(MAX_UINT(DST_BITS) / MAX_UINT(SRC_BITS))) + \
  50.        ((DST_BITS % SRC_BITS) ? ((X) >> (SRC_BITS - DST_BITS % SRC_BITS)) : 0))
  51.  
  52. static inline float
  53. _mesa_unorm_to_float(unsigned x, unsigned src_bits)
  54. {
  55.    return x * (1.0f / (float)MAX_UINT(src_bits));
  56. }
  57.  
  58. static inline float
  59. _mesa_snorm_to_float(int x, unsigned src_bits)
  60. {
  61.    if (x <= -MAX_INT(src_bits))
  62.       return -1.0f;
  63.    else
  64.       return x * (1.0f / (float)MAX_INT(src_bits));
  65. }
  66.  
  67. static inline uint16_t
  68. _mesa_unorm_to_half(unsigned x, unsigned src_bits)
  69. {
  70.    return _mesa_float_to_half(_mesa_unorm_to_float(x, src_bits));
  71. }
  72.  
  73. static inline uint16_t
  74. _mesa_snorm_to_half(int x, unsigned src_bits)
  75. {
  76.    return _mesa_float_to_half(_mesa_snorm_to_float(x, src_bits));
  77. }
  78.  
  79. static inline unsigned
  80. _mesa_float_to_unorm(float x, unsigned dst_bits)
  81. {
  82.    if (x < 0.0f)
  83.       return 0;
  84.    else if (x > 1.0f)
  85.       return MAX_UINT(dst_bits);
  86.    else
  87.       return F_TO_I(x * MAX_UINT(dst_bits));
  88. }
  89.  
  90. static inline unsigned
  91. _mesa_half_to_unorm(uint16_t x, unsigned dst_bits)
  92. {
  93.    return _mesa_float_to_unorm(_mesa_half_to_float(x), dst_bits);
  94. }
  95.  
  96. static inline unsigned
  97. _mesa_unorm_to_unorm(unsigned x, unsigned src_bits, unsigned dst_bits)
  98. {
  99.    if (src_bits < dst_bits) {
  100.       return EXTEND_NORMALIZED_INT(x, src_bits, dst_bits);
  101.    } else {
  102.       unsigned src_half = (1 << (src_bits - 1)) - 1;
  103.  
  104.       if (src_bits + dst_bits > sizeof(x) * 8) {
  105.          assert(src_bits + dst_bits <= sizeof(uint64_t) * 8);
  106.          return (((uint64_t) x * MAX_UINT(dst_bits) + src_half) /
  107.                  MAX_UINT(src_bits));
  108.       } else {
  109.          return (x * MAX_UINT(dst_bits) + src_half) / MAX_UINT(src_bits);
  110.       }
  111.    }
  112. }
  113.  
  114. static inline unsigned
  115. _mesa_snorm_to_unorm(int x, unsigned src_bits, unsigned dst_bits)
  116. {
  117.    if (x < 0)
  118.       return 0;
  119.    else
  120.       return _mesa_unorm_to_unorm(x, src_bits - 1, dst_bits);
  121. }
  122.  
  123. static inline int
  124. _mesa_float_to_snorm(float x, unsigned dst_bits)
  125. {
  126.    if (x < -1.0f)
  127.       return -MAX_INT(dst_bits);
  128.    else if (x > 1.0f)
  129.       return MAX_INT(dst_bits);
  130.    else
  131.       return F_TO_I(x * MAX_INT(dst_bits));
  132. }
  133.  
  134. static inline int
  135. _mesa_half_to_snorm(uint16_t x, unsigned dst_bits)
  136. {
  137.    return _mesa_float_to_snorm(_mesa_half_to_float(x), dst_bits);
  138. }
  139.  
  140. static inline int
  141. _mesa_unorm_to_snorm(unsigned x, unsigned src_bits, unsigned dst_bits)
  142. {
  143.    return _mesa_unorm_to_unorm(x, src_bits, dst_bits - 1);
  144. }
  145.  
  146. static inline int
  147. _mesa_snorm_to_snorm(int x, unsigned src_bits, unsigned dst_bits)
  148. {
  149.    if (x < -MAX_INT(src_bits))
  150.       return -MAX_INT(dst_bits);
  151.    else if (src_bits < dst_bits)
  152.       return EXTEND_NORMALIZED_INT(x, src_bits - 1, dst_bits - 1);
  153.    else
  154.       return x >> (src_bits - dst_bits);
  155. }
  156.  
  157. static inline unsigned
  158. _mesa_unsigned_to_unsigned(unsigned src, unsigned dst_size)
  159. {
  160.    return MIN2(src, MAX_UINT(dst_size));
  161. }
  162.  
  163. static inline int
  164. _mesa_unsigned_to_signed(unsigned src, unsigned dst_size)
  165. {
  166.    return MIN2(src, (unsigned)MAX_INT(dst_size));
  167. }
  168.  
  169. static inline int
  170. _mesa_signed_to_signed(int src, unsigned dst_size)
  171. {
  172.    return CLAMP(src, MIN_INT(dst_size), MAX_INT(dst_size));
  173. }
  174.  
  175. static inline unsigned
  176. _mesa_signed_to_unsigned(int src, unsigned dst_size)
  177. {
  178.    return CLAMP(src, 0, MAX_UINT(dst_size));
  179. }
  180.  
  181. static inline unsigned
  182. _mesa_float_to_unsigned(float src, unsigned dst_bits)
  183. {
  184.    if (src < 0.0f)
  185.       return 0;
  186.    if (src > (float)MAX_UINT(dst_bits))
  187.        return MAX_UINT(dst_bits);
  188.    return _mesa_signed_to_unsigned(src, dst_bits);
  189. }
  190.  
  191. static inline unsigned
  192. _mesa_float_to_signed(float src, unsigned dst_bits)
  193. {
  194.    if (src < (float)(-MAX_INT(dst_bits)))
  195.       return -MAX_INT(dst_bits);
  196.    if (src > (float)MAX_INT(dst_bits))
  197.        return MAX_INT(dst_bits);
  198.    return _mesa_signed_to_signed(src, dst_bits);
  199. }
  200.  
  201. static inline unsigned
  202. _mesa_half_to_unsigned(uint16_t src, unsigned dst_bits)
  203. {
  204.    if (_mesa_half_is_negative(src))
  205.       return 0;
  206.    return _mesa_unsigned_to_unsigned(_mesa_float_to_half(src), dst_bits);
  207. }
  208.  
  209. static inline unsigned
  210. _mesa_half_to_signed(uint16_t src, unsigned dst_bits)
  211. {
  212.    return _mesa_float_to_signed(_mesa_half_to_float(src), dst_bits);
  213. }
  214.  
  215. bool
  216. _mesa_format_to_array(mesa_format, GLenum *type, int *num_components,
  217.                       uint8_t swizzle[4], bool *normalized);
  218.  
  219. void
  220. _mesa_swizzle_and_convert(void *dst,
  221.                           enum mesa_array_format_datatype dst_type,
  222.                           int num_dst_channels,
  223.                           const void *src,
  224.                           enum mesa_array_format_datatype src_type,
  225.                           int num_src_channels,
  226.                           const uint8_t swizzle[4], bool normalized, int count);
  227.  
  228. bool
  229. _mesa_compute_rgba2base2rgba_component_mapping(GLenum baseFormat, uint8_t *map);
  230.  
  231. void
  232. _mesa_format_convert(void *void_dst, uint32_t dst_format, size_t dst_stride,
  233.                      void *void_src, uint32_t src_format, size_t src_stride,
  234.                      size_t width, size_t height, uint8_t *rebase_swizzle);
  235.  
  236. #endif
  237.