From patchwork Thu Dec 13 14:01:07 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arto Merilainen X-Patchwork-Id: 206099 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 901072C00A5 for ; Fri, 14 Dec 2012 02:07:50 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755693Ab2LMPHt (ORCPT ); Thu, 13 Dec 2012 10:07:49 -0500 Received: from hqemgate03.nvidia.com ([216.228.121.140]:18333 "EHLO hqemgate03.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755609Ab2LMOCS (ORCPT ); Thu, 13 Dec 2012 09:02:18 -0500 Received: from hqnvupgp08.nvidia.com (Not Verified[216.228.121.13]) by hqemgate03.nvidia.com id ; Thu, 13 Dec 2012 06:05:34 -0800 Received: from hqemhub02.nvidia.com ([172.17.108.22]) by hqnvupgp08.nvidia.com (PGP Universal service); Thu, 13 Dec 2012 06:00:25 -0800 X-PGP-Universal: processed; by hqnvupgp08.nvidia.com on Thu, 13 Dec 2012 06:00:25 -0800 Received: from deemhub01.nvidia.com (10.21.69.137) by hqemhub02.nvidia.com (172.20.150.31) with Microsoft SMTP Server (TLS) id 8.3.279.1; Thu, 13 Dec 2012 06:02:06 -0800 Received: from amerilainen-lnx.Nvidia.com (10.21.65.27) by deemhub01.nvidia.com (10.21.69.137) with Microsoft SMTP Server (TLS) id 8.3.279.1; Thu, 13 Dec 2012 15:02:02 +0100 From: =?UTF-8?q?Arto=20Meril=C3=A4inen?= To: , , CC: , , Subject: [RFC,libdrm 2/3] tegra: Add 2d library Date: Thu, 13 Dec 2012 16:01:07 +0200 Message-ID: <1355407268-32381-3-git-send-email-amerilainen@nvidia.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1355407268-32381-1-git-send-email-amerilainen@nvidia.com> References: <1355407268-32381-1-git-send-email-amerilainen@nvidia.com> X-NVConfidentiality: public MIME-Version: 1.0 Sender: linux-tegra-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-tegra@vger.kernel.org From: Francis Hart This patch introduces a simple 2d library on top of stream library. Signed-off-by: Francis Hart --- tegra/2d/hw_gr2d.h | 2614 ++++++++++++++++++++++++++++++++++++++++++ tegra/2d/tegra_2d_api.c | 235 ++++ tegra/2d/tegra_2d_color.c | 412 +++++++ tegra/2d/tegra_2d_color.h | 51 + tegra/2d/tegra_2d_context.c | 140 +++ tegra/2d/tegra_2d_context.h | 67 ++ tegra/2d/tegra_2d_copy.c | 209 ++++ tegra/2d/tegra_2d_copy.h | 38 + tegra/2d/tegra_2d_fill.c | 136 +++ tegra/2d/tegra_2d_fill.h | 36 + tegra/2d/tegra_2d_frcopy.c | 274 +++++ tegra/2d/tegra_2d_frcopy.h | 85 ++ tegra/2d/tegra_2d_g2copy.c | 272 +++++ tegra/2d/tegra_2d_g2copy.h | 88 ++ tegra/2d/tegra_2d_g2fill.c | 192 ++++ tegra/2d/tegra_2d_g2fill.h | 80 ++ tegra/2d/tegra_2d_reg_g2sb.h | 89 ++ tegra/2d/tegra_2d_reg_host.h | 119 ++ tegra/2d/tegra_2d_sbcopy.c | 388 +++++++ tegra/2d/tegra_2d_sbcopy.h | 94 ++ tegra/2d/tegra_2d_surface.c | 280 +++++ tegra/2d/tegra_2d_surface.h | 57 + tegra/2d/tegra_2d_util.c | 145 +++ tegra/2d/tegra_2d_util.h | 89 ++ tegra/Makefile.am | 13 +- tegra/tegra_2d.h | 223 ++++ 26 files changed, 6425 insertions(+), 1 deletion(-) create mode 100644 tegra/2d/hw_gr2d.h create mode 100644 tegra/2d/tegra_2d_api.c create mode 100644 tegra/2d/tegra_2d_color.c create mode 100644 tegra/2d/tegra_2d_color.h create mode 100644 tegra/2d/tegra_2d_context.c create mode 100644 tegra/2d/tegra_2d_context.h create mode 100644 tegra/2d/tegra_2d_copy.c create mode 100644 tegra/2d/tegra_2d_copy.h create mode 100644 tegra/2d/tegra_2d_fill.c create mode 100644 tegra/2d/tegra_2d_fill.h create mode 100644 tegra/2d/tegra_2d_frcopy.c create mode 100644 tegra/2d/tegra_2d_frcopy.h create mode 100644 tegra/2d/tegra_2d_g2copy.c create mode 100644 tegra/2d/tegra_2d_g2copy.h create mode 100644 tegra/2d/tegra_2d_g2fill.c create mode 100644 tegra/2d/tegra_2d_g2fill.h create mode 100644 tegra/2d/tegra_2d_reg_g2sb.h create mode 100644 tegra/2d/tegra_2d_reg_host.h create mode 100644 tegra/2d/tegra_2d_sbcopy.c create mode 100644 tegra/2d/tegra_2d_sbcopy.h create mode 100644 tegra/2d/tegra_2d_surface.c create mode 100644 tegra/2d/tegra_2d_surface.h create mode 100644 tegra/2d/tegra_2d_util.c create mode 100644 tegra/2d/tegra_2d_util.h create mode 100644 tegra/tegra_2d.h diff --git a/tegra/2d/hw_gr2d.h b/tegra/2d/hw_gr2d.h new file mode 100644 index 0000000..4c48feb --- /dev/null +++ b/tegra/2d/hw_gr2d.h @@ -0,0 +1,2614 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + */ + + /* + * Function naming determines intended use: + * + * _r(void) : Returns the offset for register . + * + * _w(void) : Returns the word offset for word (4 byte) element . + * + * __s(void) : Returns size of field of register in bits. + * + * __f(uint32_t v) : Returns a value based on 'v' which has been shifted + * and masked to place it at field of register . This value + * can be |'d with others to produce a full register value for + * register . + * + * __m(void) : Returns a mask for field of register . This + * value can be ~'d and then &'d to clear the value of field for + * register . + * + * ___f(void) : Returns the constant value after being shifted + * to place it at field of register . This value can be |'d + * with others to produce a full register value for . + * + * __v(uint32_t r) : Returns the value of field from a full register + * value 'r' after being shifted to place its LSB at bit 0. + * This value is suitable for direct comparison with other unshifted + * values appropriate for use in field of register . + * + * ___v(void) : Returns the constant value for defined for + * field of register . This value is suitable for direct + * comparison with unshifted values appropriate for use in field + * of register . + */ + +#ifndef __hw_gr2d_h__ +#define __hw_gr2d_h__ + +static inline uint32_t gr2d_trigger_r(void) +{ + return 0x9; +} +static inline uint32_t gr2d_trigger_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_trigger_trigger_s(void) +{ + return 16; +} +static inline uint32_t gr2d_trigger_trigger_f(uint32_t v) +{ + return (v & 0xffff) << 0; +} +static inline uint32_t gr2d_trigger_trigger_m(void) +{ + return 0xffff << 0; +} +static inline uint32_t gr2d_trigger_trigger_v(uint32_t r) +{ + return (r >> 0) & 0xffff; +} +static inline uint32_t gr2d_cmdsel_r(void) +{ + return 0xc; +} +static inline uint32_t gr2d_cmdsel_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_cmdsel_sbor2d_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_sbor2d_f(uint32_t v) +{ + return (v & 0x1) << 0; +} +static inline uint32_t gr2d_cmdsel_sbor2d_m(void) +{ + return 0x1 << 0; +} +static inline uint32_t gr2d_cmdsel_sbor2d_v(uint32_t r) +{ + return (r >> 0) & 0x1; +} +static inline uint32_t gr2d_cmdsel_sbor2d_g2_v(void) +{ + return 0; +} +static inline uint32_t gr2d_cmdsel_sbor2d_sb_v(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_cbenable_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_cbenable_f(uint32_t v) +{ + return (v & 0x1) << 4; +} +static inline uint32_t gr2d_cmdsel_cbenable_m(void) +{ + return 0x1 << 4; +} +static inline uint32_t gr2d_cmdsel_cbenable_v(uint32_t r) +{ + return (r >> 4) & 0x1; +} +static inline uint32_t gr2d_cmdsel_cbenable_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_cmdsel_cbenable_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_vitrigger_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_vitrigger_f(uint32_t v) +{ + return (v & 0x1) << 5; +} +static inline uint32_t gr2d_cmdsel_vitrigger_m(void) +{ + return 0x1 << 5; +} +static inline uint32_t gr2d_cmdsel_vitrigger_v(uint32_t r) +{ + return (r >> 5) & 0x1; +} +static inline uint32_t gr2d_cmdsel_hosttrigger_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_hosttrigger_f(uint32_t v) +{ + return (v & 0x1) << 6; +} +static inline uint32_t gr2d_cmdsel_hosttrigger_m(void) +{ + return 0x1 << 6; +} +static inline uint32_t gr2d_cmdsel_hosttrigger_v(uint32_t r) +{ + return (r >> 6) & 0x1; +} +static inline uint32_t gr2d_cmdsel_cbsbdisable_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_cbsbdisable_f(uint32_t v) +{ + return (v & 0x1) << 7; +} +static inline uint32_t gr2d_cmdsel_cbsbdisable_m(void) +{ + return 0x1 << 7; +} +static inline uint32_t gr2d_cmdsel_cbsbdisable_v(uint32_t r) +{ + return (r >> 7) & 0x1; +} +static inline uint32_t gr2d_cmdsel_g2output_s(void) +{ + return 2; +} +static inline uint32_t gr2d_cmdsel_g2output_f(uint32_t v) +{ + return (v & 0x3) << 8; +} +static inline uint32_t gr2d_cmdsel_g2output_m(void) +{ + return 0x3 << 8; +} +static inline uint32_t gr2d_cmdsel_g2output_v(uint32_t r) +{ + return (r >> 8) & 0x3; +} +static inline uint32_t gr2d_cmdsel_g2output_memory_v(void) +{ + return 0; +} +static inline uint32_t gr2d_cmdsel_g2output_epp_v(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_g2output_reserved2_v(void) +{ + return 2; +} +static inline uint32_t gr2d_cmdsel_g2output_reserved3_v(void) +{ + return 3; +} +static inline uint32_t gr2d_cmdsel_clip_source_top_bottom_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_clip_source_top_bottom_f(uint32_t v) +{ + return (v & 0x1) << 10; +} +static inline uint32_t gr2d_cmdsel_clip_source_top_bottom_m(void) +{ + return 0x1 << 10; +} +static inline uint32_t gr2d_cmdsel_clip_source_top_bottom_v(uint32_t r) +{ + return (r >> 10) & 0x1; +} +static inline uint32_t gr2d_cmdsel_clip_source_top_bottom_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_cmdsel_clip_source_top_bottom_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_frame_start_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_frame_start_f(uint32_t v) +{ + return (v & 0x1) << 14; +} +static inline uint32_t gr2d_cmdsel_frame_start_m(void) +{ + return 0x1 << 14; +} +static inline uint32_t gr2d_cmdsel_frame_start_v(uint32_t r) +{ + return (r >> 14) & 0x1; +} +static inline uint32_t gr2d_cmdsel_frame_end_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_frame_end_f(uint32_t v) +{ + return (v & 0x1) << 15; +} +static inline uint32_t gr2d_cmdsel_frame_end_m(void) +{ + return 0x1 << 15; +} +static inline uint32_t gr2d_cmdsel_frame_end_v(uint32_t r) +{ + return (r >> 15) & 0x1; +} +static inline uint32_t gr2d_cmdsel_buffer_index_s(void) +{ + return 8; +} +static inline uint32_t gr2d_cmdsel_buffer_index_f(uint32_t v) +{ + return (v & 0xff) << 16; +} +static inline uint32_t gr2d_cmdsel_buffer_index_m(void) +{ + return 0xff << 16; +} +static inline uint32_t gr2d_cmdsel_buffer_index_v(uint32_t r) +{ + return (r >> 16) & 0xff; +} +static inline uint32_t gr2d_cmdsel_linken_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_linken_f(uint32_t v) +{ + return (v & 0x1) << 24; +} +static inline uint32_t gr2d_cmdsel_linken_m(void) +{ + return 0x1 << 24; +} +static inline uint32_t gr2d_cmdsel_linken_v(uint32_t r) +{ + return (r >> 24) & 0x1; +} +static inline uint32_t gr2d_cmdsel_linkval_s(void) +{ + return 3; +} +static inline uint32_t gr2d_cmdsel_linkval_f(uint32_t v) +{ + return (v & 0x7) << 25; +} +static inline uint32_t gr2d_cmdsel_linkval_m(void) +{ + return 0x7 << 25; +} +static inline uint32_t gr2d_cmdsel_linkval_v(uint32_t r) +{ + return (r >> 25) & 0x7; +} +static inline uint32_t gr2d_cmdsel_priority_s(void) +{ + return 1; +} +static inline uint32_t gr2d_cmdsel_priority_f(uint32_t v) +{ + return (v & 0x1) << 28; +} +static inline uint32_t gr2d_cmdsel_priority_m(void) +{ + return 0x1 << 28; +} +static inline uint32_t gr2d_cmdsel_priority_v(uint32_t r) +{ + return (r >> 28) & 0x1; +} +static inline uint32_t gr2d_cmdsel_priority_low_v(void) +{ + return 0; +} +static inline uint32_t gr2d_cmdsel_priority_high_v(void) +{ + return 1; +} +static inline uint32_t gr2d_vdda_r(void) +{ + return 0x11; +} +static inline uint32_t gr2d_vdda_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_vdda_vdstep_s(void) +{ + return 32; +} +static inline uint32_t gr2d_vdda_vdstep_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_vdda_vdstep_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_vdda_vdstep_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_vddaini_r(void) +{ + return 0x12; +} +static inline uint32_t gr2d_vddaini_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_vddaini_vdtini_s(void) +{ + return 8; +} +static inline uint32_t gr2d_vddaini_vdtini_f(uint32_t v) +{ + return (v & 0xff) << 0; +} +static inline uint32_t gr2d_vddaini_vdtini_m(void) +{ + return 0xff << 0; +} +static inline uint32_t gr2d_vddaini_vdtini_v(uint32_t r) +{ + return (r >> 0) & 0xff; +} +static inline uint32_t gr2d_vddaini_vdbini_s(void) +{ + return 8; +} +static inline uint32_t gr2d_vddaini_vdbini_f(uint32_t v) +{ + return (v & 0xff) << 8; +} +static inline uint32_t gr2d_vddaini_vdbini_m(void) +{ + return 0xff << 8; +} +static inline uint32_t gr2d_vddaini_vdbini_v(uint32_t r) +{ + return (r >> 8) & 0xff; +} +static inline uint32_t gr2d_hdda_r(void) +{ + return 0x13; +} +static inline uint32_t gr2d_hdda_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_hdda_hdstep_s(void) +{ + return 32; +} +static inline uint32_t gr2d_hdda_hdstep_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_hdda_hdstep_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_hdda_hdstep_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_hddainils_r(void) +{ + return 0x14; +} +static inline uint32_t gr2d_hddainils_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_hddainils_hdini_s(void) +{ + return 8; +} +static inline uint32_t gr2d_hddainils_hdini_f(uint32_t v) +{ + return (v & 0xff) << 0; +} +static inline uint32_t gr2d_hddainils_hdini_m(void) +{ + return 0xff << 0; +} +static inline uint32_t gr2d_hddainils_hdini_v(uint32_t r) +{ + return (r >> 0) & 0xff; +} +static inline uint32_t gr2d_cscfirst_r(void) +{ + return 0x15; +} +static inline uint32_t gr2d_cscfirst_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_cscfirst_cub_s(void) +{ + return 10; +} +static inline uint32_t gr2d_cscfirst_cub_f(uint32_t v) +{ + return (v & 0x3ff) << 0; +} +static inline uint32_t gr2d_cscfirst_cub_m(void) +{ + return 0x3ff << 0; +} +static inline uint32_t gr2d_cscfirst_cub_v(uint32_t r) +{ + return (r >> 0) & 0x3ff; +} +static inline uint32_t gr2d_cscfirst_cvr_s(void) +{ + return 10; +} +static inline uint32_t gr2d_cscfirst_cvr_f(uint32_t v) +{ + return (v & 0x3ff) << 12; +} +static inline uint32_t gr2d_cscfirst_cvr_m(void) +{ + return 0x3ff << 12; +} +static inline uint32_t gr2d_cscfirst_cvr_v(uint32_t r) +{ + return (r >> 12) & 0x3ff; +} +static inline uint32_t gr2d_cscfirst_yos_s(void) +{ + return 8; +} +static inline uint32_t gr2d_cscfirst_yos_f(uint32_t v) +{ + return (v & 0xff) << 24; +} +static inline uint32_t gr2d_cscfirst_yos_m(void) +{ + return 0xff << 24; +} +static inline uint32_t gr2d_cscfirst_yos_v(uint32_t r) +{ + return (r >> 24) & 0xff; +} +static inline uint32_t gr2d_cscsecond_r(void) +{ + return 0x16; +} +static inline uint32_t gr2d_cscsecond_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_cscsecond_cug_s(void) +{ + return 9; +} +static inline uint32_t gr2d_cscsecond_cug_f(uint32_t v) +{ + return (v & 0x1ff) << 0; +} +static inline uint32_t gr2d_cscsecond_cug_m(void) +{ + return 0x1ff << 0; +} +static inline uint32_t gr2d_cscsecond_cug_v(uint32_t r) +{ + return (r >> 0) & 0x1ff; +} +static inline uint32_t gr2d_cscsecond_cur_s(void) +{ + return 10; +} +static inline uint32_t gr2d_cscsecond_cur_f(uint32_t v) +{ + return (v & 0x3ff) << 12; +} +static inline uint32_t gr2d_cscsecond_cur_m(void) +{ + return 0x3ff << 12; +} +static inline uint32_t gr2d_cscsecond_cur_v(uint32_t r) +{ + return (r >> 12) & 0x3ff; +} +static inline uint32_t gr2d_cscsecond_cyx_s(void) +{ + return 8; +} +static inline uint32_t gr2d_cscsecond_cyx_f(uint32_t v) +{ + return (v & 0xff) << 24; +} +static inline uint32_t gr2d_cscsecond_cyx_m(void) +{ + return 0xff << 24; +} +static inline uint32_t gr2d_cscsecond_cyx_v(uint32_t r) +{ + return (r >> 24) & 0xff; +} +static inline uint32_t gr2d_cscthird_r(void) +{ + return 0x17; +} +static inline uint32_t gr2d_cscthird_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_cscthird_cvg_s(void) +{ + return 9; +} +static inline uint32_t gr2d_cscthird_cvg_f(uint32_t v) +{ + return (v & 0x1ff) << 0; +} +static inline uint32_t gr2d_cscthird_cvg_m(void) +{ + return 0x1ff << 0; +} +static inline uint32_t gr2d_cscthird_cvg_v(uint32_t r) +{ + return (r >> 0) & 0x1ff; +} +static inline uint32_t gr2d_cscthird_cvb_s(void) +{ + return 10; +} +static inline uint32_t gr2d_cscthird_cvb_f(uint32_t v) +{ + return (v & 0x3ff) << 16; +} +static inline uint32_t gr2d_cscthird_cvb_m(void) +{ + return 0x3ff << 16; +} +static inline uint32_t gr2d_cscthird_cvb_v(uint32_t r) +{ + return (r >> 16) & 0x3ff; +} +static inline uint32_t gr2d_uba_r(void) +{ + return 0x1a; +} +static inline uint32_t gr2d_uba_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_uba_su1sa_s(void) +{ + return 32; +} +static inline uint32_t gr2d_uba_su1sa_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_uba_su1sa_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_uba_su1sa_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_vba_r(void) +{ + return 0x1b; +} +static inline uint32_t gr2d_vba_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_vba_sv1sa_s(void) +{ + return 32; +} +static inline uint32_t gr2d_vba_sv1sa_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_vba_sv1sa_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_vba_sv1sa_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_sbformat_r(void) +{ + return 0x1c; +} +static inline uint32_t gr2d_sbformat_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_sbformat_sifmt_s(void) +{ + return 5; +} +static inline uint32_t gr2d_sbformat_sifmt_f(uint32_t v) +{ + return (v & 0x1f) << 0; +} +static inline uint32_t gr2d_sbformat_sifmt_m(void) +{ + return 0x1f << 0; +} +static inline uint32_t gr2d_sbformat_sifmt_v(uint32_t r) +{ + return (r >> 0) & 0x1f; +} +static inline uint32_t gr2d_sbformat_sifmt_u8y8v8y8_ob_v(void) +{ + return 0; +} +static inline uint32_t gr2d_sbformat_sifmt_y8u8y8v8_ob_v(void) +{ + return 1; +} +static inline uint32_t gr2d_sbformat_sifmt_y8v8y8u8_ob_v(void) +{ + return 2; +} +static inline uint32_t gr2d_sbformat_sifmt_v8y8u8y8_ob_v(void) +{ + return 3; +} +static inline uint32_t gr2d_sbformat_sifmt_u8y8v8y8_tc_v(void) +{ + return 4; +} +static inline uint32_t gr2d_sbformat_sifmt_y8u8y8v8_tc_v(void) +{ + return 5; +} +static inline uint32_t gr2d_sbformat_sifmt_y8v8y8u8_tc_v(void) +{ + return 6; +} +static inline uint32_t gr2d_sbformat_sifmt_v8y8u8y8_tc_v(void) +{ + return 7; +} +static inline uint32_t gr2d_sbformat_sifmt_b5g6r5_v(void) +{ + return 8; +} +static inline uint32_t gr2d_sbformat_sifmt_b5g6r5bs_v(void) +{ + return 12; +} +static inline uint32_t gr2d_sbformat_sifmt_r8g8b8a8_v(void) +{ + return 14; +} +static inline uint32_t gr2d_sbformat_sifmt_b8g8r8a8_v(void) +{ + return 15; +} +static inline uint32_t gr2d_sbformat_difmt_s(void) +{ + return 5; +} +static inline uint32_t gr2d_sbformat_difmt_f(uint32_t v) +{ + return (v & 0x1f) << 8; +} +static inline uint32_t gr2d_sbformat_difmt_m(void) +{ + return 0x1f << 8; +} +static inline uint32_t gr2d_sbformat_difmt_v(uint32_t r) +{ + return (r >> 8) & 0x1f; +} +static inline uint32_t gr2d_sbformat_difmt_u8y8v8y8_ob_v(void) +{ + return 0; +} +static inline uint32_t gr2d_sbformat_difmt_y8u8y8v8_ob_v(void) +{ + return 1; +} +static inline uint32_t gr2d_sbformat_difmt_y8v8y8u8_ob_v(void) +{ + return 2; +} +static inline uint32_t gr2d_sbformat_difmt_v8y8u8y8_ob_v(void) +{ + return 3; +} +static inline uint32_t gr2d_sbformat_difmt_u8y8v8y8_tc_v(void) +{ + return 4; +} +static inline uint32_t gr2d_sbformat_difmt_y8u8y8v8_tc_v(void) +{ + return 5; +} +static inline uint32_t gr2d_sbformat_difmt_y8v8y8u8_tc_v(void) +{ + return 6; +} +static inline uint32_t gr2d_sbformat_difmt_v8y8u8y8_tc_v(void) +{ + return 7; +} +static inline uint32_t gr2d_sbformat_difmt_b5g6r5_v(void) +{ + return 8; +} +static inline uint32_t gr2d_sbformat_difmt_b5g6r5bs_v(void) +{ + return 12; +} +static inline uint32_t gr2d_sbformat_difmt_r8g8b8a8_v(void) +{ + return 14; +} +static inline uint32_t gr2d_sbformat_difmt_b8g8r8a8_v(void) +{ + return 15; +} +static inline uint32_t gr2d_controlsb_r(void) +{ + return 0x1d; +} +static inline uint32_t gr2d_controlsb_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_controlsb_imode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_imode_f(uint32_t v) +{ + return (v & 0x1) << 5; +} +static inline uint32_t gr2d_controlsb_imode_m(void) +{ + return 0x1 << 5; +} +static inline uint32_t gr2d_controlsb_imode_v(uint32_t r) +{ + return (r >> 5) & 0x1; +} +static inline uint32_t gr2d_controlsb_imode_multiplex_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_imode_planar_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_enavf_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_enavf_f(uint32_t v) +{ + return (v & 0x1) << 6; +} +static inline uint32_t gr2d_controlsb_enavf_m(void) +{ + return 0x1 << 6; +} +static inline uint32_t gr2d_controlsb_enavf_v(uint32_t r) +{ + return (r >> 6) & 0x1; +} +static inline uint32_t gr2d_controlsb_enavf_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_enavf_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_enahf_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_enahf_f(uint32_t v) +{ + return (v & 0x1) << 7; +} +static inline uint32_t gr2d_controlsb_enahf_m(void) +{ + return 0x1 << 7; +} +static inline uint32_t gr2d_controlsb_enahf_v(uint32_t r) +{ + return (r >> 7) & 0x1; +} +static inline uint32_t gr2d_controlsb_enahf_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_enahf_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_uvst_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsb_uvst_f(uint32_t v) +{ + return (v & 0x3) << 8; +} +static inline uint32_t gr2d_controlsb_uvst_m(void) +{ + return 0x3 << 8; +} +static inline uint32_t gr2d_controlsb_uvst_v(uint32_t r) +{ + return (r >> 8) & 0x3; +} +static inline uint32_t gr2d_controlsb_uvst_uvs2x_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_uvst_uvs1x_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_uvst_uvs4x_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsb_uvst_uvs_g2uvstride_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsb_vftype_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsb_vftype_f(uint32_t v) +{ + return (v & 0x3) << 16; +} +static inline uint32_t gr2d_controlsb_vftype_m(void) +{ + return 0x3 << 16; +} +static inline uint32_t gr2d_controlsb_vftype_v(uint32_t r) +{ + return (r >> 16) & 0x3; +} +static inline uint32_t gr2d_controlsb_vftype_interp_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_vftype_avg25_interp75_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_vftype_avg50_interp50_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsb_vftype_avg_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsb_vfen_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_vfen_f(uint32_t v) +{ + return (v & 0x1) << 18; +} +static inline uint32_t gr2d_controlsb_vfen_m(void) +{ + return 0x1 << 18; +} +static inline uint32_t gr2d_controlsb_vfen_v(uint32_t r) +{ + return (r >> 18) & 0x1; +} +static inline uint32_t gr2d_controlsb_vfen_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_vfen_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_discsc_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_discsc_f(uint32_t v) +{ + return (v & 0x1) << 19; +} +static inline uint32_t gr2d_controlsb_discsc_m(void) +{ + return 0x1 << 19; +} +static inline uint32_t gr2d_controlsb_discsc_v(uint32_t r) +{ + return (r >> 19) & 0x1; +} +static inline uint32_t gr2d_controlsb_discsc_enable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_discsc_disable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_hftype_s(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsb_hftype_f(uint32_t v) +{ + return (v & 0x7) << 20; +} +static inline uint32_t gr2d_controlsb_hftype_m(void) +{ + return 0x7 << 20; +} +static inline uint32_t gr2d_controlsb_hftype_v(uint32_t r) +{ + return (r >> 20) & 0x7; +} +static inline uint32_t gr2d_controlsb_hftype_interp_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_hftype_lpf1_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_hftype_lpf2_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsb_hftype_lpf3_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsb_hftype_lpf4_v(void) +{ + return 4; +} +static inline uint32_t gr2d_controlsb_hftype_lpf5_v(void) +{ + return 5; +} +static inline uint32_t gr2d_controlsb_hftype_lpf6_v(void) +{ + return 6; +} +static inline uint32_t gr2d_controlsb_hftype_disable_v(void) +{ + return 7; +} +static inline uint32_t gr2d_controlsb_rangeredfrm_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_rangeredfrm_f(uint32_t v) +{ + return (v & 0x1) << 23; +} +static inline uint32_t gr2d_controlsb_rangeredfrm_m(void) +{ + return 0x1 << 23; +} +static inline uint32_t gr2d_controlsb_rangeredfrm_v(uint32_t r) +{ + return (r >> 23) & 0x1; +} +static inline uint32_t gr2d_controlsb_rangeredfrm_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_rangeredfrm_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_sitype_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_sitype_f(uint32_t v) +{ + return (v & 0x1) << 24; +} +static inline uint32_t gr2d_controlsb_sitype_m(void) +{ + return 0x1 << 24; +} +static inline uint32_t gr2d_controlsb_sitype_v(uint32_t r) +{ + return (r >> 24) & 0x1; +} +static inline uint32_t gr2d_controlsb_sbsel_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_sbsel_f(uint32_t v) +{ + return (v & 0x1) << 25; +} +static inline uint32_t gr2d_controlsb_sbsel_m(void) +{ + return 0x1 << 25; +} +static inline uint32_t gr2d_controlsb_sbsel_v(uint32_t r) +{ + return (r >> 25) & 0x1; +} +static inline uint32_t gr2d_controlsb_sbsel_src_a_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_sbsel_src_b_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_dbsel_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_dbsel_f(uint32_t v) +{ + return (v & 0x1) << 26; +} +static inline uint32_t gr2d_controlsb_dbsel_m(void) +{ + return 0x1 << 26; +} +static inline uint32_t gr2d_controlsb_dbsel_v(uint32_t r) +{ + return (r >> 26) & 0x1; +} +static inline uint32_t gr2d_controlsb_dbsel_dst_a_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_dbsel_dst_b_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_keyen_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_keyen_f(uint32_t v) +{ + return (v & 0x1) << 27; +} +static inline uint32_t gr2d_controlsb_keyen_m(void) +{ + return 0x1 << 27; +} +static inline uint32_t gr2d_controlsb_keyen_v(uint32_t r) +{ + return (r >> 27) & 0x1; +} +static inline uint32_t gr2d_controlsb_keyen_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_keyen_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_kpol_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_kpol_f(uint32_t v) +{ + return (v & 0x1) << 28; +} +static inline uint32_t gr2d_controlsb_kpol_m(void) +{ + return 0x1 << 28; +} +static inline uint32_t gr2d_controlsb_kpol_v(uint32_t r) +{ + return (r >> 28) & 0x1; +} +static inline uint32_t gr2d_controlsb_kpol_within_bounds_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_kpol_outside_bounds_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_endith_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsb_endith_f(uint32_t v) +{ + return (v & 0x1) << 30; +} +static inline uint32_t gr2d_controlsb_endith_m(void) +{ + return 0x1 << 30; +} +static inline uint32_t gr2d_controlsb_endith_v(uint32_t r) +{ + return (r >> 30) & 0x1; +} +static inline uint32_t gr2d_controlsb_endith_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsb_endith_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_r(void) +{ + return 0x1e; +} +static inline uint32_t gr2d_controlsecond_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_controlsecond_bitswap_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_bitswap_f(uint32_t v) +{ + return (v & 0x1) << 1; +} +static inline uint32_t gr2d_controlsecond_bitswap_m(void) +{ + return 0x1 << 1; +} +static inline uint32_t gr2d_controlsecond_bitswap_v(uint32_t r) +{ + return (r >> 1) & 0x1; +} +static inline uint32_t gr2d_controlsecond_bitswap_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_bitswap_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_bebswap_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_bebswap_f(uint32_t v) +{ + return (v & 0x1) << 2; +} +static inline uint32_t gr2d_controlsecond_bebswap_m(void) +{ + return 0x1 << 2; +} +static inline uint32_t gr2d_controlsecond_bebswap_v(uint32_t r) +{ + return (r >> 2) & 0x1; +} +static inline uint32_t gr2d_controlsecond_bebswap_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_bebswap_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_bewswap_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_bewswap_f(uint32_t v) +{ + return (v & 0x1) << 3; +} +static inline uint32_t gr2d_controlsecond_bewswap_m(void) +{ + return 0x1 << 3; +} +static inline uint32_t gr2d_controlsecond_bewswap_v(uint32_t r) +{ + return (r >> 3) & 0x1; +} +static inline uint32_t gr2d_controlsecond_bewswap_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_bewswap_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_alptype_s(void) +{ + return 5; +} +static inline uint32_t gr2d_controlsecond_alptype_f(uint32_t v) +{ + return (v & 0x1f) << 4; +} +static inline uint32_t gr2d_controlsecond_alptype_m(void) +{ + return 0x1f << 4; +} +static inline uint32_t gr2d_controlsecond_alptype_v(uint32_t r) +{ + return (r >> 4) & 0x1f; +} +static inline uint32_t gr2d_controlsecond_alptype_fix_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_alptype_pl1bpp_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_alptype_pl2bpp_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsecond_alptype_pl4bpp_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsecond_alptype_pl8bpp_v(void) +{ + return 4; +} +static inline uint32_t gr2d_controlsecond_alptype_pl44bpp_v(void) +{ + return 5; +} +static inline uint32_t gr2d_controlsecond_alptype_pls1bpp_v(void) +{ + return 6; +} +static inline uint32_t gr2d_controlsecond_alptype_pls4bppal_v(void) +{ + return 7; +} +static inline uint32_t gr2d_controlsecond_alptype_pls4bpp_v(void) +{ + return 8; +} +static inline uint32_t gr2d_controlsecond_alptype_pls8bpp_v(void) +{ + return 9; +} +static inline uint32_t gr2d_controlsecond_alptype_pls8bx_v(void) +{ + return 10; +} +static inline uint32_t gr2d_controlsecond_alptype_pls1bppal_v(void) +{ + return 11; +} +static inline uint32_t gr2d_controlsecond_alpsrcordst_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_alpsrcordst_f(uint32_t v) +{ + return (v & 0x1) << 9; +} +static inline uint32_t gr2d_controlsecond_alpsrcordst_m(void) +{ + return 0x1 << 9; +} +static inline uint32_t gr2d_controlsecond_alpsrcordst_v(uint32_t r) +{ + return (r >> 9) & 0x1; +} +static inline uint32_t gr2d_controlsecond_alpsrcordst_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_alpsrcordst_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_clipc_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsecond_clipc_f(uint32_t v) +{ + return (v & 0x3) << 21; +} +static inline uint32_t gr2d_controlsecond_clipc_m(void) +{ + return 0x3 << 21; +} +static inline uint32_t gr2d_controlsecond_clipc_v(uint32_t r) +{ + return (r >> 21) & 0x3; +} +static inline uint32_t gr2d_controlsecond_fr_mode_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsecond_fr_mode_f(uint32_t v) +{ + return (v & 0x3) << 24; +} +static inline uint32_t gr2d_controlsecond_fr_mode_m(void) +{ + return 0x3 << 24; +} +static inline uint32_t gr2d_controlsecond_fr_mode_v(uint32_t r) +{ + return (r >> 24) & 0x3; +} +static inline uint32_t gr2d_controlsecond_fr_mode_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_fr_mode_src_dst_copy_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_fr_mode_square_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsecond_fr_mode_blank_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsecond_fr_type_s(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsecond_fr_type_f(uint32_t v) +{ + return (v & 0x7) << 26; +} +static inline uint32_t gr2d_controlsecond_fr_type_m(void) +{ + return 0x7 << 26; +} +static inline uint32_t gr2d_controlsecond_fr_type_v(uint32_t r) +{ + return (r >> 26) & 0x7; +} +static inline uint32_t gr2d_controlsecond_fr_type_flip_x_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_fr_type_flip_y_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_fr_type_trans_lr_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlsecond_fr_type_trans_rl_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlsecond_fr_type_rot_90_v(void) +{ + return 4; +} +static inline uint32_t gr2d_controlsecond_fr_type_rot_180_v(void) +{ + return 5; +} +static inline uint32_t gr2d_controlsecond_fr_type_rot_270_v(void) +{ + return 6; +} +static inline uint32_t gr2d_controlsecond_fr_type_identity_v(void) +{ + return 7; +} +static inline uint32_t gr2d_controlsecond_fr_readwait_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlsecond_fr_readwait_f(uint32_t v) +{ + return (v & 0x1) << 29; +} +static inline uint32_t gr2d_controlsecond_fr_readwait_m(void) +{ + return 0x1 << 29; +} +static inline uint32_t gr2d_controlsecond_fr_readwait_v(uint32_t r) +{ + return (r >> 29) & 0x1; +} +static inline uint32_t gr2d_controlsecond_fr_readwait_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlsecond_fr_readwait_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_r(void) +{ + return 0x1f; +} +static inline uint32_t gr2d_controlmain_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_controlmain_cmdt_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_cmdt_f(uint32_t v) +{ + return (v & 0x3) << 0; +} +static inline uint32_t gr2d_controlmain_cmdt_m(void) +{ + return 0x3 << 0; +} +static inline uint32_t gr2d_controlmain_cmdt_v(uint32_t r) +{ + return (r >> 0) & 0x3; +} +static inline uint32_t gr2d_controlmain_cmdt_bitblt_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_cmdt_linedraw_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_cmdt_vcaa_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_cmdt_reserved1_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlmain_turbofill_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_turbofill_f(uint32_t v) +{ + return (v & 0x1) << 2; +} +static inline uint32_t gr2d_controlmain_turbofill_m(void) +{ + return 0x1 << 2; +} +static inline uint32_t gr2d_controlmain_turbofill_v(uint32_t r) +{ + return (r >> 2) & 0x1; +} +static inline uint32_t gr2d_controlmain_test0bit_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_test0bit_f(uint32_t v) +{ + return (v & 0x1) << 3; +} +static inline uint32_t gr2d_controlmain_test0bit_m(void) +{ + return 0x1 << 3; +} +static inline uint32_t gr2d_controlmain_test0bit_v(uint32_t r) +{ + return (r >> 3) & 0x1; +} +static inline uint32_t gr2d_controlmain_test0bit_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_test0bit_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_faden_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_faden_f(uint32_t v) +{ + return (v & 0x1) << 4; +} +static inline uint32_t gr2d_controlmain_faden_m(void) +{ + return 0x1 << 4; +} +static inline uint32_t gr2d_controlmain_faden_v(uint32_t r) +{ + return (r >> 4) & 0x1; +} +static inline uint32_t gr2d_controlmain_faden_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_faden_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_alpen_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_alpen_f(uint32_t v) +{ + return (v & 0x1) << 5; +} +static inline uint32_t gr2d_controlmain_alpen_m(void) +{ + return 0x1 << 5; +} +static inline uint32_t gr2d_controlmain_alpen_v(uint32_t r) +{ + return (r >> 5) & 0x1; +} +static inline uint32_t gr2d_controlmain_srcsld_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcsld_f(uint32_t v) +{ + return (v & 0x1) << 6; +} +static inline uint32_t gr2d_controlmain_srcsld_m(void) +{ + return 0x1 << 6; +} +static inline uint32_t gr2d_controlmain_srcsld_v(uint32_t r) +{ + return (r >> 6) & 0x1; +} +static inline uint32_t gr2d_controlmain_srcsld_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_srcsld_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patsld_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patsld_f(uint32_t v) +{ + return (v & 0x1) << 7; +} +static inline uint32_t gr2d_controlmain_patsld_m(void) +{ + return 0x1 << 7; +} +static inline uint32_t gr2d_controlmain_patsld_v(uint32_t r) +{ + return (r >> 7) & 0x1; +} +static inline uint32_t gr2d_controlmain_patsld_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_patsld_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patfl_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patfl_f(uint32_t v) +{ + return (v & 0x1) << 8; +} +static inline uint32_t gr2d_controlmain_patfl_m(void) +{ + return 0x1 << 8; +} +static inline uint32_t gr2d_controlmain_patfl_v(uint32_t r) +{ + return (r >> 8) & 0x1; +} +static inline uint32_t gr2d_controlmain_patfl_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_patfl_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_xdir_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_xdir_f(uint32_t v) +{ + return (v & 0x1) << 9; +} +static inline uint32_t gr2d_controlmain_xdir_m(void) +{ + return 0x1 << 9; +} +static inline uint32_t gr2d_controlmain_xdir_v(uint32_t r) +{ + return (r >> 9) & 0x1; +} +static inline uint32_t gr2d_controlmain_ydir_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_ydir_f(uint32_t v) +{ + return (v & 0x1) << 10; +} +static inline uint32_t gr2d_controlmain_ydir_m(void) +{ + return 0x1 << 10; +} +static inline uint32_t gr2d_controlmain_ydir_v(uint32_t r) +{ + return (r >> 10) & 0x1; +} +static inline uint32_t gr2d_controlmain_xytdw_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_xytdw_f(uint32_t v) +{ + return (v & 0x1) << 11; +} +static inline uint32_t gr2d_controlmain_xytdw_m(void) +{ + return 0x1 << 11; +} +static inline uint32_t gr2d_controlmain_xytdw_v(uint32_t r) +{ + return (r >> 11) & 0x1; +} +static inline uint32_t gr2d_controlmain_srcpack_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcpack_f(uint32_t v) +{ + return (v & 0x1) << 12; +} +static inline uint32_t gr2d_controlmain_srcpack_m(void) +{ + return 0x1 << 12; +} +static inline uint32_t gr2d_controlmain_srcpack_v(uint32_t r) +{ + return (r >> 12) & 0x1; +} +static inline uint32_t gr2d_controlmain_srcpack_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_srcpack_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patpack_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patpack_f(uint32_t v) +{ + return (v & 0x1) << 13; +} +static inline uint32_t gr2d_controlmain_patpack_m(void) +{ + return 0x1 << 13; +} +static inline uint32_t gr2d_controlmain_patpack_v(uint32_t r) +{ + return (r >> 13) & 0x1; +} +static inline uint32_t gr2d_controlmain_patpack_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_patpack_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_yflip_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_yflip_f(uint32_t v) +{ + return (v & 0x1) << 14; +} +static inline uint32_t gr2d_controlmain_yflip_m(void) +{ + return 0x1 << 14; +} +static inline uint32_t gr2d_controlmain_yflip_v(uint32_t r) +{ + return (r >> 14) & 0x1; +} +static inline uint32_t gr2d_controlmain_yflip_dsiable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_yflip_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcsel_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcsel_f(uint32_t v) +{ + return (v & 0x1) << 15; +} +static inline uint32_t gr2d_controlmain_srcsel_m(void) +{ + return 0x1 << 15; +} +static inline uint32_t gr2d_controlmain_srcsel_v(uint32_t r) +{ + return (r >> 15) & 0x1; +} +static inline uint32_t gr2d_controlmain_srcsel_screen_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_srcsel_memory_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_dstcd_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_dstcd_f(uint32_t v) +{ + return (v & 0x3) << 16; +} +static inline uint32_t gr2d_controlmain_dstcd_m(void) +{ + return 0x3 << 16; +} +static inline uint32_t gr2d_controlmain_dstcd_v(uint32_t r) +{ + return (r >> 16) & 0x3; +} +static inline uint32_t gr2d_controlmain_dstcd_bpp8_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_dstcd_bpp16_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_dstcd_bpp32_v(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_dstcd_reserved3_v(void) +{ + return 3; +} +static inline uint32_t gr2d_controlmain_dstt_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_dstt_f(uint32_t v) +{ + return (v & 0x3) << 18; +} +static inline uint32_t gr2d_controlmain_dstt_m(void) +{ + return 0x3 << 18; +} +static inline uint32_t gr2d_controlmain_dstt_v(uint32_t r) +{ + return (r >> 18) & 0x3; +} +static inline uint32_t gr2d_controlmain_srccd_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srccd_f(uint32_t v) +{ + return (v & 0x1) << 20; +} +static inline uint32_t gr2d_controlmain_srccd_m(void) +{ + return 0x1 << 20; +} +static inline uint32_t gr2d_controlmain_srccd_v(uint32_t r) +{ + return (r >> 20) & 0x1; +} +static inline uint32_t gr2d_controlmain_hlmono_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_hlmono_f(uint32_t v) +{ + return (v & 0x1) << 21; +} +static inline uint32_t gr2d_controlmain_hlmono_m(void) +{ + return 0x1 << 21; +} +static inline uint32_t gr2d_controlmain_hlmono_v(uint32_t r) +{ + return (r >> 21) & 0x1; +} +static inline uint32_t gr2d_controlmain_srct_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_srct_f(uint32_t v) +{ + return (v & 0x3) << 22; +} +static inline uint32_t gr2d_controlmain_srct_m(void) +{ + return 0x3 << 22; +} +static inline uint32_t gr2d_controlmain_srct_v(uint32_t r) +{ + return (r >> 22) & 0x3; +} +static inline uint32_t gr2d_controlmain_srcbas_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcbas_f(uint32_t v) +{ + return (v & 0x1) << 24; +} +static inline uint32_t gr2d_controlmain_srcbas_m(void) +{ + return 0x1 << 24; +} +static inline uint32_t gr2d_controlmain_srcbas_v(uint32_t r) +{ + return (r >> 24) & 0x1; +} +static inline uint32_t gr2d_controlmain_gcsw_s(void) +{ + return 2; +} +static inline uint32_t gr2d_controlmain_gcsw_f(uint32_t v) +{ + return (v & 0x3) << 25; +} +static inline uint32_t gr2d_controlmain_gcsw_m(void) +{ + return 0x3 << 25; +} +static inline uint32_t gr2d_controlmain_gcsw_v(uint32_t r) +{ + return (r >> 25) & 0x3; +} +static inline uint32_t gr2d_controlmain_srcdir_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcdir_f(uint32_t v) +{ + return (v & 0x1) << 27; +} +static inline uint32_t gr2d_controlmain_srcdir_m(void) +{ + return 0x1 << 27; +} +static inline uint32_t gr2d_controlmain_srcdir_v(uint32_t r) +{ + return (r >> 27) & 0x1; +} +static inline uint32_t gr2d_controlmain_dstdir_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_dstdir_f(uint32_t v) +{ + return (v & 0x1) << 28; +} +static inline uint32_t gr2d_controlmain_dstdir_m(void) +{ + return 0x1 << 28; +} +static inline uint32_t gr2d_controlmain_dstdir_v(uint32_t r) +{ + return (r >> 28) & 0x1; +} +static inline uint32_t gr2d_controlmain_patsel_s(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_patsel_f(uint32_t v) +{ + return (v & 0x1) << 30; +} +static inline uint32_t gr2d_controlmain_patsel_m(void) +{ + return 0x1 << 30; +} +static inline uint32_t gr2d_controlmain_patsel_v(uint32_t r) +{ + return (r >> 30) & 0x1; +} +static inline uint32_t gr2d_controlmain_patsel_screen_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_patsel_memory_v(void) +{ + return 1; +} +static inline uint32_t gr2d_ropfade_r(void) +{ + return 0x20; +} +static inline uint32_t gr2d_ropfade_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_ropfade_rop_s(void) +{ + return 8; +} +static inline uint32_t gr2d_ropfade_rop_f(uint32_t v) +{ + return (v & 0xff) << 0; +} +static inline uint32_t gr2d_ropfade_rop_m(void) +{ + return 0xff << 0; +} +static inline uint32_t gr2d_ropfade_rop_v(uint32_t r) +{ + return (r >> 0) & 0xff; +} +static inline uint32_t gr2d_ropfade_fadcoe_s(void) +{ + return 8; +} +static inline uint32_t gr2d_ropfade_fadcoe_f(uint32_t v) +{ + return (v & 0xff) << 16; +} +static inline uint32_t gr2d_ropfade_fadcoe_m(void) +{ + return 0xff << 16; +} +static inline uint32_t gr2d_ropfade_fadcoe_v(uint32_t r) +{ + return (r >> 16) & 0xff; +} +static inline uint32_t gr2d_ropfade_fadoff_s(void) +{ + return 8; +} +static inline uint32_t gr2d_ropfade_fadoff_f(uint32_t v) +{ + return (v & 0xff) << 24; +} +static inline uint32_t gr2d_ropfade_fadoff_m(void) +{ + return 0xff << 24; +} +static inline uint32_t gr2d_ropfade_fadoff_v(uint32_t r) +{ + return (r >> 24) & 0xff; +} +static inline uint32_t gr2d_dstba_r(void) +{ + return 0x2b; +} +static inline uint32_t gr2d_dstba_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_dstba_dstba_s(void) +{ + return 32; +} +static inline uint32_t gr2d_dstba_dstba_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_dstba_dstba_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_dstba_dstba_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_dstst_r(void) +{ + return 0x2e; +} +static inline uint32_t gr2d_dstst_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_dstst_dsts_s(void) +{ + return 16; +} +static inline uint32_t gr2d_dstst_dsts_f(uint32_t v) +{ + return (v & 0xffff) << 0; +} +static inline uint32_t gr2d_dstst_dsts_m(void) +{ + return 0xffff << 0; +} +static inline uint32_t gr2d_dstst_dsts_v(uint32_t r) +{ + return (r >> 0) & 0xffff; +} +static inline uint32_t gr2d_srcba_r(void) +{ + return 0x31; +} +static inline uint32_t gr2d_srcba_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_srcba_srcba_s(void) +{ + return 32; +} +static inline uint32_t gr2d_srcba_srcba_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_srcba_srcba_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_srcba_srcba_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_srcst_r(void) +{ + return 0x33; +} +static inline uint32_t gr2d_srcst_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_srcst_srcs_s(void) +{ + return 16; +} +static inline uint32_t gr2d_srcst_srcs_f(uint32_t v) +{ + return (v & 0xffff) << 0; +} +static inline uint32_t gr2d_srcst_srcs_m(void) +{ + return 0xffff << 0; +} +static inline uint32_t gr2d_srcst_srcs_v(uint32_t r) +{ + return (r >> 0) & 0xffff; +} +static inline uint32_t gr2d_srcfgc_r(void) +{ + return 0x35; +} +static inline uint32_t gr2d_srcfgc_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_srcfgc_srcfgc_s(void) +{ + return 32; +} +static inline uint32_t gr2d_srcfgc_srcfgc_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_srcfgc_srcfgc_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_srcfgc_srcfgc_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_srcsize_r(void) +{ + return 0x37; +} +static inline uint32_t gr2d_srcsize_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_srcsize_srcwidth_s(void) +{ + return 15; +} +static inline uint32_t gr2d_srcsize_srcwidth_f(uint32_t v) +{ + return (v & 0x7fff) << 0; +} +static inline uint32_t gr2d_srcsize_srcwidth_m(void) +{ + return 0x7fff << 0; +} +static inline uint32_t gr2d_srcsize_srcwidth_v(uint32_t r) +{ + return (r >> 0) & 0x7fff; +} +static inline uint32_t gr2d_srcsize_srcheight_s(void) +{ + return 15; +} +static inline uint32_t gr2d_srcsize_srcheight_f(uint32_t v) +{ + return (v & 0x7fff) << 16; +} +static inline uint32_t gr2d_srcsize_srcheight_m(void) +{ + return 0x7fff << 16; +} +static inline uint32_t gr2d_srcsize_srcheight_v(uint32_t r) +{ + return (r >> 16) & 0x7fff; +} +static inline uint32_t gr2d_dstsize_r(void) +{ + return 0x38; +} +static inline uint32_t gr2d_dstsize_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_dstsize_dstwidth_s(void) +{ + return 15; +} +static inline uint32_t gr2d_dstsize_dstwidth_f(uint32_t v) +{ + return (v & 0x7fff) << 0; +} +static inline uint32_t gr2d_dstsize_dstwidth_m(void) +{ + return 0x7fff << 0; +} +static inline uint32_t gr2d_dstsize_dstwidth_v(uint32_t r) +{ + return (r >> 0) & 0x7fff; +} +static inline uint32_t gr2d_dstsize_dstheight_s(void) +{ + return 15; +} +static inline uint32_t gr2d_dstsize_dstheight_f(uint32_t v) +{ + return (v & 0x7fff) << 16; +} +static inline uint32_t gr2d_dstsize_dstheight_m(void) +{ + return 0x7fff << 16; +} +static inline uint32_t gr2d_dstsize_dstheight_v(uint32_t r) +{ + return (r >> 16) & 0x7fff; +} +static inline uint32_t gr2d_srcps_r(void) +{ + return 0x39; +} +static inline uint32_t gr2d_srcps_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_srcps_srcx_s(void) +{ + return 16; +} +static inline uint32_t gr2d_srcps_srcx_f(uint32_t v) +{ + return (v & 0xffff) << 0; +} +static inline uint32_t gr2d_srcps_srcx_m(void) +{ + return 0xffff << 0; +} +static inline uint32_t gr2d_srcps_srcx_v(uint32_t r) +{ + return (r >> 0) & 0xffff; +} +static inline uint32_t gr2d_srcps_srcy_s(void) +{ + return 16; +} +static inline uint32_t gr2d_srcps_srcy_f(uint32_t v) +{ + return (v & 0xffff) << 16; +} +static inline uint32_t gr2d_srcps_srcy_m(void) +{ + return 0xffff << 16; +} +static inline uint32_t gr2d_srcps_srcy_v(uint32_t r) +{ + return (r >> 16) & 0xffff; +} +static inline uint32_t gr2d_dstps_r(void) +{ + return 0x3a; +} +static inline uint32_t gr2d_dstps_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_dstps_dstx_s(void) +{ + return 16; +} +static inline uint32_t gr2d_dstps_dstx_f(uint32_t v) +{ + return (v & 0xffff) << 0; +} +static inline uint32_t gr2d_dstps_dstx_m(void) +{ + return 0xffff << 0; +} +static inline uint32_t gr2d_dstps_dstx_v(uint32_t r) +{ + return (r >> 0) & 0xffff; +} +static inline uint32_t gr2d_dstps_dsty_s(void) +{ + return 16; +} +static inline uint32_t gr2d_dstps_dsty_f(uint32_t v) +{ + return (v & 0xffff) << 16; +} +static inline uint32_t gr2d_dstps_dsty_m(void) +{ + return 0xffff << 16; +} +static inline uint32_t gr2d_dstps_dsty_v(uint32_t r) +{ + return (r >> 16) & 0xffff; +} +static inline uint32_t gr2d_uvstride_r(void) +{ + return 0x44; +} +static inline uint32_t gr2d_uvstride_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_uvstride_uvstride_s(void) +{ + return 16; +} +static inline uint32_t gr2d_uvstride_uvstride_f(uint32_t v) +{ + return (v & 0xffff) << 0; +} +static inline uint32_t gr2d_uvstride_uvstride_m(void) +{ + return 0xffff << 0; +} +static inline uint32_t gr2d_uvstride_uvstride_v(uint32_t r) +{ + return (r >> 0) & 0xffff; +} +static inline uint32_t gr2d_tilemode_r(void) +{ + return 0x46; +} +static inline uint32_t gr2d_tilemode_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_tilemode_src_y_tile_mode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_src_y_tile_mode_f(uint32_t v) +{ + return (v & 0x1) << 0; +} +static inline uint32_t gr2d_tilemode_src_y_tile_mode_m(void) +{ + return 0x1 << 0; +} +static inline uint32_t gr2d_tilemode_src_y_tile_mode_v(uint32_t r) +{ + return (r >> 0) & 0x1; +} +static inline uint32_t gr2d_tilemode_src_y_tile_mode_linear_v(void) +{ + return 0; +} +static inline uint32_t gr2d_tilemode_src_y_tile_mode_tiled_v(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_src_uv_tile_mode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_src_uv_tile_mode_f(uint32_t v) +{ + return (v & 0x1) << 4; +} +static inline uint32_t gr2d_tilemode_src_uv_tile_mode_m(void) +{ + return 0x1 << 4; +} +static inline uint32_t gr2d_tilemode_src_uv_tile_mode_v(uint32_t r) +{ + return (r >> 4) & 0x1; +} +static inline uint32_t gr2d_tilemode_src_uv_tile_mode_linear_v(void) +{ + return 0; +} +static inline uint32_t gr2d_tilemode_src_uv_tile_mode_tiled_v(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_pat_y_tile_mode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_pat_y_tile_mode_f(uint32_t v) +{ + return (v & 0x1) << 8; +} +static inline uint32_t gr2d_tilemode_pat_y_tile_mode_m(void) +{ + return 0x1 << 8; +} +static inline uint32_t gr2d_tilemode_pat_y_tile_mode_v(uint32_t r) +{ + return (r >> 8) & 0x1; +} +static inline uint32_t gr2d_tilemode_pat_y_tile_mode_linear_v(void) +{ + return 0; +} +static inline uint32_t gr2d_tilemode_pat_y_tile_mode_tiled_v(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_pat_uv_tile_mode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_pat_uv_tile_mode_f(uint32_t v) +{ + return (v & 0x1) << 12; +} +static inline uint32_t gr2d_tilemode_pat_uv_tile_mode_m(void) +{ + return 0x1 << 12; +} +static inline uint32_t gr2d_tilemode_pat_uv_tile_mode_v(uint32_t r) +{ + return (r >> 12) & 0x1; +} +static inline uint32_t gr2d_tilemode_pat_uv_tile_mode_linear_v(void) +{ + return 0; +} +static inline uint32_t gr2d_tilemode_pat_uv_tile_mode_tiled_v(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_dst_rd_tile_mode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_dst_rd_tile_mode_f(uint32_t v) +{ + return (v & 0x1) << 16; +} +static inline uint32_t gr2d_tilemode_dst_rd_tile_mode_m(void) +{ + return 0x1 << 16; +} +static inline uint32_t gr2d_tilemode_dst_rd_tile_mode_v(uint32_t r) +{ + return (r >> 16) & 0x1; +} +static inline uint32_t gr2d_tilemode_dst_rd_tile_mode_linear_v(void) +{ + return 0; +} +static inline uint32_t gr2d_tilemode_dst_rd_tile_mode_tiled_v(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_dst_wr_tile_mode_s(void) +{ + return 1; +} +static inline uint32_t gr2d_tilemode_dst_wr_tile_mode_f(uint32_t v) +{ + return (v & 0x1) << 20; +} +static inline uint32_t gr2d_tilemode_dst_wr_tile_mode_m(void) +{ + return 0x1 << 20; +} +static inline uint32_t gr2d_tilemode_dst_wr_tile_mode_v(uint32_t r) +{ + return (r >> 20) & 0x1; +} +static inline uint32_t gr2d_tilemode_dst_wr_tile_mode_linear_v(void) +{ + return 0; +} +static inline uint32_t gr2d_tilemode_dst_wr_tile_mode_tiled_v(void) +{ + return 1; +} +static inline uint32_t gr2d_srcba_sb_surfbase_r(void) +{ + return 0x48; +} +static inline uint32_t gr2d_srcba_sb_surfbase_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_srcba_sb_surfbase_src_addr_s(void) +{ + return 32; +} +static inline uint32_t gr2d_srcba_sb_surfbase_src_addr_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_srcba_sb_surfbase_src_addr_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_srcba_sb_surfbase_src_addr_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_dstba_sb_surfbase_r(void) +{ + return 0x49; +} +static inline uint32_t gr2d_dstba_sb_surfbase_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_dstba_sb_surfbase_dst_addr_s(void) +{ + return 32; +} +static inline uint32_t gr2d_dstba_sb_surfbase_dst_addr_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_dstba_sb_surfbase_dst_addr_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_dstba_sb_surfbase_dst_addr_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_vba_sb_surfbase_r(void) +{ + return 0x4b; +} +static inline uint32_t gr2d_vba_sb_surfbase_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_vba_sb_surfbase_v_addr_s(void) +{ + return 32; +} +static inline uint32_t gr2d_vba_sb_surfbase_v_addr_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_vba_sb_surfbase_v_addr_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_vba_sb_surfbase_v_addr_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} +static inline uint32_t gr2d_uba_sb_surfbase_r(void) +{ + return 0x4c; +} +static inline uint32_t gr2d_uba_sb_surfbase_reset_val_v(void) +{ + return 0x0; +} +static inline uint32_t gr2d_uba_sb_surfbase_u_addr_s(void) +{ + return 32; +} +static inline uint32_t gr2d_uba_sb_surfbase_u_addr_f(uint32_t v) +{ + return (v & 0xffffffff) << 0; +} +static inline uint32_t gr2d_uba_sb_surfbase_u_addr_m(void) +{ + return 0xffffffff << 0; +} +static inline uint32_t gr2d_uba_sb_surfbase_u_addr_v(uint32_t r) +{ + return (r >> 0) & 0xffffffff; +} + +#endif /* __hw_gr2d_h__ */ diff --git a/tegra/2d/tegra_2d_api.c b/tegra/2d/tegra_2d_api.c new file mode 100644 index 0000000..a4b5101 --- /dev/null +++ b/tegra/2d/tegra_2d_api.c @@ -0,0 +1,235 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include +#include "tegra_2d.h" +#include "tegra_2d_context.h" +#include "tegra_2d_copy.h" +#include "tegra_2d_fill.h" +#include "tegra_2d_color.h" +#include "tegra_2d_surface.h" +#include "tegra_2d_util.h" + +#define ENTER() \ + if (ctx->log_enable) LOG("> %s\n", __func__) + +#define RETURN(x) \ + if (ctx->log_enable) \ + LOG("- %s: %s\n", __func__, result_to_str((enum tegra_2d_result) x)); \ + return x + +#define RETURN_VOID() \ + if (ctx->log_enable) \ + LOG("- %s\n", __func__); \ + return + +struct tegra_2d_context * +tegra_2d_open(int fd) +{ + struct tegra_2d_ictx *ictx; + + ictx = open2d(fd); + + return (struct tegra_2d_context *) ictx; +} + +void +tegra_2d_close(struct tegra_2d_context *ctx) +{ + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return; + + ENTER(); + + close2d(ictx); +} + +int +tegra_2d_begin(struct tegra_2d_context *ctx, + const struct tegra_fence *fence) +{ + int result; + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + ENTER(); + + result = begin2d(ictx, fence); + + RETURN(result); +} + +int +tegra_2d_end(struct tegra_2d_context *ctx, + struct tegra_fence *fence) +{ + int result; + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + ENTER(); + + result = end2d(ictx, fence); + + RETURN(result); +} + +int +tegra_2d_fill(struct tegra_2d_context *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface_color *color, + const struct tegra_2d_rect *dst_rect) +{ + int result; + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + ENTER(); + + result = fill2d(ictx, dst, color, dst_rect); + + RETURN(result); +} + +int +tegra_2d_copy(struct tegra_2d_context *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface *src, + const struct tegra_2d_rect *dst_rect, + const struct tegra_2d_rect *src_rect, + enum tegra_2d_transform transform) +{ + int result; + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + ENTER(); + + result = copy2d(ictx, dst, src, dst_rect, src_rect, transform); + + RETURN(result); +} + +int +tegra_2d_compute_requirements(const struct tegra_2d_plane *plane, + uint32_t *num_bytes, + uint32_t *alignment, + uint32_t *pitch) +{ + int result; + + result = compute_requirements(plane, num_bytes, alignment, pitch); + + return result; +} + +int +tegra_2d_allocate_surface(struct tegra_2d_context *ctx, + struct tegra_2d_surface *surface) +{ + int result; + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + ENTER(); + + result = allocate_surface(ictx, surface); + + RETURN(result); +} + +void +tegra_2d_free_surface(struct tegra_2d_context *ctx, + struct tegra_2d_surface *surface) +{ + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return; + + ENTER(); + + free_surface(ictx, surface); + + RETURN_VOID(); +} + +int +tegra_2d_dump_surface(struct tegra_2d_context *ctx, + const struct tegra_2d_surface *surface, + const char *filename) +{ + int result; + struct tegra_2d_ictx *ictx = (struct tegra_2d_ictx *) ctx; + + if (ctx == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + ENTER(); + + result = dump_surface(ictx, surface, filename); + + RETURN(result); +} + +void +tegra_2d_color_convert(struct tegra_2d_surface_color *dst, + const struct tegra_2d_surface_color *src) +{ + color_convert(dst, src); +} + +void +tegra_2d_color_to_rgba(const struct tegra_2d_surface_color *src, + uint32_t *r, + uint32_t *g, + uint32_t *b, + uint32_t *a) +{ + color_to_rgba(src, r, g, b, a); +} + +void +tegra_2d_color_from_rgba(struct tegra_2d_surface_color *dst, + uint32_t r, + uint32_t g, + uint32_t b, + uint32_t a) +{ + color_from_rgba(dst, r, g, b, a); +} diff --git a/tegra/2d/tegra_2d_color.c b/tegra/2d/tegra_2d_color.c new file mode 100644 index 0000000..089c5c2 --- /dev/null +++ b/tegra/2d/tegra_2d_color.c @@ -0,0 +1,412 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include +#include "tegra_2d.h" +#include "tegra_2d_color.h" +#include "tegra_2d_util.h" + +void +color_convert(struct tegra_2d_surface_color *dst, + const struct tegra_2d_surface_color *src) +{ + int i; + uint32_t r, g, b, a; + + ASSERT(dst); + ASSERT(src); + + if (src->num_planes != dst->num_planes) + goto convert; + + for (i=0; inum_planes; ++i) + { + if (src->planes[i].format != dst->planes[i].format) + goto convert; + + dst->planes[i].value = src->planes[i].value; + } + + return; + +convert: + color_to_rgba(src, &r, &g, &b, &a); + color_from_rgba(dst, r, g, b, a); +} + +static void +rgb_to_yuv(uint32_t *y, uint32_t *u, uint32_t *v, + uint32_t r, uint32_t g, uint32_t b) +{ + int32_t yt, ut, vt; + yt = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16; + ut = ((-38 * (int32_t)r - 74 * (int32_t)g + 112 * (int32_t)b + 128) >> 8) + 128; + vt = ((112 * (int32_t)r - 94 * (int32_t)g - 18 * (int32_t)b + 128) >> 8) + 128; + *y = CLAMP(yt, 0, 255); + *u = CLAMP(ut, 0, 255); + *v = CLAMP(vt, 0, 255); +} + +static void +yuv_to_rgb(uint32_t *r, uint32_t *g, uint32_t *b, + uint32_t y, uint32_t u, uint32_t v) +{ + int32_t c = y - 16; + int32_t d = u - 128; + int32_t e = v - 128; + *r = CLAMP((298*c + 409*e + 128) >> 8, 0, 255); + *g = CLAMP(((298*c - 100*d - 208*e + 128) >> 8), 0, 255); + *b = CLAMP(((298*c + 516*d + 128) >> 8), 0, 255); +} + +static void +get_components(const struct tegra_2d_surface_color *src, + uint32_t *x, + uint32_t *y, + uint32_t *z, + uint32_t *w) +{ + int i; + + for (i=0; inum_planes; ++i) + { + uint32_t value = src->planes[i].value; + + switch (src->planes[i].format) + { + case TEGRA_2D_FORMAT_A8R8G8B8: + *w = (value >> 24) & 0xff; + *x = (value >> 16) & 0xff; + *y = (value >> 8) & 0xff; + *z = (value >> 0) & 0xff; + break; + + case TEGRA_2D_FORMAT_A8B8G8R8: + *w = (value >> 24) & 0xff; + *z = (value >> 16) & 0xff; + *y = (value >> 8) & 0xff; + *x = (value >> 0) & 0xff; + break; + + case TEGRA_2D_FORMAT_R8G8B8A8: + *x = (value >> 24) & 0xff; + *y = (value >> 16) & 0xff; + *z = (value >> 8) & 0xff; + *w = (value >> 0) & 0xff; + break; + + case TEGRA_2D_FORMAT_B8G8R8A8: + *z = (value >> 24) & 0xff; + *y = (value >> 16) & 0xff; + *x = (value >> 8) & 0xff; + *w = (value >> 0) & 0xff; + break; + + case TEGRA_2D_FORMAT_A4R4G4B4: + *w = ((value >> 12) & 0x0f) << 4; + *x = ((value >> 8) & 0x0f) << 4; + *y = ((value >> 4) & 0x0f) << 4; + *z = ((value >> 0) & 0x0f) << 4; + break; + + case TEGRA_2D_FORMAT_R4G4B4A4: + *x = ((value >> 12) & 0x0f) << 4; + *y = ((value >> 8) & 0x0f) << 4; + *z = ((value >> 4) & 0x0f) << 4; + *w = ((value >> 0) & 0x0f) << 4; + break; + + case TEGRA_2D_FORMAT_R5G6B5: + *x = ((value >> 11) & 0x1f) << 3; + *y = ((value >> 5) & 0x3f) << 2; + *z = ((value >> 0) & 0x1f) << 3; + break; + + case TEGRA_2D_FORMAT_A1R5G5B5: + *w = ((value >> 11) & 0x1f) << 3; + *x = ((value >> 6) & 0x1f) << 3; + *y = ((value >> 1) & 0x1f) << 3; + *z = ((value >> 0) & 0x01) << 7; + break; + + case TEGRA_2D_FORMAT_Y8: + *x = value & 0xff; + break; + + case TEGRA_2D_FORMAT_U8: + *y = value & 0xff; + break; + + case TEGRA_2D_FORMAT_V8: + *z = value & 0xff; + break; + + case TEGRA_2D_FORMAT_U8_V8: + *y = ((uint8_t *) &value)[0]; + *z = ((uint8_t *) &value)[1]; + break; + + case TEGRA_2D_FORMAT_V8_U8: + *z = ((uint8_t *) &value)[0]; + *y = ((uint8_t *) &value)[1]; + break; + + case TEGRA_2D_FORMAT_UYVY: + *y = ((uint8_t *) &value)[0]; + *x = ((uint8_t *) &value)[1]; + *z = ((uint8_t *) &value)[2]; + break; + + case TEGRA_2D_FORMAT_VYUY: + *z = ((uint8_t *) &value)[0]; + *x = ((uint8_t *) &value)[1]; + *y = ((uint8_t *) &value)[2]; + break; + + case TEGRA_2D_FORMAT_YUYV: + *x = ((uint8_t *) &value)[0]; + *y = ((uint8_t *) &value)[1]; + *z = ((uint8_t *) &value)[3]; + break; + + case TEGRA_2D_FORMAT_YVYU: + *x = ((uint8_t *) &value)[0]; + *z = ((uint8_t *) &value)[1]; + *y = ((uint8_t *) &value)[3]; + break; + + default: + ASSERT(0); + } + } +} + +static void +set_components(struct tegra_2d_surface_color *dst, + uint32_t x, + uint32_t y, + uint32_t z, + uint32_t w) +{ + int i; + + for (i=0; inum_planes; ++i) + { + uint32_t value; + + switch (dst->planes[i].format) + { + case TEGRA_2D_FORMAT_A8R8G8B8: + value = (w & 0xff) << 24; + value |= (x & 0xff) << 16; + value |= (y & 0xff) << 8; + value |= (z & 0xff) << 0; + break; + + case TEGRA_2D_FORMAT_A8B8G8R8: + value = (w & 0xff) << 24; + value |= (z & 0xff) << 16; + value |= (y & 0xff) << 8; + value |= (x & 0xff) << 0; + break; + + case TEGRA_2D_FORMAT_R8G8B8A8: + value = (x & 0xff) << 24; + value |= (y & 0xff) << 16; + value |= (z & 0xff) << 8; + value |= (w & 0xff) << 0; + break; + + case TEGRA_2D_FORMAT_B8G8R8A8: + value = (z & 0xff) << 24; + value |= (y & 0xff) << 16; + value |= (x & 0xff) << 8; + value |= (w & 0xff) << 0; + break; + + case TEGRA_2D_FORMAT_A4R4G4B4: + value = ((w >> 4) & 0x0f) << 12; + value |= ((x >> 4) & 0x0f) << 8; + value |= ((y >> 4) & 0x0f) << 4; + value |= ((z >> 4) & 0x0f) << 0; + break; + + case TEGRA_2D_FORMAT_R4G4B4A4: + value = ((x >> 4) & 0x0f) << 12; + value |= ((y >> 4) & 0x0f) << 8; + value |= ((z >> 4) & 0x0f) << 4; + value |= ((w >> 4) & 0x0f) << 0; + break; + + case TEGRA_2D_FORMAT_R5G6B5: + value = ((x >> 3) & 0x1f) << 11; + value |= ((y >> 2) & 0x3f) << 5; + value |= ((z >> 3) & 0x1f) << 0; + break; + + case TEGRA_2D_FORMAT_A1R5G5B5: + value = ((w >> 3) & 0x1f) << 11; + value |= ((x >> 3) & 0x1f) << 6; + value |= ((y >> 3) & 0x1f) << 1; + value |= ((z >> 7) & 0x01) << 0; + break; + + case TEGRA_2D_FORMAT_Y8: + value = x & 0xff; + break; + + case TEGRA_2D_FORMAT_U8: + value = y & 0xff; + break; + + case TEGRA_2D_FORMAT_V8: + value = z & 0xff; + break; + + case TEGRA_2D_FORMAT_U8_V8: + ((uint8_t *) &value)[0] = y & 0xff; + ((uint8_t *) &value)[1] = z & 0xff; + break; + + case TEGRA_2D_FORMAT_V8_U8: + ((uint8_t *) &value)[0] = z & 0xff; + ((uint8_t *) &value)[1] = y & 0xff; + break; + + case TEGRA_2D_FORMAT_UYVY: + ((uint8_t *) &value)[0] = y & 0xff; + ((uint8_t *) &value)[1] = x & 0xff; + ((uint8_t *) &value)[2] = z & 0xff; + ((uint8_t *) &value)[3] = x & 0xff; + break; + + case TEGRA_2D_FORMAT_VYUY: + ((uint8_t *) &value)[0] = z & 0xff; + ((uint8_t *) &value)[1] = x & 0xff; + ((uint8_t *) &value)[2] = y & 0xff; + ((uint8_t *) &value)[3] = x & 0xff; + break; + + case TEGRA_2D_FORMAT_YUYV: + ((uint8_t *) &value)[0] = x & 0xff; + ((uint8_t *) &value)[1] = y & 0xff; + ((uint8_t *) &value)[2] = x & 0xff; + ((uint8_t *) &value)[3] = z & 0xff; + break; + + case TEGRA_2D_FORMAT_YVYU: + ((uint8_t *) &value)[0] = x & 0xff; + ((uint8_t *) &value)[1] = z & 0xff; + ((uint8_t *) &value)[2] = x & 0xff; + ((uint8_t *) &value)[3] = y & 0xff; + break; + + default: + ASSERT(0); + } + + dst->planes[i].value = value; + } +} + +void +color_to_rgba(const struct tegra_2d_surface_color *src, + uint32_t *r, + uint32_t *g, + uint32_t *b, + uint32_t *a) +{ + ASSERT(src); + ASSERT(r && g && b && a); + + if (TEGRA_2D_FORMAT_IS_YUV(src->planes[0].format)) + { + uint32_t y, u, v; + y = 0; + u = 0; + v = 0; + + get_components(src, &y, &u, &v, NULL); + yuv_to_rgb(r, g, b, y, u, v); + *a = 255; + } + else + { + get_components(src, r, g, b, a); + } +} + +void +color_from_rgba(struct tegra_2d_surface_color *dst, + uint32_t r, + uint32_t g, + uint32_t b, + uint32_t a) +{ + ASSERT(dst); + + if (TEGRA_2D_FORMAT_IS_YUV(dst->planes[0].format)) + { + uint32_t y, u, v; + + rgb_to_yuv(&y, &u, &v, r, g, b); + set_components(dst, y, u, v, 255); + } + else + { + set_components(dst, r, g, b, a); + } +} + +const char * +format_to_str(enum tegra_2d_format format) +{ + switch (format) + { + #define CASE(f) case TEGRA_2D_FORMAT_##f: return #f + CASE(A8R8G8B8); + CASE(A8B8G8R8); + CASE(R8G8B8A8); + CASE(B8G8R8A8); + CASE(A4R4G4B4); + CASE(R4G4B4A4); + CASE(R5G6B5); + CASE(A1R5G5B5); + CASE(Y8); + CASE(U8); + CASE(V8); + CASE(U8_V8); + CASE(V8_U8); + CASE(UYVY); + CASE(VYUY); + CASE(YUYV); + CASE(YVYU); + #undef CASE + + default: + return "unknown"; + } +} diff --git a/tegra/2d/tegra_2d_color.h b/tegra/2d/tegra_2d_color.h new file mode 100644 index 0000000..aceef6a --- /dev/null +++ b/tegra/2d/tegra_2d_color.h @@ -0,0 +1,51 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_COLOR_H +#define TEGRA_2D_COLOR_H + +void +color_convert(struct tegra_2d_surface_color *dst, + const struct tegra_2d_surface_color *src); + +void +color_to_rgba(const struct tegra_2d_surface_color *src, + uint32_t *r, + uint32_t *g, + uint32_t *b, + uint32_t *a); + +void +color_from_rgba(struct tegra_2d_surface_color *dst, + uint32_t r, + uint32_t g, + uint32_t b, + uint32_t a); + +const char * +format_to_str(enum tegra_2d_format format); + +#endif // TEGRA_2D_COLOR_H diff --git a/tegra/2d/tegra_2d_context.c b/tegra/2d/tegra_2d_context.c new file mode 100644 index 0000000..d03d7d5 --- /dev/null +++ b/tegra/2d/tegra_2d_context.c @@ -0,0 +1,140 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include +#include "tegra_2d.h" +#include "tegra_2d_context.h" +#include "tegra_2d_util.h" + +struct tegra_2d_ictx * +open2d(int fd) +{ + int i; + struct tegra_2d_ictx *ctx; + + ctx = malloc(sizeof(struct tegra_2d_ictx)); + if (ctx == NULL) + return NULL; + + ctx->base.log_enable = 0; + ctx->base.dump_enable = 0; + ctx->base.dump_counter = 0; + ctx->base.dump_prefix[0] = 0; + ctx->device = NULL; + ctx->channel = NULL; + ctx->stream = NULL; + tegra_fence_clear(&ctx->pre_fence); + tegra_fence_clear(&ctx->post_fence); + + ctx->device = tegra_device_create(fd); + if (ctx->device == NULL) + goto fail; + + ctx->channel = tegra_channel_open(ctx->device, TEGRADRM_MODULEID_2D); + if (ctx->channel == NULL) + goto fail; + + ctx->stream = tegra_stream_create(ctx->channel); + if (ctx->stream == NULL) + goto fail; + + for (i=0; ig2fill[i]); + g2copy_init(&ctx->g2copy[i]); + frcopy_init(&ctx->frcopy[i]); + } + + sbcopy_init(&ctx->sbcopy); + + return ctx; + +fail: + close2d(ctx); + return NULL; +} + +void +close2d(struct tegra_2d_ictx *ctx) +{ + ASSERT(ctx); + + tegra_stream_destroy(ctx->stream); + tegra_channel_close(ctx->channel); + tegra_device_destroy(ctx->device); + + free(ctx); +} + +int +begin2d(struct tegra_2d_ictx *ctx, + const struct tegra_fence *fence) +{ + ASSERT(ctx); + + if (fence != NULL) + tegra_fence_copy(&ctx->pre_fence, fence); + else + tegra_fence_clear(&ctx->pre_fence); + + return TEGRA_2D_OK; +} + +int +flush2d(struct tegra_2d_ictx *ctx) +{ + int result; + + ASSERT(ctx); + + result = tegra_stream_flush(ctx->stream, &ctx->post_fence); + + if (result != 0) + return TEGRA_2D_STREAM_FAILURE; + + return TEGRA_2D_OK; +} + +int +end2d(struct tegra_2d_ictx *ctx, + struct tegra_fence *fence) +{ + int result; + + ASSERT(ctx); + + result = flush2d(ctx); + + if (result != 0) + return result; + + if (fence != NULL) + tegra_fence_copy(fence, &ctx->post_fence); + else + tegra_fence_wait(ctx->channel, &ctx->post_fence); + + return TEGRA_2D_OK; +} diff --git a/tegra/2d/tegra_2d_context.h b/tegra/2d/tegra_2d_context.h new file mode 100644 index 0000000..703f23b --- /dev/null +++ b/tegra/2d/tegra_2d_context.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_CONTEXT_H +#define TEGRA_2D_CONTEXT_H + +#include "tegra_drmif.h" +#include "tegra_2d_g2fill.h" +#include "tegra_2d_g2copy.h" +#include "tegra_2d_frcopy.h" +#include "tegra_2d_sbcopy.h" + +struct tegra_2d_ictx +{ + struct tegra_2d_context base; + struct tegra_device *device; + struct tegra_channel *channel; + struct tegra_stream *stream; + struct tegra_fence pre_fence; + struct tegra_fence post_fence; + struct tegra_2d_g2fill g2fill[TEGRA_2D_MAX_PLANES]; + struct tegra_2d_g2copy g2copy[TEGRA_2D_MAX_PLANES]; + struct tegra_2d_frcopy frcopy[TEGRA_2D_MAX_PLANES]; + struct tegra_2d_sbcopy sbcopy; +}; + +struct tegra_2d_ictx * +open2d(int fd); + +void +close2d(struct tegra_2d_ictx *ctx); + +int +begin2d(struct tegra_2d_ictx *ctx, + const struct tegra_fence *fence); + +int +flush2d(struct tegra_2d_ictx *ctx); + +int +end2d(struct tegra_2d_ictx *ctx, + struct tegra_fence *fence); + +#endif // TEGRA_2D_CONTEXT_H diff --git a/tegra/2d/tegra_2d_copy.c b/tegra/2d/tegra_2d_copy.c new file mode 100644 index 0000000..a659b5b --- /dev/null +++ b/tegra/2d/tegra_2d_copy.c @@ -0,0 +1,209 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include +#include "tegra_2d.h" +#include "tegra_2d_context.h" +#include "tegra_2d_copy.h" +#include "tegra_2d_surface.h" +#include "tegra_2d_util.h" +#include "tegra_2d_g2copy.h" +#include "tegra_2d_frcopy.h" +#include "tegra_2d_sbcopy.h" + +static int +copy_area(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface_area *dst_area, + const struct tegra_2d_surface_area *src_area, + enum tegra_2d_transform transform) +{ + int i; + int result = -1; + uint32_t num_words = 0; + uint32_t num_relocs = 0; + + ASSERT(dst_area->surface->num_planes == src_area->surface->num_planes); + + ctx->sbcopy.is_valid = 0; + + for (i=0; isurface->num_planes; ++i) + { + result = frcopy_set(&ctx->frcopy[i], + &dst_area->planes[i], + &src_area->planes[i], + transform); + if (result == TEGRA_2D_OK) + { + num_words += frcopy_num_words(&ctx->frcopy[i]); + num_relocs += frcopy_num_relocs(&ctx->frcopy[i]); + continue; + } + + result = g2copy_set(&ctx->g2copy[i], + &dst_area->planes[i], + &src_area->planes[i], + transform); + if (result == TEGRA_2D_OK) + { + num_words += g2copy_num_words(&ctx->g2copy[i]); + num_relocs += g2copy_num_relocs(&ctx->g2copy[i]); + continue; + } + + break; + } + + if (result != TEGRA_2D_OK) + { + result = sbcopy_set(&ctx->sbcopy, + dst_area, + src_area, + transform); + if (result != TEGRA_2D_OK) + return TEGRA_2D_UNSUPPORTED_BLIT; + + num_words = sbcopy_num_words(&ctx->sbcopy); + num_relocs = sbcopy_num_relocs(&ctx->sbcopy); + } + + if (ctx->base.log_enable) + { + if (ctx->sbcopy.is_valid) + { + sbcopy_dump(&ctx->sbcopy); + } + else + { + for (i=0; isurface->num_planes; ++i) + { + if (ctx->frcopy[i].is_valid) + frcopy_dump(&ctx->frcopy[i]); + else + g2copy_dump(&ctx->g2copy[i]); + } + } + } + + result = tegra_stream_begin(ctx->stream, + num_words, + &ctx->pre_fence, + tegra_fence_is_valid(&ctx->pre_fence) ? + 1 : 0, + 0, + num_relocs, + 0); + if (result != 0) + return TEGRA_2D_STREAM_FAILURE; + + if (ctx->sbcopy.is_valid) + { + sbcopy_dispatch(&ctx->sbcopy, ctx->stream); + } + else + { + for (i=0; isurface->num_planes; ++i) + { + if (ctx->frcopy[i].is_valid) + frcopy_dispatch(&ctx->frcopy[i], ctx->stream); + else + g2copy_dispatch(&ctx->g2copy[i], ctx->stream); + } + } + + tegra_stream_end(ctx->stream); + + return TEGRA_2D_OK; +} + +int +copy2d(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface *src, + const struct tegra_2d_rect *dst_rect, + const struct tegra_2d_rect *src_rect, + enum tegra_2d_transform transform) +{ + int result; + struct tegra_2d_rect vdst_rect; + struct tegra_2d_rect vsrc_rect; + struct tegra_2d_surface_area dst_area; + struct tegra_2d_surface_area src_area; + + ASSERT(ctx); + + if (dst == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + if (src == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + if (dst_rect == NULL) + { + vdst_rect.left = 0; + vdst_rect.top = 0; + vdst_rect.right = dst->planes[0].width; + vdst_rect.bottom = dst->planes[0].height; + } + else + { + result = validate_rect(dst, dst_rect); + if (result != TEGRA_2D_OK) + return result; + + vdst_rect = *dst_rect; + } + + if (src_rect == NULL) + { + vsrc_rect.left = 0; + vsrc_rect.top = 0; + vsrc_rect.right = src->planes[0].width; + vsrc_rect.bottom = src->planes[0].height; + } + else + { + result = validate_rect(src, src_rect); + if (result != TEGRA_2D_OK) + return result; + + vsrc_rect = *src_rect; + } + + compute_surface_area(&dst_area, dst, &vdst_rect); + compute_surface_area(&src_area, src, &vsrc_rect); + + if (ctx->base.dump_enable) + dump_src(ctx, src); + + result = copy_area(ctx, &dst_area, &src_area, transform); + if (result != TEGRA_2D_OK) + return result; + + if (ctx->base.dump_enable) + dump_dst(ctx, dst); + + return TEGRA_2D_OK; +} diff --git a/tegra/2d/tegra_2d_copy.h b/tegra/2d/tegra_2d_copy.h new file mode 100644 index 0000000..b307245 --- /dev/null +++ b/tegra/2d/tegra_2d_copy.h @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_COPY_H +#define TEGRA_2D_COPY_H + +int +copy2d(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface *src, + const struct tegra_2d_rect *dst_rect, + const struct tegra_2d_rect *src_rect, + enum tegra_2d_transform transform); + +#endif // TEGRA_2D_COPY_H diff --git a/tegra/2d/tegra_2d_fill.c b/tegra/2d/tegra_2d_fill.c new file mode 100644 index 0000000..8186b56 --- /dev/null +++ b/tegra/2d/tegra_2d_fill.c @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include +#include "tegra_2d.h" +#include "tegra_2d_context.h" +#include "tegra_2d_fill.h" +#include "tegra_2d_color.h" +#include "tegra_2d_surface.h" +#include "tegra_2d_util.h" + +static int +fill_area(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface_area *dst_area, + const struct tegra_2d_surface_color *color) +{ + int i; + int result; + uint32_t num_words = 0; + uint32_t num_relocs = 0; + + for (i=0; isurface->num_planes; ++i) + { + ASSERT(dst_area->planes[i].plane->format == color->planes[i].format); + + result = g2fill_set(&ctx->g2fill[i], + &dst_area->planes[i], + &color->planes[i]); + if (result != TEGRA_2D_OK) + return result; + + num_words += g2fill_num_words(&ctx->g2fill[i]); + num_relocs += g2fill_num_relocs(&ctx->g2fill[i]); + } + + if (ctx->base.log_enable) + { + for (i=0; isurface->num_planes; ++i) + g2fill_dump(&ctx->g2fill[i]); + } + + result = tegra_stream_begin(ctx->stream, + num_words, + &ctx->pre_fence, + tegra_fence_is_valid(&ctx->pre_fence) ? + 1 : 0, + 0, + num_relocs, + 0); + if (result != 0) + return TEGRA_2D_STREAM_FAILURE; + + for (i=0; isurface->num_planes; ++i) + g2fill_dispatch(&ctx->g2fill[i], ctx->stream); + + tegra_stream_end(ctx->stream); + + return TEGRA_2D_OK; +} + +int +fill2d(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface_color *color, + const struct tegra_2d_rect *dst_rect) +{ + int i; + int result; + struct tegra_2d_rect vdst_rect; + struct tegra_2d_surface_color vcolor; + struct tegra_2d_surface_area dst_area; + + ASSERT(ctx); + + if (dst == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + if (color == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + if (dst_rect == NULL) + { + vdst_rect.left = 0; + vdst_rect.top = 0; + vdst_rect.right = dst->planes[0].width; + vdst_rect.bottom = dst->planes[0].height; + } + else + { + result = validate_rect(dst, dst_rect); + if (result != TEGRA_2D_OK) + return result; + + vdst_rect = *dst_rect; + } + + vcolor.num_planes = dst->num_planes; + for (i=0; iplanes[i].format; + + color_convert(&vcolor, color); + + compute_surface_area(&dst_area, dst, &vdst_rect); + + result = fill_area(ctx, &dst_area, &vcolor); + if (result != TEGRA_2D_OK) + return result; + + if (ctx->base.dump_enable) + dump_dst(ctx, dst); + + return TEGRA_2D_OK; +} diff --git a/tegra/2d/tegra_2d_fill.h b/tegra/2d/tegra_2d_fill.h new file mode 100644 index 0000000..1d52baa --- /dev/null +++ b/tegra/2d/tegra_2d_fill.h @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_FILL_H +#define TEGRA_2D_FILL_H + +int +fill2d(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface_color *color, + const struct tegra_2d_rect *dst_rect); + +#endif // TEGRA_2D_FILL_H diff --git a/tegra/2d/tegra_2d_frcopy.c b/tegra/2d/tegra_2d_frcopy.c new file mode 100644 index 0000000..991d29d --- /dev/null +++ b/tegra/2d/tegra_2d_frcopy.c @@ -0,0 +1,274 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include "tegra_drmif.h" +#include "class_ids.h" +#include "tegra_2d_frcopy.h" +#include "tegra_2d_reg_g2sb.h" +#include "tegra_2d_reg_host.h" + +uint32_t +frcopy_num_words(const struct tegra_2d_frcopy *hw) +{ + return 1 + sizeof(hw->block) / sizeof(uint32_t); +} + +uint32_t +frcopy_num_relocs(const struct tegra_2d_frcopy *hw) +{ + return 2; +} + +void +frcopy_init(struct tegra_2d_frcopy *hw) +{ + ASSERT(hw); + + hw->is_valid = 0; + + GR2D_RESET(trigger); + GR2D_RESET(cmdsel); + GR2D_RESET(controlsecond); + GR2D_RESET(controlmain); + GR2D_RESET(tilemode); + GR2D_RESET(dstba); + GR2D_RESET(dstst); + GR2D_RESET(srcba); + GR2D_RESET(srcst); + GR2D_RESET(srcsize); + + OPCODE_MASK2(op1, + trigger, + cmdsel); + OPCODE_MASK2(op2, + controlsecond, + controlmain); + OPCODE_NONINCR(op3, tilemode, 1); + OPCODE_MASK5(op4, + dstba, + dstst, + srcba, + srcst, + srcsize); + + GR2D_VAL(trigger, trigger, gr2d_srcsize_r()); + GR2D_DEF(cmdsel, sbor2d, g2); + GR2D_DEF(controlsecond, fr_mode, src_dst_copy); + GR2D_DEF(controlsecond, fr_readwait, enable); + GR2D_DEF(controlmain, cmdt, bitblt); +} + +static uint32_t +compute_offset(const struct tegra_2d_plane *plane, + uint32_t xpos, + uint32_t ypos) +{ + uint32_t offset; + uint32_t bytes_per_pixel = TEGRA_2D_FORMAT_BYTES(plane->format); + uint32_t pixels_per_line = plane->pitch / bytes_per_pixel; + + if (plane->layout == TEGRA_2D_LAYOUT_LINEAR) + { + offset = ypos * plane->pitch; + offset += xpos * bytes_per_pixel; + } + else + { + uint32_t xb = xpos * bytes_per_pixel; + offset = 16 * pixels_per_line * (ypos / 16); + offset += 256 * (xb / 16); + offset += 16 * (ypos % 16); + offset += xb % 16; + } + + return plane->mem_offset + offset; +} + +int +frcopy_set(struct tegra_2d_frcopy *hw, + const struct tegra_2d_plane_area *dst, + const struct tegra_2d_plane_area *src, + enum tegra_2d_transform transform) +{ + uint32_t block_size; + uint32_t align_mask; + uint32_t dst_xpos = dst->xpos; + uint32_t dst_ypos = dst->ypos; + uint32_t src_xpos = src->xpos; + uint32_t src_ypos = src->ypos; + uint32_t src_width = src->width; + uint32_t src_height = src->height; + + ASSERT(hw); + + hw->is_valid = 0; + + if (dst->plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + if (src->plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + if (src_width > 4096 || src_height > 4096) + return TEGRA_2D_UNSUPPORTED_BLIT; + + if (src->plane->format != dst->plane->format) + return TEGRA_2D_UNSUPPORTED_BLIT; + + if (!equal_size_area(src, dst, transform)) + return TEGRA_2D_UNSUPPORTED_BLIT; + + hw->dst_handle = dst->plane->mem_handle; + hw->dst_offset = compute_offset(dst->plane, dst_xpos, dst_ypos); + hw->src_handle = src->plane->mem_handle; + hw->src_offset = compute_offset(src->plane, src_xpos, src_ypos); + + switch (transform) + { + #define CASE(transform, v) \ + case TEGRA_2D_TRANSFORM_##transform: \ + GR2D_DEF(controlsecond, fr_type, v); \ + break + CASE(IDENTITY, identity); + CASE(ROT_90, rot_90); + CASE(ROT_180, rot_180); + CASE(ROT_270, rot_270); + CASE(FLIP_X, flip_x); + CASE(FLIP_Y, flip_y); + CASE(TRANSPOSE, trans_lr); + CASE(INV_TRANSPOSE, trans_rl); + #undef CASE + default: + ASSERT(0); + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + switch (TEGRA_2D_FORMAT_BITS(dst->plane->format)) + { + #define CASE(v) \ + case v: \ + GR2D_DEF(controlmain, dstcd, bpp##v); \ + block_size = 128 / v; \ + break + CASE(8); + CASE(16); + CASE(32); + #undef CASE + default: + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + align_mask = block_size - 1; + #define CHECK_ALIGNMENT(v) ((((uint32_t) v) & align_mask) != 0) + if (CHECK_ALIGNMENT(src_width) || + CHECK_ALIGNMENT(src_height) || + CHECK_ALIGNMENT(src_xpos) || + CHECK_ALIGNMENT(src_ypos) || + CHECK_ALIGNMENT(dst_xpos) || + CHECK_ALIGNMENT(dst_ypos)) + return TEGRA_2D_UNSUPPORTED_BLIT; + #undef CHECK_ALIGNMENT + + GR2D_DEF(controlmain, srccd, same); + + if (dst->plane->layout == TEGRA_2D_LAYOUT_TILED) + GR2D_DEF(tilemode, dst_wr_tile_mode, tiled); + else + GR2D_DEF(tilemode, dst_wr_tile_mode, linear); + + if (src->plane->layout == TEGRA_2D_LAYOUT_TILED) + GR2D_DEF(tilemode, src_y_tile_mode, tiled); + else + GR2D_DEF(tilemode, src_y_tile_mode, linear); + + GR2D_VAL(dstst, dsts, dst->plane->pitch); + GR2D_VAL(srcst, srcs, src->plane->pitch); + GR2D_VAL(srcsize, srcwidth, src_width - 1); + GR2D_VAL(srcsize, srcheight, src_height - 1); + + hw->is_valid = 1; + return TEGRA_2D_OK; +} + +void +frcopy_dispatch(const struct tegra_2d_frcopy *hw, + struct tegra_stream *stream) +{ + ASSERT(hw); + ASSERT(hw->is_valid); + ASSERT(stream); + + tegra_stream_push_setclass(stream, NV_GRAPHICS_2D_CLASS_ID); + + tegra_stream_push_words(stream, + &hw->block, + sizeof(hw->block) / sizeof(uint32_t), + 2, + tegra_reloc(&hw->block.dstba, + hw->dst_handle, + hw->dst_offset), + tegra_reloc(&hw->block.srcba, + hw->src_handle, + hw->src_offset)); +} + +void +frcopy_dump(const struct tegra_2d_frcopy *hw) +{ + char buffer[1024]; + int offset = 0; + int space = ARRAY_SIZE(buffer); + + ASSERT(hw); + + offset = snprintf(buffer, space, "G2 Copy:\n"); + + #define PRINT(reg) \ + offset += snprintf(buffer + offset, \ + MAX(0, space - offset), \ + "%18s: 0x%08x\n", \ + #reg, \ + hw->block.reg) + + PRINT(op1); + PRINT(trigger); + PRINT(cmdsel); + PRINT(op2); + PRINT(controlsecond); + PRINT(controlmain); + PRINT(op3); + PRINT(tilemode); + PRINT(op4); + PRINT(dstba); + PRINT(dstst); + PRINT(srcba); + PRINT(srcst); + PRINT(srcsize); + + #undef PRINT + + LOG("%s", buffer); +} diff --git a/tegra/2d/tegra_2d_frcopy.h b/tegra/2d/tegra_2d_frcopy.h new file mode 100644 index 0000000..f0ca115 --- /dev/null +++ b/tegra/2d/tegra_2d_frcopy.h @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_FRCOPY_H +#define TEGRA_2D_FRCOPY_H + +#include +#include "tegra_2d.h" +#include "tegra_2d_util.h" + +struct tegra_2d_frcopy +{ + struct tegra_2d_frcopy_block + { + uint32_t op1; + uint32_t trigger; + uint32_t cmdsel; + + uint32_t op2; + uint32_t controlsecond; + uint32_t controlmain; + + uint32_t op3; + uint32_t tilemode; + + uint32_t op4; + uint32_t dstba; + uint32_t dstst; + uint32_t srcba; + uint32_t srcst; + uint32_t srcsize; + } block; + int is_valid; + struct tegra_bo *dst_handle; + struct tegra_bo *src_handle; + int dst_offset; + int src_offset; +}; + +uint32_t +frcopy_num_words(const struct tegra_2d_frcopy *hw); + +uint32_t +frcopy_num_relocs(const struct tegra_2d_frcopy *hw); + +void +frcopy_init(struct tegra_2d_frcopy *hw); + +int +frcopy_set(struct tegra_2d_frcopy *hw, + const struct tegra_2d_plane_area *dst, + const struct tegra_2d_plane_area *src, + enum tegra_2d_transform transform); + +void +frcopy_dispatch(const struct tegra_2d_frcopy *hw, + struct tegra_stream *stream); + +void +frcopy_dump(const struct tegra_2d_frcopy *hw); + +#endif // TEGRA_2D_FRCOPY_H diff --git a/tegra/2d/tegra_2d_g2copy.c b/tegra/2d/tegra_2d_g2copy.c new file mode 100644 index 0000000..9dccf25 --- /dev/null +++ b/tegra/2d/tegra_2d_g2copy.c @@ -0,0 +1,272 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include "tegra_drmif.h" +#include "class_ids.h" +#include "tegra_2d_g2copy.h" +#include "tegra_2d_reg_g2sb.h" +#include "tegra_2d_reg_host.h" + +uint32_t +g2copy_num_words(const struct tegra_2d_g2copy *hw) +{ + return 1 + sizeof(hw->block) / sizeof(uint32_t); +} + +uint32_t +g2copy_num_relocs(const struct tegra_2d_g2copy *hw) +{ + return 2; +} + +void +g2copy_init(struct tegra_2d_g2copy *hw) +{ + ASSERT(hw); + + hw->is_valid = 0; + + GR2D_RESET(trigger); + GR2D_RESET(cmdsel); + GR2D_RESET(controlsecond); + GR2D_RESET(controlmain); + GR2D_RESET(ropfade); + GR2D_RESET(tilemode); + GR2D_RESET(dstba); + GR2D_RESET(dstst); + GR2D_RESET(srcba); + GR2D_RESET(srcst); + GR2D_RESET(dstsize); + GR2D_RESET(srcps); + GR2D_RESET(dstps); + + OPCODE_MASK2(op1, + trigger, + cmdsel); + OPCODE_MASK3(op2, + controlsecond, + controlmain, + ropfade); + OPCODE_NONINCR(op3, tilemode, 1); + OPCODE_MASK7(op4, + dstba, + dstst, + srcba, + srcst, + dstsize, + srcps, + dstps); + + GR2D_VAL(trigger, trigger, gr2d_dstps_r()); + GR2D_DEF(cmdsel, sbor2d, g2); + GR2D_DEF(controlmain, cmdt, bitblt); + GR2D_VAL(ropfade, rop, 0xCC); +} + +int +g2copy_set(struct tegra_2d_g2copy *hw, + const struct tegra_2d_plane_area *dst, + const struct tegra_2d_plane_area *src, + enum tegra_2d_transform transform) +{ + int transpose; + int flip_x; + int flip_y; + uint32_t max_width; + uint32_t dst_xpos = dst->xpos; + uint32_t dst_ypos = dst->ypos; + uint32_t dst_width = dst->width; + uint32_t dst_height = dst->height; + uint32_t src_xpos = src->xpos; + uint32_t src_ypos = src->ypos; + + ASSERT(hw); + ASSERT(dst); + ASSERT(src); + + hw->is_valid = 0; + + if (dst->plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + if (src->plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + if (src->plane->format != dst->plane->format) + return TEGRA_2D_UNSUPPORTED_BLIT; + + if (!equal_size_area(src, dst, transform)) + return TEGRA_2D_UNSUPPORTED_BLIT; + + hw->dst_handle = dst->plane->mem_handle; + hw->dst_offset = dst->plane->mem_offset; + hw->src_handle = src->plane->mem_handle; + hw->src_offset = src->plane->mem_offset; + + switch (transform) + { + #define CASE(transform, t, fx, fy) \ + case TEGRA_2D_TRANSFORM_##transform: \ + transpose = t; \ + flip_x = fx; \ + flip_y = fy; \ + break + CASE(IDENTITY, 0, 0, 0); + CASE(ROT_90, 1, 0, 1); + CASE(ROT_180, 0, 1, 1); + CASE(ROT_270, 1, 1, 0); + CASE(FLIP_X, 0, 1, 0); + CASE(FLIP_Y, 0, 0, 1); + CASE(TRANSPOSE, 1, 0, 0); + CASE(INV_TRANSPOSE, 1, 1, 1); + #undef CASE + default: + ASSERT(0); + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + if (flip_x) + return TEGRA_2D_UNSUPPORTED_BLIT; + + if (transpose) + GR2D_DEF(controlmain, xytdw, enable); + else + GR2D_DEF(controlmain, xytdw, disable); + + switch (TEGRA_2D_FORMAT_BITS(dst->plane->format)) + { + #define CASE(v, max) \ + case v: \ + GR2D_DEF(controlmain, dstcd, bpp##v); \ + max_width = max; \ + break + CASE(8, 32760); + CASE(16, 16384); + CASE(32, 8192); + #undef CASE + default: + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + if (dst_width > max_width) + return TEGRA_2D_UNSUPPORTED_BLIT; + + GR2D_DEF(controlmain, srccd, same); + + if (dst->plane->layout == TEGRA_2D_LAYOUT_TILED) + GR2D_DEF(tilemode, dst_wr_tile_mode, tiled); + else + GR2D_DEF(tilemode, dst_wr_tile_mode, linear); + + if (src->plane->layout == TEGRA_2D_LAYOUT_TILED) + GR2D_DEF(tilemode, src_y_tile_mode, tiled); + else + GR2D_DEF(tilemode, src_y_tile_mode, linear); + + GR2D_VAL(dstst, dsts, dst->plane->pitch); + GR2D_VAL(srcst, srcs, src->plane->pitch); + GR2D_VAL(dstsize, dstwidth, dst_width); + GR2D_VAL(dstsize, dstheight, dst_height); + GR2D_VAL(srcps, srcx, src_xpos); + GR2D_VAL(srcps, srcy, src_ypos); + GR2D_VAL(dstps, dstx, dst_xpos); + if (flip_y) + { + GR2D_DEF(controlmain, yflip, enable); + GR2D_VAL(dstps, dsty, dst_ypos + dst_height - 1); + } + else + { + GR2D_DEF(controlmain, yflip, disable); + GR2D_VAL(dstps, dsty, dst_ypos); + } + + hw->is_valid = 1; + return TEGRA_2D_OK; +} + +void +g2copy_dispatch(const struct tegra_2d_g2copy *hw, + struct tegra_stream *stream) +{ + ASSERT(hw); + ASSERT(hw->is_valid); + ASSERT(stream); + + tegra_stream_push_setclass(stream, NV_GRAPHICS_2D_CLASS_ID); + + tegra_stream_push_words(stream, + &hw->block, + sizeof(hw->block) / sizeof(uint32_t), + 2, + tegra_reloc(&hw->block.dstba, + hw->dst_handle, + hw->dst_offset), + tegra_reloc(&hw->block.srcba, + hw->src_handle, + hw->src_offset)); +} + +void +g2copy_dump(const struct tegra_2d_g2copy *hw) +{ + char buffer[1024]; + int offset = 0; + int space = ARRAY_SIZE(buffer); + + ASSERT(hw); + + offset = snprintf(buffer, space, "G2 Copy:\n"); + + #define PRINT(reg) \ + offset += snprintf(buffer + offset, \ + MAX(0, space - offset), \ + "%18s: 0x%08x\n", \ + #reg, \ + hw->block.reg) + + PRINT(op1); + PRINT(trigger); + PRINT(cmdsel); + PRINT(op2); + PRINT(controlsecond); + PRINT(controlmain); + PRINT(ropfade); + PRINT(op3); + PRINT(tilemode); + PRINT(op4); + PRINT(dstba); + PRINT(dstst); + PRINT(srcba); + PRINT(srcst); + PRINT(dstsize); + PRINT(srcps); + PRINT(dstps); + + #undef PRINT + + LOG("%s", buffer); +} diff --git a/tegra/2d/tegra_2d_g2copy.h b/tegra/2d/tegra_2d_g2copy.h new file mode 100644 index 0000000..22f79bc --- /dev/null +++ b/tegra/2d/tegra_2d_g2copy.h @@ -0,0 +1,88 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_G2COPY_H +#define TEGRA_2D_G2COPY_H + +#include +#include "tegra_2d.h" +#include "tegra_2d_util.h" + +struct tegra_2d_g2copy +{ + struct tegra_2d_g2copy_block + { + uint32_t op1; + uint32_t trigger; + uint32_t cmdsel; + + uint32_t op2; + uint32_t controlsecond; + uint32_t controlmain; + uint32_t ropfade; + + uint32_t op3; + uint32_t tilemode; + + uint32_t op4; + uint32_t dstba; + uint32_t dstst; + uint32_t srcba; + uint32_t srcst; + uint32_t dstsize; + uint32_t srcps; + uint32_t dstps; + } block; + int is_valid; + struct tegra_bo *dst_handle; + struct tegra_bo *src_handle; + int dst_offset; + int src_offset; +}; + +uint32_t +g2copy_num_words(const struct tegra_2d_g2copy *hw); + +uint32_t +g2copy_num_relocs(const struct tegra_2d_g2copy *hw); + +void +g2copy_init(struct tegra_2d_g2copy *hw); + +int +g2copy_set(struct tegra_2d_g2copy *hw, + const struct tegra_2d_plane_area *dst, + const struct tegra_2d_plane_area *src, + enum tegra_2d_transform transform); + +void +g2copy_dispatch(const struct tegra_2d_g2copy *hw, + struct tegra_stream *stream); + +void +g2copy_dump(const struct tegra_2d_g2copy *hw); + +#endif // TEGRA_2D_G2COPY_H diff --git a/tegra/2d/tegra_2d_g2fill.c b/tegra/2d/tegra_2d_g2fill.c new file mode 100644 index 0000000..91987c0 --- /dev/null +++ b/tegra/2d/tegra_2d_g2fill.c @@ -0,0 +1,192 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include "tegra_drmif.h" +#include "class_ids.h" +#include "tegra_2d_g2fill.h" +#include "tegra_2d_reg_g2sb.h" +#include "tegra_2d_reg_host.h" + +uint32_t +g2fill_num_words(const struct tegra_2d_g2fill *hw) +{ + return 1 + (sizeof(hw->block) / sizeof(uint32_t)); +} + +uint32_t +g2fill_num_relocs(const struct tegra_2d_g2fill *hw) +{ + return 1; +} + +void +g2fill_init(struct tegra_2d_g2fill *hw) +{ + ASSERT(hw); + + hw->is_valid = 0; + + GR2D_RESET(trigger); + GR2D_RESET(cmdsel); + GR2D_RESET(controlsecond); + GR2D_RESET(controlmain); + GR2D_RESET(ropfade); + GR2D_RESET(dstba); + GR2D_RESET(dstst); + GR2D_RESET(srcfgc); + GR2D_RESET(dstsize); + GR2D_RESET(dstps); + + OPCODE_MASK2(op1, + trigger, + cmdsel); + OPCODE_MASK3(op2, + controlsecond, + controlmain, + ropfade); + OPCODE_MASK5(op3, + dstba, + dstst, + srcfgc, + dstsize, + dstps); + + GR2D_VAL(trigger, trigger, gr2d_dstps_r()); + GR2D_DEF(cmdsel, sbor2d, g2); + GR2D_DEF(controlmain, cmdt, bitblt); + GR2D_DEF(controlmain, turbofill, enable); + GR2D_DEF(controlmain, srcsld, enable); + GR2D_VAL(ropfade, rop, 0xCC); +} + +int +g2fill_set(struct tegra_2d_g2fill *hw, + const struct tegra_2d_plane_area *dst, + const struct tegra_2d_plane_color *color) +{ + int max_width; + uint32_t dst_xpos = dst->xpos; + uint32_t dst_ypos = dst->ypos; + uint32_t dst_width = dst->width; + uint32_t dst_height = dst->height; + + ASSERT(hw); + ASSERT(dst); + ASSERT(color); + + hw->is_valid = 0; + + if (dst->plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + hw->dst_handle = dst->plane->mem_handle; + hw->dst_offset = dst->plane->mem_offset; + + switch (TEGRA_2D_FORMAT_BITS(dst->plane->format)) + { + #define CASE(v, max) \ + case v: \ + GR2D_DEF(controlmain, dstcd, bpp##v); \ + max_width = max; \ + break + CASE(8, 32760); + CASE(16, 16384); + CASE(32, 8192); + #undef CASE + default: + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + if (dst->width > max_width) + return TEGRA_2D_UNSUPPORTED_BLIT; + + GR2D_DEF(controlmain, srccd, same); + GR2D_VAL(dstst, dsts, dst->plane->pitch); + GR2D_VAL(srcfgc, srcfgc, color->value); + GR2D_VAL(dstsize, dstwidth, dst_width); + GR2D_VAL(dstsize, dstheight, dst_height); + GR2D_VAL(dstps, dstx, dst_xpos); + GR2D_VAL(dstps, dsty, dst_ypos); + + hw->is_valid = 1; + return TEGRA_2D_OK; +} + +void +g2fill_dispatch(const struct tegra_2d_g2fill *hw, + struct tegra_stream *stream) +{ + ASSERT(hw); + ASSERT(hw->is_valid); + ASSERT(stream); + + tegra_stream_push_setclass(stream, NV_GRAPHICS_2D_CLASS_ID); + + tegra_stream_push_words(stream, + &hw->block, + sizeof(hw->block) / sizeof(uint32_t), + 1, + tegra_reloc(&hw->block.dstba, + hw->dst_handle, + hw->dst_offset)); +} + +void +g2fill_dump(const struct tegra_2d_g2fill *hw) +{ + char buffer[1024]; + int offset = 0; + int space = ARRAY_SIZE(buffer); + + ASSERT(hw); + + offset = snprintf(buffer, space, "G2 Fill:\n"); + + #define PRINT(reg) \ + offset += snprintf(buffer + offset, \ + MAX(0, space - offset), \ + "%18s: 0x%08x\n", \ + #reg, \ + hw->block.reg) + + PRINT(op1); + PRINT(trigger); + PRINT(cmdsel); + PRINT(op2); + PRINT(controlsecond); + PRINT(controlmain); + PRINT(ropfade); + PRINT(op3); + PRINT(dstba); + PRINT(dstst); + PRINT(srcfgc); + PRINT(dstsize); + PRINT(dstps); + + #undef PRINT + + LOG("%s", buffer); +} diff --git a/tegra/2d/tegra_2d_g2fill.h b/tegra/2d/tegra_2d_g2fill.h new file mode 100644 index 0000000..e0715bd --- /dev/null +++ b/tegra/2d/tegra_2d_g2fill.h @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_G2FILL_H +#define TEGRA_2D_G2FILL_H + +#include +#include "tegra_2d.h" +#include "tegra_2d_util.h" + +struct tegra_2d_g2fill +{ + struct tegra_2d_g2fill_block + { + uint32_t op1; + uint32_t trigger; + uint32_t cmdsel; + + uint32_t op2; + uint32_t controlsecond; + uint32_t controlmain; + uint32_t ropfade; + + uint32_t op3; + uint32_t dstba; + uint32_t dstst; + uint32_t srcfgc; + uint32_t dstsize; + uint32_t dstps; + } block; + int is_valid; + struct tegra_bo *dst_handle; + int dst_offset; +}; + +uint32_t +g2fill_num_words(const struct tegra_2d_g2fill *hw); + +uint32_t +g2fill_num_relocs(const struct tegra_2d_g2fill *hw); + +void +g2fill_init(struct tegra_2d_g2fill *hw); + +int +g2fill_set(struct tegra_2d_g2fill *hw, + const struct tegra_2d_plane_area *dst, + const struct tegra_2d_plane_color *color); + +void +g2fill_dispatch(const struct tegra_2d_g2fill *hw, + struct tegra_stream *stream); + +void +g2fill_dump(const struct tegra_2d_g2fill *hw); + +#endif // TEGRA_2D_G2FILL_H diff --git a/tegra/2d/tegra_2d_reg_g2sb.h b/tegra/2d/tegra_2d_reg_g2sb.h new file mode 100644 index 0000000..cbe09b0 --- /dev/null +++ b/tegra/2d/tegra_2d_reg_g2sb.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_REG_G2SB_H +#define TEGRA_2D_REG_G2SB_H + +#include +#include "hw_gr2d.h" + +#define GR2D_RESET(reg) \ + hw->block.reg = gr2d_##reg##_reset_val_v() + +#define GR2D_VAL(reg, field, value) \ + hw->block.reg = (hw->block.reg & ~gr2d_##reg##_##field##_m()) \ + | gr2d_##reg##_##field##_f((value)) + +#define GR2D_DEF(reg, field, def) \ + hw->block.reg = (hw->block.reg & ~gr2d_##reg##_##field##_m()) \ + | gr2d_##reg##_##field##_f(gr2d_##reg##_##field##_##def##_v()) + +static inline uint32_t gr2d_controlmain_yflip_disable_v(void) +{ + return gr2d_controlmain_yflip_dsiable_v(); +} +static inline uint32_t gr2d_controlmain_turbofill_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_turbofill_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srccd_mono_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_srccd_same_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_xytdw_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_xytdw_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_srcdir_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_srcdir_enable_v(void) +{ + return 1; +} +static inline uint32_t gr2d_controlmain_dstdir_disable_v(void) +{ + return 0; +} +static inline uint32_t gr2d_controlmain_dstdir_enable_v(void) +{ + return 1; +} + +#endif // TEGRA_2D_REG_G2SB_H diff --git a/tegra/2d/tegra_2d_reg_host.h b/tegra/2d/tegra_2d_reg_host.h new file mode 100644 index 0000000..228d9bb --- /dev/null +++ b/tegra/2d/tegra_2d_reg_host.h @@ -0,0 +1,119 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_REG_HOST_H +#define TEGRA_2D_REG_HOST_H + +#include +#include "host1x01_hardware.h" +#include "hw_gr2d.h" +#include "tegra_2d_util.h" + +#define ADDR(reg) gr2d_##reg##_r() + +#define OPCODE_INCR(word, reg, count) \ + hw->block.op = nvhost_opcode_nonincr(ADDR(reg), count) + +#define OPCODE_NONINCR(op, reg, count) \ + hw->block.op = nvhost_opcode_nonincr(ADDR(reg), count) + +#define OPCODE_MASK(op, addr, mask) \ + CT_ASSERT((mask) <= 0xffff); \ + hw->block.op = nvhost_opcode_mask(addr, mask) + +#define OPCODE_MASK2(op, reg0, reg1) \ + CT_ASSERT(ADDR(reg0) < ADDR(reg1)); \ + CT_ASSERT(ADDR(reg1) - ADDR(reg0) < 16); \ + OPCODE_MASK(op, ADDR(reg0), \ + nvhost_mask2(ADDR(reg0), ADDR(reg0)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg1))) + +#define OPCODE_MASK3(op, reg0, reg1, reg2) \ + CT_ASSERT(ADDR(reg0) < ADDR(reg1)); \ + CT_ASSERT(ADDR(reg1) < ADDR(reg2)); \ + CT_ASSERT(ADDR(reg2) - ADDR(reg0) < 16); \ + OPCODE_MASK(op, ADDR(reg0), \ + nvhost_mask2(ADDR(reg0), ADDR(reg0)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg1)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg2))) + +#define OPCODE_MASK4(op, reg0, reg1, reg2, reg3) \ + CT_ASSERT(ADDR(reg0) < ADDR(reg1)); \ + CT_ASSERT(ADDR(reg1) < ADDR(reg2)); \ + CT_ASSERT(ADDR(reg2) < ADDR(reg3)); \ + CT_ASSERT(ADDR(reg3) - ADDR(reg0) < 16); \ + OPCODE_MASK(op, ADDR(reg0), \ + nvhost_mask2(ADDR(reg0), ADDR(reg0)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg1)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg2)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg3))) + +#define OPCODE_MASK5(op, reg0, reg1, reg2, reg3, reg4) \ + CT_ASSERT(ADDR(reg0) < ADDR(reg1)); \ + CT_ASSERT(ADDR(reg1) < ADDR(reg2)); \ + CT_ASSERT(ADDR(reg2) < ADDR(reg3)); \ + CT_ASSERT(ADDR(reg3) < ADDR(reg4)); \ + CT_ASSERT(ADDR(reg4) - ADDR(reg0) < 16); \ + OPCODE_MASK(op, ADDR(reg0), \ + nvhost_mask2(ADDR(reg0), ADDR(reg0)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg1)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg2)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg3)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg4))) + +#define OPCODE_MASK6(op, reg0, reg1, reg2, reg3, reg4, reg5) \ + CT_ASSERT(ADDR(reg0) < ADDR(reg1)); \ + CT_ASSERT(ADDR(reg1) < ADDR(reg2)); \ + CT_ASSERT(ADDR(reg2) < ADDR(reg3)); \ + CT_ASSERT(ADDR(reg3) < ADDR(reg4)); \ + CT_ASSERT(ADDR(reg4) < ADDR(reg5)); \ + CT_ASSERT(ADDR(reg5) - ADDR(reg0) < 16); \ + OPCODE_MASK(op, ADDR(reg0), \ + nvhost_mask2(ADDR(reg0), ADDR(reg0)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg1)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg2)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg3)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg4)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg5))) + +#define OPCODE_MASK7(op, reg0, reg1, reg2, reg3, reg4, reg5, reg6) \ + CT_ASSERT(ADDR(reg0) < ADDR(reg1)); \ + CT_ASSERT(ADDR(reg1) < ADDR(reg2)); \ + CT_ASSERT(ADDR(reg2) < ADDR(reg3)); \ + CT_ASSERT(ADDR(reg3) < ADDR(reg4)); \ + CT_ASSERT(ADDR(reg4) < ADDR(reg5)); \ + CT_ASSERT(ADDR(reg5) < ADDR(reg6)); \ + CT_ASSERT(ADDR(reg6) - ADDR(reg0) < 16); \ + OPCODE_MASK(op, ADDR(reg0), \ + nvhost_mask2(ADDR(reg0), ADDR(reg0)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg1)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg2)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg3)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg4)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg5)) | \ + nvhost_mask2(ADDR(reg0), ADDR(reg6))) + +#endif // TEGRA_2D_REG_HOST_H diff --git a/tegra/2d/tegra_2d_sbcopy.c b/tegra/2d/tegra_2d_sbcopy.c new file mode 100644 index 0000000..9b858ff --- /dev/null +++ b/tegra/2d/tegra_2d_sbcopy.c @@ -0,0 +1,388 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include "tegra_drmif.h" +#include "class_ids.h" +#include "tegra_2d_sbcopy.h" +#include "tegra_2d_reg_g2sb.h" +#include "tegra_2d_reg_host.h" + +uint32_t +sbcopy_num_words(const struct tegra_2d_sbcopy *hw) +{ + return 1 + sizeof(hw->block) / sizeof(uint32_t); +} + +uint32_t +sbcopy_num_relocs(const struct tegra_2d_sbcopy *hw) +{ + return 4; +} + +void +sbcopy_init(struct tegra_2d_sbcopy *hw) +{ + ASSERT(hw); + + hw->is_valid = 0; + + GR2D_RESET(trigger); + GR2D_RESET(cmdsel); + GR2D_RESET(vdda); + GR2D_RESET(vddaini); + GR2D_RESET(hdda); + GR2D_RESET(hddainils); + GR2D_RESET(sbformat); + GR2D_RESET(controlsb); + GR2D_RESET(controlsecond); + GR2D_RESET(controlmain); + GR2D_RESET(dstba); + GR2D_RESET(tilemode); + GR2D_RESET(srcba_sb_surfbase); + GR2D_RESET(dstba_sb_surfbase); + GR2D_RESET(dstst); + GR2D_RESET(srcba); + GR2D_RESET(srcst); + GR2D_RESET(srcsize); + GR2D_RESET(dstsize); + + OPCODE_MASK6(op1, + trigger, + cmdsel, + vdda, + vddaini, + hdda, + hddainils); + OPCODE_MASK5(op2, + sbformat, + controlsb, + controlsecond, + controlmain, + dstba); + OPCODE_MASK3(op3, + tilemode, + srcba_sb_surfbase, + dstba_sb_surfbase); + OPCODE_MASK5(op4, + dstst, + srcba, + srcst, + srcsize, + dstsize); + + GR2D_VAL(trigger, trigger, gr2d_dstsize_r()); + GR2D_DEF(cmdsel, sbor2d, sb); + GR2D_DEF(controlmain, cmdt, bitblt); + GR2D_DEF(controlmain, srcdir, enable); + GR2D_DEF(controlmain, dstdir, enable); +} + +int +sbcopy_set(struct tegra_2d_sbcopy *hw, + const struct tegra_2d_surface_area *dst, + const struct tegra_2d_surface_area *src, + enum tegra_2d_transform transform) +{ + int transpose; + int flip_x; + int flip_y; + float inv_scale_x; + float inv_scale_y; + uint32_t dst_xpos = dst->planes[0].xpos; + uint32_t dst_ypos = dst->planes[0].ypos; + uint32_t dst_width = dst->planes[0].width; + uint32_t dst_height = dst->planes[0].height; + uint32_t src_xpos = src->planes[0].xpos; + uint32_t src_ypos = src->planes[0].ypos; + uint32_t src_width = src->planes[0].width; + uint32_t src_height = src->planes[0].height; + + ASSERT(hw); + ASSERT(dst); + ASSERT(src); + + hw->is_valid = 0; + + if (dst->surface->num_planes > 1) + return TEGRA_2D_UNSUPPORTED_BLIT; + + if (src->surface->num_planes > 1) + return TEGRA_2D_UNSUPPORTED_BLIT; + + if (dst->planes[0].plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + if (src->planes[0].plane->mem_handle == NULL) + return TEGRA_2D_INVALID_BUFFER; + + hw->dst_handle = dst->planes[0].plane->mem_handle; + hw->dst_offset = dst->planes[0].plane->mem_offset + + (TEGRA_2D_FORMAT_BYTES(dst->planes[0].plane->format) * + dst_xpos) + + (dst->planes[0].plane->pitch * dst_ypos); + hw->src_handle = src->planes[0].plane->mem_handle; + hw->src_offset = src->planes[0].plane->mem_offset + + (TEGRA_2D_FORMAT_BYTES(src->planes[0].plane->format) * + src_xpos) + + (src->planes[0].plane->pitch * src_ypos); + + switch (transform) + { + #define CASE(transform, t, fx, fy) \ + case TEGRA_2D_TRANSFORM_##transform: \ + transpose = t; \ + flip_x = fx; \ + flip_y = fy; \ + break + CASE(IDENTITY, 0, 0, 0); + CASE(ROT_90, 1, 0, 1); + CASE(ROT_180, 0, 1, 1); + CASE(ROT_270, 1, 1, 0); + CASE(FLIP_X, 0, 1, 0); + CASE(FLIP_Y, 0, 0, 1); + CASE(TRANSPOSE, 1, 0, 0); + CASE(INV_TRANSPOSE, 1, 1, 1); + #undef CASE + default: + ASSERT(0); + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + if (flip_x) + return TEGRA_2D_UNSUPPORTED_BLIT; + + #define FMT(sf, df) \ + (TEGRA_2D_FORMAT_ID(sf) | (TEGRA_2D_FORMAT_ID(df) << 16)) + + switch (FMT(src->planes[0].plane->format, dst->planes[0].plane->format)) + { + #define CASE(sf, df, sif, dif) \ + case FMT(TEGRA_2D_FORMAT_##sf, TEGRA_2D_FORMAT_##df): \ + GR2D_DEF(sbformat, sifmt, sif); \ + GR2D_DEF(sbformat, difmt, dif); \ + break + CASE(R5G6B5, R5G6B5, b5g6r5, b5g6r5); + CASE(R5G6B5, A1R5G5B5, b5g6r5, b5g6r5bs); + CASE(R5G6B5, A8B8G8R8, b5g6r5, r8g8b8a8); + CASE(R5G6B5, A8R8G8B8, b5g6r5, b8g8r8a8); + CASE(A1R5G5B5, R5G6B5, b5g6r5bs, b5g6r5); + CASE(A1R5G5B5, A1R5G5B5, b5g6r5bs, b5g6r5bs); + CASE(A1R5G5B5, A8B8G8R8, b5g6r5bs, r8g8b8a8); + CASE(A1R5G5B5, A8R8G8B8, b5g6r5bs, b8g8r8a8); + CASE(A8B8G8R8, R5G6B5, r8g8b8a8, b5g6r5); + CASE(A8B8G8R8, A1R5G5B5, r8g8b8a8, b5g6r5bs); + CASE(A8B8G8R8, A8B8G8R8, r8g8b8a8, r8g8b8a8); + CASE(A8B8G8R8, A8R8G8B8, r8g8b8a8, b8g8r8a8); + CASE(A8R8G8B8, R5G6B5, b8g8r8a8, b5g6r5); + CASE(A8R8G8B8, A1R5G5B5, b8g8r8a8, b5g6r5bs); + CASE(A8R8G8B8, A8B8G8R8, b8g8r8a8, r8g8b8a8); + CASE(A8R8G8B8, A8R8G8B8, b8g8r8a8, b8g8r8a8); + #undef CASE + default: + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + if (transpose) + { + GR2D_DEF(controlmain, xytdw, enable); + inv_scale_x = ((float) src->planes[0].width - 1) / + (dst->planes[0].height - 1); + inv_scale_y = ((float) src->planes[0].height - 1) / + (dst->planes[0].width - 1); + } + else + { + GR2D_DEF(controlmain, xytdw, disable); + inv_scale_x = ((float) src->planes[0].width - 1) / + (dst->planes[0].width - 1); + inv_scale_y = ((float) src->planes[0].height - 1) / + (dst->planes[0].height - 1); + } + + #define CHECK_SCALE(inv) \ + if (inv > 64.0f || inv < 1.0f/4096.0f) \ + return TEGRA_2D_UNSUPPORTED_BLIT; + CHECK_SCALE(inv_scale_x); + CHECK_SCALE(inv_scale_y); + #undef CHECK_SCALE + + GR2D_DEF(controlsb, discsc, disable); + + if (inv_scale_x == 1.0f) + GR2D_DEF(controlsb, hftype, disable); + else if (inv_scale_x < 1.0f) + GR2D_DEF(controlsb, hftype, interp); + else if (inv_scale_x < 1.3f) + GR2D_DEF(controlsb, hftype, lpf1); + else if (inv_scale_x < 2.0f) + GR2D_DEF(controlsb, hftype, lpf3); + else + GR2D_DEF(controlsb, hftype, lpf6); + + if (inv_scale_y == 1.0f) + { + GR2D_DEF(controlsb, vfen, disable); + } + else + { + GR2D_DEF(controlsb, vfen, enable); + + if (inv_scale_y < 1.0f) + GR2D_DEF(controlsb, vftype, interp); + else if (inv_scale_y < 1.3f) + GR2D_DEF(controlsb, vftype, avg25_interp75); + else if (inv_scale_y < 2.0f) + GR2D_DEF(controlsb, vftype, avg50_interp50); + else + GR2D_DEF(controlsb, vftype, avg); + } + + if (flip_y) + { + GR2D_DEF(controlmain, yflip, enable); + hw->dst_offset += dst->planes[0].plane->pitch * + (dst->planes[0].height - 1); + } + else + { + GR2D_DEF(controlmain, yflip, disable); + } + + switch (TEGRA_2D_FORMAT_BITS(dst->planes[0].plane->format)) + { + #define CASE(v) \ + case v: \ + GR2D_DEF(controlmain, dstcd, bpp##v); \ + break + CASE(8); + CASE(16); + CASE(32); + #undef CASE + default: + return TEGRA_2D_UNSUPPORTED_BLIT; + } + + GR2D_VAL(vdda, vdstep, FLOAT_TO_FIXED_6_12(inv_scale_y)); + GR2D_VAL(vddaini, vdtini, FLOAT_TO_FIXED_0_8(src->planes[0].ypos)); + GR2D_VAL(hdda, hdstep, FLOAT_TO_FIXED_6_12(inv_scale_x)); + GR2D_VAL(hddainils, hdini, FLOAT_TO_FIXED_0_8(src->planes[0].xpos)); + + + if (dst->planes[0].plane->layout == TEGRA_2D_LAYOUT_TILED) + GR2D_DEF(tilemode, dst_wr_tile_mode, tiled); + else + GR2D_DEF(tilemode, dst_wr_tile_mode, linear); + + if (src->planes[0].plane->layout == TEGRA_2D_LAYOUT_TILED) + GR2D_DEF(tilemode, src_y_tile_mode, tiled); + else + GR2D_DEF(tilemode, src_y_tile_mode, linear); + + GR2D_VAL(dstst, dsts, dst->planes[0].plane->pitch); + GR2D_VAL(srcst, srcs, src->planes[0].plane->pitch); + GR2D_VAL(srcsize, srcwidth, src_width); + GR2D_VAL(srcsize, srcheight, src_height - 1); + GR2D_VAL(dstsize, dstwidth, dst_width); + GR2D_VAL(dstsize, dstheight, dst_height - 1); + + hw->is_valid = 1; + return TEGRA_2D_OK; +} + +void +sbcopy_dispatch(const struct tegra_2d_sbcopy *hw, + struct tegra_stream *stream) +{ + ASSERT(hw); + ASSERT(hw->is_valid); + ASSERT(stream); + + tegra_stream_push_setclass(stream, NV_GRAPHICS_2D_SB_CLASS_ID); + + tegra_stream_push_words(stream, + &hw->block, + sizeof(hw->block) / sizeof(uint32_t), + 4, + tegra_reloc(&hw->block.dstba, + hw->dst_handle, + hw->dst_offset), + tegra_reloc(&hw->block.srcba_sb_surfbase, + hw->src_handle, + hw->src_offset), + tegra_reloc(&hw->block.dstba_sb_surfbase, + hw->dst_handle, + hw->dst_offset), + tegra_reloc(&hw->block.srcba, + hw->src_handle, + hw->src_offset)); +} + +void +sbcopy_dump(const struct tegra_2d_sbcopy *hw) +{ + char buffer[1024]; + int offset = 0; + int space = ARRAY_SIZE(buffer); + + ASSERT(hw); + + offset = snprintf(buffer, space, "G2 Copy:\n"); + + #define PRINT(reg) \ + offset += snprintf(buffer + offset, \ + MAX(0, space - offset), \ + "%18s: 0x%08x\n", \ + #reg, \ + hw->block.reg) + + PRINT(op1); + PRINT(trigger); + PRINT(cmdsel); + PRINT(vdda); + PRINT(vddaini); + PRINT(hdda); + PRINT(hddainils); + PRINT(op2); + PRINT(sbformat); + PRINT(controlsb); + PRINT(controlsecond); + PRINT(controlmain); + PRINT(dstba); + PRINT(op3); + PRINT(tilemode); + PRINT(srcba_sb_surfbase); + PRINT(dstba_sb_surfbase); + PRINT(op4); + PRINT(dstst); + PRINT(srcba); + PRINT(srcst); + PRINT(srcsize); + PRINT(dstsize); + + #undef PRINT + + LOG("%s", buffer); +} diff --git a/tegra/2d/tegra_2d_sbcopy.h b/tegra/2d/tegra_2d_sbcopy.h new file mode 100644 index 0000000..38abad2 --- /dev/null +++ b/tegra/2d/tegra_2d_sbcopy.h @@ -0,0 +1,94 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_SBCOPY_H +#define TEGRA_2D_SBCOPY_H + +#include +#include "tegra_2d.h" +#include "tegra_2d_util.h" + +struct tegra_2d_sbcopy +{ + struct tegra_2d_sbcopy_block + { + uint32_t op1; + uint32_t trigger; + uint32_t cmdsel; + uint32_t vdda; + uint32_t vddaini; + uint32_t hdda; + uint32_t hddainils; + + uint32_t op2; + uint32_t sbformat; + uint32_t controlsb; + uint32_t controlsecond; + uint32_t controlmain; + uint32_t dstba; + + uint32_t op3; + uint32_t tilemode; + uint32_t srcba_sb_surfbase; + uint32_t dstba_sb_surfbase; + + uint32_t op4; + uint32_t dstst; + uint32_t srcba; + uint32_t srcst; + uint32_t srcsize; + uint32_t dstsize; + } block; + int is_valid; + struct tegra_bo *dst_handle; + struct tegra_bo *src_handle; + int dst_offset; + int src_offset; +}; + +uint32_t +sbcopy_num_words(const struct tegra_2d_sbcopy *hw); + +uint32_t +sbcopy_num_relocs(const struct tegra_2d_sbcopy *hw); + +void +sbcopy_init(struct tegra_2d_sbcopy *hw); + +int +sbcopy_set(struct tegra_2d_sbcopy *hw, + const struct tegra_2d_surface_area *dst, + const struct tegra_2d_surface_area *src, + enum tegra_2d_transform transform); + +void +sbcopy_dispatch(const struct tegra_2d_sbcopy *hw, + struct tegra_stream *stream); + +void +sbcopy_dump(const struct tegra_2d_sbcopy *hw); + +#endif // TEGRA_2D_SBCOPY_H diff --git a/tegra/2d/tegra_2d_surface.c b/tegra/2d/tegra_2d_surface.c new file mode 100644 index 0000000..5d64adc --- /dev/null +++ b/tegra/2d/tegra_2d_surface.c @@ -0,0 +1,280 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include +#include +#include "tegra_2d.h" +#include "tegra_2d_context.h" +#include "tegra_2d_surface.h" +#include "tegra_2d_color.h" +#include "tegra_2d_util.h" + +int +compute_requirements(const struct tegra_2d_plane *plane, + uint32_t *num_bytes, + uint32_t *alignment, + uint32_t *pitch) +{ + uint32_t num_lines; + uint32_t bytes_per_line; + uint32_t bytes_per_pixel; + + if (plane == NULL || + num_bytes == NULL || + alignment == NULL || + pitch == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + num_lines = plane->height + 1; + bytes_per_pixel = TEGRA_2D_FORMAT_BYTES(plane->format); + + if (plane->layout == TEGRA_2D_LAYOUT_LINEAR) + { + *alignment = 16; + bytes_per_line = ROUND_UP(plane->width * bytes_per_pixel, 32); + } + else + { + *alignment = 256; + bytes_per_line = ROUND_UP(plane->width * bytes_per_pixel, 64); + } + + *pitch = bytes_per_line; + *num_bytes = (num_lines * bytes_per_line) + bytes_per_pixel; + + return TEGRA_2D_OK; +} + +int +allocate_surface(struct tegra_2d_ictx *ctx, + struct tegra_2d_surface *surface) +{ + int i; + int result; + uint32_t num_bytes = 0; + uint32_t alignment = 1; + struct tegra_bo *mem_handle; + + ASSERT(ctx); + + if (surface == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + for (i=0; inum_planes; ++i) + { + uint32_t nb, a, p; + struct tegra_2d_plane *plane = &surface->planes[i]; + + result = compute_requirements(plane, &nb, &a, &p); + if (result != TEGRA_2D_OK) + return result; + + num_bytes = ROUND_UP(num_bytes, a); + + plane->pitch = p; + plane->mem_handle = NULL; + plane->mem_offset = num_bytes; + + num_bytes += nb; + alignment = MAX(alignment, a); + } + + mem_handle = tegra_bo_allocate(ctx->device, + num_bytes, + alignment); + if (mem_handle == NULL) + return TEGRA_2D_MEMORY_FAILURE; + + for (i=0; inum_planes; ++i) + surface->planes[i].mem_handle = mem_handle; + + return TEGRA_2D_OK; +} + +void +free_surface(struct tegra_2d_ictx *ctx, + struct tegra_2d_surface *surface) +{ + int i; + + ASSERT(ctx); + + if (surface == NULL) + return; + + tegra_bo_free(surface->planes[0].mem_handle); + + for (i=0; inum_planes; ++i) + surface->planes[i].mem_handle = NULL; +} + +int +dump_surface(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *surface, + const char *filename) +{ + int i; + int result; + FILE *fp; + + ASSERT(ctx); + + if (surface == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + if (filename == NULL) + return TEGRA_2D_INVALID_PARAMETER; + + LOG("Dumping: %s\n", filename); + + fp = fopen(filename, "wb"); + if (fp == NULL) + return TEGRA_2D_FILE_FAILURE; + + result = TEGRA_2D_OK; + + for (i=0; inum_planes; ++i) + { + void *ptr; + uint8_t *src; + uint32_t bytes_per_pixel; + uint32_t bytes_per_line; + uint32_t num_lines; + const struct tegra_2d_plane *plane = &surface->planes[i]; + + if (plane->mem_handle == NULL) + { + result = TEGRA_2D_INVALID_BUFFER; + goto exit; + } + + bytes_per_pixel = TEGRA_2D_FORMAT_BYTES(plane->format); + bytes_per_line = plane->width * bytes_per_pixel; + num_lines = plane->height; + + ptr = tegra_bo_map(plane->mem_handle); + if (ptr == NULL) + { + result = TEGRA_2D_MEMORY_FAILURE; + goto exit; + } + + src = ((uint8_t *) ptr) + plane->mem_offset; + + while (num_lines > 0) + { + fwrite(src, 1, bytes_per_line, fp); + src += plane->pitch; + --num_lines; + } + + tegra_bo_unmap(plane->mem_handle); + } + +exit: + fclose(fp); + return result; +} + +static void +compute_dump_name(char *buffer, + size_t buffer_size, + const struct tegra_2d_surface *surface, + const char *label, + const char *prefix, + int counter) +{ + int i; + int offset = 0; + int space = buffer_size; + + offset += snprintf(buffer + offset, + MAX(0, space - offset), + "%stegra_2d_%d_%s_", + prefix, + counter, + label); + + for (i=0; inum_planes; ++i) + { + offset += snprintf(buffer + offset, + MAX(0, space - offset), + "%s%dx%dx%s", + i == 0 ? "" : "-", + surface->planes[i].width, + surface->planes[i].height, + format_to_str(surface->planes[i].format)); + } + + offset += snprintf(buffer + offset, + MAX(0, space - offset), + ".raw"); +} + +void +dump_src(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *src) +{ + char filename[FILENAME_MAX]; + + ASSERT(ctx); + ASSERT(src); + + compute_dump_name(filename, + ARRAY_SIZE(filename), + src, + "src", + ctx->base.dump_prefix, + ctx->base.dump_counter); + + tegra_fence_wait(ctx->channel, &ctx->pre_fence); + + dump_surface(ctx, src, filename); +} + +void +dump_dst(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *dst) +{ + char filename[FILENAME_MAX]; + + ASSERT(ctx); + ASSERT(dst); + + compute_dump_name(filename, + ARRAY_SIZE(filename), + dst, + "dst", + ctx->base.dump_prefix, + ctx->base.dump_counter); + + flush2d(ctx); + tegra_fence_wait(ctx->channel, &ctx->post_fence); + + dump_surface(ctx, dst, filename); + + ++ctx->base.dump_counter; +} diff --git a/tegra/2d/tegra_2d_surface.h b/tegra/2d/tegra_2d_surface.h new file mode 100644 index 0000000..8e3dc1e --- /dev/null +++ b/tegra/2d/tegra_2d_surface.h @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_SURFACE_H +#define TEGRA_2D_SURFACE_H + +int +compute_requirements(const struct tegra_2d_plane *plane, + uint32_t *num_bytes, + uint32_t *alignment, + uint32_t *pitch); + +int +allocate_surface(struct tegra_2d_ictx *ctx, + struct tegra_2d_surface *surface); + +void +free_surface(struct tegra_2d_ictx *ctx, + struct tegra_2d_surface *surface); + +int +dump_surface(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *surface, + const char *filename); + +void +dump_src(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *src); + +void +dump_dst(struct tegra_2d_ictx *ctx, + const struct tegra_2d_surface *dst); + +#endif // TEGRA_2D_SURFACE_H diff --git a/tegra/2d/tegra_2d_util.c b/tegra/2d/tegra_2d_util.c new file mode 100644 index 0000000..ea2e407 --- /dev/null +++ b/tegra/2d/tegra_2d_util.c @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#include "tegra_2d.h" +#include "tegra_2d_util.h" + +void +compute_surface_area(struct tegra_2d_surface_area *area, + const struct tegra_2d_surface *surface, + const struct tegra_2d_rect *rect) +{ + int i; + float xpos; + float ypos; + float width; + float height; + + ASSERT(area); + ASSERT(surface); + ASSERT(rect); + + area->surface = surface; + + xpos = rect->left; + ypos = rect->top; + width = RECT_WIDTH(*rect); + height = RECT_HEIGHT(*rect); + + for (i=0; inum_planes; ++i) + { + const struct tegra_2d_plane *p = &surface->planes[i]; + struct tegra_2d_plane_area *pa = &area->planes[i]; + + pa->plane = p; + pa->xpos = (xpos * p->width) / surface->planes[0].width; + pa->ypos = (ypos * p->height) / surface->planes[0].height; + pa->width = (width * p->width) / surface->planes[0].width; + pa->height = (height * p->height) / surface->planes[0].height; + } +} + +int +validate_rect(const struct tegra_2d_surface *surface, + const struct tegra_2d_rect *rect) +{ + if (rect->left < 0 || + rect->left >= rect->right || + rect->top < 0 || + rect->top >= rect->bottom || + rect->right > surface->planes[0].width || + rect->bottom > surface->planes[0].height) + return TEGRA_2D_INVALID_RECT; + + return TEGRA_2D_OK; +} + +int +transform_swaps_xy(enum tegra_2d_transform transform) +{ + switch (transform) + { + case TEGRA_2D_TRANSFORM_ROT_90: + case TEGRA_2D_TRANSFORM_ROT_270: + case TEGRA_2D_TRANSFORM_TRANSPOSE: + case TEGRA_2D_TRANSFORM_INV_TRANSPOSE: + return 1; + default: + case TEGRA_2D_TRANSFORM_IDENTITY: + case TEGRA_2D_TRANSFORM_ROT_180: + case TEGRA_2D_TRANSFORM_FLIP_X: + case TEGRA_2D_TRANSFORM_FLIP_Y: + return 0; + } +} + +int +equal_size_area(const struct tegra_2d_plane_area *a, + const struct tegra_2d_plane_area *b, + enum tegra_2d_transform transform) +{ + #define CHECK(fa, fb) \ + if (fabs(fa - fb) >= 0.001f) \ + return 0 + + if (transform_swaps_xy(transform)) + { + CHECK(a->width, b->height); + CHECK(a->height, b->width); + } + else + { + CHECK(a->width, b->width); + CHECK(b->height, b->height); + } + + #undef CHECK + + return 1; +} + +const char * +result_to_str(enum tegra_2d_result result) +{ + switch (result) + { + #define CASE(r) case TEGRA_2D_##r: return #r + CASE(OK); + CASE(INVALID_PARAMETER); + CASE(INVALID_RECT); + CASE(INVALID_BUFFER); + CASE(UNSUPPORTED_BLIT); + CASE(MEMORY_FAILURE); + CASE(STREAM_FAILURE); + CASE(CHANNEL_FAILURE); + CASE(DEVICE_FAILURE); + CASE(FILE_FAILURE); + #undef CASE + + default: + return "unknown result"; + } +} diff --git a/tegra/2d/tegra_2d_util.h b/tegra/2d/tegra_2d_util.h new file mode 100644 index 0000000..70bd25a --- /dev/null +++ b/tegra/2d/tegra_2d_util.h @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_UTIL_H +#define TEGRA_2D_UTIL_H + +#include +#include +#include + +#define ASSERT assert +#define CT_ASSERT(x) ((void) sizeof(char[1 - 2*!(x)])) + +#define MIN(a, b) (a < b ? a : b) +#define MAX(a, b) (a > b ? a : b) + +#define CLAMP(x, l, h) (((x) < (l)) ? (l) : ((x) > (h) ? (h) : (x))) + +#define ROUND_UP(v, a) (v + (a - 1)) & ~(a - 1) + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +#define RECT_WIDTH(r) ((r).right - (r).left) +#define RECT_HEIGHT(r) ((r).bottom - (r).top) + +#define FLOAT_TO_FIXED_6_12(fp) (((int32_t) (fp * 4096.0f + 0.5f)) & ((1<<18)-1)) +#define FLOAT_TO_FIXED_0_8(fp) (((int32_t) (fp * 256.0f + 0.5f)) & ((1<<8)-1)) + +#define LOG(...) printf("[TEGRA_2D] " __VA_ARGS__) + +struct tegra_2d_plane_area +{ + const struct tegra_2d_plane *plane; + float xpos; + float ypos; + float width; + float height; +}; + +struct tegra_2d_surface_area +{ + const struct tegra_2d_surface *surface; + struct tegra_2d_plane_area planes[TEGRA_2D_MAX_PLANES]; +}; + +void +compute_surface_area(struct tegra_2d_surface_area *area, + const struct tegra_2d_surface *surface, + const struct tegra_2d_rect *rect); + +int +validate_rect(const struct tegra_2d_surface *surface, + const struct tegra_2d_rect *rect); + +int +equal_size_area(const struct tegra_2d_plane_area *a, + const struct tegra_2d_plane_area *b, + enum tegra_2d_transform transform); + +int +transform_swaps_xy(enum tegra_2d_transform transform); + +const char * +result_to_str(enum tegra_2d_result result); + +#endif // TEGRA_2D_UTIL_H diff --git a/tegra/Makefile.am b/tegra/Makefile.am index 72675e5..34a49d5 100644 --- a/tegra/Makefile.am +++ b/tegra/Makefile.am @@ -11,7 +11,18 @@ libdrm_tegra_la_LDFLAGS = -version-number 1:0:0 -no-undefined libdrm_tegra_la_LIBADD = ../libdrm.la @PTHREADSTUBS_LIBS@ libdrm_tegra_la_SOURCES = \ - tegra_drm.c + tegra_drm.c \ + 2d/tegra_2d_api.c \ + 2d/tegra_2d_color.c \ + 2d/tegra_2d_context.c \ + 2d/tegra_2d_copy.c \ + 2d/tegra_2d_fill.c \ + 2d/tegra_2d_frcopy.c \ + 2d/tegra_2d_g2copy.c \ + 2d/tegra_2d_g2fill.c \ + 2d/tegra_2d_sbcopy.c \ + 2d/tegra_2d_surface.c \ + 2d/tegra_2d_util.c libdrm_tegracommonincludedir = ${includedir}/tegra libdrm_tegracommoninclude_HEADERS = \ diff --git a/tegra/tegra_2d.h b/tegra/tegra_2d.h new file mode 100644 index 0000000..a6d2f2f --- /dev/null +++ b/tegra/tegra_2d.h @@ -0,0 +1,223 @@ +/* + * Copyright (C) 2012 NVIDIA Corporation. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Authors: + * Francis Hart + */ + +#ifndef TEGRA_2D_H +#define TEGRA_2D_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +struct tegra_fence; + +struct tegra_2d_context +{ + int log_enable; + int dump_enable; + int dump_counter; + char dump_prefix[FILENAME_MAX]; +}; + +struct tegra_2d_rect +{ + float left; + float top; + float right; + float bottom; +}; + +enum tegra_2d_layout +{ + TEGRA_2D_LAYOUT_LINEAR, + TEGRA_2D_LAYOUT_TILED, +}; + +#define TEGRA_2D_FORMAT(id, yuv, bpp) \ + ((id << 16) | (yuv << 8) | (bpp)) + +#define TEGRA_2D_FORMAT_BITS(f) \ + ((f) & 0xff) + +#define TEGRA_2D_FORMAT_BYTES(f) \ + (TEGRA_2D_FORMAT_BITS(f) >> 3) + +#define TEGRA_2D_FORMAT_IS_YUV(f) \ + (((f) >> 8) & 0xff) + +#define TEGRA_2D_FORMAT_ID(f) \ + (((f) >> 16) & 0xff) + +enum tegra_2d_format +{ + TEGRA_2D_FORMAT_A8R8G8B8 = TEGRA_2D_FORMAT( 1, 0, 32), + TEGRA_2D_FORMAT_A8B8G8R8 = TEGRA_2D_FORMAT( 2, 0, 32), + TEGRA_2D_FORMAT_R8G8B8A8 = TEGRA_2D_FORMAT( 3, 0, 32), + TEGRA_2D_FORMAT_B8G8R8A8 = TEGRA_2D_FORMAT( 4, 0, 32), + TEGRA_2D_FORMAT_A4R4G4B4 = TEGRA_2D_FORMAT( 5, 0, 16), + TEGRA_2D_FORMAT_R4G4B4A4 = TEGRA_2D_FORMAT( 6, 0, 16), + TEGRA_2D_FORMAT_R5G6B5 = TEGRA_2D_FORMAT( 7, 0, 16), + TEGRA_2D_FORMAT_A1R5G5B5 = TEGRA_2D_FORMAT( 8, 0, 16), + TEGRA_2D_FORMAT_Y8 = TEGRA_2D_FORMAT( 9, 1, 8), + TEGRA_2D_FORMAT_U8 = TEGRA_2D_FORMAT(10, 1, 8), + TEGRA_2D_FORMAT_V8 = TEGRA_2D_FORMAT(11, 1, 8), + TEGRA_2D_FORMAT_U8_V8 = TEGRA_2D_FORMAT(12, 1, 16), + TEGRA_2D_FORMAT_V8_U8 = TEGRA_2D_FORMAT(13, 1, 16), + TEGRA_2D_FORMAT_UYVY = TEGRA_2D_FORMAT(14, 1, 32), + TEGRA_2D_FORMAT_VYUY = TEGRA_2D_FORMAT(15, 1, 32), + TEGRA_2D_FORMAT_YUYV = TEGRA_2D_FORMAT(16, 1, 32), + TEGRA_2D_FORMAT_YVYU = TEGRA_2D_FORMAT(17, 1, 32), +}; + +enum tegra_2d_transform +{ + TEGRA_2D_TRANSFORM_IDENTITY, + TEGRA_2D_TRANSFORM_ROT_90, + TEGRA_2D_TRANSFORM_ROT_180, + TEGRA_2D_TRANSFORM_ROT_270, + TEGRA_2D_TRANSFORM_FLIP_X, + TEGRA_2D_TRANSFORM_FLIP_Y, + TEGRA_2D_TRANSFORM_TRANSPOSE, + TEGRA_2D_TRANSFORM_INV_TRANSPOSE +}; + +enum tegra_2d_result +{ + TEGRA_2D_OK, + TEGRA_2D_INVALID_PARAMETER, + TEGRA_2D_INVALID_RECT, + TEGRA_2D_INVALID_BUFFER, + TEGRA_2D_UNSUPPORTED_BLIT, + TEGRA_2D_MEMORY_FAILURE, + TEGRA_2D_STREAM_FAILURE, + TEGRA_2D_CHANNEL_FAILURE, + TEGRA_2D_DEVICE_FAILURE, + TEGRA_2D_FILE_FAILURE +}; + +struct tegra_2d_plane +{ + int width; + int height; + int pitch; + enum tegra_2d_format format; + enum tegra_2d_layout layout; + struct tegra_bo *mem_handle; + uint32_t mem_offset; +}; + +struct tegra_2d_plane_color +{ + uint32_t value; + enum tegra_2d_format format; +}; + +#define TEGRA_2D_MAX_PLANES 3 + +struct tegra_2d_surface +{ + int num_planes; + struct tegra_2d_plane planes[TEGRA_2D_MAX_PLANES]; +}; + +struct tegra_2d_surface_color +{ + int num_planes; + struct tegra_2d_plane_color planes[TEGRA_2D_MAX_PLANES]; +}; + +struct tegra_2d_context * +tegra_2d_open(int fd); + +void +tegra_2d_close(struct tegra_2d_context *ctx); + +int +tegra_2d_begin(struct tegra_2d_context *ctx, + const struct tegra_fence *fence); + +int +tegra_2d_end(struct tegra_2d_context *ctx, + struct tegra_fence *fence); + +int +tegra_2d_fill(struct tegra_2d_context *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface_color *color, + const struct tegra_2d_rect *dst_rect); + +int +tegra_2d_copy(struct tegra_2d_context *ctx, + const struct tegra_2d_surface *dst, + const struct tegra_2d_surface *src, + const struct tegra_2d_rect *dst_rect, + const struct tegra_2d_rect *src_rect, + enum tegra_2d_transform transform); + +int +tegra_2d_compute_requirements(const struct tegra_2d_plane *plane, + uint32_t *num_bytes, + uint32_t *alignment, + uint32_t *pitch); + +int +tegra_2d_allocate_surface(struct tegra_2d_context *ctx, + struct tegra_2d_surface *surface); + +void +tegra_2d_free_surface(struct tegra_2d_context *ctx, + struct tegra_2d_surface *surface); + +int +tegra_2d_dump_surface(struct tegra_2d_context *ctx, + const struct tegra_2d_surface *surface, + const char *filename); + +void +tegra_2d_color_convert(struct tegra_2d_surface_color *dst, + const struct tegra_2d_surface_color *src); + +void +tegra_2d_color_to_rgba(const struct tegra_2d_surface_color *src, + uint32_t *r, + uint32_t *g, + uint32_t *b, + uint32_t *a); + +void +tegra_2d_color_from_rgba(struct tegra_2d_surface_color *dst, + uint32_t r, + uint32_t g, + uint32_t b, + uint32_t a); + +#ifdef __cplusplus +}; +#endif + +#endif // TEGRA_2D_H