950-0650-drm-vc4-Add-alpha_blend_mode-property-to-each-plane.patch 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. From 7760958a0fb50b0e20f88e220f55798ec154c41e Mon Sep 17 00:00:00 2001
  2. From: Dave Stevenson <[email protected]>
  3. Date: Sat, 8 Jan 2022 13:24:10 +0000
  4. Subject: [PATCH] drm/vc4: Add alpha_blend_mode property to each plane.
  5. Move from only supporting the default of pre-multiplied
  6. alpha to supporting user specified blend mode using the
  7. standardised property.
  8. Signed-off-by: Dave Stevenson <[email protected]>
  9. ---
  10. drivers/gpu/drm/vc4/vc4_plane.c | 62 ++++++++++++++++++++++++++-------
  11. 1 file changed, 49 insertions(+), 13 deletions(-)
  12. --- a/drivers/gpu/drm/vc4/vc4_plane.c
  13. +++ b/drivers/gpu/drm/vc4/vc4_plane.c
  14. @@ -666,6 +666,48 @@ static const u32 colorspace_coeffs[2][DR
  15. }
  16. };
  17. +static u32 vc4_hvs4_get_alpha_blend_mode(struct drm_plane_state *state)
  18. +{
  19. + if (!state->fb->format->has_alpha)
  20. + return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED,
  21. + SCALER_POS2_ALPHA_MODE);
  22. +
  23. + switch (state->pixel_blend_mode) {
  24. + case DRM_MODE_BLEND_PIXEL_NONE:
  25. + return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_FIXED,
  26. + SCALER_POS2_ALPHA_MODE);
  27. + default:
  28. + case DRM_MODE_BLEND_PREMULTI:
  29. + return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE,
  30. + SCALER_POS2_ALPHA_MODE) |
  31. + SCALER_POS2_ALPHA_PREMULT;
  32. + case DRM_MODE_BLEND_COVERAGE:
  33. + return VC4_SET_FIELD(SCALER_POS2_ALPHA_MODE_PIPELINE,
  34. + SCALER_POS2_ALPHA_MODE);
  35. + }
  36. +}
  37. +
  38. +static u32 vc4_hvs5_get_alpha_blend_mode(struct drm_plane_state *state)
  39. +{
  40. + if (!state->fb->format->has_alpha)
  41. + return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
  42. + SCALER5_CTL2_ALPHA_MODE);
  43. +
  44. + switch (state->pixel_blend_mode) {
  45. + case DRM_MODE_BLEND_PIXEL_NONE:
  46. + return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_FIXED,
  47. + SCALER5_CTL2_ALPHA_MODE);
  48. + default:
  49. + case DRM_MODE_BLEND_PREMULTI:
  50. + return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE,
  51. + SCALER5_CTL2_ALPHA_MODE) |
  52. + SCALER5_CTL2_ALPHA_PREMULT;
  53. + case DRM_MODE_BLEND_COVERAGE:
  54. + return VC4_SET_FIELD(SCALER5_CTL2_ALPHA_MODE_PIPELINE,
  55. + SCALER5_CTL2_ALPHA_MODE);
  56. + }
  57. +}
  58. +
  59. /* Writes out a full display list for an active plane to the plane's
  60. * private dlist state.
  61. */
  62. @@ -948,13 +990,8 @@ static int vc4_plane_mode_set(struct drm
  63. /* Position Word 2: Source Image Size, Alpha */
  64. vc4_state->pos2_offset = vc4_state->dlist_count;
  65. vc4_dlist_write(vc4_state,
  66. - VC4_SET_FIELD(fb->format->has_alpha ?
  67. - SCALER_POS2_ALPHA_MODE_PIPELINE :
  68. - SCALER_POS2_ALPHA_MODE_FIXED,
  69. - SCALER_POS2_ALPHA_MODE) |
  70. (mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
  71. - (fb->format->has_alpha ?
  72. - SCALER_POS2_ALPHA_PREMULT : 0) |
  73. + vc4_hvs4_get_alpha_blend_mode(state) |
  74. VC4_SET_FIELD(vc4_state->src_w[0],
  75. SCALER_POS2_WIDTH) |
  76. VC4_SET_FIELD(vc4_state->src_h[0],
  77. @@ -999,14 +1036,9 @@ static int vc4_plane_mode_set(struct drm
  78. vc4_dlist_write(vc4_state,
  79. VC4_SET_FIELD(state->alpha >> 4,
  80. SCALER5_CTL2_ALPHA) |
  81. - (fb->format->has_alpha ?
  82. - SCALER5_CTL2_ALPHA_PREMULT : 0) |
  83. + vc4_hvs5_get_alpha_blend_mode(state) |
  84. (mix_plane_alpha ?
  85. - SCALER5_CTL2_ALPHA_MIX : 0) |
  86. - VC4_SET_FIELD(fb->format->has_alpha ?
  87. - SCALER5_CTL2_ALPHA_MODE_PIPELINE :
  88. - SCALER5_CTL2_ALPHA_MODE_FIXED,
  89. - SCALER5_CTL2_ALPHA_MODE)
  90. + SCALER5_CTL2_ALPHA_MIX : 0)
  91. );
  92. /* Position Word 1: Scaled Image Dimensions. */
  93. @@ -1496,6 +1528,10 @@ struct drm_plane *vc4_plane_init(struct
  94. drm_plane_helper_add(plane, &vc4_plane_helper_funcs);
  95. drm_plane_create_alpha_property(plane);
  96. + drm_plane_create_blend_mode_property(plane,
  97. + BIT(DRM_MODE_BLEND_PIXEL_NONE) |
  98. + BIT(DRM_MODE_BLEND_PREMULTI) |
  99. + BIT(DRM_MODE_BLEND_COVERAGE));
  100. drm_plane_create_rotation_property(plane, DRM_MODE_ROTATE_0,
  101. DRM_MODE_ROTATE_0 |
  102. DRM_MODE_ROTATE_180 |