1507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/**************************************************************************
2507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
3507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * All Rights Reserved.
5507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
6507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
7507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * copy of this software and associated documentation files (the
8507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * "Software"), to deal in the Software without restriction, including
9507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
10507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
11507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
12507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * the following conditions:
13507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
14507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * The above copyright notice and this permission notice (including the
15507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
16507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * of the Software.
17507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
18507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
26507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell **************************************************************************/
27507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
28507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell /*
29507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell  * Authors:
30507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell  *   Keith Whitwell <keith@tungstengraphics.com>
31507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell  */
32507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
33507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw/draw_private.h"
34507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw/draw_pipe.h"
3538f6f23fcf37247fd709d1c612d08bfa9b124e69José Fonseca#include "util/u_debug.h"
36507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
37507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
38bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
39507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellboolean draw_pipeline_init( struct draw_context *draw )
40507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
41507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   /* create pipeline stages */
42507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_line  = draw_wide_line_stage( draw );
43507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_point = draw_wide_point_stage( draw );
44507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.stipple   = draw_stipple_stage( draw );
45507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.unfilled  = draw_unfilled_stage( draw );
46507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.twoside   = draw_twoside_stage( draw );
47507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.offset    = draw_offset_stage( draw );
48507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.clip      = draw_clip_stage( draw );
49507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.flatshade = draw_flatshade_stage( draw );
50507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.cull      = draw_cull_stage( draw );
51507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.validate  = draw_validate_stage( draw );
52507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.first     = draw->pipeline.validate;
53507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
54507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (!draw->pipeline.wide_line ||
55507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.wide_point ||
56507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.stipple ||
57507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.unfilled ||
58507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.twoside ||
59507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.offset ||
60507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.clip ||
61507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.flatshade ||
62507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.cull ||
63507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.validate)
64507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      return FALSE;
65507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
66507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   /* these defaults are oriented toward the needs of softpipe */
674586e6c8cb5b391536a370faa0c419c3fd541693José Fonseca   draw->pipeline.wide_point_threshold = 1000000.0f; /* infinity */
684586e6c8cb5b391536a370faa0c419c3fd541693José Fonseca   draw->pipeline.wide_line_threshold = 1.0f;
698cb223eb020560d59c8f73e09b832cef477933b7Brian Paul   draw->pipeline.wide_point_sprites = FALSE;
70507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.line_stipple = TRUE;
71507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.point_sprite = TRUE;
72507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
73507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   return TRUE;
74507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
75507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
76507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
77507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellvoid draw_pipeline_destroy( struct draw_context *draw )
78507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
79507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.wide_line)
80507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.wide_line->destroy( draw->pipeline.wide_line );
81507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.wide_point)
82507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.wide_point->destroy( draw->pipeline.wide_point );
83507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.stipple)
84507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.stipple->destroy( draw->pipeline.stipple );
85507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.unfilled)
86507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.unfilled->destroy( draw->pipeline.unfilled );
87507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.twoside)
88507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.twoside->destroy( draw->pipeline.twoside );
89507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.offset)
90507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.offset->destroy( draw->pipeline.offset );
91507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.clip)
92507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.clip->destroy( draw->pipeline.clip );
93507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.flatshade)
94507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.flatshade->destroy( draw->pipeline.flatshade );
95507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.cull)
96507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.cull->destroy( draw->pipeline.cull );
97507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.validate)
98507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.validate->destroy( draw->pipeline.validate );
99507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.aaline)
100507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.aaline->destroy( draw->pipeline.aaline );
101507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.aapoint)
102507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.aapoint->destroy( draw->pipeline.aapoint );
103507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.pstipple)
104507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.pstipple->destroy( draw->pipeline.pstipple );
105507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.rasterize)
106507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.rasterize->destroy( draw->pipeline.rasterize );
107507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
108507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
109507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
110507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
1115ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
1125ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Build primitive to render a point with vertex at v0.
1135ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
114bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellstatic void do_point( struct draw_context *draw,
115bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell		      const char *v0 )
116bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
117bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   struct prim_header prim;
118bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
119f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   prim.flags = 0;
120bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.pad = 0;
121bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[0] = (struct vertex_header *)v0;
122bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
123bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.first->point( draw->pipeline.first, &prim );
124bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
125bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
126bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
1275ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
1285ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Build primitive to render a line with vertices at v0, v1.
1295ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * \param flags  bitmask of DRAW_PIPE_EDGE_x, DRAW_PIPE_RESET_STIPPLE
1305ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
131bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellstatic void do_line( struct draw_context *draw,
132f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell                     ushort flags,
133bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell		     const char *v0,
134bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell		     const char *v1 )
135bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
136bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   struct prim_header prim;
137bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
138f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   prim.flags = flags;
139bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.pad = 0;
140bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[0] = (struct vertex_header *)v0;
141bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[1] = (struct vertex_header *)v1;
142bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
143bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.first->line( draw->pipeline.first, &prim );
144bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
145bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
146bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
1475ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
1485ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Build primitive to render a triangle with vertices at v0, v1, v2.
1495ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * \param flags  bitmask of DRAW_PIPE_EDGE_x, DRAW_PIPE_RESET_STIPPLE
1505ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
151bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellstatic void do_triangle( struct draw_context *draw,
152f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell                         ushort flags,
153bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell			 char *v0,
154bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell			 char *v1,
155bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell			 char *v2 )
156bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
157bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   struct prim_header prim;
158bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
159bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[0] = (struct vertex_header *)v0;
160bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[1] = (struct vertex_header *)v1;
161bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[2] = (struct vertex_header *)v2;
162f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   prim.flags = flags;
163bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.pad = 0;
164bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
165bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.first->tri( draw->pipeline.first, &prim );
166bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
167bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
168bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
1695ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/*
1705ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Set up macros for draw_pt_decompose.h template code.
1715ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * This code uses vertex indexes / elements.
1725ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
173cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul
1746ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu#define TRIANGLE(flags,i0,i1,i2)                                  \
1756ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   do {                                                           \
1766ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu      do_triangle( draw,                                          \
1775a085c623faebf957be3fae2f82dc89ef6214585Chia-I Wu                   flags,                                         \
178c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu                   verts + stride * (i0),                         \
1796ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu                   verts + stride * (i1),                         \
1806ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu                   verts + stride * (i2) );                       \
1816ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   } while (0)
1826ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu
1836ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu#define LINE(flags,i0,i1)                                         \
1846ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   do {                                                           \
1856ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu      do_line( draw,                                              \
1865a085c623faebf957be3fae2f82dc89ef6214585Chia-I Wu               flags,                                             \
187c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu               verts + stride * (i0),                             \
1886ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu               verts + stride * (i1) );                           \
1896ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   } while (0)
1901ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
1911ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell#define POINT(i0)                               \
1926ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   do {                                         \
1936ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu      do_point( draw, verts + stride * (i0) );  \
1946ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   } while (0)
195eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu
196eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define GET_ELT(idx) (elts[idx])
1971ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
198b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul#define FUNC pipe_run_elts
199eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define FUNC_VARS                               \
2001ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    struct draw_context *draw,                  \
2011ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    unsigned prim,                              \
202f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu    unsigned prim_flags,                        \
2031ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    struct vertex_header *vertices,             \
2041ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    unsigned stride,                            \
205eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    const ushort *elts,                         \
206eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned count
2071ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
2081ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell#include "draw_pt_decompose.h"
2091ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
2101ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
211507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
2125ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
213b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca * Code to run the pipeline on a fairly arbitrary collection of vertices.
2145ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * For drawing indexed primitives.
215bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell *
216bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * Vertex headers must be pre-initialized with the
217bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * UNDEFINED_VERTEX_ID, this code will cause that id to become
218bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * overwritten, so it may have to be reset if there is the intention
219bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * to reuse the vertices.
220bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell *
221bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * This code provides a callback to reset the vertex id's which the
222bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * draw_vbuf.c code uses when it has to perform a flush.
223bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell */
224bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellvoid draw_pipeline_run( struct draw_context *draw,
225b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                        const struct draw_vertex_info *vert_info,
226b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                        const struct draw_prim_info *prim_info)
227bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
228b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   unsigned i, start;
2295cf1921e6d7ba36e6e882094d3280e3cd363df61Zack Rusin
230b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   draw->pipeline.verts = (char *)vert_info->verts;
231b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   draw->pipeline.vertex_stride = vert_info->stride;
232b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   draw->pipeline.vertex_count = vert_info->count;
233b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
234b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   for (start = i = 0;
235b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        i < prim_info->primitive_count;
236b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        start += prim_info->primitive_lengths[i], i++)
237b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   {
238b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      const unsigned count = prim_info->primitive_lengths[i];
239b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul
240b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul#if DEBUG
241ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca      /* Warn if one of the element indexes go outside the vertex buffer */
242b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      {
243b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         unsigned max_index = 0x0, i;
244b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         /* find the largest element index */
245b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         for (i = 0; i < count; i++) {
246c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu            unsigned int index = prim_info->elts[start + i];
247b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul            if (index > max_index)
248b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul               max_index = index;
249b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         }
250ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca         if (max_index >= vert_info->count) {
251ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca            debug_printf("%s: max_index (%u) outside vertex buffer (%u)\n",
252ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca                         __FUNCTION__,
253ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca                         max_index,
254ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca                         vert_info->count);
255ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca         }
256b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      }
257b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul#endif
258b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul
259b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      pipe_run_elts(draw,
260b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    prim_info->prim,
261f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu                    prim_info->flags,
262b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    vert_info->verts,
263b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    vert_info->stride,
264b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    prim_info->elts + start,
265b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    count);
266b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   }
267b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
268bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.verts = NULL;
269bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.vertex_count = 0;
270bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
271bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
2725ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul
2735ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/*
2745ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Set up macros for draw_pt_decompose.h template code.
275cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul * This code is for non-indexed (aka linear) rendering (no elts).
2765ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
277cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul
278642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu#define TRIANGLE(flags,i0,i1,i2)       \
279642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu   do_triangle( draw, flags,           \
280642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu                verts + stride * (i0), \
281642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu                verts + stride * (i1), \
282642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu                verts + stride * (i2) )
2831c624846a81b0218b4a07328f485e295432c6312Zack Rusin
284642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu#define LINE(flags,i0,i1)              \
285642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu   do_line( draw, flags,               \
286642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu            verts + stride * (i0),     \
287642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu            verts + stride * (i1) )
2881c624846a81b0218b4a07328f485e295432c6312Zack Rusin
289642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu#define POINT(i0)                      \
290642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu   do_point( draw, verts + stride * (i0) )
2911c624846a81b0218b4a07328f485e295432c6312Zack Rusin
2921c624846a81b0218b4a07328f485e295432c6312Zack Rusin
293eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define GET_ELT(idx) (idx)
2941c624846a81b0218b4a07328f485e295432c6312Zack Rusin
295eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define FUNC pipe_run_linear
296eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define FUNC_VARS                      \
297eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    struct draw_context *draw,         \
298eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned prim,                     \
299f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu    unsigned prim_flags,               \
300eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    struct vertex_header *vertices,    \
301eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned stride,                   \
302eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned count
3031c624846a81b0218b4a07328f485e295432c6312Zack Rusin
3041c624846a81b0218b4a07328f485e295432c6312Zack Rusin#include "draw_pt_decompose.h"
3051c624846a81b0218b4a07328f485e295432c6312Zack Rusin
3065ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul
3075ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/*
3085ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * For drawing non-indexed primitives.
3095ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
310fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusinvoid draw_pipeline_run_linear( struct draw_context *draw,
311b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                               const struct draw_vertex_info *vert_info,
312b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                               const struct draw_prim_info *prim_info)
313fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin{
314b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   unsigned i, start;
315b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
316b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   for (start = i = 0;
317b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        i < prim_info->primitive_count;
318b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        start += prim_info->primitive_lengths[i], i++)
319b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   {
320b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      unsigned count = prim_info->primitive_lengths[i];
3219cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin      char *verts = ((char*)vert_info->verts) +
3229cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin                    (start * vert_info->stride);
323b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
3249cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin      draw->pipeline.verts = verts;
325b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      draw->pipeline.vertex_stride = vert_info->stride;
326b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      draw->pipeline.vertex_count = count;
327b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
328b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      assert(count <= vert_info->count);
329b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul
330b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      pipe_run_linear(draw,
331b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                      prim_info->prim,
332f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu                      prim_info->flags,
3339cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin                      (struct vertex_header*)verts,
334b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                      vert_info->stride,
335bf577393c7334ed8e11584984138285ae0faac93Zack Rusin                      count);
336b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   }
337fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin
338fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin   draw->pipeline.verts = NULL;
339fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin   draw->pipeline.vertex_count = 0;
340fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin}
341e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell
342e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell
343e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwellvoid draw_pipeline_flush( struct draw_context *draw,
344e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell                          unsigned flags )
345e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell{
346e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell   draw->pipeline.first->flush( draw->pipeline.first, flags );
347eb65ccbc21670d16813b53e0f8d94cb4e037d39cJakob Bornecrantz   if (!(flags & DRAW_FLUSH_BACKEND))
348eb65ccbc21670d16813b53e0f8d94cb4e037d39cJakob Bornecrantz      draw->pipeline.first = draw->pipeline.validate;
349e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell}
350