1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  * Authors:
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  */
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_private.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw/draw_pipe.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean draw_pipeline_init( struct draw_context *draw )
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* create pipeline stages */
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.wide_line  = draw_wide_line_stage( draw );
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.wide_point = draw_wide_point_stage( draw );
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.stipple   = draw_stipple_stage( draw );
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.unfilled  = draw_unfilled_stage( draw );
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.twoside   = draw_twoside_stage( draw );
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.offset    = draw_offset_stage( draw );
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.clip      = draw_clip_stage( draw );
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.flatshade = draw_flatshade_stage( draw );
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.cull      = draw_cull_stage( draw );
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.validate  = draw_validate_stage( draw );
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.first     = draw->pipeline.validate;
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!draw->pipeline.wide_line ||
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.wide_point ||
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.stipple ||
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.unfilled ||
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.twoside ||
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.offset ||
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.clip ||
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.flatshade ||
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.cull ||
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !draw->pipeline.validate)
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* these defaults are oriented toward the needs of softpipe */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.wide_point_threshold = 1000000.0f; /* infinity */
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.wide_line_threshold = 1.0f;
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.wide_point_sprites = FALSE;
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.line_stipple = TRUE;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.point_sprite = TRUE;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pipeline_destroy( struct draw_context *draw )
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.wide_line)
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.wide_line->destroy( draw->pipeline.wide_line );
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.wide_point)
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.wide_point->destroy( draw->pipeline.wide_point );
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.stipple)
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.stipple->destroy( draw->pipeline.stipple );
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.unfilled)
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.unfilled->destroy( draw->pipeline.unfilled );
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.twoside)
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.twoside->destroy( draw->pipeline.twoside );
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.offset)
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.offset->destroy( draw->pipeline.offset );
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.clip)
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.clip->destroy( draw->pipeline.clip );
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.flatshade)
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.flatshade->destroy( draw->pipeline.flatshade );
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.cull)
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.cull->destroy( draw->pipeline.cull );
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.validate)
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.validate->destroy( draw->pipeline.validate );
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.aaline)
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.aaline->destroy( draw->pipeline.aaline );
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.aapoint)
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.aapoint->destroy( draw->pipeline.aapoint );
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.pstipple)
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.pstipple->destroy( draw->pipeline.pstipple );
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (draw->pipeline.rasterize)
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.rasterize->destroy( draw->pipeline.rasterize );
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build primitive to render a point with vertex at v0.
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_point( struct draw_context *draw,
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		      const char *v0 )
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct prim_header prim;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.flags = 0;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.pad = 0;
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.v[0] = (struct vertex_header *)v0;
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.first->point( draw->pipeline.first, &prim );
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build primitive to render a line with vertices at v0, v1.
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param flags  bitmask of DRAW_PIPE_EDGE_x, DRAW_PIPE_RESET_STIPPLE
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_line( struct draw_context *draw,
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     ushort flags,
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const char *v0,
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		     const char *v1 )
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct prim_header prim;
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.flags = flags;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.pad = 0;
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.v[0] = (struct vertex_header *)v0;
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.v[1] = (struct vertex_header *)v1;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.first->line( draw->pipeline.first, &prim );
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Build primitive to render a triangle with vertices at v0, v1, v2.
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param flags  bitmask of DRAW_PIPE_EDGE_x, DRAW_PIPE_RESET_STIPPLE
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void do_triangle( struct draw_context *draw,
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         ushort flags,
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 char *v0,
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 char *v1,
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			 char *v2 )
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct prim_header prim;
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.v[0] = (struct vertex_header *)v0;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.v[1] = (struct vertex_header *)v1;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.v[2] = (struct vertex_header *)v2;
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.flags = flags;
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prim.pad = 0;
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.first->tri( draw->pipeline.first, &prim );
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set up macros for draw_pt_decompose.h template code.
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This code uses vertex indexes / elements.
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TRIANGLE(flags,i0,i1,i2)                                  \
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                                           \
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_triangle( draw,                                          \
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   flags,                                         \
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   verts + stride * (i0),                         \
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   verts + stride * (i1),                         \
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                   verts + stride * (i2) );                       \
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (0)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LINE(flags,i0,i1)                                         \
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                                           \
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_line( draw,                                              \
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               flags,                                             \
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               verts + stride * (i0),                             \
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               verts + stride * (i1) );                           \
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (0)
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define POINT(i0)                               \
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do {                                         \
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      do_point( draw, verts + stride * (i0) );  \
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } while (0)
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_ELT(idx) (elts[idx])
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC pipe_run_elts
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC_VARS                               \
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct draw_context *draw,                  \
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned prim,                              \
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned prim_flags,                        \
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct vertex_header *vertices,             \
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned stride,                            \
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    const ushort *elts,                         \
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned count
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_pt_decompose.h"
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Code to run the pipeline on a fairly arbitrary collection of vertices.
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For drawing indexed primitives.
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Vertex headers must be pre-initialized with the
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * UNDEFINED_VERTEX_ID, this code will cause that id to become
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * overwritten, so it may have to be reset if there is the intention
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to reuse the vertices.
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This code provides a callback to reset the vertex id's which the
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * draw_vbuf.c code uses when it has to perform a flush.
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pipeline_run( struct draw_context *draw,
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const struct draw_vertex_info *vert_info,
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        const struct draw_prim_info *prim_info)
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, start;
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.verts = (char *)vert_info->verts;
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.vertex_stride = vert_info->stride;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.vertex_count = vert_info->count;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (start = i = 0;
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        i < prim_info->primitive_count;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        start += prim_info->primitive_lengths[i], i++)
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const unsigned count = prim_info->primitive_lengths[i];
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DEBUG
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Warn if one of the element indexes go outside the vertex buffer */
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      {
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         unsigned max_index = 0x0, i;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* find the largest element index */
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < count; i++) {
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            unsigned int index = prim_info->elts[start + i];
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (index > max_index)
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               max_index = index;
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (max_index >= vert_info->count) {
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            debug_printf("%s: max_index (%u) outside vertex buffer (%u)\n",
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         __FUNCTION__,
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         max_index,
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         vert_info->count);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_run_elts(draw,
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    prim_info->prim,
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    prim_info->flags,
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    vert_info->verts,
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    vert_info->stride,
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    prim_info->elts + start,
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    count);
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.verts = NULL;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.vertex_count = 0;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set up macros for draw_pt_decompose.h template code.
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This code is for non-indexed (aka linear) rendering (no elts).
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define TRIANGLE(flags,i0,i1,i2)       \
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do_triangle( draw, flags,           \
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                verts + stride * (i0), \
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                verts + stride * (i1), \
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                verts + stride * (i2) )
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define LINE(flags,i0,i1)              \
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do_line( draw, flags,               \
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            verts + stride * (i0),     \
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            verts + stride * (i1) )
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define POINT(i0)                      \
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   do_point( draw, verts + stride * (i0) )
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GET_ELT(idx) (idx)
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC pipe_run_linear
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FUNC_VARS                      \
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct draw_context *draw,         \
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned prim,                     \
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned prim_flags,               \
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    struct vertex_header *vertices,    \
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned stride,                   \
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    unsigned count
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "draw_pt_decompose.h"
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For drawing non-indexed primitives.
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pipeline_run_linear( struct draw_context *draw,
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const struct draw_vertex_info *vert_info,
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                               const struct draw_prim_info *prim_info)
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i, start;
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (start = i = 0;
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        i < prim_info->primitive_count;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        start += prim_info->primitive_lengths[i], i++)
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   {
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned count = prim_info->primitive_lengths[i];
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      char *verts = ((char*)vert_info->verts) +
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                    (start * vert_info->stride);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.verts = verts;
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.vertex_stride = vert_info->stride;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.vertex_count = count;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      assert(count <= vert_info->count);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pipe_run_linear(draw,
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      prim_info->prim,
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      prim_info->flags,
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      (struct vertex_header*)verts,
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      vert_info->stride,
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      count);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.verts = NULL;
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.vertex_count = 0;
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid draw_pipeline_flush( struct draw_context *draw,
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          unsigned flags )
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   draw->pipeline.first->flush( draw->pipeline.first, flags );
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!(flags & DRAW_FLUSH_BACKEND))
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      draw->pipeline.first = draw->pipeline.validate;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
350