1507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell/**************************************************************************
2507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell *
3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc.
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.
21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE 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:
30877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca  *   Keith Whitwell <keithw@vmware.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"
3694f9ea03a12fe1adf90c0e5defb0063cd568b537Roland Scheidegger#include "util/u_math.h"
37507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
38507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
39bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
40507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellboolean draw_pipeline_init( struct draw_context *draw )
41507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
42507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   /* create pipeline stages */
43507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_line  = draw_wide_line_stage( draw );
44507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.wide_point = draw_wide_point_stage( draw );
45507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.stipple   = draw_stipple_stage( draw );
46507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.unfilled  = draw_unfilled_stage( draw );
47507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.twoside   = draw_twoside_stage( draw );
48507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.offset    = draw_offset_stage( draw );
49507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.clip      = draw_clip_stage( draw );
50507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.flatshade = draw_flatshade_stage( draw );
51507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.cull      = draw_cull_stage( draw );
52507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.validate  = draw_validate_stage( draw );
53507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.first     = draw->pipeline.validate;
54507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
55507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (!draw->pipeline.wide_line ||
56507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.wide_point ||
57507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.stipple ||
58507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.unfilled ||
59507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.twoside ||
60507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.offset ||
61507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.clip ||
62507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.flatshade ||
63507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.cull ||
64507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell       !draw->pipeline.validate)
65507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      return FALSE;
66507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
67507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   /* these defaults are oriented toward the needs of softpipe */
684586e6c8cb5b391536a370faa0c419c3fd541693José Fonseca   draw->pipeline.wide_point_threshold = 1000000.0f; /* infinity */
694586e6c8cb5b391536a370faa0c419c3fd541693José Fonseca   draw->pipeline.wide_line_threshold = 1.0f;
708cb223eb020560d59c8f73e09b832cef477933b7Brian Paul   draw->pipeline.wide_point_sprites = FALSE;
71507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.line_stipple = TRUE;
72507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   draw->pipeline.point_sprite = TRUE;
73507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
74507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   return TRUE;
75507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
76507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
77507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
78507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwellvoid draw_pipeline_destroy( struct draw_context *draw )
79507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell{
80507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.wide_line)
81507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.wide_line->destroy( draw->pipeline.wide_line );
82507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.wide_point)
83507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.wide_point->destroy( draw->pipeline.wide_point );
84507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.stipple)
85507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.stipple->destroy( draw->pipeline.stipple );
86507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.unfilled)
87507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.unfilled->destroy( draw->pipeline.unfilled );
88507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.twoside)
89507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.twoside->destroy( draw->pipeline.twoside );
90507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.offset)
91507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.offset->destroy( draw->pipeline.offset );
92507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.clip)
93507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.clip->destroy( draw->pipeline.clip );
94507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.flatshade)
95507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.flatshade->destroy( draw->pipeline.flatshade );
96507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.cull)
97507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.cull->destroy( draw->pipeline.cull );
98507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.validate)
99507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.validate->destroy( draw->pipeline.validate );
100507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.aaline)
101507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.aaline->destroy( draw->pipeline.aaline );
102507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.aapoint)
103507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.aapoint->destroy( draw->pipeline.aapoint );
104507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.pstipple)
105507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.pstipple->destroy( draw->pipeline.pstipple );
106507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell   if (draw->pipeline.rasterize)
107507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell      draw->pipeline.rasterize->destroy( draw->pipeline.rasterize );
108507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell}
109507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
110507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
111507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
1125ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
1135ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Build primitive to render a point with vertex at v0.
1145ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
115bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellstatic void do_point( struct draw_context *draw,
116bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell		      const char *v0 )
117bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
118bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   struct prim_header prim;
119bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
120f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   prim.flags = 0;
121bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.pad = 0;
122bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[0] = (struct vertex_header *)v0;
123bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
124bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.first->point( draw->pipeline.first, &prim );
125bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
126bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
127bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
1285ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
1295ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Build primitive to render a line with vertices at v0, v1.
1305ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * \param flags  bitmask of DRAW_PIPE_EDGE_x, DRAW_PIPE_RESET_STIPPLE
1315ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
132bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellstatic void do_line( struct draw_context *draw,
133f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell                     ushort flags,
134bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell		     const char *v0,
135bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell		     const char *v1 )
136bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
137bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   struct prim_header prim;
138bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
139f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   prim.flags = flags;
140bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.pad = 0;
141bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[0] = (struct vertex_header *)v0;
142bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[1] = (struct vertex_header *)v1;
143bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
144bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.first->line( draw->pipeline.first, &prim );
145bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
146bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
147bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
1485ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
1495ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Build primitive to render a triangle with vertices at v0, v1, v2.
1505ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * \param flags  bitmask of DRAW_PIPE_EDGE_x, DRAW_PIPE_RESET_STIPPLE
1515ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
152bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellstatic void do_triangle( struct draw_context *draw,
153f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell                         ushort flags,
154bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell			 char *v0,
155bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell			 char *v1,
156bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell			 char *v2 )
157bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
158bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   struct prim_header prim;
159bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
160bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[0] = (struct vertex_header *)v0;
161bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[1] = (struct vertex_header *)v1;
162bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.v[2] = (struct vertex_header *)v2;
163f93332da5655a31b6c44a1079629a15360ff999bKeith Whitwell   prim.flags = flags;
164bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   prim.pad = 0;
165bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
166bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.first->tri( draw->pipeline.first, &prim );
167bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
168bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
169bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
1705ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/*
1715ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Set up macros for draw_pt_decompose.h template code.
1725ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * This code uses vertex indexes / elements.
1735ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
174cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul
1756ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu#define TRIANGLE(flags,i0,i1,i2)                                  \
1766ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   do {                                                           \
1776ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu      do_triangle( draw,                                          \
1785a085c623faebf957be3fae2f82dc89ef6214585Chia-I Wu                   flags,                                         \
179c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu                   verts + stride * (i0),                         \
1806ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu                   verts + stride * (i1),                         \
1816ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu                   verts + stride * (i2) );                       \
1826ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   } while (0)
1836ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu
1846ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu#define LINE(flags,i0,i1)                                         \
1856ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   do {                                                           \
1866ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu      do_line( draw,                                              \
1875a085c623faebf957be3fae2f82dc89ef6214585Chia-I Wu               flags,                                             \
188c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu               verts + stride * (i0),                             \
1896ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu               verts + stride * (i1) );                           \
1906ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   } while (0)
1911ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
1921ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell#define POINT(i0)                               \
1936ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   do {                                         \
1946ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu      do_point( draw, verts + stride * (i0) );  \
1956ae39f6dca8f0968902642f04f1deb6f573edb6dChia-I Wu   } while (0)
196eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu
19794f9ea03a12fe1adf90c0e5defb0063cd568b537Roland Scheidegger#define GET_ELT(idx) (MIN2(elts[idx], max_index))
1981ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
199b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul#define FUNC pipe_run_elts
200eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define FUNC_VARS                               \
2011ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    struct draw_context *draw,                  \
2021ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    unsigned prim,                              \
203f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu    unsigned prim_flags,                        \
2041ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    struct vertex_header *vertices,             \
2051ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell    unsigned stride,                            \
206eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    const ushort *elts,                         \
20794f9ea03a12fe1adf90c0e5defb0063cd568b537Roland Scheidegger    unsigned count,                             \
20894f9ea03a12fe1adf90c0e5defb0063cd568b537Roland Scheidegger    unsigned max_index
2091ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
2101ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell#include "draw_pt_decompose.h"
2111ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
2121ce3f5a806f6efb29c231157987e3495c7b41022Keith Whitwell
213507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell
2145ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/**
215b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca * Code to run the pipeline on a fairly arbitrary collection of vertices.
2165ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * For drawing indexed primitives.
217bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell *
218bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * Vertex headers must be pre-initialized with the
219bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * UNDEFINED_VERTEX_ID, this code will cause that id to become
220bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * overwritten, so it may have to be reset if there is the intention
221bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * to reuse the vertices.
222bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell *
223bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * This code provides a callback to reset the vertex id's which the
224bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell * draw_vbuf.c code uses when it has to perform a flush.
225bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell */
226bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwellvoid draw_pipeline_run( struct draw_context *draw,
227b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                        const struct draw_vertex_info *vert_info,
228b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                        const struct draw_prim_info *prim_info)
229bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell{
230b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   unsigned i, start;
2315cf1921e6d7ba36e6e882094d3280e3cd363df61Zack Rusin
232b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   draw->pipeline.verts = (char *)vert_info->verts;
233b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   draw->pipeline.vertex_stride = vert_info->stride;
234b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   draw->pipeline.vertex_count = vert_info->count;
235b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
236b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   for (start = i = 0;
237b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        i < prim_info->primitive_count;
238b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        start += prim_info->primitive_lengths[i], i++)
239b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   {
240b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      const unsigned count = prim_info->primitive_lengths[i];
241b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul
242b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul#if DEBUG
243ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca      /* Warn if one of the element indexes go outside the vertex buffer */
244b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      {
245b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         unsigned max_index = 0x0, i;
246b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         /* find the largest element index */
247b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         for (i = 0; i < count; i++) {
248c3fee80f2b35f6a7e48d6015bfc759c66b7e1a2cChia-I Wu            unsigned int index = prim_info->elts[start + i];
249b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul            if (index > max_index)
250b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul               max_index = index;
251b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul         }
252ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca         if (max_index >= vert_info->count) {
253ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca            debug_printf("%s: max_index (%u) outside vertex buffer (%u)\n",
254ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca                         __FUNCTION__,
255ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca                         max_index,
256ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca                         vert_info->count);
257ae34a6393e6519dc32e53fa8407155e8679fc257José Fonseca         }
258b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      }
259b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul#endif
260b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul
261b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      pipe_run_elts(draw,
262b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    prim_info->prim,
263f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu                    prim_info->flags,
264b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    vert_info->verts,
265b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    vert_info->stride,
266b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul                    prim_info->elts + start,
26794f9ea03a12fe1adf90c0e5defb0063cd568b537Roland Scheidegger                    count,
26894f9ea03a12fe1adf90c0e5defb0063cd568b537Roland Scheidegger                    vert_info->count - 1);
269b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   }
270b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
271bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.verts = NULL;
272bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell   draw->pipeline.vertex_count = 0;
273bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell}
274bee1d31641674c67676de86fbb4b35ca5bf7f33fKeith Whitwell
2755ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul
2765ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/*
2775ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * Set up macros for draw_pt_decompose.h template code.
278cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul * This code is for non-indexed (aka linear) rendering (no elts).
2795ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
280cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul
281642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu#define TRIANGLE(flags,i0,i1,i2)       \
282642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu   do_triangle( draw, flags,           \
283642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu                verts + stride * (i0), \
284642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu                verts + stride * (i1), \
285642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu                verts + stride * (i2) )
2861c624846a81b0218b4a07328f485e295432c6312Zack Rusin
287642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu#define LINE(flags,i0,i1)              \
288642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu   do_line( draw, flags,               \
289642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu            verts + stride * (i0),     \
290642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu            verts + stride * (i1) )
2911c624846a81b0218b4a07328f485e295432c6312Zack Rusin
292642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu#define POINT(i0)                      \
293642d5ba79abc6a231a5fdabb3454b9b082b0d7f8Chia-I Wu   do_point( draw, verts + stride * (i0) )
2941c624846a81b0218b4a07328f485e295432c6312Zack Rusin
2951c624846a81b0218b4a07328f485e295432c6312Zack Rusin
296eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define GET_ELT(idx) (idx)
2971c624846a81b0218b4a07328f485e295432c6312Zack Rusin
298eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define FUNC pipe_run_linear
299eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu#define FUNC_VARS                      \
300eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    struct draw_context *draw,         \
301eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned prim,                     \
302f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu    unsigned prim_flags,               \
303eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    struct vertex_header *vertices,    \
304eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned stride,                   \
305eb3c6ddafb7a1b544243e9dec991cc24d16940eaChia-I Wu    unsigned count
3061c624846a81b0218b4a07328f485e295432c6312Zack Rusin
3071c624846a81b0218b4a07328f485e295432c6312Zack Rusin#include "draw_pt_decompose.h"
3081c624846a81b0218b4a07328f485e295432c6312Zack Rusin
3095ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul
3105ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul/*
3115ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul * For drawing non-indexed primitives.
3125ab0d49a07fb81b7545463310c91ada596e26e72Brian Paul */
313fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusinvoid draw_pipeline_run_linear( struct draw_context *draw,
314b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                               const struct draw_vertex_info *vert_info,
315b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                               const struct draw_prim_info *prim_info)
316fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin{
317b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   unsigned i, start;
318b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
319b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   for (start = i = 0;
320b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        i < prim_info->primitive_count;
321b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell        start += prim_info->primitive_lengths[i], i++)
322b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   {
323b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      unsigned count = prim_info->primitive_lengths[i];
3249cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin      char *verts = ((char*)vert_info->verts) +
3259cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin                    (start * vert_info->stride);
326b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
3279cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin      draw->pipeline.verts = verts;
328b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      draw->pipeline.vertex_stride = vert_info->stride;
329b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      draw->pipeline.vertex_count = count;
330b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell
331b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul      assert(count <= vert_info->count);
332b4c8de1ff24d4d5e2fe550da54249934320acab4Brian Paul
333b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell      pipe_run_linear(draw,
334b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                      prim_info->prim,
335f141abdc8fdbff41e16b0ce53fa3fa8fba32a7f9Chia-I Wu                      prim_info->flags,
3369cf5e814b943d38750cdc6d27a9e25856454c853Zack Rusin                      (struct vertex_header*)verts,
337b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell                      vert_info->stride,
338bf577393c7334ed8e11584984138285ae0faac93Zack Rusin                      count);
339b85a361ccbac956d2842251395c048a4b3f4c440Keith Whitwell   }
340fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin
341fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin   draw->pipeline.verts = NULL;
342fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin   draw->pipeline.vertex_count = 0;
343fe586f8612dd517b9a1f0d87fbaf3a75e3caf588Zack Rusin}
344e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell
345e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell
346e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwellvoid draw_pipeline_flush( struct draw_context *draw,
347e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell                          unsigned flags )
348e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell{
349e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell   draw->pipeline.first->flush( draw->pipeline.first, flags );
3504b73cdb864aef6d64c35a7ab9a59e4ee4e3f9d0fBrian Paul   if (flags & DRAW_FLUSH_STATE_CHANGE)
351eb65ccbc21670d16813b53e0f8d94cb4e037d39cJakob Bornecrantz      draw->pipeline.first = draw->pipeline.validate;
352e7bac4276634ea1ee81ac71f6f6869f87e689872Keith Whitwell}
353