drm_format_internal.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* SPDX-License-Identifier: GPL-2.0 or MIT */
  2. #ifndef DRM_FORMAT_INTERNAL_H
  3. #define DRM_FORMAT_INTERNAL_H
  4. #include <linux/bits.h>
  5. #include <linux/types.h>
  6. #include <linux/swab.h>
  7. /*
  8. * Each pixel-format conversion helper takes a raw pixel in a
  9. * specific input format and returns a raw pixel in a specific
  10. * output format. All pixels are in little-endian byte order.
  11. *
  12. * Function names are
  13. *
  14. * drm_pixel_<input>_to_<output>_<algorithm>()
  15. *
  16. * where <input> and <output> refer to pixel formats. The
  17. * <algorithm> is optional and hints to the method used for the
  18. * conversion. Helpers with no algorithm given apply pixel-bit
  19. * shifting.
  20. *
  21. * The argument type is u32. We expect this to be wide enough to
  22. * hold all conversion input from 32-bit RGB to any output format.
  23. * The Linux kernel should avoid format conversion for anything
  24. * but XRGB8888 input data. Converting from other format can still
  25. * be acceptable in some cases.
  26. *
  27. * The return type is u32. It is wide enough to hold all conversion
  28. * output from XRGB8888. For output formats wider than 32 bit, a
  29. * return type of u64 would be acceptable.
  30. */
  31. /*
  32. * Conversions from XRGB8888
  33. */
  34. static inline u32 drm_pixel_xrgb8888_to_r8_bt601(u32 pix)
  35. {
  36. u32 r = (pix & 0x00ff0000) >> 16;
  37. u32 g = (pix & 0x0000ff00) >> 8;
  38. u32 b = pix & 0x000000ff;
  39. /* ITU-R BT.601: Y = 0.299 R + 0.587 G + 0.114 B */
  40. return (77 * r + 150 * g + 29 * b) / 256;
  41. }
  42. static inline u32 drm_pixel_xrgb8888_to_rgb332(u32 pix)
  43. {
  44. return ((pix & 0x00e00000) >> 16) |
  45. ((pix & 0x0000e000) >> 11) |
  46. ((pix & 0x000000c0) >> 6);
  47. }
  48. static inline u32 drm_pixel_xrgb8888_to_rgb565(u32 pix)
  49. {
  50. return ((pix & 0x00f80000) >> 8) |
  51. ((pix & 0x0000fc00) >> 5) |
  52. ((pix & 0x000000f8) >> 3);
  53. }
  54. static inline u32 drm_pixel_xrgb8888_to_rgb565be(u32 pix)
  55. {
  56. return swab16(drm_pixel_xrgb8888_to_rgb565(pix));
  57. }
  58. static inline u32 drm_pixel_xrgb8888_to_rgbx5551(u32 pix)
  59. {
  60. return ((pix & 0x00f80000) >> 8) |
  61. ((pix & 0x0000f800) >> 5) |
  62. ((pix & 0x000000f8) >> 2);
  63. }
  64. static inline u32 drm_pixel_xrgb8888_to_rgba5551(u32 pix)
  65. {
  66. return drm_pixel_xrgb8888_to_rgbx5551(pix) |
  67. BIT(0); /* set alpha bit */
  68. }
  69. static inline u32 drm_pixel_xrgb8888_to_xrgb1555(u32 pix)
  70. {
  71. return ((pix & 0x00f80000) >> 9) |
  72. ((pix & 0x0000f800) >> 6) |
  73. ((pix & 0x000000f8) >> 3);
  74. }
  75. static inline u32 drm_pixel_xrgb8888_to_argb1555(u32 pix)
  76. {
  77. return BIT(15) | /* set alpha bit */
  78. drm_pixel_xrgb8888_to_xrgb1555(pix);
  79. }
  80. static inline u32 drm_pixel_xrgb8888_to_rgb888(u32 pix)
  81. {
  82. return pix & GENMASK(23, 0);
  83. }
  84. static inline u32 drm_pixel_xrgb8888_to_bgr888(u32 pix)
  85. {
  86. return ((pix & 0x00ff0000) >> 16) |
  87. ((pix & 0x0000ff00)) |
  88. ((pix & 0x000000ff) << 16);
  89. }
  90. static inline u32 drm_pixel_xrgb8888_to_argb8888(u32 pix)
  91. {
  92. return GENMASK(31, 24) | /* fill alpha bits */
  93. pix;
  94. }
  95. static inline u32 drm_pixel_xrgb8888_to_xbgr8888(u32 pix)
  96. {
  97. return ((pix & 0xff000000)) | /* also copy filler bits */
  98. ((pix & 0x00ff0000) >> 16) |
  99. ((pix & 0x0000ff00)) |
  100. ((pix & 0x000000ff) << 16);
  101. }
  102. static inline u32 drm_pixel_xrgb8888_to_bgrx8888(u32 pix)
  103. {
  104. return ((pix & 0xff000000) >> 24) | /* also copy filler bits */
  105. ((pix & 0x00ff0000) >> 8) |
  106. ((pix & 0x0000ff00) << 8) |
  107. ((pix & 0x000000ff) << 24);
  108. }
  109. static inline u32 drm_pixel_xrgb8888_to_abgr8888(u32 pix)
  110. {
  111. return GENMASK(31, 24) | /* fill alpha bits */
  112. drm_pixel_xrgb8888_to_xbgr8888(pix);
  113. }
  114. static inline u32 drm_pixel_xrgb8888_to_xrgb2101010(u32 pix)
  115. {
  116. pix = ((pix & 0x000000ff) << 2) |
  117. ((pix & 0x0000ff00) << 4) |
  118. ((pix & 0x00ff0000) << 6);
  119. return pix | ((pix >> 8) & 0x00300c03);
  120. }
  121. static inline u32 drm_pixel_xrgb8888_to_argb2101010(u32 pix)
  122. {
  123. return GENMASK(31, 30) | /* set alpha bits */
  124. drm_pixel_xrgb8888_to_xrgb2101010(pix);
  125. }
  126. static inline u32 drm_pixel_xrgb8888_to_xbgr2101010(u32 pix)
  127. {
  128. pix = ((pix & 0x00ff0000) >> 14) |
  129. ((pix & 0x0000ff00) << 4) |
  130. ((pix & 0x000000ff) << 22);
  131. return pix | ((pix >> 8) & 0x00300c03);
  132. }
  133. static inline u32 drm_pixel_xrgb8888_to_abgr2101010(u32 pix)
  134. {
  135. return GENMASK(31, 30) | /* set alpha bits */
  136. drm_pixel_xrgb8888_to_xbgr2101010(pix);
  137. }
  138. /*
  139. * Conversion from ARGB8888
  140. */
  141. static inline u32 drm_pixel_argb8888_to_argb4444(u32 pix)
  142. {
  143. return ((pix & 0xf0000000) >> 16) |
  144. ((pix & 0x00f00000) >> 12) |
  145. ((pix & 0x0000f000) >> 8) |
  146. ((pix & 0x000000f0) >> 4);
  147. }
  148. #endif