On 05/06/2015 10:36 PM, Tobias Jakobi wrote:
This updates the blending setup when the layer configuration changes (triggered by mixer_win_{commit,disable}).
Extra care has to be taken for the layer that is currently being enabled/disabled.
Signed-off-by: Tobias Jakobi tjakobi@math.uni-bielefeld.de
drivers/gpu/drm/exynos/exynos_mixer.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 3ab7a01..430d10c 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c @@ -177,6 +177,18 @@ static inline bool is_alpha_format(const struct mixer_context* ctx, unsigned int } }
+static inline unsigned int layer_bitmask(const struct mixer_context* ctx) +{
- unsigned int i, mask = 0;
- for (i = 0; i < MIXER_WIN_NR; ++i) {
if (ctx->planes[i].enabled)
mask |= (1 << i);
- }
- return mask;
+}
static inline u32 vp_reg_read(struct mixer_resources *res, u32 reg_id) { return readl(res->vp_regs + reg_id); @@ -513,6 +525,7 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, bool enable) { struct mixer_resources *res = &ctx->mixer_res;
unsigned int enable_state; u32 val = enable ? ~0 : 0;
switch (win) {
@@ -530,6 +543,16 @@ static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win, bool en } break; }
- /* Determine the current enabled/disabled state of the layers. */
- enable_state = layer_bitmask(ctx);
- if (enable)
enable_state |= (1 << win);
- else
enable_state &= ~(1 << win);
I think way to remove to get enable_state of plane everytime, maybe using atomic state information?
- /* Layer configuration has changed, update blending setup. */
- mixer_layer_blending(ctx, enable_state);
}
static void mixer_run(struct mixer_context *ctx)