From 642699a19f1c07336a6fadacd6d5a9028f5d346f Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 16 Jun 2003 14:32:44 +0000 Subject: DOS updates for new tree (Daniel Borca) --- src/mesa/drivers/dos/mga/m_ttemp.h | 754 ++++----- src/mesa/drivers/dos/mga/m_ttemp2.h | 750 ++++----- src/mesa/drivers/dos/mga/mga.c | 3072 +++++++++++++++++------------------ src/mesa/drivers/dos/mga/mga.h | 182 +-- src/mesa/drivers/dos/mga/mga_hw.c | 832 +++++----- src/mesa/drivers/dos/mga/mga_hw.h | 226 +-- src/mesa/drivers/dos/mga/mga_mode.c | 462 +++--- src/mesa/drivers/dos/mga/mga_mode.h | 94 +- src/mesa/drivers/dos/mga/mga_reg.h | 414 ++--- 9 files changed, 3393 insertions(+), 3393 deletions(-) (limited to 'src/mesa/drivers/dos/mga') diff --git a/src/mesa/drivers/dos/mga/m_ttemp.h b/src/mesa/drivers/dos/mga/m_ttemp.h index 1c5fbda29a..90d9de3564 100644 --- a/src/mesa/drivers/dos/mga/m_ttemp.h +++ b/src/mesa/drivers/dos/mga/m_ttemp.h @@ -1,377 +1,377 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - */ - - -/* - * Triangle Rasterizer Template - * - * This file is #include'd to generate custom triangle rasterizers. - * - * The following macros may be defined to indicate what auxillary information - * must be interplated across the triangle: - * INTERP_Z - if defined, interpolate Z values - * INTERP_RGB - if defined, interpolate RGB values - * - * TAG - function name - * CULL - enable culling for: 0=no, 1=back, -1=front - * - * SETUP_CODE - to be executed once per triangle (usually HW init) - * - * For flatshaded primitives, the provoking vertex is the final one. - * This code was designed for the origin to be in the upper-left corner. - * - * Inspired by triangle rasterizer code written by Brian Paul. - */ - - - -#define TRI_SWAP(a, b) \ -do { \ - const MGAvertex *tmp = a; \ - a = b; \ - b = tmp; \ -} while (0) - -void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3) -{ - int area; - int x1, y1, x2, y2, x3, y3; - int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy; -#ifdef INTERP_RGB -#define FIFO_CNT_RGB 3 - int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db; - int drdx, drdy, dgdx, dgdy, dbdx, dbdy; -#else -#define FIFO_CNT_RGB 0 -#endif -#ifdef INTERP_Z -#define FIFO_CNT_Z 1 - int dzdx, dzdy; - int eMaj_dz, eBot_dz; - int z1, z2, z3; -#else -#define FIFO_CNT_Z 0 -#endif - -#if defined(INTERP_Z) || defined(INTERP_RGB) - double one_area; -#ifndef INTERP_RGB - int red = v3->color[0]; - int green = v3->color[1]; - int blue = v3->color[2]; -#endif -#else - unsigned long color = mga_mixrgb_full(v3->color); -#endif - - int sgn = 0; - - /* sort along the vertical axis */ - if (v2->win[1] < v1->win[1]) { - TRI_SWAP(v1, v2); -#ifdef CULL - cull = -cull; -#endif - } - - if (v3->win[1] < v1->win[1]) { - TRI_SWAP(v1, v3); - TRI_SWAP(v2, v3); - } else if (v3->win[1] < v2->win[1]) { - TRI_SWAP(v2, v3); -#ifdef CULL - cull = -cull; -#endif - } - - x1 = v1->win[0]; - y1 = v1->win[1]; - x2 = v2->win[0]; - y2 = v2->win[1]; - x3 = v3->win[0]; - y3 = v3->win[1]; - - /* compute deltas for each edge */ - eMaj_dx = x3 - x1; - eMaj_dy = y3 - y1; - eBot_dx = x2 - x1; - eBot_dy = y2 - y1; - eTop_dx = x3 - x2; - eTop_dy = y3 - y2; - - /* compute area */ - if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) { - return; - } -#ifdef CULL - if ((area * cull) > 0) { - return; - } -#endif - - mga_select(); - - /* set engine state */ -#ifdef SETUP_CODE - SETUP_CODE -#endif - - /* draw lower triangle */ -#if defined(INTERP_Z) || defined(INTERP_RGB) - one_area = (double)(1<<15) / (double)area; - mga_fifo(1); -#else - mga_fifo(2); - mga_outl(M_FCOL, color); -#endif - mga_outl(M_YDST, y1); - -#ifdef INTERP_Z - z1 = v1->win[2]; - z2 = v2->win[2]; - z3 = v3->win[2]; - - /* compute d?/dx and d?/dy derivatives */ - eMaj_dz = z3 - z1; - eBot_dz = z2 - z1; - dzdx = (eMaj_dz * eBot_dy - eMaj_dy * eBot_dz) * one_area; - dzdy = (eMaj_dx * eBot_dz - eMaj_dz * eBot_dx) * one_area; - -#ifndef INTERP_RGB - mga_fifo(11); - mga_outl(M_DR2, dzdx); - mga_outl(M_DR3, dzdy); - mga_outl(M_DR4, red<<15); - mga_outl(M_DR6, 0); - mga_outl(M_DR7, 0); - mga_outl(M_DR8, green<<15); - mga_outl(M_DR10, 0); - mga_outl(M_DR11, 0); - mga_outl(M_DR12, blue<<15); - mga_outl(M_DR14, 0); - mga_outl(M_DR15, 0); -#else - mga_fifo(2); - mga_outl(M_DR2, dzdx); - mga_outl(M_DR3, dzdy); -#endif -#endif - -#ifdef INTERP_RGB - /* compute color deltas */ - eMaj_dr = v3->color[0] - v1->color[0]; - eBot_dr = v2->color[0] - v1->color[0]; - eMaj_dg = v3->color[1] - v1->color[1]; - eBot_dg = v2->color[1] - v1->color[1]; - eMaj_db = v3->color[2] - v1->color[2]; - eBot_db = v2->color[2] - v1->color[2]; - - /* compute color increments */ - drdx = (eMaj_dr * eBot_dy - eMaj_dy * eBot_dr) * one_area; - drdy = (eMaj_dx * eBot_dr - eMaj_dr * eBot_dx) * one_area; - dgdx = (eMaj_dg * eBot_dy - eMaj_dy * eBot_dg) * one_area; - dgdy = (eMaj_dx * eBot_dg - eMaj_dg * eBot_dx) * one_area; - dbdx = (eMaj_db * eBot_dy - eMaj_dy * eBot_db) * one_area; - dbdy = (eMaj_dx * eBot_db - eMaj_db * eBot_dx) * one_area; - - mga_fifo(6); - mga_outl(M_DR6, drdx); - mga_outl(M_DR7, drdy); - mga_outl(M_DR10, dgdx); - mga_outl(M_DR11, dgdy); - mga_outl(M_DR14, dbdx); - mga_outl(M_DR15, dbdy); -#endif - - if (area > 0) { /* major edge on the right */ - if (eBot_dy) { /* have lower triangle */ - mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eBot_dy); - if (x2 < x1) { - mga_outl(M_AR1, eBot_dx + eBot_dy - 1); - mga_outl(M_AR2, eBot_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eBot_dx); - mga_outl(M_AR2, -eBot_dx); - } - - mga_outl(M_AR6, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR5, eMaj_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eMaj_dx); - mga_outl(M_AR5, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eBot_dy); - } else { /* no lower triangle */ - mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR6, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR5, eMaj_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eMaj_dx); - mga_outl(M_AR5, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x2); -#ifdef INTERP_Z - mga_outl(M_DR0, z2<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v2->color[0]<<15); - mga_outl(M_DR8, v2->color[1]<<15); - mga_outl(M_DR12, v2->color[2]<<15); -#endif - } - - /* draw upper triangle */ - if (eTop_dy) { - mga_fifo(5); - mga_outl(M_AR0, eTop_dy); - if (x3 < x2) { - mga_outl(M_AR1, eTop_dx + eTop_dy - 1); - mga_outl(M_AR2, eTop_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eTop_dx); - mga_outl(M_AR2, -eTop_dx); - sgn &= ~M_SDXL; - } - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eTop_dy); - } - } else { /* major edge on the left */ - if (eBot_dy) { /* have lower triangle */ - mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR2, eMaj_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eMaj_dx); - mga_outl(M_AR2, -eMaj_dx); - } - - mga_outl(M_AR6, eBot_dy); - if (x2 < x1) { - mga_outl(M_AR4, eBot_dx + eBot_dy - 1); - mga_outl(M_AR5, eBot_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eBot_dx); - mga_outl(M_AR5, -eBot_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eBot_dy); - } else { /* no lower triangle */ - mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR2, eMaj_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eMaj_dx); - mga_outl(M_AR2, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x2<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - } - - /* draw upper triangle */ - if (eTop_dy) { - mga_fifo(5); - mga_outl(M_AR6, eTop_dy); - if (x3 < x2) { - mga_outl(M_AR4, eTop_dx + eTop_dy - 1); - mga_outl(M_AR5, eTop_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eTop_dx); - mga_outl(M_AR5, -eTop_dx); - sgn &= ~M_SDXR; - } - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eTop_dy); - } - } -} - -#undef FIFO_CNT_RGB -#undef FIFO_CNT_Z - -#undef TRI_SWAP - -#undef SETUP_CODE -#undef INTERP_RGB -#undef INTERP_Z -#undef CULL -#undef TAG +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +/* + * Triangle Rasterizer Template + * + * This file is #include'd to generate custom triangle rasterizers. + * + * The following macros may be defined to indicate what auxillary information + * must be interplated across the triangle: + * INTERP_Z - if defined, interpolate Z values + * INTERP_RGB - if defined, interpolate RGB values + * + * TAG - function name + * CULL - enable culling for: 0=no, 1=back, -1=front + * + * SETUP_CODE - to be executed once per triangle (usually HW init) + * + * For flatshaded primitives, the provoking vertex is the final one. + * This code was designed for the origin to be in the upper-left corner. + * + * Inspired by triangle rasterizer code written by Brian Paul. + */ + + + +#define TRI_SWAP(a, b) \ +do { \ + const MGAvertex *tmp = a; \ + a = b; \ + b = tmp; \ +} while (0) + +void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3) +{ + int area; + int x1, y1, x2, y2, x3, y3; + int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy; +#ifdef INTERP_RGB +#define FIFO_CNT_RGB 3 + int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db; + int drdx, drdy, dgdx, dgdy, dbdx, dbdy; +#else +#define FIFO_CNT_RGB 0 +#endif +#ifdef INTERP_Z +#define FIFO_CNT_Z 1 + int dzdx, dzdy; + int eMaj_dz, eBot_dz; + int z1, z2, z3; +#else +#define FIFO_CNT_Z 0 +#endif + +#if defined(INTERP_Z) || defined(INTERP_RGB) + double one_area; +#ifndef INTERP_RGB + int red = v3->color[0]; + int green = v3->color[1]; + int blue = v3->color[2]; +#endif +#else + unsigned long color = mga_mixrgb_full(v3->color); +#endif + + int sgn = 0; + + /* sort along the vertical axis */ + if (v2->win[1] < v1->win[1]) { + TRI_SWAP(v1, v2); +#ifdef CULL + cull = -cull; +#endif + } + + if (v3->win[1] < v1->win[1]) { + TRI_SWAP(v1, v3); + TRI_SWAP(v2, v3); + } else if (v3->win[1] < v2->win[1]) { + TRI_SWAP(v2, v3); +#ifdef CULL + cull = -cull; +#endif + } + + x1 = v1->win[0]; + y1 = v1->win[1]; + x2 = v2->win[0]; + y2 = v2->win[1]; + x3 = v3->win[0]; + y3 = v3->win[1]; + + /* compute deltas for each edge */ + eMaj_dx = x3 - x1; + eMaj_dy = y3 - y1; + eBot_dx = x2 - x1; + eBot_dy = y2 - y1; + eTop_dx = x3 - x2; + eTop_dy = y3 - y2; + + /* compute area */ + if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) { + return; + } +#ifdef CULL + if ((area * cull) > 0) { + return; + } +#endif + + mga_select(); + + /* set engine state */ +#ifdef SETUP_CODE + SETUP_CODE +#endif + + /* draw lower triangle */ +#if defined(INTERP_Z) || defined(INTERP_RGB) + one_area = (double)(1<<15) / (double)area; + mga_fifo(1); +#else + mga_fifo(2); + mga_outl(M_FCOL, color); +#endif + mga_outl(M_YDST, y1); + +#ifdef INTERP_Z + z1 = v1->win[2]; + z2 = v2->win[2]; + z3 = v3->win[2]; + + /* compute d?/dx and d?/dy derivatives */ + eMaj_dz = z3 - z1; + eBot_dz = z2 - z1; + dzdx = (eMaj_dz * eBot_dy - eMaj_dy * eBot_dz) * one_area; + dzdy = (eMaj_dx * eBot_dz - eMaj_dz * eBot_dx) * one_area; + +#ifndef INTERP_RGB + mga_fifo(11); + mga_outl(M_DR2, dzdx); + mga_outl(M_DR3, dzdy); + mga_outl(M_DR4, red<<15); + mga_outl(M_DR6, 0); + mga_outl(M_DR7, 0); + mga_outl(M_DR8, green<<15); + mga_outl(M_DR10, 0); + mga_outl(M_DR11, 0); + mga_outl(M_DR12, blue<<15); + mga_outl(M_DR14, 0); + mga_outl(M_DR15, 0); +#else + mga_fifo(2); + mga_outl(M_DR2, dzdx); + mga_outl(M_DR3, dzdy); +#endif +#endif + +#ifdef INTERP_RGB + /* compute color deltas */ + eMaj_dr = v3->color[0] - v1->color[0]; + eBot_dr = v2->color[0] - v1->color[0]; + eMaj_dg = v3->color[1] - v1->color[1]; + eBot_dg = v2->color[1] - v1->color[1]; + eMaj_db = v3->color[2] - v1->color[2]; + eBot_db = v2->color[2] - v1->color[2]; + + /* compute color increments */ + drdx = (eMaj_dr * eBot_dy - eMaj_dy * eBot_dr) * one_area; + drdy = (eMaj_dx * eBot_dr - eMaj_dr * eBot_dx) * one_area; + dgdx = (eMaj_dg * eBot_dy - eMaj_dy * eBot_dg) * one_area; + dgdy = (eMaj_dx * eBot_dg - eMaj_dg * eBot_dx) * one_area; + dbdx = (eMaj_db * eBot_dy - eMaj_dy * eBot_db) * one_area; + dbdy = (eMaj_dx * eBot_db - eMaj_db * eBot_dx) * one_area; + + mga_fifo(6); + mga_outl(M_DR6, drdx); + mga_outl(M_DR7, drdy); + mga_outl(M_DR10, dgdx); + mga_outl(M_DR11, dgdy); + mga_outl(M_DR14, dbdx); + mga_outl(M_DR15, dbdy); +#endif + + if (area > 0) { /* major edge on the right */ + if (eBot_dy) { /* have lower triangle */ + mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR0, eBot_dy); + if (x2 < x1) { + mga_outl(M_AR1, eBot_dx + eBot_dy - 1); + mga_outl(M_AR2, eBot_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eBot_dx); + mga_outl(M_AR2, -eBot_dx); + } + + mga_outl(M_AR6, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR5, eMaj_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eMaj_dx); + mga_outl(M_AR5, -eMaj_dx); + } + + mga_outl(M_FXBNDRY, (x1<<16) | x1); +#ifdef INTERP_Z + mga_outl(M_DR0, z1<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v1->color[0]<<15); + mga_outl(M_DR8, v1->color[1]<<15); + mga_outl(M_DR12, v1->color[2]<<15); +#endif + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eBot_dy); + } else { /* no lower triangle */ + mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR6, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR5, eMaj_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eMaj_dx); + mga_outl(M_AR5, -eMaj_dx); + } + + mga_outl(M_FXBNDRY, (x1<<16) | x2); +#ifdef INTERP_Z + mga_outl(M_DR0, z2<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v2->color[0]<<15); + mga_outl(M_DR8, v2->color[1]<<15); + mga_outl(M_DR12, v2->color[2]<<15); +#endif + } + + /* draw upper triangle */ + if (eTop_dy) { + mga_fifo(5); + mga_outl(M_AR0, eTop_dy); + if (x3 < x2) { + mga_outl(M_AR1, eTop_dx + eTop_dy - 1); + mga_outl(M_AR2, eTop_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eTop_dx); + mga_outl(M_AR2, -eTop_dx); + sgn &= ~M_SDXL; + } + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eTop_dy); + } + } else { /* major edge on the left */ + if (eBot_dy) { /* have lower triangle */ + mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR0, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR2, eMaj_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eMaj_dx); + mga_outl(M_AR2, -eMaj_dx); + } + + mga_outl(M_AR6, eBot_dy); + if (x2 < x1) { + mga_outl(M_AR4, eBot_dx + eBot_dy - 1); + mga_outl(M_AR5, eBot_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eBot_dx); + mga_outl(M_AR5, -eBot_dx); + } + + mga_outl(M_FXBNDRY, (x1<<16) | x1); +#ifdef INTERP_Z + mga_outl(M_DR0, z1<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v1->color[0]<<15); + mga_outl(M_DR8, v1->color[1]<<15); + mga_outl(M_DR12, v1->color[2]<<15); +#endif + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eBot_dy); + } else { /* no lower triangle */ + mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR0, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR2, eMaj_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eMaj_dx); + mga_outl(M_AR2, -eMaj_dx); + } + + mga_outl(M_FXBNDRY, (x2<<16) | x1); +#ifdef INTERP_Z + mga_outl(M_DR0, z1<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v1->color[0]<<15); + mga_outl(M_DR8, v1->color[1]<<15); + mga_outl(M_DR12, v1->color[2]<<15); +#endif + } + + /* draw upper triangle */ + if (eTop_dy) { + mga_fifo(5); + mga_outl(M_AR6, eTop_dy); + if (x3 < x2) { + mga_outl(M_AR4, eTop_dx + eTop_dy - 1); + mga_outl(M_AR5, eTop_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eTop_dx); + mga_outl(M_AR5, -eTop_dx); + sgn &= ~M_SDXR; + } + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eTop_dy); + } + } +} + +#undef FIFO_CNT_RGB +#undef FIFO_CNT_Z + +#undef TRI_SWAP + +#undef SETUP_CODE +#undef INTERP_RGB +#undef INTERP_Z +#undef CULL +#undef TAG diff --git a/src/mesa/drivers/dos/mga/m_ttemp2.h b/src/mesa/drivers/dos/mga/m_ttemp2.h index 2933f2b1a9..13ca87d348 100644 --- a/src/mesa/drivers/dos/mga/m_ttemp2.h +++ b/src/mesa/drivers/dos/mga/m_ttemp2.h @@ -1,375 +1,375 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - */ - - -/* - * Triangle Rasterizer Template - * - * This file is #include'd to generate custom triangle rasterizers. - * - * The following macros may be defined to indicate what auxillary information - * must be interplated across the triangle: - * INTERP_Z - if defined, interpolate Z values - * INTERP_RGB - if defined, interpolate RGB values - * - * TAG - function name - * CULL - enable culling for: 0=no, 1=back, -1=front - * - * SETUP_CODE - to be executed once per triangle (usually HW init) - * - * For flatshaded primitives, the provoking vertex is the final one. - * This code was designed for the origin to be in the upper-left corner. - * - * Inspired by triangle rasterizer code written by Brian Paul. - */ - - - -#define TRI_SWAP(a, b) \ -do { \ - const MGAvertex *tmp = a; \ - a = b; \ - b = tmp; \ -} while (0) - -void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3) -{ - int area; - int x1, y1, x2, y2, x3, y3; - int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy; -#ifdef INTERP_RGB -#define FIFO_CNT_RGB 3 - int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db; - int drdx, drdy, dgdx, dgdy, dbdx, dbdy; -#else -#define FIFO_CNT_RGB 0 -#endif -#ifdef INTERP_Z -#define FIFO_CNT_Z 1 - int dzdx, dzdy; - int eMaj_dz, eBot_dz; - int z1, z2, z3; -#else -#define FIFO_CNT_Z 0 -#endif - -#if defined(INTERP_Z) || defined(INTERP_RGB) -#ifndef INTERP_RGB - int red = v3->color[0]; - int green = v3->color[1]; - int blue = v3->color[2]; -#endif -#else - unsigned long color = mga_mixrgb_full(v3->color); -#endif - - int sgn = 0; - - /* sort along the vertical axis */ - if (v2->win[1] < v1->win[1]) { - TRI_SWAP(v1, v2); -#ifdef CULL - cull = -cull; -#endif - } - - if (v3->win[1] < v1->win[1]) { - TRI_SWAP(v1, v3); - TRI_SWAP(v2, v3); - } else if (v3->win[1] < v2->win[1]) { - TRI_SWAP(v2, v3); -#ifdef CULL - cull = -cull; -#endif - } - - x1 = v1->win[0]; - y1 = v1->win[1]; - x2 = v2->win[0]; - y2 = v2->win[1]; - x3 = v3->win[0]; - y3 = v3->win[1]; - - /* compute deltas for each edge */ - eMaj_dx = x3 - x1; - eMaj_dy = y3 - y1; - eBot_dx = x2 - x1; - eBot_dy = y2 - y1; - eTop_dx = x3 - x2; - eTop_dy = y3 - y2; - - /* compute area */ - if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) { - return; - } -#ifdef CULL - if ((area * cull) > 0) { - return; - } -#endif - - mga_select(); - - /* set engine state */ -#ifdef SETUP_CODE - SETUP_CODE -#endif - - /* draw lower triangle */ -#if defined(INTERP_Z) || defined(INTERP_RGB) - mga_fifo(1); -#else - mga_fifo(2); - mga_outl(M_FCOL, color); -#endif - mga_outl(M_YDST, y1); - -#ifdef INTERP_Z - z1 = v1->win[2]; - z2 = v2->win[2]; - z3 = v3->win[2]; - - /* compute d?/dx and d?/dy derivatives */ - eMaj_dz = z3 - z1; - eBot_dz = z2 - z1; - dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area; - dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area; - -#ifndef INTERP_RGB - mga_fifo(11); - mga_outl(M_DR2, dzdx); - mga_outl(M_DR3, dzdy); - mga_outl(M_DR4, red<<15); - mga_outl(M_DR6, 0); - mga_outl(M_DR7, 0); - mga_outl(M_DR8, green<<15); - mga_outl(M_DR10, 0); - mga_outl(M_DR11, 0); - mga_outl(M_DR12, blue<<15); - mga_outl(M_DR14, 0); - mga_outl(M_DR15, 0); -#else - mga_fifo(2); - mga_outl(M_DR2, dzdx); - mga_outl(M_DR3, dzdy); -#endif -#endif - -#ifdef INTERP_RGB - /* compute color deltas */ - eMaj_dr = v3->color[0] - v1->color[0]; - eBot_dr = v2->color[0] - v1->color[0]; - eMaj_dg = v3->color[1] - v1->color[1]; - eBot_dg = v2->color[1] - v1->color[1]; - eMaj_db = v3->color[2] - v1->color[2]; - eBot_db = v2->color[2] - v1->color[2]; - - /* compute color increments */ - drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area; - drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area; - dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area; - dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area; - dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area; - dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area; - - mga_fifo(6); - mga_outl(M_DR6, drdx); - mga_outl(M_DR7, drdy); - mga_outl(M_DR10, dgdx); - mga_outl(M_DR11, dgdy); - mga_outl(M_DR14, dbdx); - mga_outl(M_DR15, dbdy); -#endif - - if (area > 0) { /* major edge on the right */ - if (eBot_dy) { /* have lower triangle */ - mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eBot_dy); - if (x2 < x1) { - mga_outl(M_AR1, eBot_dx + eBot_dy - 1); - mga_outl(M_AR2, eBot_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eBot_dx); - mga_outl(M_AR2, -eBot_dx); - } - - mga_outl(M_AR6, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR5, eMaj_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eMaj_dx); - mga_outl(M_AR5, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eBot_dy); - } else { /* no lower triangle */ - mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR6, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR5, eMaj_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eMaj_dx); - mga_outl(M_AR5, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x2); -#ifdef INTERP_Z - mga_outl(M_DR0, z2<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v2->color[0]<<15); - mga_outl(M_DR8, v2->color[1]<<15); - mga_outl(M_DR12, v2->color[2]<<15); -#endif - } - - /* draw upper triangle */ - if (eTop_dy) { - mga_fifo(5); - mga_outl(M_AR0, eTop_dy); - if (x3 < x2) { - mga_outl(M_AR1, eTop_dx + eTop_dy - 1); - mga_outl(M_AR2, eTop_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eTop_dx); - mga_outl(M_AR2, -eTop_dx); - sgn &= ~M_SDXL; - } - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eTop_dy); - } - } else { /* major edge on the left */ - if (eBot_dy) { /* have lower triangle */ - mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR2, eMaj_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eMaj_dx); - mga_outl(M_AR2, -eMaj_dx); - } - - mga_outl(M_AR6, eBot_dy); - if (x2 < x1) { - mga_outl(M_AR4, eBot_dx + eBot_dy - 1); - mga_outl(M_AR5, eBot_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eBot_dx); - mga_outl(M_AR5, -eBot_dx); - } - - mga_outl(M_FXBNDRY, (x1<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eBot_dy); - } else { /* no lower triangle */ - mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); - - mga_outl(M_AR0, eMaj_dy); - if (x3 < x1) { - mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); - mga_outl(M_AR2, eMaj_dx); - sgn |= M_SDXL; - } else { - mga_outl(M_AR1, -eMaj_dx); - mga_outl(M_AR2, -eMaj_dx); - } - - mga_outl(M_FXBNDRY, (x2<<16) | x1); -#ifdef INTERP_Z - mga_outl(M_DR0, z1<<15); -#endif -#ifdef INTERP_RGB - mga_outl(M_DR4, v1->color[0]<<15); - mga_outl(M_DR8, v1->color[1]<<15); - mga_outl(M_DR12, v1->color[2]<<15); -#endif - } - - /* draw upper triangle */ - if (eTop_dy) { - mga_fifo(5); - mga_outl(M_AR6, eTop_dy); - if (x3 < x2) { - mga_outl(M_AR4, eTop_dx + eTop_dy - 1); - mga_outl(M_AR5, eTop_dx); - sgn |= M_SDXR; - } else { - mga_outl(M_AR4, -eTop_dx); - mga_outl(M_AR5, -eTop_dx); - sgn &= ~M_SDXR; - } - mga_outl(M_SGN, sgn); - mga_outl(M_LEN | M_EXEC, eTop_dy); - } - } -} - -#undef FIFO_CNT_RGB -#undef FIFO_CNT_Z - -#undef TRI_SWAP - -#undef SETUP_CODE -#undef INTERP_RGB -#undef INTERP_Z -#undef CULL -#undef TAG +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W triangle template + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +/* + * Triangle Rasterizer Template + * + * This file is #include'd to generate custom triangle rasterizers. + * + * The following macros may be defined to indicate what auxillary information + * must be interplated across the triangle: + * INTERP_Z - if defined, interpolate Z values + * INTERP_RGB - if defined, interpolate RGB values + * + * TAG - function name + * CULL - enable culling for: 0=no, 1=back, -1=front + * + * SETUP_CODE - to be executed once per triangle (usually HW init) + * + * For flatshaded primitives, the provoking vertex is the final one. + * This code was designed for the origin to be in the upper-left corner. + * + * Inspired by triangle rasterizer code written by Brian Paul. + */ + + + +#define TRI_SWAP(a, b) \ +do { \ + const MGAvertex *tmp = a; \ + a = b; \ + b = tmp; \ +} while (0) + +void TAG (int cull, const MGAvertex *v1, const MGAvertex *v2, const MGAvertex *v3) +{ + int area; + int x1, y1, x2, y2, x3, y3; + int eMaj_dx, eMaj_dy, eBot_dx, eBot_dy, eTop_dx, eTop_dy; +#ifdef INTERP_RGB +#define FIFO_CNT_RGB 3 + int eMaj_dr, eBot_dr, eMaj_dg, eBot_dg, eMaj_db, eBot_db; + int drdx, drdy, dgdx, dgdy, dbdx, dbdy; +#else +#define FIFO_CNT_RGB 0 +#endif +#ifdef INTERP_Z +#define FIFO_CNT_Z 1 + int dzdx, dzdy; + int eMaj_dz, eBot_dz; + int z1, z2, z3; +#else +#define FIFO_CNT_Z 0 +#endif + +#if defined(INTERP_Z) || defined(INTERP_RGB) +#ifndef INTERP_RGB + int red = v3->color[0]; + int green = v3->color[1]; + int blue = v3->color[2]; +#endif +#else + unsigned long color = mga_mixrgb_full(v3->color); +#endif + + int sgn = 0; + + /* sort along the vertical axis */ + if (v2->win[1] < v1->win[1]) { + TRI_SWAP(v1, v2); +#ifdef CULL + cull = -cull; +#endif + } + + if (v3->win[1] < v1->win[1]) { + TRI_SWAP(v1, v3); + TRI_SWAP(v2, v3); + } else if (v3->win[1] < v2->win[1]) { + TRI_SWAP(v2, v3); +#ifdef CULL + cull = -cull; +#endif + } + + x1 = v1->win[0]; + y1 = v1->win[1]; + x2 = v2->win[0]; + y2 = v2->win[1]; + x3 = v3->win[0]; + y3 = v3->win[1]; + + /* compute deltas for each edge */ + eMaj_dx = x3 - x1; + eMaj_dy = y3 - y1; + eBot_dx = x2 - x1; + eBot_dy = y2 - y1; + eTop_dx = x3 - x2; + eTop_dy = y3 - y2; + + /* compute area */ + if ((area = eMaj_dx * eBot_dy - eBot_dx * eMaj_dy) == 0) { + return; + } +#ifdef CULL + if ((area * cull) > 0) { + return; + } +#endif + + mga_select(); + + /* set engine state */ +#ifdef SETUP_CODE + SETUP_CODE +#endif + + /* draw lower triangle */ +#if defined(INTERP_Z) || defined(INTERP_RGB) + mga_fifo(1); +#else + mga_fifo(2); + mga_outl(M_FCOL, color); +#endif + mga_outl(M_YDST, y1); + +#ifdef INTERP_Z + z1 = v1->win[2]; + z2 = v2->win[2]; + z3 = v3->win[2]; + + /* compute d?/dx and d?/dy derivatives */ + eMaj_dz = z3 - z1; + eBot_dz = z2 - z1; + dzdx = ((long long)(eMaj_dz * eBot_dy - eMaj_dy * eBot_dz)<<15) / area; + dzdy = ((long long)(eMaj_dx * eBot_dz - eMaj_dz * eBot_dx)<<15) / area; + +#ifndef INTERP_RGB + mga_fifo(11); + mga_outl(M_DR2, dzdx); + mga_outl(M_DR3, dzdy); + mga_outl(M_DR4, red<<15); + mga_outl(M_DR6, 0); + mga_outl(M_DR7, 0); + mga_outl(M_DR8, green<<15); + mga_outl(M_DR10, 0); + mga_outl(M_DR11, 0); + mga_outl(M_DR12, blue<<15); + mga_outl(M_DR14, 0); + mga_outl(M_DR15, 0); +#else + mga_fifo(2); + mga_outl(M_DR2, dzdx); + mga_outl(M_DR3, dzdy); +#endif +#endif + +#ifdef INTERP_RGB + /* compute color deltas */ + eMaj_dr = v3->color[0] - v1->color[0]; + eBot_dr = v2->color[0] - v1->color[0]; + eMaj_dg = v3->color[1] - v1->color[1]; + eBot_dg = v2->color[1] - v1->color[1]; + eMaj_db = v3->color[2] - v1->color[2]; + eBot_db = v2->color[2] - v1->color[2]; + + /* compute color increments */ + drdx = ((long long)(eMaj_dr * eBot_dy - eMaj_dy * eBot_dr)<<15) / area; + drdy = ((long long)(eMaj_dx * eBot_dr - eMaj_dr * eBot_dx)<<15) / area; + dgdx = ((long long)(eMaj_dg * eBot_dy - eMaj_dy * eBot_dg)<<15) / area; + dgdy = ((long long)(eMaj_dx * eBot_dg - eMaj_dg * eBot_dx)<<15) / area; + dbdx = ((long long)(eMaj_db * eBot_dy - eMaj_dy * eBot_db)<<15) / area; + dbdy = ((long long)(eMaj_dx * eBot_db - eMaj_db * eBot_dx)<<15) / area; + + mga_fifo(6); + mga_outl(M_DR6, drdx); + mga_outl(M_DR7, drdy); + mga_outl(M_DR10, dgdx); + mga_outl(M_DR11, dgdy); + mga_outl(M_DR14, dbdx); + mga_outl(M_DR15, dbdy); +#endif + + if (area > 0) { /* major edge on the right */ + if (eBot_dy) { /* have lower triangle */ + mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR0, eBot_dy); + if (x2 < x1) { + mga_outl(M_AR1, eBot_dx + eBot_dy - 1); + mga_outl(M_AR2, eBot_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eBot_dx); + mga_outl(M_AR2, -eBot_dx); + } + + mga_outl(M_AR6, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR5, eMaj_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eMaj_dx); + mga_outl(M_AR5, -eMaj_dx); + } + + mga_outl(M_FXBNDRY, (x1<<16) | x1); +#ifdef INTERP_Z + mga_outl(M_DR0, z1<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v1->color[0]<<15); + mga_outl(M_DR8, v1->color[1]<<15); + mga_outl(M_DR12, v1->color[2]<<15); +#endif + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eBot_dy); + } else { /* no lower triangle */ + mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR6, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR4, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR5, eMaj_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eMaj_dx); + mga_outl(M_AR5, -eMaj_dx); + } + + mga_outl(M_FXBNDRY, (x1<<16) | x2); +#ifdef INTERP_Z + mga_outl(M_DR0, z2<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v2->color[0]<<15); + mga_outl(M_DR8, v2->color[1]<<15); + mga_outl(M_DR12, v2->color[2]<<15); +#endif + } + + /* draw upper triangle */ + if (eTop_dy) { + mga_fifo(5); + mga_outl(M_AR0, eTop_dy); + if (x3 < x2) { + mga_outl(M_AR1, eTop_dx + eTop_dy - 1); + mga_outl(M_AR2, eTop_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eTop_dx); + mga_outl(M_AR2, -eTop_dx); + sgn &= ~M_SDXL; + } + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eTop_dy); + } + } else { /* major edge on the left */ + if (eBot_dy) { /* have lower triangle */ + mga_fifo(9 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR0, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR2, eMaj_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eMaj_dx); + mga_outl(M_AR2, -eMaj_dx); + } + + mga_outl(M_AR6, eBot_dy); + if (x2 < x1) { + mga_outl(M_AR4, eBot_dx + eBot_dy - 1); + mga_outl(M_AR5, eBot_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eBot_dx); + mga_outl(M_AR5, -eBot_dx); + } + + mga_outl(M_FXBNDRY, (x1<<16) | x1); +#ifdef INTERP_Z + mga_outl(M_DR0, z1<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v1->color[0]<<15); + mga_outl(M_DR8, v1->color[1]<<15); + mga_outl(M_DR12, v1->color[2]<<15); +#endif + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eBot_dy); + } else { /* no lower triangle */ + mga_fifo(4 + FIFO_CNT_Z + FIFO_CNT_RGB); + + mga_outl(M_AR0, eMaj_dy); + if (x3 < x1) { + mga_outl(M_AR1, eMaj_dx + eMaj_dy - 1); + mga_outl(M_AR2, eMaj_dx); + sgn |= M_SDXL; + } else { + mga_outl(M_AR1, -eMaj_dx); + mga_outl(M_AR2, -eMaj_dx); + } + + mga_outl(M_FXBNDRY, (x2<<16) | x1); +#ifdef INTERP_Z + mga_outl(M_DR0, z1<<15); +#endif +#ifdef INTERP_RGB + mga_outl(M_DR4, v1->color[0]<<15); + mga_outl(M_DR8, v1->color[1]<<15); + mga_outl(M_DR12, v1->color[2]<<15); +#endif + } + + /* draw upper triangle */ + if (eTop_dy) { + mga_fifo(5); + mga_outl(M_AR6, eTop_dy); + if (x3 < x2) { + mga_outl(M_AR4, eTop_dx + eTop_dy - 1); + mga_outl(M_AR5, eTop_dx); + sgn |= M_SDXR; + } else { + mga_outl(M_AR4, -eTop_dx); + mga_outl(M_AR5, -eTop_dx); + sgn &= ~M_SDXR; + } + mga_outl(M_SGN, sgn); + mga_outl(M_LEN | M_EXEC, eTop_dy); + } + } +} + +#undef FIFO_CNT_RGB +#undef FIFO_CNT_Z + +#undef TRI_SWAP + +#undef SETUP_CODE +#undef INTERP_RGB +#undef INTERP_Z +#undef CULL +#undef TAG diff --git a/src/mesa/drivers/dos/mga/mga.c b/src/mesa/drivers/dos/mga/mga.c index 27afba0ba0..5b0ee6437e 100644 --- a/src/mesa/drivers/dos/mga/mga.c +++ b/src/mesa/drivers/dos/mga/mga.c @@ -1,1536 +1,1536 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - * - * Thanks to Shawn Hargreaves for FreeBE/AF - */ - - -#include -#include -#include - -#include "../internal.h" -#include "mga_reg.h" -#include "mga_hw.h" -#include "mga_mode.h" -#include "mga.h" - - - -/* cached drawing engine state */ -#define OP_NONE 0 - -#define OP_DRAWRECT (\ - M_DWG_TRAP | /* opcod */ \ - M_DWG_BLK | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - M_DWG_SOLID | /* solid */ \ - M_DWG_ARZERO | /* arzero */ \ - M_DWG_SGNZERO | /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC /* bop */ \ - /* trans */ \ - /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWRECT_TX32BGR (\ - M_DWG_TEXTURE_TRAP | /* opcod */ \ - M_DWG_I | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - /* solid */ \ - M_DWG_ARZERO | /* arzero */ \ - M_DWG_SGNZERO | /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BU32BGR /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWRECT_TX24BGR (\ - M_DWG_TEXTURE_TRAP | /* opcod */ \ - M_DWG_I | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - /* solid */ \ - M_DWG_ARZERO | /* arzero */ \ - M_DWG_SGNZERO | /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BU24BGR /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWLINE (\ - M_DWG_AUTOLINE_CLOSE | /* opcod */ \ - M_DWG_RPL | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - M_DWG_SOLID | /* solid */ \ - /* arzero */ \ - /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BFCOL /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWLINE_I (\ - M_DWG_AUTOLINE_CLOSE | /* opcod */ \ - M_DWG_I | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - /* solid */ \ - /* arzero */ \ - /* sgnzero */ \ - /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BFCOL /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWLINE_ZI (\ - M_DWG_AUTOLINE_CLOSE | /* opcod */ \ - M_DWG_ZI | /* atype */ \ - /* linear */ \ - M_DWG_ZLT | /* zmode */ \ - /* solid */ \ - /* arzero */ \ - /* sgnzero */ \ - /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BFCOL /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWTRAP (\ - M_DWG_TRAP | /* opcod */ \ - M_DWG_BLK | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - M_DWG_SOLID | /* solid */ \ - /* arzero */ \ - /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC /* bop */ \ - /* trans */ \ - /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWTRAP_I (\ - M_DWG_TRAP | /* opcod */ \ - M_DWG_I | /* atype */ \ - /* linear */ \ - M_DWG_NOZCMP | /* zmode */ \ - /* solid */ \ - /* arzero */ \ - /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC /* bop */ \ - /* trans */ \ - /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_DRAWTRAP_ZI (\ - M_DWG_TRAP | /* opcod */ \ - M_DWG_ZI | /* atype */ \ - /* linear */ \ - M_DWG_ZLT | /* zmode */ \ - /* solid */ \ - /* arzero */ \ - /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC /* bop */ \ - /* trans */ \ - /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_ILOAD_32BGR (\ - M_DWG_ILOAD | /* opcod */ \ - M_DWG_RPL | /* atype */ \ - /* linear */ \ - /* zmode */ \ - /* solid */ \ - /* arzero */ \ - M_DWG_SGNZERO | /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BU32BGR /* bltmod */ \ - /* pattern */ \ - /* transc */ ) -#define OP_ILOAD_24BGR (\ - M_DWG_ILOAD | /* opcod */ \ - M_DWG_RPL | /* atype */ \ - /* linear */ \ - /* zmode */ \ - /* solid */ \ - /* arzero */ \ - M_DWG_SGNZERO | /* sgnzero */ \ - M_DWG_SHFTZERO | /* shftzero */ \ - M_DWG_BOP_SRC | /* bop */ \ - /* trans */ \ - M_DWG_BU24BGR /* bltmod */ \ - /* pattern */ \ - /* transc */ ) - - - -/* internal hardware data structures */ -static int interleave; -static unsigned long zorg; -static unsigned long vram; -static char card_name[80]; - - - -/* some info about current mode */ -static int __bpp, __bypp; -static int __pixwidth, __bytwidth, __pagewidth, __width, __height, __zheight; -static int __operation; -static int __scrollx, __scrolly; - - - -/* buffers */ -static int mga_readbuffer, mga_writebuffer; -static long mga_readbuffer_ptr, mga_writebuffer_ptr; -static long mga_backbuffer_ptr, mga_frontbuffer_ptr; - - - -/* lookup table for scaling 2 bit colors up to 8 bits */ -static int _rgb_scale_2[4] = { - 0, 85, 170, 255 -}; - -/* lookup table for scaling 3 bit colors up to 8 bits */ -static int _rgb_scale_3[8] = { - 0, 36, 73, 109, 146, 182, 219, 255 -}; - -/* lookup table for scaling 5 bit colors up to 8 bits */ -static int _rgb_scale_5[32] = { - 0, 8, 16, 25, 33, 41, 49, 58, - 66, 74, 82, 90, 99, 107, 115, 123, - 132, 140, 148, 156, 165, 173, 181, 189, - 197, 206, 214, 222, 230, 239, 247, 255 -}; - -/* lookup table for scaling 6 bit colors up to 8 bits */ -static int _rgb_scale_6[64] = { - 0, 4, 8, 12, 16, 20, 24, 28, - 32, 36, 40, 45, 49, 53, 57, 61, - 65, 69, 73, 77, 81, 85, 89, 93, - 97, 101, 105, 109, 113, 117, 121, 125, - 130, 134, 138, 142, 146, 150, 154, 158, - 162, 166, 170, 174, 178, 182, 186, 190, - 194, 198, 202, 206, 210, 215, 219, 223, - 227, 231, 235, 239, 243, 247, 251, 255 -}; - - - -/* - * pixel/color routines - */ -void (*mga_putpixel) (unsigned int offset, int color); -int (*mga_getpixel) (unsigned int offset); -void (*mga_getrgba) (unsigned int offset, unsigned char rgba[4]); -int (*mga_mixrgb) (const unsigned char rgb[]); -static int (*mga_mixrgb_full) (const unsigned char rgb[]); - - - -/* mga_fifo: - * Waits until there are at least free slots in the FIFO buffer. - */ -#define mga_fifo(n) do { } while (mga_inb(M_FIFOSTATUS) < (n)) - - - -static int _mga_rread (int port, int index) -{ - mga_select(); - mga_outb(port, index); - return mga_inb(port+1); -} - - - -static void _mga_rwrite (int port, int index, int v) -{ - mga_select(); - mga_outb(port, index); - mga_outb(port+1, v); -} - - - -static void _mga_ralter (int port, int index, int mask, int v) -{ - int temp; - temp = _mga_rread(port, index); - temp &= (~mask); - temp |= (v & mask); - _mga_rwrite(port, index, temp); -} - - - -/* WaitTillIdle: - * Delay until the hardware controller has finished drawing. - */ -void mga_wait_idle (void) -{ - int tries = 2; - - /*hwptr_unselect(oldptr);*/ - - mga_select(); - - while (tries--) { - do { - } while (!(mga_inl(M_FIFOSTATUS) & 0x200)); - - do { - } while (mga_inl(M_STATUS) & 0x10000); - - mga_outb(M_CRTC_INDEX, 0); - } - - /*hwptr_select(oldptr);*/ -} - - - -/* Desc: Waits for the next vertical sync period. - * - * In : - * Out : - * - * Note: - */ -static void _mga_wait_retrace (void) -{ - int t1 = 0; - int t2 = 0; - - do { - t1 = t2; - t2 = mga_inl(M_VCOUNT); - } while (t2 >= t1); -} - - - -/* Desc: fix scan lines - * - * In : - * Out : - * - * Note: - */ -static unsigned long _mga_fix_scans (unsigned long l) -{ - unsigned long m = 0; - - switch (__bpp) { - case 8: - m = interleave?128:64; - break; - case 15: - case 16: - m = interleave?64:32; - break; - case 24: - m = interleave?128:64; - break; - case 32: - m = 32; - break; - } - - m -= 1; - return (l + m) & ~m; -} - - - -/* Desc: HW scrolling function - * - * In : - * Out : - * - * Note: view Z-buffer in 16bit modes: _mga_display_start(0, 0, __height, 1) - */ -void mga_display_start (long boffset, long x, long y, long waitVRT) -{ - long addr; - - mga_select(); - - if (waitVRT >= 0) { - - addr = __bytwidth * y + (boffset + x) * __bypp; - - if (interleave) { - addr /= 8; - } else { - addr /= 4; - } - - _mga_rwrite(M_CRTC_INDEX, 0x0D, (addr)&0xFF); - _mga_rwrite(M_CRTC_INDEX, 0x0C, (addr>>8)&0xFF); - _mga_ralter(M_CRTC_EXT_INDEX, 0, 0x0F, (addr>>16)&0x0F); - - while (waitVRT--) { - _mga_wait_retrace(); - } - } - - __scrollx = x; - __scrolly = y; -} - - - -/* Desc: set READ buffer - * - * In : either FRONT or BACK buffer - * Out : - * - * Note: - */ -void mga_set_readbuffer (int buffer) -{ - mga_readbuffer = buffer; - - mga_readbuffer_ptr = (mga_readbuffer == MGA_FRONTBUFFER) ? mga_frontbuffer_ptr : mga_backbuffer_ptr; -} - - - -/* Desc: set WRITE buffer - * - * In : either FRONT or BACK buffer - * Out : - * - * Note: - */ -void mga_set_writebuffer (int buffer) -{ - mga_writebuffer = buffer; - - mga_writebuffer_ptr = (mga_writebuffer == MGA_FRONTBUFFER) ? mga_frontbuffer_ptr : mga_backbuffer_ptr; - - mga_select(); - mga_fifo(1); - mga_outl(M_YDSTORG, mga_writebuffer_ptr); - - __operation = OP_NONE; -} - - - -/* Desc: swap buffers - * - * In : number of vertical retraces to wait - * Out : - * - * Note: - */ -void mga_swapbuffers (int swapinterval) -{ - /* flip the buffers */ - mga_backbuffer_ptr ^= __pagewidth; - mga_frontbuffer_ptr ^= __pagewidth; - - /* update READ/WRITE pointers */ - mga_set_readbuffer(mga_readbuffer); - mga_set_writebuffer(mga_writebuffer); - - /* make sure we always see the FRONT buffer */ - mga_display_start(mga_frontbuffer_ptr, __scrollx, __scrolly, swapinterval); -} - - - -/* Desc: color composition (w/o ALPHA) - * - * In : array of integers (R, G, B) - * Out : color - * - * Note: - - */ -static __inline int _mga_mixrgb8 (const unsigned char rgb[]) -{ - return (rgb[0]&0xe0)|((rgb[1]>>5)<<2)|(rgb[2]>>6); -} -static __inline int _mga_mixrgb15 (const unsigned char rgb[]) -{ - return ((rgb[0]>>3)<<10)|((rgb[1]>>3)<<5)|(rgb[2]>>3); -} -static __inline int _mga_mixrgb16 (const unsigned char rgb[]) -{ - return ((rgb[0]>>3)<<11)|((rgb[1]>>2)<<5)|(rgb[2]>>3); -} -static __inline int _mga_mixrgb32 (const unsigned char rgb[]) -{ - return (rgb[0]<<16)|(rgb[1]<<8)|(rgb[2]); -} - - - -/* Desc: color composition (w/o ALPHA) + replication - * - * In : array of integers (R, G, B) - * Out : color - * - * Note: - - */ -static int _mga_mixrgb8_full (const unsigned char rgb[]) -{ - int color = _mga_mixrgb8(rgb); - color |= color<<8; - return (color<<16) | color; -} -static int _mga_mixrgb15_full (const unsigned char rgb[]) -{ - int color = _mga_mixrgb15(rgb); - return (color<<16) | color; -} -static int _mga_mixrgb16_full (const unsigned char rgb[]) -{ - int color = _mga_mixrgb16(rgb); - return (color<<16) | color; -} -#define _mga_mixrgb32_full _mga_mixrgb32 - - - -/* Desc: putpixel - * - * In : pixel offset, pixel value - * Out : - - * - * Note: uses current write buffer - */ -static void _mga_putpixel8 (unsigned int offset, int color) -{ - hwptr_pokeb(mgaptr.linear_map, mga_writebuffer_ptr + offset, color); -} -#define _mga_putpixel15 _mga_putpixel16 -static void _mga_putpixel16 (unsigned int offset, int color) -{ - hwptr_pokew(mgaptr.linear_map, (mga_writebuffer_ptr + offset) * 2, color); -} -static void _mga_putpixel32 (unsigned int offset, int color) -{ - hwptr_pokel(mgaptr.linear_map, (mga_writebuffer_ptr + offset) * 4, color); -} - - - -/* Desc: pixel retrieval - * - * In : pixel offset - * Out : pixel value - * - * Note: uses current read buffer - */ -static __inline int _mga_getpixel8 (unsigned int offset) -{ - return hwptr_peekb(mgaptr.linear_map, mga_readbuffer_ptr + offset); -} -#define _mga_getpixel15 _mga_getpixel16 -static __inline int _mga_getpixel16 (unsigned int offset) -{ - return hwptr_peekw(mgaptr.linear_map, (mga_readbuffer_ptr + offset) * 2); -} -static __inline int _mga_getpixel32 (unsigned int offset) -{ - return hwptr_peekl(mgaptr.linear_map, (mga_readbuffer_ptr + offset) * 4); -} - - - -/* Desc: color decomposition - * - * In : pixel offset, array of integers to hold color components (R, G, B, A) - * Out : - - * - * Note: uses current read buffer - */ -static void _mga_getrgba8 (unsigned int offset, unsigned char rgba[4]) -{ - int c = _mga_getpixel8(offset); - rgba[0] = _rgb_scale_3[(c >> 5) & 0x7]; - rgba[1] = _rgb_scale_3[(c >> 2) & 0x7]; - rgba[2] = _rgb_scale_2[c & 0x3]; - rgba[3] = 255; -} -static void _mga_getrgba15 (unsigned int offset, unsigned char rgba[4]) -{ - int c = _mga_getpixel15(offset); - rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F]; - rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F]; - rgba[2] = _rgb_scale_5[c & 0x1F]; - rgba[3] = 255; -} -static void _mga_getrgba16 (unsigned int offset, unsigned char rgba[4]) -{ - int c = _mga_getpixel16(offset); - rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F]; - rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F]; - rgba[2] = _rgb_scale_5[c & 0x1F]; - rgba[3] = 255; -} -static void _mga_getrgba32 (unsigned int offset, unsigned char rgba[4]) -{ - int c = _mga_getpixel32(offset); - rgba[0] = c >> 16; - rgba[1] = c >> 8; - rgba[2] = c; - rgba[3] = c >> 24; -} - - - -/* Desc: RGB flat line - * - * In : - * Out : - * - * Note: - */ -void mga_draw_line_rgb_flat (const MGAvertex *v1, const MGAvertex *v2) -{ - unsigned long color; - int x1 = v1->win[0]; - int y1 = v1->win[1]; - int x2 = v2->win[0]; - int y2 = v2->win[1]; - - if ((x1 == x2) && (y1 == y2)) { - return; - } - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWLINE) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWLINE); - __operation = OP_DRAWLINE; - } - - color = mga_mixrgb_full(v2->color); - - /* draw the line */ - mga_fifo(3); - mga_outl(M_FCOL, color); - mga_outl(M_XYSTRT, (y1<<16) | x1); - mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); -} - - - -/* Desc: RGB flat Z-less line - * - * In : - * Out : - * - * Note: I never figured out "diagonal increments" - */ -void mga_draw_line_rgb_flat_zless (const MGAvertex *v1, const MGAvertex *v2) -{ - int z1, dz; - int x1 = v1->win[0]; - int y1 = v1->win[1]; - int x2 = v2->win[0]; - int y2 = v2->win[1]; - int dx = abs(x2 - x1); - int dy = abs(y2 - y1); - - if ((dx == 0) && (dy == 0)) { - return; - } - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWLINE_ZI) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWLINE_ZI); - __operation = OP_DRAWLINE_ZI; - } - - if (dx < dy) { - dx = dy; - } - - z1 = v1->win[2] << 15; - dz = ((v2->win[2] << 15) - z1) / dx; - - /* draw the line */ - mga_fifo(14); - mga_outl(M_DR0, z1); - mga_outl(M_DR2, dz); - mga_outl(M_DR3, dz); - mga_outl(M_DR4, v2->color[0] << 15); - mga_outl(M_DR6, 0); - mga_outl(M_DR7, 0); - mga_outl(M_DR8, v2->color[1] << 15); - mga_outl(M_DR10, 0); - mga_outl(M_DR11, 0); - mga_outl(M_DR12, v2->color[2] << 15); - mga_outl(M_DR14, 0); - mga_outl(M_DR15, 0); - mga_outl(M_XYSTRT, (y1<<16) | x1); - mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); -} - - - -/* Desc: RGB iterated line - * - * In : - * Out : - * - * Note: I never figured out "diagonal increments" - */ -void mga_draw_line_rgb_iter (const MGAvertex *v1, const MGAvertex *v2) -{ - int r1, g1, b1; - int dr, dg, db; - int x1 = v1->win[0]; - int y1 = v1->win[1]; - int x2 = v2->win[0]; - int y2 = v2->win[1]; - int dx = abs(x2 - x1); - int dy = abs(y2 - y1); - - if ((dx == 0) && (dy == 0)) { - return; - } - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWLINE_I) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWLINE_I); - __operation = OP_DRAWLINE_I; - } - - if (dx < dy) { - dx = dy; - } - - r1 = v1->color[0] << 15; - g1 = v1->color[1] << 15; - b1 = v1->color[2] << 15; - dr = ((v2->color[0] << 15) - r1) / dx; - dg = ((v2->color[1] << 15) - g1) / dx; - db = ((v2->color[2] << 15) - b1) / dx; - - /* draw the line */ - mga_fifo(11); - mga_outl(M_DR4, r1); - mga_outl(M_DR6, dr); - mga_outl(M_DR7, dr); - mga_outl(M_DR8, g1); - mga_outl(M_DR10, dg); - mga_outl(M_DR11, dg); - mga_outl(M_DR12, b1); - mga_outl(M_DR14, db); - mga_outl(M_DR15, db); - mga_outl(M_XYSTRT, (y1<<16) | x1); - mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); -} - - - -/* Desc: RGB iterated Z-less line - * - * In : - * Out : - * - * Note: I never figured out "diagonal increments" - */ -void mga_draw_line_rgb_iter_zless (const MGAvertex *v1, const MGAvertex *v2) -{ - int z1, dz; - int r1, g1, b1; - int dr, dg, db; - int x1 = v1->win[0]; - int y1 = v1->win[1]; - int x2 = v2->win[0]; - int y2 = v2->win[1]; - int dx = abs(x2 - x1); - int dy = abs(y2 - y1); - - if ((dx == 0) && (dy == 0)) { - return; - } - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWLINE_ZI) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWLINE_ZI); - __operation = OP_DRAWLINE_ZI; - } - - if (dx < dy) { - dx = dy; - } - - z1 = v1->win[2] << 15; - dz = ((v2->win[2] << 15) - z1) / dx; - - r1 = v1->color[0] << 15; - g1 = v1->color[1] << 15; - b1 = v1->color[2] << 15; - dr = ((v2->color[0] << 15) - r1) / dx; - dg = ((v2->color[1] << 15) - g1) / dx; - db = ((v2->color[2] << 15) - b1) / dx; - - /* draw the line */ - mga_fifo(14); - mga_outl(M_DR0, z1); - mga_outl(M_DR2, dz); - mga_outl(M_DR3, dz); - mga_outl(M_DR4, r1); - mga_outl(M_DR6, dr); - mga_outl(M_DR7, dr); - mga_outl(M_DR8, g1); - mga_outl(M_DR10, dg); - mga_outl(M_DR11, dg); - mga_outl(M_DR12, b1); - mga_outl(M_DR14, db); - mga_outl(M_DR15, db); - mga_outl(M_XYSTRT, (y1<<16) | x1); - mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); -} - - - -/* Desc: RGB flat triangle - * - * In : - * Out : - * - * Note: - */ -#define TAG mga_draw_tri_rgb_flat -#define CULL -#define SETUP_CODE \ - if (__operation != OP_DRAWTRAP) { \ - mga_fifo(1); \ - mga_outl(M_DWGCTL, OP_DRAWTRAP); \ - __operation = OP_DRAWTRAP; \ - } -#include "m_ttemp.h" - - - -/* Desc: RGB flat Z-less triangle - * - * In : - * Out : - * - * Note: - */ -#define TAG mga_draw_tri_rgb_flat_zless -#define CULL -#define INTERP_Z -#define SETUP_CODE \ - if (__operation != OP_DRAWTRAP_ZI) { \ - mga_fifo(1); \ - mga_outl(M_DWGCTL, OP_DRAWTRAP_ZI); \ - __operation = OP_DRAWTRAP_ZI; \ - } -#include "m_ttemp.h" - - - -/* Desc: RGB iterated triangle - * - * In : - * Out : - * - * Note: - */ -#define TAG mga_draw_tri_rgb_iter -#define CULL -#define INTERP_RGB -#define SETUP_CODE \ - if (__operation != OP_DRAWTRAP_I) { \ - mga_fifo(1); \ - mga_outl(M_DWGCTL, OP_DRAWTRAP_I); \ - __operation = OP_DRAWTRAP_I; \ - } -#include "m_ttemp.h" - - - -/* Desc: RGB iterated Z-less triangle - * - * In : - * Out : - * - * Note: - */ -#define TAG mga_draw_tri_rgb_iter_zless -#define CULL -#define INTERP_Z -#define INTERP_RGB -#define SETUP_CODE \ - if (__operation != OP_DRAWTRAP_ZI) { \ - mga_fifo(1); \ - mga_outl(M_DWGCTL, OP_DRAWTRAP_ZI); \ - __operation = OP_DRAWTRAP_ZI; \ - } -#include "m_ttemp.h" - - - -/* Desc: RGB flat rectangle - * - * In : - * Out : - * - * Note: - */ -void mga_draw_rect_rgb_flat (int left, int top, int width, int height, int color) -{ - if (__bpp == 8) { - color |= color << 8; - } - if (__bpp <= 16) { - color |= color << 16; - } - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWRECT) { - - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWRECT); - __operation = OP_DRAWRECT; - } - - /* draw the rectangle */ - mga_fifo(3); - mga_outl(M_FCOL, color); - mga_outl(M_FXBNDRY, ((left+width)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); -} - - - -/* Desc: 32RGB textured span - * - * In : - * Out : - * - * Note: 0 <= width <= 7*1024 - */ -void mga_draw_span_rgb_tx32 (int left, int top, int width, const unsigned long *bitmap) -{ - int i; - - if (!width) { - return; - } - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWRECT_TX32BGR) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWRECT_TX32BGR); - __operation = OP_DRAWRECT_TX32BGR; - } - - /* draw the rectangle */ - mga_fifo(2); - mga_outl(M_FXBNDRY, ((left+width)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | 1); - - /* copy data to the pseudo-dma window */ - i = 0; - do { - mga_outl(i, *bitmap); - bitmap++; - i += 4; - } while (--width); -} - - - -/* Desc: 24RGB textured span - * - * In : - * Out : - * - * Note: 0 <= width <= 7*1024 - */ -void mga_draw_span_rgb_tx24 (int left, int top, int width, const unsigned long *bitmap) -{ - int i; - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWRECT_TX24BGR) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWRECT_TX24BGR); - __operation = OP_DRAWRECT_TX24BGR; - } - - /* draw the rectangle */ - mga_fifo(2); - mga_outl(M_FXBNDRY, ((left+width)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | 1); - - /* copy data to the pseudo-dma window */ - i = 0; - width = (width * 3 + 3) / 4; - while (width) { - mga_outl(i & (7 * 1024 - 1), *bitmap); - bitmap++; - i += 4; - width--; - } -} - - - -/* Desc: 32RGB textured rectangle - * - * In : - * Out : - * - * Note: - */ -void mga_draw_rect_rgb_tx32 (int left, int top, int width, int height, const unsigned long *bitmap) -{ - int i; - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWRECT_TX32BGR) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWRECT_TX32BGR); - __operation = OP_DRAWRECT_TX32BGR; - } - - /* draw the rectangle */ - mga_fifo(2); - mga_outl(M_FXBNDRY, ((left+width)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); - - /* copy data to the pseudo-dma window */ - i = 0; - width *= height; - while (width) { - mga_outl(i & (7 * 1024 - 1), *bitmap); - bitmap++; - i += 4; - width--; - } -} - - - -/* Desc: 24RGB textured rectangle - * - * In : - * Out : - * - * Note: - */ -void mga_draw_rect_rgb_tx24 (int left, int top, int width, int height, const unsigned long *bitmap) -{ - int i; - - mga_select(); - - /* set engine state */ - if (__operation != OP_DRAWRECT_TX24BGR) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_DRAWRECT_TX24BGR); - __operation = OP_DRAWRECT_TX24BGR; - } - - /* draw the rectangle */ - mga_fifo(2); - mga_outl(M_FXBNDRY, ((left+width)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); - - /* copy data to the pseudo-dma window */ - i = 0; - width = (width * height * 3 + 3) / 4; - while (width) { - mga_outl(i & (7 * 1024 - 1), *bitmap); - bitmap++; - i += 4; - width--; - } -} - - - -/* Desc: copy 32RGB image to screen - * - * In : - * Out : - * - * Note: - */ -void mga_iload_32RGB (int left, int top, int width, int height, const unsigned long *bitmap) -{ - int i; - - mga_select(); - - /* set engine state */ - if (__operation != OP_ILOAD_32BGR) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_ILOAD_32BGR); - __operation = OP_ILOAD_32BGR; - } - - /* draw the bitmap */ - mga_fifo(5); - mga_outl(M_AR0, width-1); - mga_outl(M_AR3, 0); - mga_outl(M_AR5, 0); - mga_outl(M_FXBNDRY, ((left+width-1)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); - - /* copy data to the pseudo-dma window */ - i = 0; - width *= height; - while (width) { - mga_outl(i & (7 * 1024 - 1), *bitmap); - bitmap++; - i += 4; - width--; - } -} - - - -/* Desc: copy 24RGB image to screen - * - * In : - * Out : - * - * Note: - */ -void mga_iload_24RGB (int left, int top, int width, int height, const unsigned long *bitmap) -{ - int i; - - mga_select(); - - /* set engine state */ - if (__operation != OP_ILOAD_24BGR) { - mga_fifo(1); - mga_outl(M_DWGCTL, OP_ILOAD_24BGR); - __operation = OP_ILOAD_24BGR; - } - - /* draw the bitmap */ - mga_fifo(5); - mga_outl(M_AR0, width-1); - mga_outl(M_AR3, 0); - mga_outl(M_AR5, 0); - mga_outl(M_FXBNDRY, ((left+width-1)<<16) | left); - mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); - - /* copy data to the pseudo-dma window */ - i = 0; - width = (width * height * 3 + 3) / 4; - while (width) { - mga_outl(i & (7 * 1024 - 1), *bitmap); - bitmap++; - i += 4; - width--; - } -} - - - -/* Desc: get Z-buffer value - * - * In : - * Out : - * - * Note: - */ -unsigned short mga_getz (int offset) -{ - return hwptr_peekw(mgaptr.linear_map, zorg + (mga_readbuffer_ptr + offset) * 2); -} - - - -/* Desc: put Z-buffer value - * - * In : - * Out : - * - * Note: - */ -void mga_setz (int offset, unsigned short z) -{ - hwptr_pokew(mgaptr.linear_map, zorg + (mga_writebuffer_ptr + offset) * 2, z); -} - - - -/* Desc: clear Z-buffer - * - * In : - * Out : - * - * Note: uses current write buffer - */ -static void _mga_clear_zed (int left, int top, int width, int height, unsigned short z) -{ - if (__bpp == 16) { - /* GPU store (high bandwidth) - * Hack alert: - * can cause problems with concurrent FB accesses - */ - mga_select(); - mga_fifo(1); - mga_outl(M_YDSTORG, mga_writebuffer_ptr + zorg/2); - mga_draw_rect_rgb_flat(left, top, width, height, z); - mga_fifo(1); - mga_outl(M_YDSTORG, mga_writebuffer_ptr); - } else { - /* CPU store */ - unsigned long i, zz = (z<<16) | z; - unsigned long ofs = zorg + (top * __pixwidth + left + mga_writebuffer_ptr) * 2; - hwptr_select(mgaptr.linear_map); - while (height--) { - i = width/2; - while (i--) { - hwptr_nspokel(mgaptr.linear_map, ofs, zz); - ofs += 4; - } - if (width & 1) { - hwptr_nspokew(mgaptr.linear_map, ofs, z); - ofs += 2; - } - ofs += (__pixwidth - width) * 2; - } - } -} - - - -/* Desc: clear color- and Z-buffer - * - * In : front = clear front buffer - * back = clear back buffer - * zed = clear depth buffer - * left = leftmost pixel to be cleared - * top = starting line - * width = number of pixels - * height = number of lines - * color = color to clear to - * z = z value (ignored if zed==0) - * Out : - * - * Note: - */ -void mga_clear (int front, int back, int zed, int left, int top, int width, int height, int color, unsigned short z) -{ - if (front) { - if (mga_writebuffer == MGA_FRONTBUFFER) { - mga_draw_rect_rgb_flat(left, top, width, height, color); - if (zed) { - _mga_clear_zed(left, top, width, height, z); - } - front = 0; - } - } - if (back) { - if (mga_writebuffer == MGA_BACKBUFFER) { - mga_draw_rect_rgb_flat(left, top, width, height, color); - if (zed) { - _mga_clear_zed(left, top, width, height, z); - } - back = 0; - } - } - if (front) { - int old = mga_writebuffer; - mga_set_writebuffer(MGA_FRONTBUFFER); - mga_draw_rect_rgb_flat(left, top, width, height, color); - if (zed) { - _mga_clear_zed(left, top, width, height, z); - } - mga_set_writebuffer(old); - front = 0; - } - if (back) { - int old = mga_writebuffer; - mga_set_writebuffer(MGA_BACKBUFFER); - mga_draw_rect_rgb_flat(left, top, width, height, color); - if (zed) { - _mga_clear_zed(left, top, width, height, z); - } - mga_set_writebuffer(old); - back = 0; - } -} - - - -/* Desc: Attempts to enter specified video mode. - * - * In : ptr to mode structure, number of pages, Z-buffer request, refresh rate - * Out : 0 if success - * - * Note: also set up the accelerator engine - */ -int mga_open (int width, int height, int bpp, int buffers, int zbuffer, int refresh) -{ - static int mill_strides[] = { 640, 768, 800, 960, 1024, 1152, 1280, 1600, 1920, 2048, 0 }; - unsigned int i, used; - MGA_MODE *p; - - if (mga_hw_init(&vram, &interleave, card_name) == 0) { - return -1; - } - - if ((p = mga_mode_find(width, height, bpp)) == NULL) { - return -1; - } - - __bpp = p->bpp; - __width = __pagewidth = p->xres; - __height = p->yres; - - if (buffers > 1) { - __pagewidth = _mga_fix_scans(__pagewidth); - __pixwidth = __pagewidth * buffers; - } else { - __pixwidth = __pagewidth; - __pixwidth = _mga_fix_scans(__pixwidth); - } - - for (i=0; mill_strides[i]; i++) { - if (__pixwidth <= mill_strides[i]) { - __pixwidth = mill_strides[i]; - break; - } - } - - __bypp = (__bpp+7)/8; - __bytwidth = __pixwidth * __bypp; - - /* compute used memory: framebuffer + zbuffer */ - used = __bytwidth * __height; - if (zbuffer) { - zorg = (used + 511) & ~511; - /* Hack alert: - * a 16-bit Z-buffer size is (stride_in_pixels * number_of_lines * 2) - * We cannot mess with the Z-buffer width, but we might decrease the - * number of lines, if the user requests less than (screen_height). For - * example with a 2MB card, one can have 640x480x16 display with 2 color - * buffers and Z-buffer if the maximum requested height is 339: - * Total = (640*480 * 2 + 640*339 * 2) * 2 - * However, this means the user must not write beyond the window's height - * and if we'll ever implement moveable windows, we'll have to reconsider - * this hack. - */ -#if 1 - __zheight = height; /* smaller */ - used = zorg + __pixwidth * 2 * __zheight; -#else - __zheight = __height; - used = zorg + __pixwidth * 2 * __zheight; -#endif - } - - if (mill_strides[i] && (vram>=used)) { - /* enter mode */ - mga_mode_switch(p, refresh); - /* change the scan line length */ - _mga_ralter(M_CRTC_INDEX, 0x14, 0x40, 0); /* disable DWORD */ - _mga_ralter(M_CRTC_INDEX, 0x17, 0x40, 0x40); /* wbmode = BYTE */ - if (interleave) { - _mga_rwrite(M_CRTC_INDEX, 0x13, __bytwidth/16); - _mga_ralter(M_CRTC_EXT_INDEX, 0, 0x30, ((__bytwidth/16)>>4)&0x30); - } else { - _mga_rwrite(M_CRTC_INDEX, 0x13, __bytwidth/8); - _mga_ralter(M_CRTC_EXT_INDEX, 0, 0x30, ((__bytwidth/8)>>4)&0x30); - } - } else { - return -1; - } - - /* setup buffers */ - mga_frontbuffer_ptr = 0; - if (buffers > 1) { - mga_backbuffer_ptr = __pagewidth; - mga_set_readbuffer(MGA_BACKBUFFER); - mga_set_writebuffer(MGA_BACKBUFFER); - } else { - mga_backbuffer_ptr = 0; - mga_set_readbuffer(MGA_FRONTBUFFER); - mga_set_writebuffer(MGA_FRONTBUFFER); - } - mga_display_start(mga_frontbuffer_ptr, __scrollx = 0, __scrolly = 0, 1); - - /* set up the accelerator engine */ - mga_select(); - - mga_fifo(8); - mga_outl(M_PITCH, __pixwidth); - mga_outl(M_PLNWT, 0xFFFFFFFF); - mga_outl(M_OPMODE, M_DMA_BLIT); - mga_outl(M_CXBNDRY, 0xFFFF0000); - mga_outl(M_YTOP, 0x00000000); - mga_outl(M_YBOT, 0x007FFFFF); - mga_outl(M_ZORG, zorg); - -#define INITPTR(bpp) \ - mga_putpixel = _mga_putpixel##bpp; \ - mga_getrgba = _mga_getrgba##bpp; \ - mga_getpixel = _mga_getpixel##bpp; \ - mga_mixrgb = _mga_mixrgb##bpp; \ - mga_mixrgb_full = _mga_mixrgb##bpp##_full - - switch (__bpp) { - case 8: - mga_outl(M_MACCESS, 0); - INITPTR(8); - break; - case 15: - mga_outl(M_MACCESS, 0x80000001); - INITPTR(15); - break; - case 16: - mga_outl(M_MACCESS, 1); - INITPTR(16); - break; - case 32: - mga_outl(M_MACCESS, 2); - INITPTR(32); - break; - } - -#undef INITPTR - - /* disable VGA aperture */ - i = mga_inb(M_MISC_R); - mga_outb(M_MISC_W, i & ~2); - - /* clear Z-buffer (if any) */ - if (zbuffer) { - unsigned long ofs = zorg; - unsigned long len = zorg + __pixwidth * 2 * __zheight; - - hwptr_select(mgaptr.linear_map); - for (; ofs +#include +#include + +#include "../internal.h" +#include "mga_reg.h" +#include "mga_hw.h" +#include "mga_mode.h" +#include "mga.h" + + + +/* cached drawing engine state */ +#define OP_NONE 0 + +#define OP_DRAWRECT (\ + M_DWG_TRAP | /* opcod */ \ + M_DWG_BLK | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + M_DWG_SOLID | /* solid */ \ + M_DWG_ARZERO | /* arzero */ \ + M_DWG_SGNZERO | /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC /* bop */ \ + /* trans */ \ + /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWRECT_TX32BGR (\ + M_DWG_TEXTURE_TRAP | /* opcod */ \ + M_DWG_I | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + /* solid */ \ + M_DWG_ARZERO | /* arzero */ \ + M_DWG_SGNZERO | /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BU32BGR /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWRECT_TX24BGR (\ + M_DWG_TEXTURE_TRAP | /* opcod */ \ + M_DWG_I | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + /* solid */ \ + M_DWG_ARZERO | /* arzero */ \ + M_DWG_SGNZERO | /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BU24BGR /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWLINE (\ + M_DWG_AUTOLINE_CLOSE | /* opcod */ \ + M_DWG_RPL | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + M_DWG_SOLID | /* solid */ \ + /* arzero */ \ + /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BFCOL /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWLINE_I (\ + M_DWG_AUTOLINE_CLOSE | /* opcod */ \ + M_DWG_I | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + /* solid */ \ + /* arzero */ \ + /* sgnzero */ \ + /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BFCOL /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWLINE_ZI (\ + M_DWG_AUTOLINE_CLOSE | /* opcod */ \ + M_DWG_ZI | /* atype */ \ + /* linear */ \ + M_DWG_ZLT | /* zmode */ \ + /* solid */ \ + /* arzero */ \ + /* sgnzero */ \ + /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BFCOL /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWTRAP (\ + M_DWG_TRAP | /* opcod */ \ + M_DWG_BLK | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + M_DWG_SOLID | /* solid */ \ + /* arzero */ \ + /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC /* bop */ \ + /* trans */ \ + /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWTRAP_I (\ + M_DWG_TRAP | /* opcod */ \ + M_DWG_I | /* atype */ \ + /* linear */ \ + M_DWG_NOZCMP | /* zmode */ \ + /* solid */ \ + /* arzero */ \ + /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC /* bop */ \ + /* trans */ \ + /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_DRAWTRAP_ZI (\ + M_DWG_TRAP | /* opcod */ \ + M_DWG_ZI | /* atype */ \ + /* linear */ \ + M_DWG_ZLT | /* zmode */ \ + /* solid */ \ + /* arzero */ \ + /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC /* bop */ \ + /* trans */ \ + /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_ILOAD_32BGR (\ + M_DWG_ILOAD | /* opcod */ \ + M_DWG_RPL | /* atype */ \ + /* linear */ \ + /* zmode */ \ + /* solid */ \ + /* arzero */ \ + M_DWG_SGNZERO | /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BU32BGR /* bltmod */ \ + /* pattern */ \ + /* transc */ ) +#define OP_ILOAD_24BGR (\ + M_DWG_ILOAD | /* opcod */ \ + M_DWG_RPL | /* atype */ \ + /* linear */ \ + /* zmode */ \ + /* solid */ \ + /* arzero */ \ + M_DWG_SGNZERO | /* sgnzero */ \ + M_DWG_SHFTZERO | /* shftzero */ \ + M_DWG_BOP_SRC | /* bop */ \ + /* trans */ \ + M_DWG_BU24BGR /* bltmod */ \ + /* pattern */ \ + /* transc */ ) + + + +/* internal hardware data structures */ +static int interleave; +static unsigned long zorg; +static unsigned long vram; +static char card_name[80]; + + + +/* some info about current mode */ +static int __bpp, __bypp; +static int __pixwidth, __bytwidth, __pagewidth, __width, __height, __zheight; +static int __operation; +static int __scrollx, __scrolly; + + + +/* buffers */ +static int mga_readbuffer, mga_writebuffer; +static long mga_readbuffer_ptr, mga_writebuffer_ptr; +static long mga_backbuffer_ptr, mga_frontbuffer_ptr; + + + +/* lookup table for scaling 2 bit colors up to 8 bits */ +static int _rgb_scale_2[4] = { + 0, 85, 170, 255 +}; + +/* lookup table for scaling 3 bit colors up to 8 bits */ +static int _rgb_scale_3[8] = { + 0, 36, 73, 109, 146, 182, 219, 255 +}; + +/* lookup table for scaling 5 bit colors up to 8 bits */ +static int _rgb_scale_5[32] = { + 0, 8, 16, 25, 33, 41, 49, 58, + 66, 74, 82, 90, 99, 107, 115, 123, + 132, 140, 148, 156, 165, 173, 181, 189, + 197, 206, 214, 222, 230, 239, 247, 255 +}; + +/* lookup table for scaling 6 bit colors up to 8 bits */ +static int _rgb_scale_6[64] = { + 0, 4, 8, 12, 16, 20, 24, 28, + 32, 36, 40, 45, 49, 53, 57, 61, + 65, 69, 73, 77, 81, 85, 89, 93, + 97, 101, 105, 109, 113, 117, 121, 125, + 130, 134, 138, 142, 146, 150, 154, 158, + 162, 166, 170, 174, 178, 182, 186, 190, + 194, 198, 202, 206, 210, 215, 219, 223, + 227, 231, 235, 239, 243, 247, 251, 255 +}; + + + +/* + * pixel/color routines + */ +void (*mga_putpixel) (unsigned int offset, int color); +int (*mga_getpixel) (unsigned int offset); +void (*mga_getrgba) (unsigned int offset, unsigned char rgba[4]); +int (*mga_mixrgb) (const unsigned char rgb[]); +static int (*mga_mixrgb_full) (const unsigned char rgb[]); + + + +/* mga_fifo: + * Waits until there are at least free slots in the FIFO buffer. + */ +#define mga_fifo(n) do { } while (mga_inb(M_FIFOSTATUS) < (n)) + + + +static int _mga_rread (int port, int index) +{ + mga_select(); + mga_outb(port, index); + return mga_inb(port+1); +} + + + +static void _mga_rwrite (int port, int index, int v) +{ + mga_select(); + mga_outb(port, index); + mga_outb(port+1, v); +} + + + +static void _mga_ralter (int port, int index, int mask, int v) +{ + int temp; + temp = _mga_rread(port, index); + temp &= (~mask); + temp |= (v & mask); + _mga_rwrite(port, index, temp); +} + + + +/* WaitTillIdle: + * Delay until the hardware controller has finished drawing. + */ +void mga_wait_idle (void) +{ + int tries = 2; + + /*hwptr_unselect(oldptr);*/ + + mga_select(); + + while (tries--) { + do { + } while (!(mga_inl(M_FIFOSTATUS) & 0x200)); + + do { + } while (mga_inl(M_STATUS) & 0x10000); + + mga_outb(M_CRTC_INDEX, 0); + } + + /*hwptr_select(oldptr);*/ +} + + + +/* Desc: Waits for the next vertical sync period. + * + * In : + * Out : + * + * Note: + */ +static void _mga_wait_retrace (void) +{ + int t1 = 0; + int t2 = 0; + + do { + t1 = t2; + t2 = mga_inl(M_VCOUNT); + } while (t2 >= t1); +} + + + +/* Desc: fix scan lines + * + * In : + * Out : + * + * Note: + */ +static unsigned long _mga_fix_scans (unsigned long l) +{ + unsigned long m = 0; + + switch (__bpp) { + case 8: + m = interleave?128:64; + break; + case 15: + case 16: + m = interleave?64:32; + break; + case 24: + m = interleave?128:64; + break; + case 32: + m = 32; + break; + } + + m -= 1; + return (l + m) & ~m; +} + + + +/* Desc: HW scrolling function + * + * In : + * Out : + * + * Note: view Z-buffer in 16bit modes: _mga_display_start(0, 0, __height, 1) + */ +void mga_display_start (long boffset, long x, long y, long waitVRT) +{ + long addr; + + mga_select(); + + if (waitVRT >= 0) { + + addr = __bytwidth * y + (boffset + x) * __bypp; + + if (interleave) { + addr /= 8; + } else { + addr /= 4; + } + + _mga_rwrite(M_CRTC_INDEX, 0x0D, (addr)&0xFF); + _mga_rwrite(M_CRTC_INDEX, 0x0C, (addr>>8)&0xFF); + _mga_ralter(M_CRTC_EXT_INDEX, 0, 0x0F, (addr>>16)&0x0F); + + while (waitVRT--) { + _mga_wait_retrace(); + } + } + + __scrollx = x; + __scrolly = y; +} + + + +/* Desc: set READ buffer + * + * In : either FRONT or BACK buffer + * Out : + * + * Note: + */ +void mga_set_readbuffer (int buffer) +{ + mga_readbuffer = buffer; + + mga_readbuffer_ptr = (mga_readbuffer == MGA_FRONTBUFFER) ? mga_frontbuffer_ptr : mga_backbuffer_ptr; +} + + + +/* Desc: set WRITE buffer + * + * In : either FRONT or BACK buffer + * Out : + * + * Note: + */ +void mga_set_writebuffer (int buffer) +{ + mga_writebuffer = buffer; + + mga_writebuffer_ptr = (mga_writebuffer == MGA_FRONTBUFFER) ? mga_frontbuffer_ptr : mga_backbuffer_ptr; + + mga_select(); + mga_fifo(1); + mga_outl(M_YDSTORG, mga_writebuffer_ptr); + + __operation = OP_NONE; +} + + + +/* Desc: swap buffers + * + * In : number of vertical retraces to wait + * Out : + * + * Note: + */ +void mga_swapbuffers (int swapinterval) +{ + /* flip the buffers */ + mga_backbuffer_ptr ^= __pagewidth; + mga_frontbuffer_ptr ^= __pagewidth; + + /* update READ/WRITE pointers */ + mga_set_readbuffer(mga_readbuffer); + mga_set_writebuffer(mga_writebuffer); + + /* make sure we always see the FRONT buffer */ + mga_display_start(mga_frontbuffer_ptr, __scrollx, __scrolly, swapinterval); +} + + + +/* Desc: color composition (w/o ALPHA) + * + * In : array of integers (R, G, B) + * Out : color + * + * Note: - + */ +static __inline int _mga_mixrgb8 (const unsigned char rgb[]) +{ + return (rgb[0]&0xe0)|((rgb[1]>>5)<<2)|(rgb[2]>>6); +} +static __inline int _mga_mixrgb15 (const unsigned char rgb[]) +{ + return ((rgb[0]>>3)<<10)|((rgb[1]>>3)<<5)|(rgb[2]>>3); +} +static __inline int _mga_mixrgb16 (const unsigned char rgb[]) +{ + return ((rgb[0]>>3)<<11)|((rgb[1]>>2)<<5)|(rgb[2]>>3); +} +static __inline int _mga_mixrgb32 (const unsigned char rgb[]) +{ + return (rgb[0]<<16)|(rgb[1]<<8)|(rgb[2]); +} + + + +/* Desc: color composition (w/o ALPHA) + replication + * + * In : array of integers (R, G, B) + * Out : color + * + * Note: - + */ +static int _mga_mixrgb8_full (const unsigned char rgb[]) +{ + int color = _mga_mixrgb8(rgb); + color |= color<<8; + return (color<<16) | color; +} +static int _mga_mixrgb15_full (const unsigned char rgb[]) +{ + int color = _mga_mixrgb15(rgb); + return (color<<16) | color; +} +static int _mga_mixrgb16_full (const unsigned char rgb[]) +{ + int color = _mga_mixrgb16(rgb); + return (color<<16) | color; +} +#define _mga_mixrgb32_full _mga_mixrgb32 + + + +/* Desc: putpixel + * + * In : pixel offset, pixel value + * Out : - + * + * Note: uses current write buffer + */ +static void _mga_putpixel8 (unsigned int offset, int color) +{ + hwptr_pokeb(mgaptr.linear_map, mga_writebuffer_ptr + offset, color); +} +#define _mga_putpixel15 _mga_putpixel16 +static void _mga_putpixel16 (unsigned int offset, int color) +{ + hwptr_pokew(mgaptr.linear_map, (mga_writebuffer_ptr + offset) * 2, color); +} +static void _mga_putpixel32 (unsigned int offset, int color) +{ + hwptr_pokel(mgaptr.linear_map, (mga_writebuffer_ptr + offset) * 4, color); +} + + + +/* Desc: pixel retrieval + * + * In : pixel offset + * Out : pixel value + * + * Note: uses current read buffer + */ +static __inline int _mga_getpixel8 (unsigned int offset) +{ + return hwptr_peekb(mgaptr.linear_map, mga_readbuffer_ptr + offset); +} +#define _mga_getpixel15 _mga_getpixel16 +static __inline int _mga_getpixel16 (unsigned int offset) +{ + return hwptr_peekw(mgaptr.linear_map, (mga_readbuffer_ptr + offset) * 2); +} +static __inline int _mga_getpixel32 (unsigned int offset) +{ + return hwptr_peekl(mgaptr.linear_map, (mga_readbuffer_ptr + offset) * 4); +} + + + +/* Desc: color decomposition + * + * In : pixel offset, array of integers to hold color components (R, G, B, A) + * Out : - + * + * Note: uses current read buffer + */ +static void _mga_getrgba8 (unsigned int offset, unsigned char rgba[4]) +{ + int c = _mga_getpixel8(offset); + rgba[0] = _rgb_scale_3[(c >> 5) & 0x7]; + rgba[1] = _rgb_scale_3[(c >> 2) & 0x7]; + rgba[2] = _rgb_scale_2[c & 0x3]; + rgba[3] = 255; +} +static void _mga_getrgba15 (unsigned int offset, unsigned char rgba[4]) +{ + int c = _mga_getpixel15(offset); + rgba[0] = _rgb_scale_5[(c >> 10) & 0x1F]; + rgba[1] = _rgb_scale_5[(c >> 5) & 0x1F]; + rgba[2] = _rgb_scale_5[c & 0x1F]; + rgba[3] = 255; +} +static void _mga_getrgba16 (unsigned int offset, unsigned char rgba[4]) +{ + int c = _mga_getpixel16(offset); + rgba[0] = _rgb_scale_5[(c >> 11) & 0x1F]; + rgba[1] = _rgb_scale_6[(c >> 5) & 0x3F]; + rgba[2] = _rgb_scale_5[c & 0x1F]; + rgba[3] = 255; +} +static void _mga_getrgba32 (unsigned int offset, unsigned char rgba[4]) +{ + int c = _mga_getpixel32(offset); + rgba[0] = c >> 16; + rgba[1] = c >> 8; + rgba[2] = c; + rgba[3] = c >> 24; +} + + + +/* Desc: RGB flat line + * + * In : + * Out : + * + * Note: + */ +void mga_draw_line_rgb_flat (const MGAvertex *v1, const MGAvertex *v2) +{ + unsigned long color; + int x1 = v1->win[0]; + int y1 = v1->win[1]; + int x2 = v2->win[0]; + int y2 = v2->win[1]; + + if ((x1 == x2) && (y1 == y2)) { + return; + } + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWLINE) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWLINE); + __operation = OP_DRAWLINE; + } + + color = mga_mixrgb_full(v2->color); + + /* draw the line */ + mga_fifo(3); + mga_outl(M_FCOL, color); + mga_outl(M_XYSTRT, (y1<<16) | x1); + mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); +} + + + +/* Desc: RGB flat Z-less line + * + * In : + * Out : + * + * Note: I never figured out "diagonal increments" + */ +void mga_draw_line_rgb_flat_zless (const MGAvertex *v1, const MGAvertex *v2) +{ + int z1, dz; + int x1 = v1->win[0]; + int y1 = v1->win[1]; + int x2 = v2->win[0]; + int y2 = v2->win[1]; + int dx = abs(x2 - x1); + int dy = abs(y2 - y1); + + if ((dx == 0) && (dy == 0)) { + return; + } + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWLINE_ZI) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWLINE_ZI); + __operation = OP_DRAWLINE_ZI; + } + + if (dx < dy) { + dx = dy; + } + + z1 = v1->win[2] << 15; + dz = ((v2->win[2] << 15) - z1) / dx; + + /* draw the line */ + mga_fifo(14); + mga_outl(M_DR0, z1); + mga_outl(M_DR2, dz); + mga_outl(M_DR3, dz); + mga_outl(M_DR4, v2->color[0] << 15); + mga_outl(M_DR6, 0); + mga_outl(M_DR7, 0); + mga_outl(M_DR8, v2->color[1] << 15); + mga_outl(M_DR10, 0); + mga_outl(M_DR11, 0); + mga_outl(M_DR12, v2->color[2] << 15); + mga_outl(M_DR14, 0); + mga_outl(M_DR15, 0); + mga_outl(M_XYSTRT, (y1<<16) | x1); + mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); +} + + + +/* Desc: RGB iterated line + * + * In : + * Out : + * + * Note: I never figured out "diagonal increments" + */ +void mga_draw_line_rgb_iter (const MGAvertex *v1, const MGAvertex *v2) +{ + int r1, g1, b1; + int dr, dg, db; + int x1 = v1->win[0]; + int y1 = v1->win[1]; + int x2 = v2->win[0]; + int y2 = v2->win[1]; + int dx = abs(x2 - x1); + int dy = abs(y2 - y1); + + if ((dx == 0) && (dy == 0)) { + return; + } + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWLINE_I) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWLINE_I); + __operation = OP_DRAWLINE_I; + } + + if (dx < dy) { + dx = dy; + } + + r1 = v1->color[0] << 15; + g1 = v1->color[1] << 15; + b1 = v1->color[2] << 15; + dr = ((v2->color[0] << 15) - r1) / dx; + dg = ((v2->color[1] << 15) - g1) / dx; + db = ((v2->color[2] << 15) - b1) / dx; + + /* draw the line */ + mga_fifo(11); + mga_outl(M_DR4, r1); + mga_outl(M_DR6, dr); + mga_outl(M_DR7, dr); + mga_outl(M_DR8, g1); + mga_outl(M_DR10, dg); + mga_outl(M_DR11, dg); + mga_outl(M_DR12, b1); + mga_outl(M_DR14, db); + mga_outl(M_DR15, db); + mga_outl(M_XYSTRT, (y1<<16) | x1); + mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); +} + + + +/* Desc: RGB iterated Z-less line + * + * In : + * Out : + * + * Note: I never figured out "diagonal increments" + */ +void mga_draw_line_rgb_iter_zless (const MGAvertex *v1, const MGAvertex *v2) +{ + int z1, dz; + int r1, g1, b1; + int dr, dg, db; + int x1 = v1->win[0]; + int y1 = v1->win[1]; + int x2 = v2->win[0]; + int y2 = v2->win[1]; + int dx = abs(x2 - x1); + int dy = abs(y2 - y1); + + if ((dx == 0) && (dy == 0)) { + return; + } + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWLINE_ZI) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWLINE_ZI); + __operation = OP_DRAWLINE_ZI; + } + + if (dx < dy) { + dx = dy; + } + + z1 = v1->win[2] << 15; + dz = ((v2->win[2] << 15) - z1) / dx; + + r1 = v1->color[0] << 15; + g1 = v1->color[1] << 15; + b1 = v1->color[2] << 15; + dr = ((v2->color[0] << 15) - r1) / dx; + dg = ((v2->color[1] << 15) - g1) / dx; + db = ((v2->color[2] << 15) - b1) / dx; + + /* draw the line */ + mga_fifo(14); + mga_outl(M_DR0, z1); + mga_outl(M_DR2, dz); + mga_outl(M_DR3, dz); + mga_outl(M_DR4, r1); + mga_outl(M_DR6, dr); + mga_outl(M_DR7, dr); + mga_outl(M_DR8, g1); + mga_outl(M_DR10, dg); + mga_outl(M_DR11, dg); + mga_outl(M_DR12, b1); + mga_outl(M_DR14, db); + mga_outl(M_DR15, db); + mga_outl(M_XYSTRT, (y1<<16) | x1); + mga_outl(M_XYEND | M_EXEC, (y2<<16) | x2); +} + + + +/* Desc: RGB flat triangle + * + * In : + * Out : + * + * Note: + */ +#define TAG mga_draw_tri_rgb_flat +#define CULL +#define SETUP_CODE \ + if (__operation != OP_DRAWTRAP) { \ + mga_fifo(1); \ + mga_outl(M_DWGCTL, OP_DRAWTRAP); \ + __operation = OP_DRAWTRAP; \ + } +#include "m_ttemp.h" + + + +/* Desc: RGB flat Z-less triangle + * + * In : + * Out : + * + * Note: + */ +#define TAG mga_draw_tri_rgb_flat_zless +#define CULL +#define INTERP_Z +#define SETUP_CODE \ + if (__operation != OP_DRAWTRAP_ZI) { \ + mga_fifo(1); \ + mga_outl(M_DWGCTL, OP_DRAWTRAP_ZI); \ + __operation = OP_DRAWTRAP_ZI; \ + } +#include "m_ttemp.h" + + + +/* Desc: RGB iterated triangle + * + * In : + * Out : + * + * Note: + */ +#define TAG mga_draw_tri_rgb_iter +#define CULL +#define INTERP_RGB +#define SETUP_CODE \ + if (__operation != OP_DRAWTRAP_I) { \ + mga_fifo(1); \ + mga_outl(M_DWGCTL, OP_DRAWTRAP_I); \ + __operation = OP_DRAWTRAP_I; \ + } +#include "m_ttemp.h" + + + +/* Desc: RGB iterated Z-less triangle + * + * In : + * Out : + * + * Note: + */ +#define TAG mga_draw_tri_rgb_iter_zless +#define CULL +#define INTERP_Z +#define INTERP_RGB +#define SETUP_CODE \ + if (__operation != OP_DRAWTRAP_ZI) { \ + mga_fifo(1); \ + mga_outl(M_DWGCTL, OP_DRAWTRAP_ZI); \ + __operation = OP_DRAWTRAP_ZI; \ + } +#include "m_ttemp.h" + + + +/* Desc: RGB flat rectangle + * + * In : + * Out : + * + * Note: + */ +void mga_draw_rect_rgb_flat (int left, int top, int width, int height, int color) +{ + if (__bpp == 8) { + color |= color << 8; + } + if (__bpp <= 16) { + color |= color << 16; + } + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWRECT) { + + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWRECT); + __operation = OP_DRAWRECT; + } + + /* draw the rectangle */ + mga_fifo(3); + mga_outl(M_FCOL, color); + mga_outl(M_FXBNDRY, ((left+width)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); +} + + + +/* Desc: 32RGB textured span + * + * In : + * Out : + * + * Note: 0 <= width <= 7*1024 + */ +void mga_draw_span_rgb_tx32 (int left, int top, int width, const unsigned long *bitmap) +{ + int i; + + if (!width) { + return; + } + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWRECT_TX32BGR) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWRECT_TX32BGR); + __operation = OP_DRAWRECT_TX32BGR; + } + + /* draw the rectangle */ + mga_fifo(2); + mga_outl(M_FXBNDRY, ((left+width)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | 1); + + /* copy data to the pseudo-dma window */ + i = 0; + do { + mga_outl(i, *bitmap); + bitmap++; + i += 4; + } while (--width); +} + + + +/* Desc: 24RGB textured span + * + * In : + * Out : + * + * Note: 0 <= width <= 7*1024 + */ +void mga_draw_span_rgb_tx24 (int left, int top, int width, const unsigned long *bitmap) +{ + int i; + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWRECT_TX24BGR) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWRECT_TX24BGR); + __operation = OP_DRAWRECT_TX24BGR; + } + + /* draw the rectangle */ + mga_fifo(2); + mga_outl(M_FXBNDRY, ((left+width)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | 1); + + /* copy data to the pseudo-dma window */ + i = 0; + width = (width * 3 + 3) / 4; + while (width) { + mga_outl(i & (7 * 1024 - 1), *bitmap); + bitmap++; + i += 4; + width--; + } +} + + + +/* Desc: 32RGB textured rectangle + * + * In : + * Out : + * + * Note: + */ +void mga_draw_rect_rgb_tx32 (int left, int top, int width, int height, const unsigned long *bitmap) +{ + int i; + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWRECT_TX32BGR) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWRECT_TX32BGR); + __operation = OP_DRAWRECT_TX32BGR; + } + + /* draw the rectangle */ + mga_fifo(2); + mga_outl(M_FXBNDRY, ((left+width)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); + + /* copy data to the pseudo-dma window */ + i = 0; + width *= height; + while (width) { + mga_outl(i & (7 * 1024 - 1), *bitmap); + bitmap++; + i += 4; + width--; + } +} + + + +/* Desc: 24RGB textured rectangle + * + * In : + * Out : + * + * Note: + */ +void mga_draw_rect_rgb_tx24 (int left, int top, int width, int height, const unsigned long *bitmap) +{ + int i; + + mga_select(); + + /* set engine state */ + if (__operation != OP_DRAWRECT_TX24BGR) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_DRAWRECT_TX24BGR); + __operation = OP_DRAWRECT_TX24BGR; + } + + /* draw the rectangle */ + mga_fifo(2); + mga_outl(M_FXBNDRY, ((left+width)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); + + /* copy data to the pseudo-dma window */ + i = 0; + width = (width * height * 3 + 3) / 4; + while (width) { + mga_outl(i & (7 * 1024 - 1), *bitmap); + bitmap++; + i += 4; + width--; + } +} + + + +/* Desc: copy 32RGB image to screen + * + * In : + * Out : + * + * Note: + */ +void mga_iload_32RGB (int left, int top, int width, int height, const unsigned long *bitmap) +{ + int i; + + mga_select(); + + /* set engine state */ + if (__operation != OP_ILOAD_32BGR) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_ILOAD_32BGR); + __operation = OP_ILOAD_32BGR; + } + + /* draw the bitmap */ + mga_fifo(5); + mga_outl(M_AR0, width-1); + mga_outl(M_AR3, 0); + mga_outl(M_AR5, 0); + mga_outl(M_FXBNDRY, ((left+width-1)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); + + /* copy data to the pseudo-dma window */ + i = 0; + width *= height; + while (width) { + mga_outl(i & (7 * 1024 - 1), *bitmap); + bitmap++; + i += 4; + width--; + } +} + + + +/* Desc: copy 24RGB image to screen + * + * In : + * Out : + * + * Note: + */ +void mga_iload_24RGB (int left, int top, int width, int height, const unsigned long *bitmap) +{ + int i; + + mga_select(); + + /* set engine state */ + if (__operation != OP_ILOAD_24BGR) { + mga_fifo(1); + mga_outl(M_DWGCTL, OP_ILOAD_24BGR); + __operation = OP_ILOAD_24BGR; + } + + /* draw the bitmap */ + mga_fifo(5); + mga_outl(M_AR0, width-1); + mga_outl(M_AR3, 0); + mga_outl(M_AR5, 0); + mga_outl(M_FXBNDRY, ((left+width-1)<<16) | left); + mga_outl(M_YDSTLEN | M_EXEC, (top<<16) | height); + + /* copy data to the pseudo-dma window */ + i = 0; + width = (width * height * 3 + 3) / 4; + while (width) { + mga_outl(i & (7 * 1024 - 1), *bitmap); + bitmap++; + i += 4; + width--; + } +} + + + +/* Desc: get Z-buffer value + * + * In : + * Out : + * + * Note: + */ +unsigned short mga_getz (int offset) +{ + return hwptr_peekw(mgaptr.linear_map, zorg + (mga_readbuffer_ptr + offset) * 2); +} + + + +/* Desc: put Z-buffer value + * + * In : + * Out : + * + * Note: + */ +void mga_setz (int offset, unsigned short z) +{ + hwptr_pokew(mgaptr.linear_map, zorg + (mga_writebuffer_ptr + offset) * 2, z); +} + + + +/* Desc: clear Z-buffer + * + * In : + * Out : + * + * Note: uses current write buffer + */ +static void _mga_clear_zed (int left, int top, int width, int height, unsigned short z) +{ + if (__bpp == 16) { + /* GPU store (high bandwidth) + * Hack alert: + * can cause problems with concurrent FB accesses + */ + mga_select(); + mga_fifo(1); + mga_outl(M_YDSTORG, mga_writebuffer_ptr + zorg/2); + mga_draw_rect_rgb_flat(left, top, width, height, z); + mga_fifo(1); + mga_outl(M_YDSTORG, mga_writebuffer_ptr); + } else { + /* CPU store */ + unsigned long i, zz = (z<<16) | z; + unsigned long ofs = zorg + (top * __pixwidth + left + mga_writebuffer_ptr) * 2; + hwptr_select(mgaptr.linear_map); + while (height--) { + i = width/2; + while (i--) { + hwptr_nspokel(mgaptr.linear_map, ofs, zz); + ofs += 4; + } + if (width & 1) { + hwptr_nspokew(mgaptr.linear_map, ofs, z); + ofs += 2; + } + ofs += (__pixwidth - width) * 2; + } + } +} + + + +/* Desc: clear color- and Z-buffer + * + * In : front = clear front buffer + * back = clear back buffer + * zed = clear depth buffer + * left = leftmost pixel to be cleared + * top = starting line + * width = number of pixels + * height = number of lines + * color = color to clear to + * z = z value (ignored if zed==0) + * Out : + * + * Note: + */ +void mga_clear (int front, int back, int zed, int left, int top, int width, int height, int color, unsigned short z) +{ + if (front) { + if (mga_writebuffer == MGA_FRONTBUFFER) { + mga_draw_rect_rgb_flat(left, top, width, height, color); + if (zed) { + _mga_clear_zed(left, top, width, height, z); + } + front = 0; + } + } + if (back) { + if (mga_writebuffer == MGA_BACKBUFFER) { + mga_draw_rect_rgb_flat(left, top, width, height, color); + if (zed) { + _mga_clear_zed(left, top, width, height, z); + } + back = 0; + } + } + if (front) { + int old = mga_writebuffer; + mga_set_writebuffer(MGA_FRONTBUFFER); + mga_draw_rect_rgb_flat(left, top, width, height, color); + if (zed) { + _mga_clear_zed(left, top, width, height, z); + } + mga_set_writebuffer(old); + front = 0; + } + if (back) { + int old = mga_writebuffer; + mga_set_writebuffer(MGA_BACKBUFFER); + mga_draw_rect_rgb_flat(left, top, width, height, color); + if (zed) { + _mga_clear_zed(left, top, width, height, z); + } + mga_set_writebuffer(old); + back = 0; + } +} + + + +/* Desc: Attempts to enter specified video mode. + * + * In : ptr to mode structure, number of pages, Z-buffer request, refresh rate + * Out : 0 if success + * + * Note: also set up the accelerator engine + */ +int mga_open (int width, int height, int bpp, int buffers, int zbuffer, int refresh) +{ + static int mill_strides[] = { 640, 768, 800, 960, 1024, 1152, 1280, 1600, 1920, 2048, 0 }; + unsigned int i, used; + MGA_MODE *p; + + if (mga_hw_init(&vram, &interleave, card_name) == 0) { + return -1; + } + + if ((p = mga_mode_find(width, height, bpp)) == NULL) { + return -1; + } + + __bpp = p->bpp; + __width = __pagewidth = p->xres; + __height = p->yres; + + if (buffers > 1) { + __pagewidth = _mga_fix_scans(__pagewidth); + __pixwidth = __pagewidth * buffers; + } else { + __pixwidth = __pagewidth; + __pixwidth = _mga_fix_scans(__pixwidth); + } + + for (i=0; mill_strides[i]; i++) { + if (__pixwidth <= mill_strides[i]) { + __pixwidth = mill_strides[i]; + break; + } + } + + __bypp = (__bpp+7)/8; + __bytwidth = __pixwidth * __bypp; + + /* compute used memory: framebuffer + zbuffer */ + used = __bytwidth * __height; + if (zbuffer) { + zorg = (used + 511) & ~511; + /* Hack alert: + * a 16-bit Z-buffer size is (stride_in_pixels * number_of_lines * 2) + * We cannot mess with the Z-buffer width, but we might decrease the + * number of lines, if the user requests less than (screen_height). For + * example with a 2MB card, one can have 640x480x16 display with 2 color + * buffers and Z-buffer if the maximum requested height is 339: + * Total = (640*480 * 2 + 640*339 * 2) * 2 + * However, this means the user must not write beyond the window's height + * and if we'll ever implement moveable windows, we'll have to reconsider + * this hack. + */ +#if 1 + __zheight = height; /* smaller */ + used = zorg + __pixwidth * 2 * __zheight; +#else + __zheight = __height; + used = zorg + __pixwidth * 2 * __zheight; +#endif + } + + if (mill_strides[i] && (vram>=used)) { + /* enter mode */ + mga_mode_switch(p, refresh); + /* change the scan line length */ + _mga_ralter(M_CRTC_INDEX, 0x14, 0x40, 0); /* disable DWORD */ + _mga_ralter(M_CRTC_INDEX, 0x17, 0x40, 0x40); /* wbmode = BYTE */ + if (interleave) { + _mga_rwrite(M_CRTC_INDEX, 0x13, __bytwidth/16); + _mga_ralter(M_CRTC_EXT_INDEX, 0, 0x30, ((__bytwidth/16)>>4)&0x30); + } else { + _mga_rwrite(M_CRTC_INDEX, 0x13, __bytwidth/8); + _mga_ralter(M_CRTC_EXT_INDEX, 0, 0x30, ((__bytwidth/8)>>4)&0x30); + } + } else { + return -1; + } + + /* setup buffers */ + mga_frontbuffer_ptr = 0; + if (buffers > 1) { + mga_backbuffer_ptr = __pagewidth; + mga_set_readbuffer(MGA_BACKBUFFER); + mga_set_writebuffer(MGA_BACKBUFFER); + } else { + mga_backbuffer_ptr = 0; + mga_set_readbuffer(MGA_FRONTBUFFER); + mga_set_writebuffer(MGA_FRONTBUFFER); + } + mga_display_start(mga_frontbuffer_ptr, __scrollx = 0, __scrolly = 0, 1); + + /* set up the accelerator engine */ + mga_select(); + + mga_fifo(8); + mga_outl(M_PITCH, __pixwidth); + mga_outl(M_PLNWT, 0xFFFFFFFF); + mga_outl(M_OPMODE, M_DMA_BLIT); + mga_outl(M_CXBNDRY, 0xFFFF0000); + mga_outl(M_YTOP, 0x00000000); + mga_outl(M_YBOT, 0x007FFFFF); + mga_outl(M_ZORG, zorg); + +#define INITPTR(bpp) \ + mga_putpixel = _mga_putpixel##bpp; \ + mga_getrgba = _mga_getrgba##bpp; \ + mga_getpixel = _mga_getpixel##bpp; \ + mga_mixrgb = _mga_mixrgb##bpp; \ + mga_mixrgb_full = _mga_mixrgb##bpp##_full + + switch (__bpp) { + case 8: + mga_outl(M_MACCESS, 0); + INITPTR(8); + break; + case 15: + mga_outl(M_MACCESS, 0x80000001); + INITPTR(15); + break; + case 16: + mga_outl(M_MACCESS, 1); + INITPTR(16); + break; + case 32: + mga_outl(M_MACCESS, 2); + INITPTR(32); + break; + } + +#undef INITPTR + + /* disable VGA aperture */ + i = mga_inb(M_MISC_R); + mga_outb(M_MISC_W, i & ~2); + + /* clear Z-buffer (if any) */ + if (zbuffer) { + unsigned long ofs = zorg; + unsigned long len = zorg + __pixwidth * 2 * __zheight; + + hwptr_select(mgaptr.linear_map); + for (; ofs -#include -#include -#include -#include -#include - -#include "../internal.h" -#include "mga_reg.h" -#include "mga_hw.h" - - - -/* Hack alert: - * these should really be externs - */ -/* PCI access routines */ -static int pci_find_device (int deviceID, int vendorID, int deviceIndex, int *handle); -static unsigned long pci_read_long (int handle, int index); -static void pci_write_long (int handle, int index, unsigned long value); - - - -/* PCI device identifiers */ -#define MATROX_VENDOR_ID 0x102B - -typedef enum { - MATROX_MILL_ID = 0x0519 -} MATROX_ID; - -static MATROX_ID matrox_id_list[] = { - MATROX_MILL_ID, - 0 -}; - - - -/* internal hardware data structures */ -#if !MGA_FARPTR -static int dirty; -#endif -static int bus_id; -static unsigned long reg40; -static unsigned long io_mem_base[4], linear_base; -static unsigned long io_mem_size[4], linear_size; -static MATROX_ID matrox_id; - - - -/* interface structures containing hardware pointer data */ -MGA_HWPTR mgaptr; - - - -/* Desc: create MMAP - * - * In : - * Out : - * - * Note: - */ -static int _create_mmap (__dpmi_paddr *m, unsigned long base, unsigned long size) -{ -#if MGA_FARPTR - int sel; - if (_create_selector(&sel, base, size)) { - return -1; - } - m->selector = sel; - m->offset32 = 0; -#else - m->selector = _my_ds(); - if (_create_linear_mapping(&m->offset32, base, size)) { - return -1; - } - m->offset32 -= __djgpp_base_address; -#endif - return 0; -} - - - -/* Desc: destroy MMAP - * - * In : - * Out : - * - * Note: - */ -static void _destroy_mmap (__dpmi_paddr *m) -{ -#if MGA_FARPTR - int sel = m->selector; - _remove_selector(&sel); -#else - m->offset32 += __djgpp_base_address; - _remove_linear_mapping(&m->offset32); -#endif - m->selector = 0; - m->offset32 = 0; -} - - - -/* Desc: Counts amount of installed RAM - * - * In : - * Out : - * - * Note: - */ -static int _mga_get_vram (MATROX_ID chip, unsigned long base) -{ - int ProbeSize = 8; - int SizeFound = 2; - unsigned char tmp; - int i; - __dpmi_paddr fb; - - switch (chip) { - case MATROX_MILL_ID: - ProbeSize = 8; - break; - } - - if (_create_mmap(&fb, base, ProbeSize*1024*1024)) { - return 0; - } - - /* turn MGA mode on - enable linear frame buffer (CRTCEXT3) */ - mga_select(); - mga_outb(M_CRTC_EXT_INDEX, 3); - tmp = mga_inb(M_CRTC_EXT_DATA); - mga_outb(M_CRTC_EXT_DATA, tmp | M_MGAMODE); - - /* write, read and compare method */ - for (i=ProbeSize; i>2; i-= 2) { - hwptr_pokeb(fb, i*1024*1024 - 1, 0xAA); - mga_select(); - mga_outb(M_CRTC_INDEX, 0); /* flush the cache */ - mga_inl(M_STATUS); /* delay */ - mga_inl(M_STATUS); /* delay */ - mga_inl(M_STATUS); /* delay */ - if (hwptr_peekb(fb, i*1024*1024 - 1) == 0xAA) { - SizeFound = i; - break; - } - } - - /* restore CRTCEXT3 state */ - mga_select(); - mga_outb(M_CRTC_EXT_INDEX, 3); - mga_outb(M_CRTC_EXT_DATA, tmp); - - _destroy_mmap(&fb); - - return SizeFound*1024*1024; -} - - - -/* Desc: Frees all resources allocated by MGA init code. - * - * In : - * Out : - * - * Note: - */ -void mga_hw_fini (void) -{ - int i; - - pci_write_long(bus_id, 0x40, reg40); - - for (i=0; i<4; i++) { - _destroy_mmap(&mgaptr.io_mem_map[i]); - } - - _destroy_mmap(&mgaptr.linear_map); - -#if !MGA_FARPTR - if (dirty) { - __djgpp_nearptr_disable(); - dirty = FALSE; - } -#endif - - matrox_id = 0; -} - - - -/* Desc: Attempts to detect MGA. - * - * In : - * Out : - * - * Note: The first thing ever to be called. This is in charge of filling in - * the driver header with all the required information and function - * pointers. We do not yet have access to the video memory, so we can't - * talk directly to the card. - */ -int mga_hw_init (unsigned long *vram, int *interleave, char *name) -{ - int i; - unsigned long pci_base[2]; - - if (matrox_id) { - return matrox_id; - } - -#if !MGA_FARPTR - /* enable nearptr access */ - if (_crt0_startup_flags & _CRT0_FLAG_NEARPTR) { - dirty = FALSE; - } else { - if (__djgpp_nearptr_enable() == 0) - return NULL; - - dirty = TRUE; - } -#endif - - /* find PCI device */ - matrox_id = 0; - - for (bus_id=0, i=0; matrox_id_list[i]; i++) { - if (pci_find_device(matrox_id_list[i], MATROX_VENDOR_ID, 0, &bus_id)) { - matrox_id = matrox_id_list[i]; - break; - } - } - - /* set up the card name */ - switch (matrox_id) { - case MATROX_MILL_ID: - if (name) strcpy(name, "Millennium"); - break; - default: - matrox_id = 0; - return -1; - } - - reg40 = pci_read_long(bus_id, 0x40); -#if 0 /* overclock a little :) */ - { - int rfhcnt = (reg40 >> 16) & 0xF; - if ((reg40 & 0x200000) && (rfhcnt < 0xC)) { - pci_write_long(bus_id, 0x40, (reg40 & 0xFFF0FFFF) | 0x000C0000); - } - } -#endif - - /* read hardware configuration data */ - for (i=0; i<2; i++) - pci_base[i] = pci_read_long(bus_id, 16+i*4); - - /* work out the linear framebuffer and MMIO addresses */ - if (matrox_id == MATROX_MILL_ID) { - if (pci_base[0]) - io_mem_base[0] = pci_base[0] & 0xFFFFC000; - - if (pci_base[1]) - linear_base = pci_base[1] & 0xFF800000; - } - - if (!linear_base || !io_mem_base[0]) - return NULL; - - /* deal with the memory mapping crap */ - io_mem_size[0] = 0x4000; - - for (i=0; i<4; i++) { - if (io_mem_base[i]) { - if (_create_mmap(&mgaptr.io_mem_map[i], io_mem_base[i], io_mem_size[i])) { - mga_hw_fini(); - return NULL; - } - } - } - - *vram = linear_size = _mga_get_vram(matrox_id, linear_base); - - if (_create_mmap(&mgaptr.linear_map, linear_base, linear_size)) { - mga_hw_fini(); - return NULL; - } - - /* fill in user data */ - *interleave = linear_size > 2*1024*1024; - - return matrox_id; -} - - - -/* PCI routines added by SET */ -#define PCIAddr 0xCF8 -#define PCIData 0xCFC -#define PCIEnable 0x80000000 - - - -/* FindPCIDevice: - * Replacement for the INT 1A - PCI BIOS v2.0c+ - FIND PCI DEVICE, AX = B102h - * - * Note: deviceIndex is because a card can hold more than one PCI chip. - * - * Searches the board of the vendor supplied in vendorID with - * identification number deviceID and index deviceIndex (normally 0). - * The value returned in handle can be used to access the PCI registers - * of this board. - * - * Return: 1 if found 0 if not found. - */ -static int pci_find_device (int deviceID, int vendorID, int deviceIndex, int *handle) -{ - int model, vendor, card, device; - unsigned value, full_id, bus, busMax; - - deviceIndex <<= 8; - - /* for each PCI bus */ - for (bus=0, busMax=0x10000; bus> 16; - - if (vendor != 0xFFFF) { - /* is this the one we want? */ - if ((deviceID == model) && (vendorID == vendor)) { - *handle = value; - return 1; - } - - /* is it a bridge to a secondary bus? */ - outportl(PCIAddr, value | 8); - - if (((inportl(PCIData) >> 16) == 0x0600) || (full_id==0x00011011)) - busMax += 0x10000; - } - } - } - - return 0; -} - - - -/* Desc: - * - * In : - * Out : - * - * Note: - */ -static unsigned long pci_read_long (int handle, int index) -{ - outportl(PCIAddr, PCIEnable | handle | index); - return inportl(PCIData); -} - - - -/* Desc: - * - * In : - * Out : - * - * Note: - */ -static void pci_write_long (int handle, int index, unsigned long value) -{ - outportl(PCIAddr, PCIEnable | handle | index); - outportl(PCIData, value); -} +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.4 for Mesa -- MGA2064W HW mapping + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include +#include +#include +#include +#include +#include + +#include "../internal.h" +#include "mga_reg.h" +#include "mga_hw.h" + + + +/* Hack alert: + * these should really be externs + */ +/* PCI access routines */ +static int pci_find_device (int deviceID, int vendorID, int deviceIndex, int *handle); +static unsigned long pci_read_long (int handle, int index); +static void pci_write_long (int handle, int index, unsigned long value); + + + +/* PCI device identifiers */ +#define MATROX_VENDOR_ID 0x102B + +typedef enum { + MATROX_MILL_ID = 0x0519 +} MATROX_ID; + +static MATROX_ID matrox_id_list[] = { + MATROX_MILL_ID, + 0 +}; + + + +/* internal hardware data structures */ +#if !MGA_FARPTR +static int dirty; +#endif +static int bus_id; +static unsigned long reg40; +static unsigned long io_mem_base[4], linear_base; +static unsigned long io_mem_size[4], linear_size; +static MATROX_ID matrox_id; + + + +/* interface structures containing hardware pointer data */ +MGA_HWPTR mgaptr; + + + +/* Desc: create MMAP + * + * In : + * Out : + * + * Note: + */ +static int _create_mmap (__dpmi_paddr *m, unsigned long base, unsigned long size) +{ +#if MGA_FARPTR + int sel; + if (_create_selector(&sel, base, size)) { + return -1; + } + m->selector = sel; + m->offset32 = 0; +#else + m->selector = _my_ds(); + if (_create_linear_mapping(&m->offset32, base, size)) { + return -1; + } + m->offset32 -= __djgpp_base_address; +#endif + return 0; +} + + + +/* Desc: destroy MMAP + * + * In : + * Out : + * + * Note: + */ +static void _destroy_mmap (__dpmi_paddr *m) +{ +#if MGA_FARPTR + int sel = m->selector; + _remove_selector(&sel); +#else + m->offset32 += __djgpp_base_address; + _remove_linear_mapping(&m->offset32); +#endif + m->selector = 0; + m->offset32 = 0; +} + + + +/* Desc: Counts amount of installed RAM + * + * In : + * Out : + * + * Note: + */ +static int _mga_get_vram (MATROX_ID chip, unsigned long base) +{ + int ProbeSize = 8; + int SizeFound = 2; + unsigned char tmp; + int i; + __dpmi_paddr fb; + + switch (chip) { + case MATROX_MILL_ID: + ProbeSize = 8; + break; + } + + if (_create_mmap(&fb, base, ProbeSize*1024*1024)) { + return 0; + } + + /* turn MGA mode on - enable linear frame buffer (CRTCEXT3) */ + mga_select(); + mga_outb(M_CRTC_EXT_INDEX, 3); + tmp = mga_inb(M_CRTC_EXT_DATA); + mga_outb(M_CRTC_EXT_DATA, tmp | M_MGAMODE); + + /* write, read and compare method */ + for (i=ProbeSize; i>2; i-= 2) { + hwptr_pokeb(fb, i*1024*1024 - 1, 0xAA); + mga_select(); + mga_outb(M_CRTC_INDEX, 0); /* flush the cache */ + mga_inl(M_STATUS); /* delay */ + mga_inl(M_STATUS); /* delay */ + mga_inl(M_STATUS); /* delay */ + if (hwptr_peekb(fb, i*1024*1024 - 1) == 0xAA) { + SizeFound = i; + break; + } + } + + /* restore CRTCEXT3 state */ + mga_select(); + mga_outb(M_CRTC_EXT_INDEX, 3); + mga_outb(M_CRTC_EXT_DATA, tmp); + + _destroy_mmap(&fb); + + return SizeFound*1024*1024; +} + + + +/* Desc: Frees all resources allocated by MGA init code. + * + * In : + * Out : + * + * Note: + */ +void mga_hw_fini (void) +{ + int i; + + pci_write_long(bus_id, 0x40, reg40); + + for (i=0; i<4; i++) { + _destroy_mmap(&mgaptr.io_mem_map[i]); + } + + _destroy_mmap(&mgaptr.linear_map); + +#if !MGA_FARPTR + if (dirty) { + __djgpp_nearptr_disable(); + dirty = FALSE; + } +#endif + + matrox_id = 0; +} + + + +/* Desc: Attempts to detect MGA. + * + * In : + * Out : + * + * Note: The first thing ever to be called. This is in charge of filling in + * the driver header with all the required information and function + * pointers. We do not yet have access to the video memory, so we can't + * talk directly to the card. + */ +int mga_hw_init (unsigned long *vram, int *interleave, char *name) +{ + int i; + unsigned long pci_base[2]; + + if (matrox_id) { + return matrox_id; + } + +#if !MGA_FARPTR + /* enable nearptr access */ + if (_crt0_startup_flags & _CRT0_FLAG_NEARPTR) { + dirty = FALSE; + } else { + if (__djgpp_nearptr_enable() == 0) + return 0; + + dirty = TRUE; + } +#endif + + /* find PCI device */ + matrox_id = 0; + + for (bus_id=0, i=0; matrox_id_list[i]; i++) { + if (pci_find_device(matrox_id_list[i], MATROX_VENDOR_ID, 0, &bus_id)) { + matrox_id = matrox_id_list[i]; + break; + } + } + + /* set up the card name */ + switch (matrox_id) { + case MATROX_MILL_ID: + if (name) strcpy(name, "Millennium"); + break; + default: + matrox_id = 0; + return -1; + } + + reg40 = pci_read_long(bus_id, 0x40); +#if 0 /* overclock a little :) */ + { + int rfhcnt = (reg40 >> 16) & 0xF; + if ((reg40 & 0x200000) && (rfhcnt < 0xC)) { + pci_write_long(bus_id, 0x40, (reg40 & 0xFFF0FFFF) | 0x000C0000); + } + } +#endif + + /* read hardware configuration data */ + for (i=0; i<2; i++) + pci_base[i] = pci_read_long(bus_id, 16+i*4); + + /* work out the linear framebuffer and MMIO addresses */ + if (matrox_id == MATROX_MILL_ID) { + if (pci_base[0]) + io_mem_base[0] = pci_base[0] & 0xFFFFC000; + + if (pci_base[1]) + linear_base = pci_base[1] & 0xFF800000; + } + + if (!linear_base || !io_mem_base[0]) + return 0; + + /* deal with the memory mapping crap */ + io_mem_size[0] = 0x4000; + + for (i=0; i<4; i++) { + if (io_mem_base[i]) { + if (_create_mmap(&mgaptr.io_mem_map[i], io_mem_base[i], io_mem_size[i])) { + mga_hw_fini(); + return 0; + } + } + } + + *vram = linear_size = _mga_get_vram(matrox_id, linear_base); + + if (_create_mmap(&mgaptr.linear_map, linear_base, linear_size)) { + mga_hw_fini(); + return 0; + } + + /* fill in user data */ + *interleave = linear_size > 2*1024*1024; + + return matrox_id; +} + + + +/* PCI routines added by SET */ +#define PCIAddr 0xCF8 +#define PCIData 0xCFC +#define PCIEnable 0x80000000 + + + +/* FindPCIDevice: + * Replacement for the INT 1A - PCI BIOS v2.0c+ - FIND PCI DEVICE, AX = B102h + * + * Note: deviceIndex is because a card can hold more than one PCI chip. + * + * Searches the board of the vendor supplied in vendorID with + * identification number deviceID and index deviceIndex (normally 0). + * The value returned in handle can be used to access the PCI registers + * of this board. + * + * Return: 1 if found 0 if not found. + */ +static int pci_find_device (int deviceID, int vendorID, int deviceIndex, int *handle) +{ + int model, vendor, card, device; + unsigned value, full_id, bus, busMax; + + deviceIndex <<= 8; + + /* for each PCI bus */ + for (bus=0, busMax=0x10000; bus> 16; + + if (vendor != 0xFFFF) { + /* is this the one we want? */ + if ((deviceID == model) && (vendorID == vendor)) { + *handle = value; + return 1; + } + + /* is it a bridge to a secondary bus? */ + outportl(PCIAddr, value | 8); + + if (((inportl(PCIData) >> 16) == 0x0600) || (full_id==0x00011011)) + busMax += 0x10000; + } + } + } + + return 0; +} + + + +/* Desc: + * + * In : + * Out : + * + * Note: + */ +static unsigned long pci_read_long (int handle, int index) +{ + outportl(PCIAddr, PCIEnable | handle | index); + return inportl(PCIData); +} + + + +/* Desc: + * + * In : + * Out : + * + * Note: + */ +static void pci_write_long (int handle, int index, unsigned long value) +{ + outportl(PCIAddr, PCIEnable | handle | index); + outportl(PCIData, value); +} diff --git a/src/mesa/drivers/dos/mga/mga_hw.h b/src/mesa/drivers/dos/mga/mga_hw.h index c6575b97f8..8cc266b49e 100644 --- a/src/mesa/drivers/dos/mga/mga_hw.h +++ b/src/mesa/drivers/dos/mga/mga_hw.h @@ -1,113 +1,113 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W HW mapping - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - */ - - -#ifndef MGA_HW_included -#define MGA_HW_included - - - -/* set this to zero to use near pointers */ -#define MGA_FARPTR 1 - - - -/* access macros */ -#if MGA_FARPTR - -#include - -#define hwptr_pokeb(ptr, off, val) _farpokeb((ptr).selector, (ptr).offset32+(off), (val)) -#define hwptr_pokew(ptr, off, val) _farpokew((ptr).selector, (ptr).offset32+(off), (val)) -#define hwptr_pokel(ptr, off, val) _farpokel((ptr).selector, (ptr).offset32+(off), (val)) - -#define hwptr_peekb(ptr, off) _farpeekb((ptr).selector, (ptr).offset32+(off)) -#define hwptr_peekw(ptr, off) _farpeekw((ptr).selector, (ptr).offset32+(off)) -#define hwptr_peekl(ptr, off) _farpeekl((ptr).selector, (ptr).offset32+(off)) - -#define hwptr_select(ptr) _farsetsel((ptr).selector) -#define hwptr_unselect(ptr) (ptr).selector = _fargetsel() - -#define hwptr_nspokeb(ptr, off, val) _farnspokeb((ptr).offset32+(off), (val)) -#define hwptr_nspokew(ptr, off, val) _farnspokew((ptr).offset32+(off), (val)) -#define hwptr_nspokel(ptr, off, val) _farnspokel((ptr).offset32+(off), (val)) - -#define hwptr_nspeekb(ptr, off) _farnspeekb((ptr).offset32+(off)) -#define hwptr_nspeekw(ptr, off) _farnspeekw((ptr).offset32+(off)) -#define hwptr_nspeekl(ptr, off) _farnspeekl((ptr).offset32+(off)) - -#else - -#define hwptr_pokeb(ptr, off, val) *((volatile unsigned char *)((ptr).offset32+(off))) = (val) -#define hwptr_pokew(ptr, off, val) *((volatile unsigned short *)((ptr).offset32+(off))) = (val) -#define hwptr_pokel(ptr, off, val) *((volatile unsigned long *)((ptr).offset32+(off))) = (val) - -#define hwptr_peekb(ptr, off) (*((volatile unsigned char *)((ptr).offset32+(off)))) -#define hwptr_peekw(ptr, off) (*((volatile unsigned short *)((ptr).offset32+(off)))) -#define hwptr_peekl(ptr, off) (*((volatile unsigned long *)((ptr).offset32+(off)))) - -#define hwptr_select(ptr) -#define hwptr_unselect(ptr) - -#define hwptr_nspokeb(ptr, off, val) *((volatile unsigned char *)((ptr).offset32+(off))) = (val) -#define hwptr_nspokew(ptr, off, val) *((volatile unsigned short *)((ptr).offset32+(off))) = (val) -#define hwptr_nspokel(ptr, off, val) *((volatile unsigned long *)((ptr).offset32+(off))) = (val) - -#define hwptr_nspeekb(ptr, off) (*((volatile unsigned char *)((ptr).offset32+(off)))) -#define hwptr_nspeekw(ptr, off) (*((volatile unsigned short *)((ptr).offset32+(off)))) -#define hwptr_nspeekl(ptr, off) (*((volatile unsigned long *)((ptr).offset32+(off)))) - -#endif - - - -/* helpers for accessing the Matrox registers */ -#define mga_select() hwptr_select(mgaptr.io_mem_map[0]) -#define mga_inb(addr) hwptr_nspeekb(mgaptr.io_mem_map[0], addr) -#define mga_inw(addr) hwptr_nspeekw(mgaptr.io_mem_map[0], addr) -#define mga_inl(addr) hwptr_nspeekl(mgaptr.io_mem_map[0], addr) -#define mga_outb(addr, val) hwptr_nspokeb(mgaptr.io_mem_map[0], addr, val) -#define mga_outw(addr, val) hwptr_nspokew(mgaptr.io_mem_map[0], addr, val) -#define mga_outl(addr, val) hwptr_nspokel(mgaptr.io_mem_map[0], addr, val) - - - -typedef struct MGA_HWPTR { - __dpmi_paddr io_mem_map[4], linear_map; -} MGA_HWPTR; - -extern MGA_HWPTR mgaptr; - -void mga_hw_fini (void); -int mga_hw_init (unsigned long *vram, int *interleave, char *name); - -#endif +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W HW mapping + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#ifndef MGA_HW_included +#define MGA_HW_included + + + +/* set this to zero to use near pointers */ +#define MGA_FARPTR 1 + + + +/* access macros */ +#if MGA_FARPTR + +#include + +#define hwptr_pokeb(ptr, off, val) _farpokeb((ptr).selector, (ptr).offset32+(off), (val)) +#define hwptr_pokew(ptr, off, val) _farpokew((ptr).selector, (ptr).offset32+(off), (val)) +#define hwptr_pokel(ptr, off, val) _farpokel((ptr).selector, (ptr).offset32+(off), (val)) + +#define hwptr_peekb(ptr, off) _farpeekb((ptr).selector, (ptr).offset32+(off)) +#define hwptr_peekw(ptr, off) _farpeekw((ptr).selector, (ptr).offset32+(off)) +#define hwptr_peekl(ptr, off) _farpeekl((ptr).selector, (ptr).offset32+(off)) + +#define hwptr_select(ptr) _farsetsel((ptr).selector) +#define hwptr_unselect(ptr) (ptr).selector = _fargetsel() + +#define hwptr_nspokeb(ptr, off, val) _farnspokeb((ptr).offset32+(off), (val)) +#define hwptr_nspokew(ptr, off, val) _farnspokew((ptr).offset32+(off), (val)) +#define hwptr_nspokel(ptr, off, val) _farnspokel((ptr).offset32+(off), (val)) + +#define hwptr_nspeekb(ptr, off) _farnspeekb((ptr).offset32+(off)) +#define hwptr_nspeekw(ptr, off) _farnspeekw((ptr).offset32+(off)) +#define hwptr_nspeekl(ptr, off) _farnspeekl((ptr).offset32+(off)) + +#else + +#define hwptr_pokeb(ptr, off, val) *((volatile unsigned char *)((ptr).offset32+(off))) = (val) +#define hwptr_pokew(ptr, off, val) *((volatile unsigned short *)((ptr).offset32+(off))) = (val) +#define hwptr_pokel(ptr, off, val) *((volatile unsigned long *)((ptr).offset32+(off))) = (val) + +#define hwptr_peekb(ptr, off) (*((volatile unsigned char *)((ptr).offset32+(off)))) +#define hwptr_peekw(ptr, off) (*((volatile unsigned short *)((ptr).offset32+(off)))) +#define hwptr_peekl(ptr, off) (*((volatile unsigned long *)((ptr).offset32+(off)))) + +#define hwptr_select(ptr) +#define hwptr_unselect(ptr) + +#define hwptr_nspokeb(ptr, off, val) *((volatile unsigned char *)((ptr).offset32+(off))) = (val) +#define hwptr_nspokew(ptr, off, val) *((volatile unsigned short *)((ptr).offset32+(off))) = (val) +#define hwptr_nspokel(ptr, off, val) *((volatile unsigned long *)((ptr).offset32+(off))) = (val) + +#define hwptr_nspeekb(ptr, off) (*((volatile unsigned char *)((ptr).offset32+(off)))) +#define hwptr_nspeekw(ptr, off) (*((volatile unsigned short *)((ptr).offset32+(off)))) +#define hwptr_nspeekl(ptr, off) (*((volatile unsigned long *)((ptr).offset32+(off)))) + +#endif + + + +/* helpers for accessing the Matrox registers */ +#define mga_select() hwptr_select(mgaptr.io_mem_map[0]) +#define mga_inb(addr) hwptr_nspeekb(mgaptr.io_mem_map[0], addr) +#define mga_inw(addr) hwptr_nspeekw(mgaptr.io_mem_map[0], addr) +#define mga_inl(addr) hwptr_nspeekl(mgaptr.io_mem_map[0], addr) +#define mga_outb(addr, val) hwptr_nspokeb(mgaptr.io_mem_map[0], addr, val) +#define mga_outw(addr, val) hwptr_nspokew(mgaptr.io_mem_map[0], addr, val) +#define mga_outl(addr, val) hwptr_nspokel(mgaptr.io_mem_map[0], addr, val) + + + +typedef struct MGA_HWPTR { + __dpmi_paddr io_mem_map[4], linear_map; +} MGA_HWPTR; + +extern MGA_HWPTR mgaptr; + +void mga_hw_fini (void); +int mga_hw_init (unsigned long *vram, int *interleave, char *name); + +#endif diff --git a/src/mesa/drivers/dos/mga/mga_mode.c b/src/mesa/drivers/dos/mga/mga_mode.c index 4c6d926111..efba24ca69 100644 --- a/src/mesa/drivers/dos/mga/mga_mode.c +++ b/src/mesa/drivers/dos/mga/mga_mode.c @@ -1,231 +1,231 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W mode switching - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - */ - - -#include -#include -#include -#include -#include -#include -#include - -#include "../internal.h" -#include "mga_mode.h" - - - -static MGA_MODE oldmode; -static MGA_MODE modes[64]; - - - -/* - * VESA info - */ -#define V_SIGN 0 -#define V_MINOR 4 -#define V_MAJOR 5 -#define V_OEM_OFS 6 -#define V_OEM_SEG 8 -#define V_MODE_OFS 14 -#define V_MODE_SEG 16 -#define V_MEMORY 18 - -/* - * mode info - */ -#define M_ATTR 0 -#define M_GRAN 4 -#define M_SCANLEN 16 -#define M_XRES 18 -#define M_YRES 20 -#define M_BPP 25 -#define M_RED 31 -#define M_GREEN 33 -#define M_BLUE 35 -#define M_PHYS_PTR 40 - - - -/* Desc: get available modes - * - * In : - - * Out : linear modes list ptr - * - * Note: shouldn't use VESA... - */ -static MGA_MODE *_mga_mode_check (void) -{ - __dpmi_regs r; - word16 *p; - MGA_MODE *q; - char vesa_info[512], tmp[512]; - - _farpokel(_stubinfo->ds_selector, 0, 0x32454256); - r.x.ax = 0x4f00; - r.x.di = 0; - r.x.es = _stubinfo->ds_segment; - __dpmi_int(0x10, &r); - movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512); - if ((r.x.ax!=0x004f) || ((_32_ vesa_info[V_SIGN])!=0x41534556)) { - return NULL; - } - - p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS])); - q = modes; - do { - if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) { - break; - } - - r.x.ax = 0x4f01; - r.x.cx = q->mode; - r.x.di = 512; - r.x.es = _stubinfo->ds_segment; - __dpmi_int(0x10, &r); - movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256); - switch (tmp[M_BPP]) { - case 16: - q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE]; - break; - case 8: - case 15: - case 24: - case 32: - q->bpp = tmp[M_BPP]; - break; - default: - q->bpp = 0; - } - if ((r.x.ax==0x004f) && ((tmp[M_ATTR]&0x11)==0x11) && q->bpp && (tmp[M_ATTR]&0x80)) { - q->xres = _16_ tmp[M_XRES]; - q->yres = _16_ tmp[M_YRES]; - q->mode |= 0x4000; - q++; - } - } while (TRUE); - - return modes; -} - - - -/* Desc: save current mode - * - * In : ptr to mode structure - * Out : 0 if success - * - * Note: shouldn't use VESA... - */ -static int _mga_mode_save (MGA_MODE *p) -{ - __asm("\n\ - movw $0x4f03, %%ax \n\ - int $0x10 \n\ - movl %%ebx, %0 \n\ - ":"=g"(p->mode)::"%eax", "%ebx"); - return 0; -} - - - -/* Desc: switch to specified mode - * - * In : ptr to mode structure, refresh rate - * Out : 0 if success - * - * Note: shouldn't use VESA... - */ -int mga_mode_switch (MGA_MODE *p, int refresh) -{ - if (oldmode.mode == 0) { - _mga_mode_save(&oldmode); - } - __asm("movw $0x4f02, %%ax; int $0x10"::"b"(p->mode):"%eax"); - return 0; - - (void)refresh; /* silence compiler warning */ -} - - - -/* Desc: restore to the mode prior to first call to `mga_switch' - * - * In : - - * Out : 0 if success - * - * Note: shouldn't use VESA... - */ -int mga_mode_restore (void) -{ - if (oldmode.mode != 0) { - __asm("movw $0x4f02, %%ax; int $0x10"::"b"(oldmode.mode):"%eax"); - oldmode.mode = 0; - } - return 0; -} - - - -/* Desc: return suitable mode - * - * In : width, height, bpp - * Out : ptr to mode structure - * - * Note: - - */ -MGA_MODE *mga_mode_find (int width, int height, int bpp) -{ - static MGA_MODE *q = NULL; - - MGA_MODE *p; - unsigned int min; - - if (q == NULL) { - if ((q = _mga_mode_check()) == NULL) { - return NULL; - } - } - - /* search for a mode that fits our request */ - for (min=-1, p=NULL; q->mode!=0xffff; q++) { - if ((q->xres>=width) && (q->yres>=height) && (q->bpp==bpp)) { - if (min>=(unsigned)(q->xres*q->yres)) { - min = q->xres*q->yres; - p = q; - } - } - } - - return p; -} +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W mode switching + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#include +#include +#include +#include +#include +#include +#include + +#include "../internal.h" +#include "mga_mode.h" + + + +static MGA_MODE oldmode; +static MGA_MODE modes[64]; + + + +/* + * VESA info + */ +#define V_SIGN 0 +#define V_MINOR 4 +#define V_MAJOR 5 +#define V_OEM_OFS 6 +#define V_OEM_SEG 8 +#define V_MODE_OFS 14 +#define V_MODE_SEG 16 +#define V_MEMORY 18 + +/* + * mode info + */ +#define M_ATTR 0 +#define M_GRAN 4 +#define M_SCANLEN 16 +#define M_XRES 18 +#define M_YRES 20 +#define M_BPP 25 +#define M_RED 31 +#define M_GREEN 33 +#define M_BLUE 35 +#define M_PHYS_PTR 40 + + + +/* Desc: get available modes + * + * In : - + * Out : linear modes list ptr + * + * Note: shouldn't use VESA... + */ +static MGA_MODE *_mga_mode_check (void) +{ + __dpmi_regs r; + word16 *p; + MGA_MODE *q; + char vesa_info[512], tmp[512]; + + _farpokel(_stubinfo->ds_selector, 0, 0x32454256); + r.x.ax = 0x4f00; + r.x.di = 0; + r.x.es = _stubinfo->ds_segment; + __dpmi_int(0x10, &r); + movedata(_stubinfo->ds_selector, 0, _my_ds(), (unsigned)vesa_info, 512); + if ((r.x.ax!=0x004f) || ((_32_ vesa_info[V_SIGN])!=0x41534556)) { + return NULL; + } + + p = (word16 *)(((_16_ vesa_info[V_MODE_SEG])<<4) + (_16_ vesa_info[V_MODE_OFS])); + q = modes; + do { + if ((q->mode=_farpeekw(__djgpp_dos_sel, (unsigned long)(p++)))==0xffff) { + break; + } + + r.x.ax = 0x4f01; + r.x.cx = q->mode; + r.x.di = 512; + r.x.es = _stubinfo->ds_segment; + __dpmi_int(0x10, &r); + movedata(_stubinfo->ds_selector, 512, _my_ds(), (unsigned)tmp, 256); + switch (tmp[M_BPP]) { + case 16: + q->bpp = tmp[M_RED] + tmp[M_GREEN] + tmp[M_BLUE]; + break; + case 8: + case 15: + case 24: + case 32: + q->bpp = tmp[M_BPP]; + break; + default: + q->bpp = 0; + } + if ((r.x.ax==0x004f) && ((tmp[M_ATTR]&0x11)==0x11) && q->bpp && (tmp[M_ATTR]&0x80)) { + q->xres = _16_ tmp[M_XRES]; + q->yres = _16_ tmp[M_YRES]; + q->mode |= 0x4000; + q++; + } + } while (TRUE); + + return modes; +} + + + +/* Desc: save current mode + * + * In : ptr to mode structure + * Out : 0 if success + * + * Note: shouldn't use VESA... + */ +static int _mga_mode_save (MGA_MODE *p) +{ + __asm("\n\ + movw $0x4f03, %%ax \n\ + int $0x10 \n\ + movl %%ebx, %0 \n\ + ":"=g"(p->mode)::"%eax", "%ebx"); + return 0; +} + + + +/* Desc: switch to specified mode + * + * In : ptr to mode structure, refresh rate + * Out : 0 if success + * + * Note: shouldn't use VESA... + */ +int mga_mode_switch (MGA_MODE *p, int refresh) +{ + if (oldmode.mode == 0) { + _mga_mode_save(&oldmode); + } + __asm("movw $0x4f02, %%ax; int $0x10"::"b"(p->mode):"%eax"); + return 0; + + (void)refresh; /* silence compiler warning */ +} + + + +/* Desc: restore to the mode prior to first call to `mga_switch' + * + * In : - + * Out : 0 if success + * + * Note: shouldn't use VESA... + */ +int mga_mode_restore (void) +{ + if (oldmode.mode != 0) { + __asm("movw $0x4f02, %%ax; int $0x10"::"b"(oldmode.mode):"%eax"); + oldmode.mode = 0; + } + return 0; +} + + + +/* Desc: return suitable mode + * + * In : width, height, bpp + * Out : ptr to mode structure + * + * Note: - + */ +MGA_MODE *mga_mode_find (int width, int height, int bpp) +{ + static MGA_MODE *q = NULL; + + MGA_MODE *p; + unsigned int min; + + if (q == NULL) { + if ((q = _mga_mode_check()) == NULL) { + return NULL; + } + } + + /* search for a mode that fits our request */ + for (min=-1, p=NULL; q->mode!=0xffff; q++) { + if ((q->xres>=width) && (q->yres>=height) && (q->bpp==bpp)) { + if (min>=(unsigned)(q->xres*q->yres)) { + min = q->xres*q->yres; + p = q; + } + } + } + + return p; +} diff --git a/src/mesa/drivers/dos/mga/mga_mode.h b/src/mesa/drivers/dos/mga/mga_mode.h index b458d00d80..c9e04bc2ea 100644 --- a/src/mesa/drivers/dos/mga/mga_mode.h +++ b/src/mesa/drivers/dos/mga/mga_mode.h @@ -1,47 +1,47 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W mode switching - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - */ - - -#ifndef MGA_MODE_included -#define MGA_MODE_included - -typedef struct MGA_MODE { - int mode; - int xres, yres; - int bpp; -} MGA_MODE; - -int mga_mode_switch (MGA_MODE *p, int refresh); -int mga_mode_restore (void); -MGA_MODE *mga_mode_find (int width, int height, int bpp); - -#endif +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W mode switching + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#ifndef MGA_MODE_included +#define MGA_MODE_included + +typedef struct MGA_MODE { + int mode; + int xres, yres; + int bpp; +} MGA_MODE; + +int mga_mode_switch (MGA_MODE *p, int refresh); +int mga_mode_restore (void); +MGA_MODE *mga_mode_find (int width, int height, int bpp); + +#endif diff --git a/src/mesa/drivers/dos/mga/mga_reg.h b/src/mesa/drivers/dos/mga/mga_reg.h index 4cd664ff96..11db81886b 100644 --- a/src/mesa/drivers/dos/mga/mga_reg.h +++ b/src/mesa/drivers/dos/mga/mga_reg.h @@ -1,207 +1,207 @@ -/* - * Mesa 3-D graphics library - * Version: 5.0 - * - * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. - * - * 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 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 - * BRIAN PAUL 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. - */ - -/* - * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W register mnemonics - * - * Copyright (c) 2003 - Borca Daniel - * Email : dborca@yahoo.com - * Web : http://www.geocities.com/dborca - */ - - -#ifndef MGA_REG_H_included -#define MGA_REG_H_included - -/* Matrox hardware registers: */ -#define M_AR0 0x1C60 -#define M_AR1 0x1C64 -#define M_AR2 0x1C68 -#define M_AR3 0x1C6C -#define M_AR4 0x1C70 -#define M_AR5 0x1C74 -#define M_AR6 0x1C78 -#define M_BCOL 0x1C20 -#define M_CXBNDRY 0x1C80 -#define M_CXLEFT 0x1CA0 -#define M_CXRIGHT 0x1CA4 -#define M_DR0 0x1CC0 -#define M_DR2 0x1CC8 -#define M_DR3 0x1CCC -#define M_DR4 0x1CD0 -#define M_DR6 0x1CD8 -#define M_DR7 0x1CDC -#define M_DR8 0x1CE0 -#define M_DR10 0x1CE8 -#define M_DR11 0x1CEC -#define M_DR12 0x1CF0 -#define M_DR14 0x1CF8 -#define M_DR15 0x1CFC -#define M_DWGCTL 0x1C00 -#define M_FCOL 0x1C24 -#define M_FIFOSTATUS 0x1E10 -#define M_FXBNDRY 0x1C84 -#define M_FXLEFT 0x1CA8 -#define M_FXRIGHT 0x1CAC -#define M_ICLEAR 0x1E18 -#define M_IEN 0x1E1C -#define M_LEN 0x1C5C -#define M_MACCESS 0x1C04 -#define M_OPMODE 0x1E54 -#define M_PAT0 0x1C10 -#define M_PAT1 0x1C14 -#define M_PITCH 0x1C8C -#define M_PLNWT 0x1C1C -#define M_RESET 0x1E40 -#define M_SGN 0x1C58 -#define M_SHIFT 0x1C50 -#define M_SRC0 0x1C30 -#define M_SRC1 0x1C34 -#define M_SRC2 0x1C38 -#define M_SRC3 0x1C3C -#define M_STATUS 0x1E14 -#define M_VCOUNT 0x1E20 -#define M_XDST 0x1CB0 -#define M_XYEND 0x1C44 -#define M_XYSTRT 0x1C40 -#define M_YBOT 0x1C9C -#define M_YDST 0x1C90 -#define M_YDSTLEN 0x1C88 -#define M_YDSTORG 0x1C94 -#define M_YTOP 0x1C98 -#define M_ZORG 0x1C0C - -#define M_EXEC 0x0100 - -/* DWGCTL: opcod */ -#define M_DWG_LINE_OPEN 0x0 -#define M_DWG_AUTOLINE_OPEN 0x1 -#define M_DWG_LINE_CLOSE 0x2 -#define M_DWG_AUTOLINE_CLOSE 0x3 -#define M_DWG_TRAP 0x4 -#define M_DWG_TEXTURE_TRAP 0x5 -#define M_DWG_BITBLT 0x8 -#define M_DWG_FBITBLT 0xC -#define M_DWG_ILOAD 0x9 -#define M_DWG_ILOAD_SCALE 0xD -#define M_DWG_ILOAD_FILTER 0xF -#define M_DWG_IDUMP 0xA - -/* DWGCTL: atype */ -#define M_DWG_RPL (0x0 << 4) -#define M_DWG_RSTR (0x1 << 4) -#define M_DWG_ZI (0x3 << 4) -#define M_DWG_BLK (0x4 << 4) -#define M_DWG_I (0x7 << 4) - -/* DWGCTL: linear */ -#define M_DWG_LINEAR (0x1 << 7) - -/* DWGCTL: zmode */ -#define M_DWG_NOZCMP (0x0 << 8) -#define M_DWG_ZE (0x2 << 8) -#define M_DWG_ZNE (0x3 << 8) -#define M_DWG_ZLT (0x4 << 8) -#define M_DWG_ZLTE (0x5 << 8) -#define M_DWG_ZGT (0x6 << 8) -#define M_DWG_ZGTE (0x7 << 8) - -/* DWGCTL: solid */ -#define M_DWG_SOLID (0x1 << 11) - -/* DWGCTL: arzero */ -#define M_DWG_ARZERO (0x1 << 12) - -/* DWGCTL: sgnzero */ -#define M_DWG_SGNZERO (0x1 << 13) - -/* DWGCTL: shiftzero */ -#define M_DWG_SHFTZERO (0x1 << 14) - -/* DWGCTL: bop */ -#define M_DWG_BOP_XOR (0x6 << 16) -#define M_DWG_BOP_AND (0x8 << 16) -#define M_DWG_BOP_SRC (0xC << 16) -#define M_DWG_BOP_OR (0xE << 16) - -/* DWGCTL: trans */ -#define M_DWG_TRANS_0 (0x0 << 20) -#define M_DWG_TRANS_1 (0x1 << 20) -#define M_DWG_TRANS_2 (0x2 << 20) -#define M_DWG_TRANS_3 (0x3 << 20) -#define M_DWG_TRANS_4 (0x4 << 20) -#define M_DWG_TRANS_5 (0x5 << 20) -#define M_DWG_TRANS_6 (0x6 << 20) -#define M_DWG_TRANS_7 (0x7 << 20) -#define M_DWG_TRANS_8 (0x8 << 20) -#define M_DWG_TRANS_9 (0x9 << 20) -#define M_DWG_TRANS_A (0xA << 20) -#define M_DWG_TRANS_B (0xB << 20) -#define M_DWG_TRANS_C (0xC << 20) -#define M_DWG_TRANS_D (0xD << 20) -#define M_DWG_TRANS_E (0xE << 20) -#define M_DWG_TRANS_F (0xF << 20) - -/* DWGCTL: bltmod */ -#define M_DWG_BMONOLEF (0x0 << 25) -#define M_DWG_BMONOWF (0x4 << 25) -#define M_DWG_BPLAN (0x1 << 25) -#define M_DWG_BFCOL (0x2 << 25) -#define M_DWG_BUYUV (0xE << 25) -#define M_DWG_BU32BGR (0x3 << 25) -#define M_DWG_BU32RGB (0x7 << 25) -#define M_DWG_BU24BGR (0xB << 25) -#define M_DWG_BU24RGB (0xF << 25) - -/* DWGCTL: pattern */ -#define M_DWG_PATTERN (0x1 << 29) - -/* DWGCTL: transc */ -#define M_DWG_TRANSC (0x1 << 30) - -/* OPMODE: */ -#define M_DMA_GENERAL (0x0 << 2) -#define M_DMA_BLIT (0x1 << 2) -#define M_DMA_VECTOR (0x2 << 2) - -/* SGN: */ -#define M_SDXL (0x1 << 1) -#define M_SDXR (0x1 << 5) - - - -/* VGAREG */ -#define M_CRTC_INDEX 0x1FD4 -#define M_CRTC_DATA 0x1FD5 - -#define M_CRTC_EXT_INDEX 0x1FDE -#define M_CRTC_EXT_DATA 0x1FDF - -#define M_MISC_R 0x1FCC -#define M_MISC_W 0x1FC2 - -/* CRTCEXT3: */ -#define M_MGAMODE (0x1 << 7) - -#endif +/* + * Mesa 3-D graphics library + * Version: 5.0 + * + * Copyright (C) 1999-2002 Brian Paul All Rights Reserved. + * + * 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 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 + * BRIAN PAUL 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. + */ + +/* + * DOS/DJGPP device driver v1.3 for Mesa -- MGA2064W register mnemonics + * + * Copyright (c) 2003 - Borca Daniel + * Email : dborca@yahoo.com + * Web : http://www.geocities.com/dborca + */ + + +#ifndef MGA_REG_H_included +#define MGA_REG_H_included + +/* Matrox hardware registers: */ +#define M_AR0 0x1C60 +#define M_AR1 0x1C64 +#define M_AR2 0x1C68 +#define M_AR3 0x1C6C +#define M_AR4 0x1C70 +#define M_AR5 0x1C74 +#define M_AR6 0x1C78 +#define M_BCOL 0x1C20 +#define M_CXBNDRY 0x1C80 +#define M_CXLEFT 0x1CA0 +#define M_CXRIGHT 0x1CA4 +#define M_DR0 0x1CC0 +#define M_DR2 0x1CC8 +#define M_DR3 0x1CCC +#define M_DR4 0x1CD0 +#define M_DR6 0x1CD8 +#define M_DR7 0x1CDC +#define M_DR8 0x1CE0 +#define M_DR10 0x1CE8 +#define M_DR11 0x1CEC +#define M_DR12 0x1CF0 +#define M_DR14 0x1CF8 +#define M_DR15 0x1CFC +#define M_DWGCTL 0x1C00 +#define M_FCOL 0x1C24 +#define M_FIFOSTATUS 0x1E10 +#define M_FXBNDRY 0x1C84 +#define M_FXLEFT 0x1CA8 +#define M_FXRIGHT 0x1CAC +#define M_ICLEAR 0x1E18 +#define M_IEN 0x1E1C +#define M_LEN 0x1C5C +#define M_MACCESS 0x1C04 +#define M_OPMODE 0x1E54 +#define M_PAT0 0x1C10 +#define M_PAT1 0x1C14 +#define M_PITCH 0x1C8C +#define M_PLNWT 0x1C1C +#define M_RESET 0x1E40 +#define M_SGN 0x1C58 +#define M_SHIFT 0x1C50 +#define M_SRC0 0x1C30 +#define M_SRC1 0x1C34 +#define M_SRC2 0x1C38 +#define M_SRC3 0x1C3C +#define M_STATUS 0x1E14 +#define M_VCOUNT 0x1E20 +#define M_XDST 0x1CB0 +#define M_XYEND 0x1C44 +#define M_XYSTRT 0x1C40 +#define M_YBOT 0x1C9C +#define M_YDST 0x1C90 +#define M_YDSTLEN 0x1C88 +#define M_YDSTORG 0x1C94 +#define M_YTOP 0x1C98 +#define M_ZORG 0x1C0C + +#define M_EXEC 0x0100 + +/* DWGCTL: opcod */ +#define M_DWG_LINE_OPEN 0x0 +#define M_DWG_AUTOLINE_OPEN 0x1 +#define M_DWG_LINE_CLOSE 0x2 +#define M_DWG_AUTOLINE_CLOSE 0x3 +#define M_DWG_TRAP 0x4 +#define M_DWG_TEXTURE_TRAP 0x5 +#define M_DWG_BITBLT 0x8 +#define M_DWG_FBITBLT 0xC +#define M_DWG_ILOAD 0x9 +#define M_DWG_ILOAD_SCALE 0xD +#define M_DWG_ILOAD_FILTER 0xF +#define M_DWG_IDUMP 0xA + +/* DWGCTL: atype */ +#define M_DWG_RPL (0x0 << 4) +#define M_DWG_RSTR (0x1 << 4) +#define M_DWG_ZI (0x3 << 4) +#define M_DWG_BLK (0x4 << 4) +#define M_DWG_I (0x7 << 4) + +/* DWGCTL: linear */ +#define M_DWG_LINEAR (0x1 << 7) + +/* DWGCTL: zmode */ +#define M_DWG_NOZCMP (0x0 << 8) +#define M_DWG_ZE (0x2 << 8) +#define M_DWG_ZNE (0x3 << 8) +#define M_DWG_ZLT (0x4 << 8) +#define M_DWG_ZLTE (0x5 << 8) +#define M_DWG_ZGT (0x6 << 8) +#define M_DWG_ZGTE (0x7 << 8) + +/* DWGCTL: solid */ +#define M_DWG_SOLID (0x1 << 11) + +/* DWGCTL: arzero */ +#define M_DWG_ARZERO (0x1 << 12) + +/* DWGCTL: sgnzero */ +#define M_DWG_SGNZERO (0x1 << 13) + +/* DWGCTL: shiftzero */ +#define M_DWG_SHFTZERO (0x1 << 14) + +/* DWGCTL: bop */ +#define M_DWG_BOP_XOR (0x6 << 16) +#define M_DWG_BOP_AND (0x8 << 16) +#define M_DWG_BOP_SRC (0xC << 16) +#define M_DWG_BOP_OR (0xE << 16) + +/* DWGCTL: trans */ +#define M_DWG_TRANS_0 (0x0 << 20) +#define M_DWG_TRANS_1 (0x1 << 20) +#define M_DWG_TRANS_2 (0x2 << 20) +#define M_DWG_TRANS_3 (0x3 << 20) +#define M_DWG_TRANS_4 (0x4 << 20) +#define M_DWG_TRANS_5 (0x5 << 20) +#define M_DWG_TRANS_6 (0x6 << 20) +#define M_DWG_TRANS_7 (0x7 << 20) +#define M_DWG_TRANS_8 (0x8 << 20) +#define M_DWG_TRANS_9 (0x9 << 20) +#define M_DWG_TRANS_A (0xA << 20) +#define M_DWG_TRANS_B (0xB << 20) +#define M_DWG_TRANS_C (0xC << 20) +#define M_DWG_TRANS_D (0xD << 20) +#define M_DWG_TRANS_E (0xE << 20) +#define M_DWG_TRANS_F (0xF << 20) + +/* DWGCTL: bltmod */ +#define M_DWG_BMONOLEF (0x0 << 25) +#define M_DWG_BMONOWF (0x4 << 25) +#define M_DWG_BPLAN (0x1 << 25) +#define M_DWG_BFCOL (0x2 << 25) +#define M_DWG_BUYUV (0xE << 25) +#define M_DWG_BU32BGR (0x3 << 25) +#define M_DWG_BU32RGB (0x7 << 25) +#define M_DWG_BU24BGR (0xB << 25) +#define M_DWG_BU24RGB (0xF << 25) + +/* DWGCTL: pattern */ +#define M_DWG_PATTERN (0x1 << 29) + +/* DWGCTL: transc */ +#define M_DWG_TRANSC (0x1 << 30) + +/* OPMODE: */ +#define M_DMA_GENERAL (0x0 << 2) +#define M_DMA_BLIT (0x1 << 2) +#define M_DMA_VECTOR (0x2 << 2) + +/* SGN: */ +#define M_SDXL (0x1 << 1) +#define M_SDXR (0x1 << 5) + + + +/* VGAREG */ +#define M_CRTC_INDEX 0x1FD4 +#define M_CRTC_DATA 0x1FD5 + +#define M_CRTC_EXT_INDEX 0x1FDE +#define M_CRTC_EXT_DATA 0x1FDF + +#define M_MISC_R 0x1FCC +#define M_MISC_W 0x1FC2 + +/* CRTCEXT3: */ +#define M_MGAMODE (0x1 << 7) + +#endif -- cgit v1.2.3