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