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