xm_tri.c revision c7a5d528c7e5f4812b423bf4c091d21c34af3cf1
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Mesa 3-D graphics library
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Version:  6.5
48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
5fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
6fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com *
7fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * Permission is hereby granted, free of charge, to any person obtaining a
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * copy of this software and associated documentation files (the "Software"),
9fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * to deal in the Software without restriction, including without limitation
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * and/or sell copies of the Software, and to permit persons to whom the
12fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * Software is furnished to do so, subject to the following conditions:
13fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com *
14fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * The above copyright notice and this permission notice shall be included
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * in all copies or substantial portions of the Software.
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com */
24fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com
25fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com
26fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com/*
27fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com * This file contains "accelerated" triangle functions.  It should be
2847e0a09052eb4c93a4506ebf3c64070fafc3d4b3tomhudson@google.com * fairly easy to write new special-purpose triangle functions and hook
2947e0a09052eb4c93a4506ebf3c64070fafc3d4b3tomhudson@google.com * them into this module.
30fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com */
31fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com
32fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com
33fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "glxheader.h"
34fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "depth.h"
35fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "macros.h"
36fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "imports.h"
37fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "mtypes.h"
38fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "xmesaP.h"
39fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com
40fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com/* Internal swrast includes:
41fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com */
42fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "swrast/s_context.h"
43fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "swrast/s_depth.h"
44fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#include "swrast/s_triangle.h"
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
464e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define GET_XRB(XRB)  struct xmesa_renderbuffer *XRB = \
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   (struct xmesa_renderbuffer *) ctx->DrawBuffer->_ColorDrawBuffers[0][0]->Wrapped
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/**********************************************************************/
524e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org/***                   Triangle rendering                           ***/
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/**********************************************************************/
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, smooth, depth-buffered, PF_TRUECOLOR triangle.
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_TRUECOLOR_z_triangle
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
614e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
654e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GET_XRB(xrb);
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
674e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define RENDER_SPAN( span )					\
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLint x = span.x, y = YFLIP(xrb, span.y);			\
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         unsigned long p;					\
744e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         PACK_TRUECOLOR(p, FixedToInt(span.red),		\
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            FixedToInt(span.green), FixedToInt(span.blue));	\
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         XMesaPutPixel(xrb->ximage, x, y, p);			\
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.green += span.greenStep;				\
814e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.blue += span.blueStep;				\
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
854e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
904e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org/*
914e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, smooth, depth-buffered, PF_8A8B8G8R triangle.
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
934e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define NAME smooth_8A8B8G8R_z_triangle
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
974e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLuint
994e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )					\
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
1044e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   for (i = 0; i < span.end; i++) {				\
105d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      const DEPTH_TYPE z = FixedToDepth(span.z);		\
106d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      if (z < zRow[i]) {					\
107d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org         pRow[i] = PACK_8B8G8R(FixedToInt(span.red),		\
108d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org            FixedToInt(span.green), FixedToInt(span.blue));	\
109d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org         zRow[i] = z;						\
110d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      }								\
111d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      span.red += span.redStep;					\
112d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      span.green += span.greenStep;				\
113d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      span.blue += span.blueStep;				\
114d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      span.z += span.zStep;					\
1154e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   }
116d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
117d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#include "swrast/s_tritemp.h"
118d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
119d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
120d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
1214e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org/*
122d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org * XImage, smooth, depth-buffered, PF_8A8R8G8B triangle.
123d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org */
124d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define NAME smooth_8A8R8G8B_z_triangle
125d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define INTERP_Z 1
126d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1274e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_RGB 1
1284e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
1294e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_TYPE GLuint
130d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
131d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define SETUP_CODE						\
132d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org   GET_XRB(xrb);
133d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org
134d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define RENDER_SPAN( span )					\
135d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org   GLuint i;							\
136d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org   for (i = 0; i < span.end; i++) {				\
137d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      const DEPTH_TYPE z = FixedToDepth(span.z);		\
138d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org      if (z < zRow[i]) {					\
139677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org         pRow[i] = PACK_8R8G8B(FixedToInt(span.red),		\
1404e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            FixedToInt(span.green), FixedToInt(span.blue));	\
1418072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com         zRow[i] = z;						\
1428072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com      }								\
1438072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com      span.red += span.redStep;					\
1448072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com      span.green += span.greenStep;				\
1458072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com      span.blue += span.blueStep;				\
1468072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com      span.z += span.zStep;					\
147677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org   }
1488072e4fdc8261b1ca8937aa5c31db967280eae2areed@google.com
149677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org#include "swrast/s_tritemp.h"
150677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1524e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
153677cbedda7dc43844cbc58dbebbe52e37381be8evandebo@chromium.org/*
1544e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, smooth, depth-buffered, PF_8R8G8B triangle.
1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_8R8G8B_z_triangle
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
1614e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_TYPE GLuint
1624e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )					\
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {				\
1694e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      const DEPTH_TYPE z = FixedToDepth(span.z);		\
1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         pRow[i] = PACK_8R8G8B(FixedToInt(span.red),		\
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            FixedToInt(span.green), FixedToInt(span.blue));	\
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.green += span.greenStep;				\
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.blue += span.blueStep;				\
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
185fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com/*
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, smooth, depth-buffered, PF_8R8G8B24 triangle.
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_8R8G8B24_z_triangle
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
1904e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE bgr_t
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span ) 					\
1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
1994e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   for (i = 0; i < span.end; i++) {				\
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
2024e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org	 PIXEL_TYPE *ptr = pRow + i;				\
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         ptr->r = FixedToInt(span.red);				\
2044e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         ptr->g = FixedToInt(span.green);			\
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         ptr->b = FixedToInt(span.blue);			\
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
2094e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.green += span.greenStep;				\
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.blue += span.blueStep;				\
2114e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.z += span.zStep;					\
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2174e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org/*
2184e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, smooth, depth-buffered, PF_TRUEDITHER triangle.
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_TRUEDITHER_z_triangle
2214e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
2228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2234e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_RGB 1
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
2278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )					\
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
2294e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLint x = span.x, y = YFLIP(xrb, span.y);			\
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
2318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         unsigned long p;					\
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         PACK_TRUEDITHER(p, x, y, FixedToInt(span.red),		\
2354e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            FixedToInt(span.green), FixedToInt(span.blue));	\
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         XMesaPutPixel(xrb->ximage, x, y, p);			\
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.green += span.greenStep;				\
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.blue += span.blueStep;				\
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
2444e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, smooth, depth-buffered, PF_5R6G5B triangle.
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_5R6G5B_z_triangle
2524e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLushort
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
2588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
2608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )					\
2614e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLuint i;							\
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {				\
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         pRow[i] = PACK_5R6G5B(FixedToInt(span.red),		\
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            FixedToInt(span.green), FixedToInt(span.blue));	\
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
2704e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.green += span.greenStep;				\
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.blue += span.blueStep;				\
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2774e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, smooth, depth-buffered, PF_DITHER_5R6G5B triangle.
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_DITHER_5R6G5B_z_triangle
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
2864e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_TYPE GLushort
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
2894e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
2908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
2914e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define RENDER_SPAN( span )					\
2928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
2934e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLint x = span.x, y = YFLIP(xrb, span.y);			\
2948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
2958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
2968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
2974e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red),	\
2988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            FixedToInt(span.green), FixedToInt(span.blue));	\
2998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
3014e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.red += span.redStep;					\
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.green += span.greenStep;				\
3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.blue += span.blueStep;				\
3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
3054e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   }
3068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
3078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3114e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, smooth, depth-buffered, 8-bit, PF_DITHER8 triangle.
3128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
3138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_DITHER8_z_triangle
3144e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
3158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
3168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
3178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
3188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLubyte
3198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
3208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
321fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com   GET_XRB(xrb);
322fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com#define RENDER_SPAN( span )					\
323fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com   GLuint i;							\
324fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com   GLint x = span.x, y = YFLIP(xrb, span.y);			\
325fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com   XDITHER_SETUP(y);						\
326fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com   for (i = 0; i < span.end; i++, x++) {			\
327fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
328fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com      if (z < zRow[i]) {					\
329fc296295257a9300098df56a1e3975580e13d329bsalomon@google.com         pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span.red),\
3304e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            FixedToInt(span.green), FixedToInt(span.blue) );	\
3318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
3328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
3334e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.red += span.redStep;					\
3348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.green += span.greenStep;				\
3354e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.blue += span.blueStep;				\
3368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
3374e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   }
3388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
3398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, smooth, depth-buffered, PF_DITHER triangle.
3448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
3458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_DITHER_z_triangle
3464e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
3478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
3488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
3494e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define SETUP_CODE						\
3504e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GET_XRB(xrb);						\
3518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XMesaImage *img = xrb->ximage;
3528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )					\
3538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
3548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLint x = span.x, y = YFLIP(xrb, span.y);			\
3558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XDITHER_SETUP(y);						\
3568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
3578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
3588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
3598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         unsigned long p = XDITHER(x, FixedToInt(span.red),	\
3608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            FixedToInt(span.green), FixedToInt(span.blue));	\
3614e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org	 XMesaPutPixel(img, x, y, p);			       	\
3628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
3638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
3648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
3654e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.green += span.greenStep;				\
3664e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.blue += span.blueStep;				\
3678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
3684e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   }
3694e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
3708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3724e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
3738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
3744e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, smooth, depth-buffered, 8-bit PF_LOOKUP triangle.
3758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
3768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME smooth_LOOKUP8_z_triangle
3774e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
3788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
3798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
3804e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
3818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLubyte
3824e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
3838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
3848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
3854e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define RENDER_SPAN( span )					\
3868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
3878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   LOOKUP_SETUP;						\
3888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {				\
3898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
3908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
3914e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         pRow[i] = LOOKUP(FixedToInt(span.red),			\
3928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            FixedToInt(span.green), FixedToInt(span.blue));	\
3938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
3944e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      }								\
3958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
3964e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.green += span.greenStep;				\
3978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.blue += span.blueStep;				\
3988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
3998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
4004e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
4014e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
4028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4034e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
4044e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org/*
4054e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, smooth, depth-buffered, 8-bit PF_HPCR triangle.
4068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
4074e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define NAME smooth_HPCR_z_triangle
4088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
4094e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
4108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_RGB 1
4114e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
4128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLubyte
4134e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
4144e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define SETUP_CODE						\
4154e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
4168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);
4174e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define RENDER_SPAN( span )					\
4188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
4194e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLint x = span.x, y = YFLIP(xrb, span.y);			\
4208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
4218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
4228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
4238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         pRow[i] = DITHER_HPCR(x, y, FixedToInt(span.red),	\
4244e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org            FixedToInt(span.green), FixedToInt(span.blue) );	\
4258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
4268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
4278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.red += span.redStep;					\
4284e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.green += span.greenStep;				\
4294e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      span.blue += span.blueStep;				\
4308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
4314e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   }
4328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
4334e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
4348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
4378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, flat, depth-buffered, PF_TRUECOLOR triangle.
4388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
4398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME flat_TRUECOLOR_z_triangle
4408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
4418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
4428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE						\
4438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
4448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);						\
4454e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   XMesaImage *img = xrb->ximage;				\
4468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   unsigned long pixel;						\
4478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]);
4484e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define RENDER_SPAN( span )					\
4498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
4504e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLint x = span.x, y = YFLIP(xrb, span.y);			\
4518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
4528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
4538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
4548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         XMesaPutPixel(img, x, y, pixel);			\
4554e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         zRow[i] = z;						\
4568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
4578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
4588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
4598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
4608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4624e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
4638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
4644e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org * XImage, flat, depth-buffered, PF_8A8B8G8R triangle.
4658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
4664e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define NAME flat_8A8B8G8R_z_triangle
4674e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
4684e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
4694e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
4708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLuint
4718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
4728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE					\
4738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);					\
4748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint p = PACK_8B8G8R( v2->color[0], v2->color[1], v2->color[2] );
4758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )				\
4764e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLuint i;						\
4778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {			\
4788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);	\
4798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {				\
4804e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org	 pRow[i] = (PIXEL_TYPE) p;			\
4818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;					\
4824e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org      }							\
4838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;				\
4848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
4854e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
4868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
4908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, flat, depth-buffered, PF_8A8R8G8B triangle.
4914e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org */
492d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define NAME flat_8A8R8G8B_z_triangle
493d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define INTERP_Z 1
494d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
495d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
496d877fdbb6e64692285c3e6532d88b9458f65b3cdvandebo@chromium.org#define PIXEL_TYPE GLuint
4974e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
4988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE					\
499fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com   GET_XRB(xrb);					\
5008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint p = PACK_8R8G8B( v2->color[0], v2->color[1], v2->color[2] );
5018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )				\
5028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;						\
5038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {			\
5048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);	\
5058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {				\
5068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com	 pRow[i] = (PIXEL_TYPE) p;			\
5078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;					\
5088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }							\
5098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;				\
5104e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   }
5114e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
5128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5134e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org
5148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
5168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, flat, depth-buffered, PF_8R8G8B triangle.
5178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
5188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME flat_8R8G8B_z_triangle
5194e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define INTERP_Z 1
5208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
5218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
5228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLuint
5238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
5248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SETUP_CODE					\
5258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);					\
5268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint p = PACK_8R8G8B( v2->color[0], v2->color[1], v2->color[2] );
5278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )			\
5288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;					\
5298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {		\
5308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      DEPTH_TYPE z = FixedToDepth(span.z);	\
5318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {			\
5328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com	 pRow[i] = (PIXEL_TYPE) p;		\
5338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;				\
5348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }						\
535fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com      span.z += span.zStep;			\
5368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
5378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "swrast/s_tritemp.h"
5398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
542fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com/*
5438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, flat, depth-buffered, PF_8R8G8B24 triangle.
5448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
5458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME flat_8R8G8B24_z_triangle
546fa06e528035dd9c4d01c1d1e17e9df1cfe99b855reed@google.com#define INTERP_Z 1
5478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
5484e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
5498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE bgr_t
5508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
5514e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define SETUP_CODE					\
5524e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GET_XRB(xrb);					\
5538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   const GLubyte *color = v2->color;
5544e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define RENDER_SPAN( span )				\
5554e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org   GLuint i;						\
5568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++) {			\
5578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);	\
5588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {				\
5598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com	 PIXEL_TYPE *ptr = pRow + i;			\
5608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         ptr->r = color[RCOMP];				\
5614e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         ptr->g = color[GCOMP];				\
5628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         ptr->b = color[BCOMP];				\
5638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;					\
5648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }							\
5658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;				\
5668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   }
5674e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#include "swrast/s_tritemp.h"
5688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
5718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
5728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, flat, depth-buffered, PF_TRUEDITHER triangle.
5738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
5748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME flat_TRUEDITHER_z_triangle
5758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
5768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
5774e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org#define SETUP_CODE						\
5788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
5798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GET_XRB(xrb);						\
5808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   XMesaImage *img = xrb->ximage;
5818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define RENDER_SPAN( span )					\
5828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLuint i;							\
5838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   GLint x = span.x, y = YFLIP(xrb, span.y);			\
5848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com   for (i = 0; i < span.end; i++, x++) {			\
5858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      const DEPTH_TYPE z = FixedToDepth(span.z);		\
5868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      if (z < zRow[i]) {					\
5874e1d3acc16edb0b502cff157978235f5af627a5amike@reedtribe.org         unsigned long p;					\
5888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         PACK_TRUEDITHER(p, x, y, v2->color[0],			\
589d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org            v2->color[1], v2->color[2]);			\
5908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         XMesaPutPixel(img, x, y, p);				\
5918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com         zRow[i] = z;						\
5928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      }								\
5938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com      span.z += span.zStep;					\
594d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org   }
595d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org#include "swrast/s_tritemp.h"
5968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
597d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org
5988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
599d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org/*
6008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * XImage, flat, depth-buffered, PF_5R6G5B triangle.
6018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
6028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define NAME flat_5R6G5B_z_triangle
6038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define INTERP_Z 1
604d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
605d5e05d428647c164080e38dabee94db52c8c4544mike@reedtribe.org#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
6068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define PIXEL_TYPE GLushort
6073a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
6083a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com#define SETUP_CODE					\
6093a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com   GET_XRB(xrb);					\
6103a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com   GLushort p = PACK_5R6G5B( v2->color[0], v2->color[1], v2->color[2] );
6113a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com#define RENDER_SPAN( span )				\
6123a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com   GLuint i;						\
6133a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com   for (i = 0; i < span.end; i++) {			\
6143a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com      const DEPTH_TYPE z = FixedToDepth(span.z);	\
6153a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com      if (z < zRow[i]) {				\
6163a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com	 pRow[i] = (PIXEL_TYPE) p;			\
6173a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com         zRow[i] = z;					\
6183a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com      }							\
61947e0a09052eb4c93a4506ebf3c64070fafc3d4b3tomhudson@google.com      span.z += span.zStep;				\
6203a1f6a06cc706b35d9d6086ffbf5135cbf42bf8atomhudson@google.com   }
621#include "swrast/s_tritemp.h"
622
623
624
625/*
626 * XImage, flat, depth-buffered, PF_DITHER_5R6G5B triangle.
627 */
628#define NAME flat_DITHER_5R6G5B_z_triangle
629#define INTERP_Z 1
630#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
631#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
632#define PIXEL_TYPE GLushort
633#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
634#define SETUP_CODE						\
635   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
636   GET_XRB(xrb);						\
637   const GLubyte *color = v2->color;
638#define RENDER_SPAN( span )					\
639   GLuint i;							\
640   GLint x = span.x, y = YFLIP(xrb, span.y);			\
641   for (i = 0; i < span.end; i++, x++) {			\
642      const DEPTH_TYPE z = FixedToDepth(span.z);		\
643      if (z < zRow[i]) {					\
644	 PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP],		\
645			 color[GCOMP], color[BCOMP]);		\
646         zRow[i] = z;						\
647      }								\
648      span.z += span.zStep;					\
649   }
650#include "swrast/s_tritemp.h"
651
652
653
654/*
655 * XImage, flat, depth-buffered, 8-bit PF_DITHER triangle.
656 */
657#define NAME flat_DITHER8_z_triangle
658#define INTERP_Z 1
659#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
660#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
661#define PIXEL_TYPE GLubyte
662#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
663#define SETUP_CODE						\
664   GET_XRB(xrb);						\
665   FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
666#define RENDER_SPAN( span )					\
667   GLuint i;							\
668   GLint x = span.x, y = YFLIP(xrb, span.y);			\
669   FLAT_DITHER_ROW_SETUP(YFLIP(xrb, y));			\
670   for (i = 0; i < span.end; i++, x++) {			\
671      const DEPTH_TYPE z = FixedToDepth(span.z);		\
672      if (z < zRow[i]) {					\
673	 pRow[i] = (PIXEL_TYPE) FLAT_DITHER(x);			\
674         zRow[i] = z;						\
675      }								\
676      span.z += span.zStep;					\
677   }
678#include "swrast/s_tritemp.h"
679
680
681
682/*
683 * XImage, flat, depth-buffered, PF_DITHER triangle.
684 */
685#define NAME flat_DITHER_z_triangle
686#define INTERP_Z 1
687#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
688#define SETUP_CODE						\
689   GET_XRB(xrb);					\
690   XMesaImage *img = xrb->ximage;		\
691   FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
692#define RENDER_SPAN( span )					\
693   GLuint i;							\
694   GLint x = span.x, y = YFLIP(xrb, span.y);	\
695   FLAT_DITHER_ROW_SETUP(y);					\
696   for (i = 0; i < span.end; i++, x++) {			\
697      const DEPTH_TYPE z = FixedToDepth(span.z);		\
698      if (z < zRow[i]) {					\
699         unsigned long p = FLAT_DITHER(x);			\
700	 XMesaPutPixel(img, x, y, p);				\
701         zRow[i] = z;						\
702      }								\
703      span.z += span.zStep;					\
704   }
705#include "swrast/s_tritemp.h"
706
707
708
709/*
710 * XImage, flat, depth-buffered, 8-bit PF_HPCR triangle.
711 */
712#define NAME flat_HPCR_z_triangle
713#define INTERP_Z 1
714#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
715#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
716#define PIXEL_TYPE GLubyte
717#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
718#define SETUP_CODE						\
719   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
720   GET_XRB(xrb);						\
721   GLubyte r = v2->color[0];					\
722   GLubyte g = v2->color[1];					\
723   GLubyte b = v2->color[2];
724#define RENDER_SPAN( span )					\
725   GLuint i;							\
726   GLint x = span.x, y = YFLIP(xrb, span.y);	\
727   for (i = 0; i < span.end; i++, x++) {			\
728      const DEPTH_TYPE z = FixedToDepth(span.z);		\
729      if (z < zRow[i]) {					\
730	 pRow[i] = (PIXEL_TYPE) DITHER_HPCR(x, y, r, g, b);	\
731         zRow[i] = z;						\
732      }								\
733      span.z += span.zStep;					\
734   }
735#include "swrast/s_tritemp.h"
736
737
738
739/*
740 * XImage, flat, depth-buffered, 8-bit PF_LOOKUP triangle.
741 */
742#define NAME flat_LOOKUP8_z_triangle
743#define INTERP_Z 1
744#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
745#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
746#define PIXEL_TYPE GLubyte
747#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
748#define SETUP_CODE					\
749   GET_XRB(xrb);					\
750   LOOKUP_SETUP;					\
751   GLubyte r = v2->color[0];				\
752   GLubyte g = v2->color[1];				\
753   GLubyte b = v2->color[2];				\
754   GLubyte p = LOOKUP(r,g,b);
755#define RENDER_SPAN( span )				\
756   GLuint i;						\
757   for (i = 0; i < span.end; i++) {			\
758      const DEPTH_TYPE z = FixedToDepth(span.z);	\
759      if (z < zRow[i]) {				\
760	 pRow[i] = p;					\
761         zRow[i] = z;					\
762      }							\
763      span.z += span.zStep;				\
764   }
765#include "swrast/s_tritemp.h"
766
767
768
769/*
770 * XImage, smooth, NON-depth-buffered, PF_TRUECOLOR triangle.
771 */
772#define NAME smooth_TRUECOLOR_triangle
773#define INTERP_RGB 1
774#define SETUP_CODE						\
775   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
776   GET_XRB(xrb);						\
777   XMesaImage *img = xrb->ximage;
778#define RENDER_SPAN( span )					\
779   GLuint i;							\
780   GLint x = span.x, y = YFLIP(xrb, span.y);	\
781   for (i = 0; i < span.end; i++, x++) {			\
782      unsigned long p;						\
783      PACK_TRUECOLOR(p, FixedToInt(span.red),			\
784         FixedToInt(span.green), FixedToInt(span.blue));	\
785      XMesaPutPixel(img, x, y, p);				\
786      span.red += span.redStep;					\
787      span.green += span.greenStep;				\
788      span.blue += span.blueStep;				\
789   }
790#include "swrast/s_tritemp.h"
791
792
793
794/*
795 * XImage, smooth, NON-depth-buffered, PF_8A8B8G8R triangle.
796 */
797#define NAME smooth_8A8B8G8R_triangle
798#define INTERP_RGB 1
799#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
800#define PIXEL_TYPE GLuint
801#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
802#define SETUP_CODE						\
803   GET_XRB(xrb);
804#define RENDER_SPAN( span )					\
805   GLuint i;							\
806   for (i = 0; i < span.end; i++) {				\
807      pRow[i] = PACK_8B8G8R(FixedToInt(span.red),		\
808         FixedToInt(span.green), FixedToInt(span.blue) );	\
809      span.red += span.redStep;					\
810      span.green += span.greenStep;				\
811      span.blue += span.blueStep;				\
812   }
813#include "swrast/s_tritemp.h"
814
815
816
817/*
818 * XImage, smooth, NON-depth-buffered, PF_8A8R8G8B triangle.
819 */
820#define NAME smooth_8A8R8G8B_triangle
821#define INTERP_RGB 1
822#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
823#define PIXEL_TYPE GLuint
824#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
825#define SETUP_CODE						\
826   GET_XRB(xrb);
827#define RENDER_SPAN( span )					\
828   GLuint i;							\
829   for (i = 0; i < span.end; i++) {				\
830      pRow[i] = PACK_8R8G8B(FixedToInt(span.red),		\
831         FixedToInt(span.green), FixedToInt(span.blue) );	\
832      span.red += span.redStep;					\
833      span.green += span.greenStep;				\
834      span.blue += span.blueStep;				\
835   }
836#include "swrast/s_tritemp.h"
837
838
839
840/*
841 * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
842 */
843#define NAME smooth_8R8G8B_triangle
844#define INTERP_RGB 1
845#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
846#define PIXEL_TYPE GLuint
847#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
848#define SETUP_CODE						\
849   GET_XRB(xrb);
850#define RENDER_SPAN( span )					\
851   GLuint i;							\
852   for (i = 0; i < span.end; i++) {				\
853      pRow[i] = PACK_8R8G8B(FixedToInt(span.red),		\
854         FixedToInt(span.green), FixedToInt(span.blue) );	\
855      span.red += span.redStep;					\
856      span.green += span.greenStep;				\
857      span.blue += span.blueStep;				\
858   }
859#include "swrast/s_tritemp.h"
860
861
862
863/*
864 * XImage, smooth, NON-depth-buffered, PF_8R8G8B triangle.
865 */
866#define NAME smooth_8R8G8B24_triangle
867#define INTERP_RGB 1
868#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
869#define PIXEL_TYPE bgr_t
870#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
871#define SETUP_CODE					\
872   GET_XRB(xrb);
873#define RENDER_SPAN( span )				\
874   GLuint i;						\
875   PIXEL_TYPE *pixel = pRow;				\
876   for (i = 0; i < span.end; i++, pixel++) {		\
877      pixel->r = FixedToInt(span.red);			\
878      pixel->g = FixedToInt(span.green);		\
879      pixel->b = FixedToInt(span.blue);			\
880      span.red += span.redStep;				\
881      span.green += span.greenStep;			\
882      span.blue += span.blueStep;			\
883   }
884#include "swrast/s_tritemp.h"
885
886
887
888/*
889 * XImage, smooth, NON-depth-buffered, PF_TRUEDITHER triangle.
890 */
891#define NAME smooth_TRUEDITHER_triangle
892#define INTERP_RGB 1
893#define SETUP_CODE						\
894   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
895   GET_XRB(xrb);						\
896   XMesaImage *img = xrb->ximage;
897#define RENDER_SPAN( span )					\
898   GLuint i;							\
899   GLint x = span.x, y = YFLIP(xrb, span.y);	\
900   for (i = 0; i < span.end; i++, x++) {			\
901      unsigned long p;						\
902      PACK_TRUEDITHER(p, x, y, FixedToInt(span.red),		\
903         FixedToInt(span.green), FixedToInt(span.blue));	\
904      XMesaPutPixel(img, x, y, p );				\
905      span.red += span.redStep;					\
906      span.green += span.greenStep;				\
907      span.blue += span.blueStep;				\
908   }
909#include "swrast/s_tritemp.h"
910
911
912
913/*
914 * XImage, smooth, NON-depth-buffered, PF_5R6G5B triangle.
915 */
916#define NAME smooth_5R6G5B_triangle
917#define INTERP_RGB 1
918#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
919#define PIXEL_TYPE GLushort
920#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
921#define SETUP_CODE						\
922   GET_XRB(xrb);
923#define RENDER_SPAN( span )					\
924   GLuint i;							\
925   for (i = 0; i < span.end; i++) {				\
926      pRow[i] = (PIXEL_TYPE) PACK_5R6G5B(FixedToInt(span.red),	\
927         FixedToInt(span.green), FixedToInt(span.blue));	\
928      span.red += span.redStep;					\
929      span.green += span.greenStep;				\
930      span.blue += span.blueStep;				\
931   }
932#include "swrast/s_tritemp.h"
933
934
935
936/*
937 * XImage, smooth, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
938 */
939#define NAME smooth_DITHER_5R6G5B_triangle
940#define INTERP_RGB 1
941#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
942#define PIXEL_TYPE GLushort
943#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
944#define SETUP_CODE						\
945   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
946   GET_XRB(xrb);
947#define RENDER_SPAN( span )					\
948   GLuint i;							\
949   GLint x = span.x, y = YFLIP(xrb, span.y);	\
950   for (i = 0; i < span.end; i++, x++) {			\
951      PACK_TRUEDITHER(pRow[i], x, y, FixedToInt(span.red),	\
952         FixedToInt(span.green), FixedToInt(span.blue));	\
953      span.red += span.redStep;					\
954      span.green += span.greenStep;				\
955      span.blue += span.blueStep;				\
956   }
957#include "swrast/s_tritemp.h"
958
959
960
961/*
962 * XImage, smooth, NON-depth-buffered, 8-bit PF_DITHER triangle.
963 */
964#define NAME smooth_DITHER8_triangle
965#define INTERP_RGB 1
966#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
967#define PIXEL_TYPE GLubyte
968#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
969#define SETUP_CODE						\
970   GET_XRB(xrb);
971#define RENDER_SPAN( span )					\
972   GLuint i;							\
973   GLint x = span.x, y = YFLIP(xrb, span.y);	\
974   XDITHER_SETUP(y);						\
975   for (i = 0; i < span.end; i++, x++) {			\
976      pRow[i] = (PIXEL_TYPE) XDITHER(x, FixedToInt(span.red),	\
977         FixedToInt(span.green), FixedToInt(span.blue) );	\
978      span.red += span.redStep;					\
979      span.green += span.greenStep;				\
980      span.blue += span.blueStep;				\
981   }
982#include "swrast/s_tritemp.h"
983
984
985
986/*
987 * XImage, smooth, NON-depth-buffered, PF_DITHER triangle.
988 */
989#define NAME smooth_DITHER_triangle
990#define INTERP_RGB 1
991#define SETUP_CODE						\
992   GET_XRB(xrb);						\
993   XMesaImage *img = xrb->ximage;
994#define RENDER_SPAN( span )					\
995   GLuint i;							\
996   GLint x = span.x, y = YFLIP(xrb, span.y);	\
997   XDITHER_SETUP(y);						\
998   for (i = 0; i < span.end; i++, x++) {			\
999      unsigned long p = XDITHER(x, FixedToInt(span.red),	\
1000         FixedToInt(span.green), FixedToInt(span.blue) );	\
1001      XMesaPutPixel(img, x, y, p);				\
1002      span.red += span.redStep;					\
1003      span.green += span.greenStep;				\
1004      span.blue += span.blueStep;				\
1005   }
1006#include "swrast/s_tritemp.h"
1007
1008
1009
1010/*
1011 * XImage, smooth, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
1012 */
1013#define NAME smooth_LOOKUP8_triangle
1014#define INTERP_RGB 1
1015#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
1016#define PIXEL_TYPE GLubyte
1017#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1018#define SETUP_CODE						\
1019   GET_XRB(xrb);
1020#define RENDER_SPAN( span )					\
1021   GLuint i;							\
1022   LOOKUP_SETUP;						\
1023   for (i = 0; i < span.end; i++) {				\
1024      pRow[i] = LOOKUP(FixedToInt(span.red),			\
1025         FixedToInt(span.green), FixedToInt(span.blue));	\
1026      span.red += span.redStep;					\
1027      span.green += span.greenStep;				\
1028      span.blue += span.blueStep;				\
1029   }
1030#include "swrast/s_tritemp.h"
1031
1032
1033
1034/*
1035 * XImage, smooth, NON-depth-buffered, 8-bit PF_HPCR triangle.
1036 */
1037#define NAME smooth_HPCR_triangle
1038#define INTERP_RGB 1
1039#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
1040#define PIXEL_TYPE GLubyte
1041#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1042#define SETUP_CODE						\
1043   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
1044   GET_XRB(xrb);
1045#define RENDER_SPAN( span )					\
1046   GLuint i;							\
1047   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1048   for (i = 0; i < span.end; i++, x++) {			\
1049      pRow[i] = DITHER_HPCR(x, y, FixedToInt(span.red),		\
1050         FixedToInt(span.green), FixedToInt(span.blue));	\
1051      span.red += span.redStep;					\
1052      span.green += span.greenStep;				\
1053      span.blue += span.blueStep;				\
1054   }
1055#include "swrast/s_tritemp.h"
1056
1057
1058
1059/*
1060 * XImage, flat, NON-depth-buffered, PF_TRUECOLOR triangle.
1061 */
1062#define NAME flat_TRUECOLOR_triangle
1063#define SETUP_CODE						\
1064   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
1065   GET_XRB(xrb);						\
1066   XMesaImage *img = xrb->ximage;				\
1067   unsigned long pixel;						\
1068   PACK_TRUECOLOR(pixel, v2->color[0], v2->color[1], v2->color[2]);
1069#define RENDER_SPAN( span )					\
1070   GLuint i;							\
1071   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1072   for (i = 0; i < span.end; i++, x++) {			\
1073      XMesaPutPixel(img, x, y, pixel);				\
1074   }
1075#include "swrast/s_tritemp.h"
1076
1077
1078
1079/*
1080 * XImage, flat, NON-depth-buffered, PF_8A8B8G8R triangle.
1081 */
1082#define NAME flat_8A8B8G8R_triangle
1083#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
1084#define PIXEL_TYPE GLuint
1085#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1086#define SETUP_CODE					\
1087   GET_XRB(xrb);					\
1088   unsigned long p = PACK_8B8G8R( v2->color[0],		\
1089		 v2->color[1], v2->color[2] );
1090#define RENDER_SPAN( span )				\
1091   GLuint i;						\
1092   for (i = 0; i < span.end; i++) {			\
1093      pRow[i] = (PIXEL_TYPE) p;				\
1094   }
1095#include "swrast/s_tritemp.h"
1096
1097
1098
1099/*
1100 * XImage, flat, NON-depth-buffered, PF_8A8R8G8B triangle.
1101 */
1102#define NAME flat_8A8R8G8B_triangle
1103#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
1104#define PIXEL_TYPE GLuint
1105#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1106#define SETUP_CODE					\
1107   GET_XRB(xrb);					\
1108   unsigned long p = PACK_8R8G8B( v2->color[0],		\
1109		 v2->color[1], v2->color[2] );
1110#define RENDER_SPAN( span )				\
1111   GLuint i;						\
1112   for (i = 0; i < span.end; i++) {			\
1113      pRow[i] = (PIXEL_TYPE) p;				\
1114   }
1115#include "swrast/s_tritemp.h"
1116
1117
1118
1119/*
1120 * XImage, flat, NON-depth-buffered, PF_8R8G8B triangle.
1121 */
1122#define NAME flat_8R8G8B_triangle
1123#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR4(xrb, X, Y)
1124#define PIXEL_TYPE GLuint
1125#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1126#define SETUP_CODE					\
1127   GET_XRB(xrb);					\
1128   unsigned long p = PACK_8R8G8B( v2->color[0],		\
1129		 v2->color[1], v2->color[2] );
1130#define RENDER_SPAN( span )				\
1131   GLuint i;						\
1132   for (i = 0; i < span.end; i++) {			\
1133      pRow[i] = (PIXEL_TYPE) p;				\
1134   }
1135#include "swrast/s_tritemp.h"
1136
1137
1138
1139/*
1140 * XImage, flat, NON-depth-buffered, PF_8R8G8B24 triangle.
1141 */
1142#define NAME flat_8R8G8B24_triangle
1143#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR3(xrb, X, Y)
1144#define PIXEL_TYPE bgr_t
1145#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1146#define SETUP_CODE					\
1147   GET_XRB(xrb);					\
1148   const GLubyte *color = v2->color;
1149#define RENDER_SPAN( span )				\
1150   GLuint i;						\
1151   PIXEL_TYPE *pixel = pRow;				\
1152   for (i = 0; i < span.end; i++, pixel++) {		\
1153      pixel->r = color[RCOMP];				\
1154      pixel->g = color[GCOMP];				\
1155      pixel->b = color[BCOMP];				\
1156   }
1157#include "swrast/s_tritemp.h"
1158
1159
1160
1161/*
1162 * XImage, flat, NON-depth-buffered, PF_TRUEDITHER triangle.
1163 */
1164#define NAME flat_TRUEDITHER_triangle
1165#define SETUP_CODE						\
1166   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
1167   GET_XRB(xrb);						\
1168   XMesaImage *img = xrb->ximage;
1169#define RENDER_SPAN( span )					\
1170   GLuint i;							\
1171   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1172   for (i = 0; i < span.end; i++, x++) {			\
1173      unsigned long p;						\
1174      PACK_TRUEDITHER(p, x, y, v2->color[0],			\
1175               v2->color[1], v2->color[2] );			\
1176      XMesaPutPixel(img, x, y, p);				\
1177   }
1178#include "swrast/s_tritemp.h"
1179
1180
1181
1182/*
1183 * XImage, flat, NON-depth-buffered, PF_5R6G5B triangle.
1184 */
1185#define NAME flat_5R6G5B_triangle
1186#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
1187#define PIXEL_TYPE GLushort
1188#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1189#define SETUP_CODE					\
1190   GET_XRB(xrb);					\
1191   unsigned long p = PACK_5R6G5B( v2->color[0],		\
1192		 v2->color[1], v2->color[2] );
1193#define RENDER_SPAN( span )				\
1194   GLuint i;						\
1195   for (i = 0; i < span.end; i++) {			\
1196      pRow[i] = (PIXEL_TYPE) p;				\
1197   }
1198#include "swrast/s_tritemp.h"
1199
1200
1201
1202/*
1203 * XImage, flat, NON-depth-buffered, PF_DITHER_5R6G5B triangle.
1204 */
1205#define NAME flat_DITHER_5R6G5B_triangle
1206#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR2(xrb, X, Y)
1207#define PIXEL_TYPE GLushort
1208#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1209#define SETUP_CODE						\
1210   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
1211   GET_XRB(xrb);						\
1212   const GLubyte *color = v2->color;
1213#define RENDER_SPAN( span )					\
1214   GLuint i;							\
1215   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1216   for (i = 0; i < span.end; i++, x++) {			\
1217      PACK_TRUEDITHER(pRow[i], x, y, color[RCOMP],		\
1218         color[GCOMP], color[BCOMP]);				\
1219   }
1220#include "swrast/s_tritemp.h"
1221
1222
1223
1224/*
1225 * XImage, flat, NON-depth-buffered, 8-bit PF_DITHER triangle.
1226 */
1227#define NAME flat_DITHER8_triangle
1228#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
1229#define PIXEL_TYPE GLubyte
1230#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1231#define SETUP_CODE						\
1232   GET_XRB(xrb);						\
1233   FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
1234#define RENDER_SPAN( span )					\
1235   GLuint i;							\
1236   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1237   FLAT_DITHER_ROW_SETUP(YFLIP(xrb, y));		\
1238   for (i = 0; i < span.end; i++, x++) {			\
1239      pRow[i] = (PIXEL_TYPE) FLAT_DITHER(x);			\
1240   }
1241#include "swrast/s_tritemp.h"
1242
1243
1244
1245/*
1246 * XImage, flat, NON-depth-buffered, PF_DITHER triangle.
1247 */
1248#define NAME flat_DITHER_triangle
1249#define SETUP_CODE						\
1250   GET_XRB(xrb);						\
1251   XMesaImage *img = xrb->ximage;				\
1252   FLAT_DITHER_SETUP( v2->color[0], v2->color[1], v2->color[2] );
1253#define RENDER_SPAN( span )					\
1254   GLuint i;							\
1255   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1256   FLAT_DITHER_ROW_SETUP(y);					\
1257   for (i = 0; i < span.end; i++, x++) {			\
1258      unsigned long p = FLAT_DITHER(x);				\
1259      XMesaPutPixel(img, x, y, p );				\
1260   }
1261#include "swrast/s_tritemp.h"
1262
1263
1264
1265/*
1266 * XImage, flat, NON-depth-buffered, 8-bit PF_HPCR triangle.
1267 */
1268#define NAME flat_HPCR_triangle
1269#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
1270#define PIXEL_TYPE GLubyte
1271#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1272#define SETUP_CODE						\
1273   XMesaContext xmesa = XMESA_CONTEXT(ctx);			\
1274   GET_XRB(xrb);						\
1275   GLubyte r = v2->color[0];					\
1276   GLubyte g = v2->color[1];					\
1277   GLubyte b = v2->color[2];
1278#define RENDER_SPAN( span )					\
1279   GLuint i;							\
1280   GLint x = span.x, y = YFLIP(xrb, span.y);	\
1281   for (i = 0; i < span.end; i++, x++) {			\
1282      pRow[i] = (PIXEL_TYPE) DITHER_HPCR(x, y, r, g, b);	\
1283   }
1284#include "swrast/s_tritemp.h"
1285
1286
1287
1288/*
1289 * XImage, flat, NON-depth-buffered, 8-bit PF_LOOKUP triangle.
1290 */
1291#define NAME flat_LOOKUP8_triangle
1292#define PIXEL_ADDRESS(X,Y) PIXEL_ADDR1(xrb, X, Y)
1293#define PIXEL_TYPE GLubyte
1294#define BYTES_PER_ROW (xrb->ximage->bytes_per_line)
1295#define SETUP_CODE					\
1296   GET_XRB(xrb);					\
1297   LOOKUP_SETUP;					\
1298   GLubyte r = v2->color[0];				\
1299   GLubyte g = v2->color[1];				\
1300   GLubyte b = v2->color[2];				\
1301   GLubyte p = LOOKUP(r,g,b);
1302#define RENDER_SPAN( span )         	 		\
1303   GLuint i;						\
1304   for (i = 0; i < span.end; i++) {			\
1305      pRow[i] = (PIXEL_TYPE) p;				\
1306   }
1307#include "swrast/s_tritemp.h"
1308
1309
1310
1311#ifdef DEBUG
1312extern void _xmesa_print_triangle_func( swrast_tri_func triFunc );
1313void _xmesa_print_triangle_func( swrast_tri_func triFunc )
1314{
1315   _mesa_printf("XMesa tri func = ");
1316   if (triFunc ==smooth_TRUECOLOR_z_triangle)
1317      _mesa_printf("smooth_TRUECOLOR_z_triangle\n");
1318   else if (triFunc ==smooth_8A8B8G8R_z_triangle)
1319      _mesa_printf("smooth_8A8B8G8R_z_triangle\n");
1320   else if (triFunc ==smooth_8A8R8G8B_z_triangle)
1321      _mesa_printf("smooth_8A8R8G8B_z_triangle\n");
1322   else if (triFunc ==smooth_8R8G8B_z_triangle)
1323      _mesa_printf("smooth_8R8G8B_z_triangle\n");
1324   else if (triFunc ==smooth_8R8G8B24_z_triangle)
1325      _mesa_printf("smooth_8R8G8B24_z_triangle\n");
1326   else if (triFunc ==smooth_TRUEDITHER_z_triangle)
1327      _mesa_printf("smooth_TRUEDITHER_z_triangle\n");
1328   else if (triFunc ==smooth_5R6G5B_z_triangle)
1329      _mesa_printf("smooth_5R6G5B_z_triangle\n");
1330   else if (triFunc ==smooth_DITHER_5R6G5B_z_triangle)
1331      _mesa_printf("smooth_DITHER_5R6G5B_z_triangle\n");
1332   else if (triFunc ==smooth_HPCR_z_triangle)
1333      _mesa_printf("smooth_HPCR_z_triangle\n");
1334   else if (triFunc ==smooth_DITHER8_z_triangle)
1335      _mesa_printf("smooth_DITHER8_z_triangle\n");
1336   else if (triFunc ==smooth_LOOKUP8_z_triangle)
1337      _mesa_printf("smooth_LOOKUP8_z_triangle\n");
1338   else if (triFunc ==flat_TRUECOLOR_z_triangle)
1339      _mesa_printf("flat_TRUECOLOR_z_triangle\n");
1340   else if (triFunc ==flat_8A8B8G8R_z_triangle)
1341      _mesa_printf("flat_8A8B8G8R_z_triangle\n");
1342   else if (triFunc ==flat_8A8R8G8B_z_triangle)
1343      _mesa_printf("flat_8A8R8G8B_z_triangle\n");
1344   else if (triFunc ==flat_8R8G8B_z_triangle)
1345      _mesa_printf("flat_8R8G8B_z_triangle\n");
1346   else if (triFunc ==flat_8R8G8B24_z_triangle)
1347      _mesa_printf("flat_8R8G8B24_z_triangle\n");
1348   else if (triFunc ==flat_TRUEDITHER_z_triangle)
1349      _mesa_printf("flat_TRUEDITHER_z_triangle\n");
1350   else if (triFunc ==flat_5R6G5B_z_triangle)
1351      _mesa_printf("flat_5R6G5B_z_triangle\n");
1352   else if (triFunc ==flat_DITHER_5R6G5B_z_triangle)
1353      _mesa_printf("flat_DITHER_5R6G5B_z_triangle\n");
1354   else if (triFunc ==flat_HPCR_z_triangle)
1355      _mesa_printf("flat_HPCR_z_triangle\n");
1356   else if (triFunc ==flat_DITHER8_z_triangle)
1357      _mesa_printf("flat_DITHER8_z_triangle\n");
1358   else if (triFunc ==flat_LOOKUP8_z_triangle)
1359      _mesa_printf("flat_LOOKUP8_z_triangle\n");
1360   else if (triFunc ==smooth_TRUECOLOR_triangle)
1361      _mesa_printf("smooth_TRUECOLOR_triangle\n");
1362   else if (triFunc ==smooth_8A8B8G8R_triangle)
1363      _mesa_printf("smooth_8A8B8G8R_triangle\n");
1364   else if (triFunc ==smooth_8A8R8G8B_triangle)
1365      _mesa_printf("smooth_8A8R8G8B_triangle\n");
1366   else if (triFunc ==smooth_8R8G8B_triangle)
1367      _mesa_printf("smooth_8R8G8B_triangle\n");
1368   else if (triFunc ==smooth_8R8G8B24_triangle)
1369      _mesa_printf("smooth_8R8G8B24_triangle\n");
1370   else if (triFunc ==smooth_TRUEDITHER_triangle)
1371      _mesa_printf("smooth_TRUEDITHER_triangle\n");
1372   else if (triFunc ==smooth_5R6G5B_triangle)
1373      _mesa_printf("smooth_5R6G5B_triangle\n");
1374   else if (triFunc ==smooth_DITHER_5R6G5B_triangle)
1375      _mesa_printf("smooth_DITHER_5R6G5B_triangle\n");
1376   else if (triFunc ==smooth_HPCR_triangle)
1377      _mesa_printf("smooth_HPCR_triangle\n");
1378   else if (triFunc ==smooth_DITHER8_triangle)
1379      _mesa_printf("smooth_DITHER8_triangle\n");
1380   else if (triFunc ==smooth_LOOKUP8_triangle)
1381      _mesa_printf("smooth_LOOKUP8_triangle\n");
1382   else if (triFunc ==flat_TRUECOLOR_triangle)
1383      _mesa_printf("flat_TRUECOLOR_triangle\n");
1384   else if (triFunc ==flat_TRUEDITHER_triangle)
1385      _mesa_printf("flat_TRUEDITHER_triangle\n");
1386   else if (triFunc ==flat_8A8B8G8R_triangle)
1387      _mesa_printf("flat_8A8B8G8R_triangle\n");
1388   else if (triFunc ==flat_8A8R8G8B_triangle)
1389      _mesa_printf("flat_8A8R8G8B_triangle\n");
1390   else if (triFunc ==flat_8R8G8B_triangle)
1391      _mesa_printf("flat_8R8G8B_triangle\n");
1392   else if (triFunc ==flat_8R8G8B24_triangle)
1393      _mesa_printf("flat_8R8G8B24_triangle\n");
1394   else if (triFunc ==flat_5R6G5B_triangle)
1395      _mesa_printf("flat_5R6G5B_triangle\n");
1396   else if (triFunc ==flat_DITHER_5R6G5B_triangle)
1397      _mesa_printf("flat_DITHER_5R6G5B_triangle\n");
1398   else if (triFunc ==flat_HPCR_triangle)
1399      _mesa_printf("flat_HPCR_triangle\n");
1400   else if (triFunc ==flat_DITHER8_triangle)
1401      _mesa_printf("flat_DITHER8_triangle\n");
1402   else if (triFunc ==flat_LOOKUP8_triangle)
1403      _mesa_printf("flat_LOOKUP8_triangle\n");
1404   else
1405      _mesa_printf("???\n");
1406}
1407#endif
1408
1409
1410#ifdef DEBUG
1411
1412/* record the current triangle function name */
1413static const char *triFuncName = NULL;
1414
1415#define USE(triFunc)                   \
1416do {                                   \
1417    triFuncName = #triFunc;            \
1418    return triFunc;                    \
1419} while (0)
1420
1421#else
1422
1423#define USE(triFunc)  return triFunc
1424
1425#endif
1426
1427
1428/**
1429 * Return pointer to line drawing function, or NULL if we should use a
1430 * swrast fallback.
1431 */
1432static swrast_tri_func
1433get_triangle_func(GLcontext *ctx)
1434{
1435   SWcontext *swrast = SWRAST_CONTEXT(ctx);
1436   XMesaContext xmesa = XMESA_CONTEXT(ctx);
1437   int depth = GET_VISUAL_DEPTH(xmesa->xm_visual);
1438   struct xmesa_renderbuffer *xrb;
1439
1440#ifdef DEBUG
1441   triFuncName = NULL;
1442#endif
1443
1444   if ((ctx->DrawBuffer->_ColorDrawBufferMask[0]
1445        & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_BACK_LEFT)) == 0)
1446      return (swrast_tri_func) NULL;
1447   if (ctx->RenderMode != GL_RENDER)  return (swrast_tri_func) NULL;
1448   if (ctx->Polygon.SmoothFlag)       return (swrast_tri_func) NULL;
1449   if (ctx->Texture._EnabledUnits)    return (swrast_tri_func) NULL;
1450   if (swrast->_RasterMask & MULTI_DRAW_BIT) return (swrast_tri_func) NULL;
1451   if (ctx->Polygon.CullFlag &&
1452       ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
1453                                        return (swrast_tri_func) NULL;
1454
1455   xrb = (struct xmesa_renderbuffer *)
1456      ctx->DrawBuffer->_ColorDrawBuffers[0][0]->Wrapped;
1457
1458   if (xrb->ximage) {
1459      if (   ctx->Light.ShadeModel==GL_SMOOTH
1460          && swrast->_RasterMask==DEPTH_BIT
1461          && ctx->Depth.Func==GL_LESS
1462          && ctx->Depth.Mask==GL_TRUE
1463          && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
1464          && ctx->Polygon.StippleFlag==GL_FALSE) {
1465         switch (xmesa->pixelformat) {
1466            case PF_Truecolor:
1467	       USE(smooth_TRUECOLOR_z_triangle);
1468            case PF_8A8B8G8R:
1469               USE(smooth_8A8B8G8R_z_triangle);
1470            case PF_8A8R8G8B:
1471               USE(smooth_8A8R8G8B_z_triangle);
1472            case PF_8R8G8B:
1473               USE(smooth_8R8G8B_z_triangle);
1474            case PF_8R8G8B24:
1475               USE(smooth_8R8G8B24_z_triangle);
1476            case PF_Dither_True:
1477               USE(smooth_TRUEDITHER_z_triangle);
1478            case PF_5R6G5B:
1479               USE(smooth_5R6G5B_z_triangle);
1480            case PF_Dither_5R6G5B:
1481               USE(smooth_DITHER_5R6G5B_z_triangle);
1482            case PF_HPCR:
1483	       USE(smooth_HPCR_z_triangle);
1484            case PF_Dither:
1485               if (depth == 8)
1486                  USE(smooth_DITHER8_z_triangle);
1487               else
1488                  USE(smooth_DITHER_z_triangle);
1489            case PF_Lookup:
1490               if (depth == 8)
1491                  USE(smooth_LOOKUP8_z_triangle);
1492               else
1493                  return (swrast_tri_func) NULL;
1494            default:
1495               return (swrast_tri_func) NULL;
1496         }
1497      }
1498      if (   ctx->Light.ShadeModel==GL_FLAT
1499          && swrast->_RasterMask==DEPTH_BIT
1500          && ctx->Depth.Func==GL_LESS
1501          && ctx->Depth.Mask==GL_TRUE
1502          && ctx->Visual.depthBits == DEFAULT_SOFTWARE_DEPTH_BITS
1503          && ctx->Polygon.StippleFlag==GL_FALSE) {
1504         switch (xmesa->pixelformat) {
1505            case PF_Truecolor:
1506	       USE(flat_TRUECOLOR_z_triangle);
1507            case PF_8A8B8G8R:
1508               USE(flat_8A8B8G8R_z_triangle);
1509            case PF_8A8R8G8B:
1510               USE(flat_8A8R8G8B_z_triangle);
1511            case PF_8R8G8B:
1512               USE(flat_8R8G8B_z_triangle);
1513            case PF_8R8G8B24:
1514               USE(flat_8R8G8B24_z_triangle);
1515            case PF_Dither_True:
1516               USE(flat_TRUEDITHER_z_triangle);
1517            case PF_5R6G5B:
1518               USE(flat_5R6G5B_z_triangle);
1519            case PF_Dither_5R6G5B:
1520               USE(flat_DITHER_5R6G5B_z_triangle);
1521            case PF_HPCR:
1522	       USE(flat_HPCR_z_triangle);
1523            case PF_Dither:
1524               if (depth == 8)
1525                  USE(flat_DITHER8_z_triangle);
1526               else
1527                  USE(flat_DITHER_z_triangle);
1528            case PF_Lookup:
1529               if (depth == 8)
1530                  USE(flat_LOOKUP8_z_triangle);
1531               else
1532                  return (swrast_tri_func) NULL;
1533            default:
1534               return (swrast_tri_func) NULL;
1535         }
1536      }
1537      if (   swrast->_RasterMask==0   /* no depth test */
1538          && ctx->Light.ShadeModel==GL_SMOOTH
1539          && ctx->Polygon.StippleFlag==GL_FALSE) {
1540         switch (xmesa->pixelformat) {
1541            case PF_Truecolor:
1542	       USE(smooth_TRUECOLOR_triangle);
1543            case PF_8A8B8G8R:
1544               USE(smooth_8A8B8G8R_triangle);
1545            case PF_8A8R8G8B:
1546               USE(smooth_8A8R8G8B_triangle);
1547            case PF_8R8G8B:
1548               USE(smooth_8R8G8B_triangle);
1549            case PF_8R8G8B24:
1550               USE(smooth_8R8G8B24_triangle);
1551            case PF_Dither_True:
1552               USE(smooth_TRUEDITHER_triangle);
1553            case PF_5R6G5B:
1554               USE(smooth_5R6G5B_triangle);
1555            case PF_Dither_5R6G5B:
1556               USE(smooth_DITHER_5R6G5B_triangle);
1557            case PF_HPCR:
1558	       USE(smooth_HPCR_triangle);
1559            case PF_Dither:
1560               if (depth == 8)
1561                  USE(smooth_DITHER8_triangle);
1562               else
1563                  USE(smooth_DITHER_triangle);
1564            case PF_Lookup:
1565               if (depth == 8)
1566                  USE(smooth_LOOKUP8_triangle);
1567               else
1568                  return (swrast_tri_func) NULL;
1569            default:
1570               return (swrast_tri_func) NULL;
1571         }
1572      }
1573
1574      if (   swrast->_RasterMask==0   /* no depth test */
1575          && ctx->Light.ShadeModel==GL_FLAT
1576          && ctx->Polygon.StippleFlag==GL_FALSE) {
1577         switch (xmesa->pixelformat) {
1578            case PF_Truecolor:
1579	       USE(flat_TRUECOLOR_triangle);
1580            case PF_Dither_True:
1581	       USE(flat_TRUEDITHER_triangle);
1582            case PF_8A8B8G8R:
1583               USE(flat_8A8B8G8R_triangle);
1584            case PF_8A8R8G8B:
1585               USE(flat_8A8R8G8B_triangle);
1586            case PF_8R8G8B:
1587               USE(flat_8R8G8B_triangle);
1588            case PF_8R8G8B24:
1589               USE(flat_8R8G8B24_triangle);
1590            case PF_5R6G5B:
1591               USE(flat_5R6G5B_triangle);
1592            case PF_Dither_5R6G5B:
1593               USE(flat_DITHER_5R6G5B_triangle);
1594            case PF_HPCR:
1595	       USE(flat_HPCR_triangle);
1596            case PF_Dither:
1597               if (depth == 8)
1598                  USE(flat_DITHER8_triangle);
1599               else
1600                  USE(flat_DITHER_triangle);
1601            case PF_Lookup:
1602               if (depth == 8)
1603                  USE(flat_LOOKUP8_triangle);
1604               else
1605                  return (swrast_tri_func) NULL;
1606            default:
1607               return (swrast_tri_func) NULL;
1608         }
1609      }
1610
1611      return (swrast_tri_func) NULL;
1612   }
1613   else {
1614      /* draw to pixmap */
1615      return (swrast_tri_func) NULL;
1616   }
1617}
1618
1619
1620/* Override for the swrast tri-selection function.  Try to use one
1621 * of our internal tri functions, otherwise fall back to the
1622 * standard swrast functions.
1623 */
1624void xmesa_choose_triangle( GLcontext *ctx )
1625{
1626   SWcontext *swrast = SWRAST_CONTEXT(ctx);
1627
1628   if (!(swrast->Triangle = get_triangle_func( ctx )))
1629      _swrast_choose_triangle( ctx );
1630}
1631
1632