From patchwork Mon Feb 16 13:46:32 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tobias Jakobi X-Patchwork-Id: 5833041 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 19C0E9F373 for ; Mon, 16 Feb 2015 13:47:06 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 49DBF201FA for ; Mon, 16 Feb 2015 13:47:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C92F420145 for ; Mon, 16 Feb 2015 13:47:03 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755302AbbBPNq5 (ORCPT ); Mon, 16 Feb 2015 08:46:57 -0500 Received: from smtp.math.uni-bielefeld.de ([129.70.45.10]:55403 "EHLO smtp.math.uni-bielefeld.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755386AbbBPNq4 (ORCPT ); Mon, 16 Feb 2015 08:46:56 -0500 Received: from chidori.math.uni-bielefeld.de (dhcp24-141.math.uni-bielefeld.de [129.70.24.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by smtp.math.uni-bielefeld.de (Postfix) with ESMTPSA id 57DED60F17; Mon, 16 Feb 2015 14:46:55 +0100 (CET) From: Tobias Jakobi To: linux-samsung-soc@vger.kernel.org Cc: dri-devel@lists.freedesktop.org, jy0922.shim@samsung.com, m.szyprowski@samsung.com, djkurtz@chromium.org, robclark@freedesktop.org, Tobias Jakobi Subject: [PATCH v2 02/15] exynos: replace G2D_DOUBLE_TO_FIXED macro with function Date: Mon, 16 Feb 2015 14:46:32 +0100 Message-Id: <1424094405-6314-3-git-send-email-tjakobi@math.uni-bielefeld.de> X-Mailer: git-send-email 2.0.5 In-Reply-To: <1424094405-6314-1-git-send-email-tjakobi@math.uni-bielefeld.de> References: <1424094405-6314-1-git-send-email-tjakobi@math.uni-bielefeld.de> Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This also avoids the floating point conversion steps and just uses pure integer arithmetic. Since the G2D hardware scaling approach is a bit unintuitive, document it in the function as well. v2: Explicitly mention the normalization constant. Signed-off-by: Tobias Jakobi --- exynos/exynos_fimg2d.c | 20 +++++++++++++++----- exynos/fimg2d.h | 2 -- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/exynos/exynos_fimg2d.c b/exynos/exynos_fimg2d.c index ce1ba1e..037021a 100644 --- a/exynos/exynos_fimg2d.c +++ b/exynos/exynos_fimg2d.c @@ -41,6 +41,16 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) +static unsigned int g2d_get_scaling(unsigned int src, unsigned int dst) +{ + /* The G2D hw scaling factor is a normalized inverse of the scaling factor. * + * For example: When source width is 100 and destination width is 200 * + * (scaling of 2x), then the hw factor is NC * 100 / 200. * + * The normalization factor (NC) is 2^16 = 0x10000. */ + + return ((src << 16) / dst); +} + static unsigned int g2d_get_blend_op(enum e_g2d_op op) { union g2d_blend_func_val val; @@ -428,7 +438,7 @@ g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src, union g2d_rop4_val rop4; union g2d_point_val pt; unsigned int scale; - double scale_x = 0.0f, scale_y = 0.0f; + unsigned int scale_x, scale_y; g2d_add_cmd(ctx, DST_SELECT_REG, G2D_SELECT_MODE_BGCOLOR); g2d_add_cmd(ctx, DST_COLOR_MODE_REG, dst->color_mode); @@ -454,8 +464,8 @@ g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src, scale = 0; else { scale = 1; - scale_x = (double)src_w / (double)dst_w; - scale_y = (double)src_h / (double)dst_h; + scale_x = g2d_get_scaling(src_w, dst_w); + scale_y = g2d_get_scaling(src_h, dst_h); } if (src_x + src_w > src->width) @@ -487,8 +497,8 @@ g2d_copy_with_scale(struct g2d_context *ctx, struct g2d_image *src, if (scale) { g2d_add_cmd(ctx, SRC_SCALE_CTRL_REG, G2D_SCALE_MODE_BILINEAR); - g2d_add_cmd(ctx, SRC_XSCALE_REG, G2D_DOUBLE_TO_FIXED(scale_x)); - g2d_add_cmd(ctx, SRC_YSCALE_REG, G2D_DOUBLE_TO_FIXED(scale_y)); + g2d_add_cmd(ctx, SRC_XSCALE_REG, scale_x); + g2d_add_cmd(ctx, SRC_YSCALE_REG, scale_y); } pt.val = 0; diff --git a/exynos/fimg2d.h b/exynos/fimg2d.h index 4785e2f..8e0321c 100644 --- a/exynos/fimg2d.h +++ b/exynos/fimg2d.h @@ -25,8 +25,6 @@ #define G2D_MAX_CMD_LIST_NR 64 #define G2D_PLANE_MAX_NR 2 -#define G2D_DOUBLE_TO_FIXED(d) ((unsigned int)((d) * 65536.0)) - enum e_g2d_color_mode { /* COLOR FORMAT */ G2D_COLOR_FMT_XRGB8888,