1b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul/************************************************************************** 2b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * 3b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * All Rights Reserved. 5b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * 6b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * Permission is hereby granted, free of charge, to any person obtaining a 7b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * copy of this software and associated documentation files (the 8b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * "Software"), to deal in the Software without restriction, including 9b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * without limitation the rights to use, copy, modify, merge, publish, 10b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * distribute, sub license, and/or sell copies of the Software, and to 11b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * permit persons to whom the Software is furnished to do so, subject to 12b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * the following conditions: 13b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * 14b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * The above copyright notice and this permission notice (including the 15b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * next paragraph) shall be included in all copies or substantial portions 16b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * of the Software. 17b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * 18b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * 26b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul **************************************************************************/ 27b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 28b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul/* Authors: Keith Whitwell <keith@tungstengraphics.com> 29b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul */ 30b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 31e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul#include "pipe/p_context.h" 32b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul#include "pipe/p_defines.h" 33b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul#include "pipe/p_shader_tokens.h" 344f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h" 354f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 36b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul#include "draw_private.h" 37507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw_pipe.h" 38b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 39b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 40b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstruct wideline_stage { 41b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct draw_stage stage; 42b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 43b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul float half_line_width; 44b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul}; 45b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 46b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 47b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 48b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstatic INLINE struct wideline_stage *wideline_stage( struct draw_stage *stage ) 49b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul{ 50b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul return (struct wideline_stage *)stage; 51b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul} 52b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 53b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 54b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 55b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul/** 56b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * Draw a wide line by drawing a quad (two triangles). 57b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul */ 58b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstatic void wideline_line( struct draw_stage *stage, 59b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct prim_header *header ) 60b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul{ 61b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul /*const struct wideline_stage *wide = wideline_stage(stage);*/ 6289d8577fb3036547ef0b47498cc8dc5c77f886e0Zack Rusin const unsigned pos = draw_current_shader_position_output(stage->draw); 63b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul const float half_width = 0.5f * stage->draw->rasterizer->line_width; 64b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 65b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct prim_header tri; 66b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 67b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct vertex_header *v0 = dup_vert(stage, header->v[0], 0); 68b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct vertex_header *v1 = dup_vert(stage, header->v[0], 1); 69b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct vertex_header *v2 = dup_vert(stage, header->v[1], 2); 70b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct vertex_header *v3 = dup_vert(stage, header->v[1], 3); 71b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 722161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell float *pos0 = v0->data[pos]; 732161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell float *pos1 = v1->data[pos]; 742161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell float *pos2 = v2->data[pos]; 752161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell float *pos3 = v3->data[pos]; 76b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 77120270def74149b240926f827b80ca073536d462Brian Paul const float dx = fabsf(pos0[0] - pos2[0]); 78120270def74149b240926f827b80ca073536d462Brian Paul const float dy = fabsf(pos0[1] - pos2[1]); 792a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul 80dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul const boolean gl_rasterization_rules = 81dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul stage->draw->rasterizer->gl_rasterization_rules; 82dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul 832a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul /* small tweak to meet GL specification */ 84dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul const float bias = gl_rasterization_rules ? 0.125f : 0.0f; 852a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul 86b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul /* 87b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * Draw wide line as a quad (two tris) by "stretching" the line along 88b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * X or Y. 89b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul * We need to tweak coords in several ways to be conformant here. 90b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul */ 91b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 92b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul if (dx > dy) { 93b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul /* x-major line */ 942a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos0[1] = pos0[1] - half_width - bias; 952a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos1[1] = pos1[1] + half_width - bias; 962a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos2[1] = pos2[1] - half_width - bias; 972a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos3[1] = pos3[1] + half_width - bias; 98dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul if (gl_rasterization_rules) { 99dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul if (pos0[0] < pos2[0]) { 100dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul /* left to right line */ 101dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos0[0] -= 0.5f; 102dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos1[0] -= 0.5f; 103dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos2[0] -= 0.5f; 104dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos3[0] -= 0.5f; 105dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul } 106dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul else { 107dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul /* right to left line */ 108dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos0[0] += 0.5f; 109dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos1[0] += 0.5f; 110dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos2[0] += 0.5f; 111dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos3[0] += 0.5f; 112dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul } 113b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul } 114b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul } 115b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul else { 116b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul /* y-major line */ 1172a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos0[0] = pos0[0] - half_width + bias; 1182a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos1[0] = pos1[0] + half_width + bias; 1192a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos2[0] = pos2[0] - half_width + bias; 1202a121e8e2289d2ca136f511c5a6ef049f9c99ec4Brian Paul pos3[0] = pos3[0] + half_width + bias; 121dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul if (gl_rasterization_rules) { 122dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul if (pos0[1] < pos2[1]) { 123dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul /* top to bottom line */ 124dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos0[1] -= 0.5f; 125dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos1[1] -= 0.5f; 126dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos2[1] -= 0.5f; 127dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos3[1] -= 0.5f; 128dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul } 129dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul else { 130dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul /* bottom to top line */ 131dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos0[1] += 0.5f; 132dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos1[1] += 0.5f; 133dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos2[1] += 0.5f; 134dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul pos3[1] += 0.5f; 135dc1c33b448c830c5775e4f3fb6510830694a4177Brian Paul } 136b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul } 137b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul } 138b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 139b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.det = header->det; /* only the sign matters */ 140b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.v[0] = v0; 141b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.v[1] = v2; 142b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.v[2] = v3; 143b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul stage->next->tri( stage->next, &tri ); 144b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 145b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.v[0] = v0; 146b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.v[1] = v3; 147b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul tri.v[2] = v1; 148b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul stage->next->tri( stage->next, &tri ); 149b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul} 150b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 151b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 152e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paulstatic void wideline_first_line( struct draw_stage *stage, 153e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct prim_header *header ) 154e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul{ 155e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct draw_context *draw = stage->draw; 156e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct pipe_context *pipe = draw->pipe; 157e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul const struct pipe_rasterizer_state *rast = draw->rasterizer; 158e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul void *r; 159e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 160e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul /* Disable triangle culling, stippling, unfilled mode etc. */ 161e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade); 162e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->suspend_flushing = TRUE; 163e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul pipe->bind_rasterizer_state(pipe, r); 164e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->suspend_flushing = FALSE; 165e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 166e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul stage->line = wideline_line; 167e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 168e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul wideline_line(stage, header); 169e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul} 170e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 171e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 172b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstatic void wideline_flush( struct draw_stage *stage, unsigned flags ) 173b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul{ 174e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct draw_context *draw = stage->draw; 175e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul struct pipe_context *pipe = draw->pipe; 176e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 177e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul stage->line = wideline_first_line; 178b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul stage->next->flush( stage->next, flags ); 179e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul 180e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul /* restore original rasterizer state */ 181e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul if (draw->rast_handle) { 182e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->suspend_flushing = TRUE; 183e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul pipe->bind_rasterizer_state(pipe, draw->rast_handle); 184e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul draw->suspend_flushing = FALSE; 185e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul } 186b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul} 187b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 188b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 189b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstatic void wideline_reset_stipple_counter( struct draw_stage *stage ) 190b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul{ 191b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul stage->next->reset_stipple_counter( stage->next ); 192b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul} 193b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 194b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 195b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstatic void wideline_destroy( struct draw_stage *stage ) 196b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul{ 197b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul draw_free_temp_verts( stage ); 198b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul FREE( stage ); 199b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul} 200b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 201b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 202b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paulstruct draw_stage *draw_wide_line_stage( struct draw_context *draw ) 203b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul{ 204b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul struct wideline_stage *wide = CALLOC_STRUCT(wideline_stage); 2051c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane if (wide == NULL) 2061c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane goto fail; 207b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 208b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul wide->stage.draw = draw; 209eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell wide->stage.name = "wide-line"; 210b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul wide->stage.next = NULL; 211a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell wide->stage.point = draw_pipe_passthrough_point; 212e3a34cc7f6c9f959cdc2af4486e84587fab4d0d7Brian Paul wide->stage.line = wideline_first_line; 2133f6242d3e4d3ee61884a91a3eef4be8dfaadee3cBrian Paul wide->stage.tri = draw_pipe_passthrough_tri; 214b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul wide->stage.flush = wideline_flush; 215b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul wide->stage.reset_stipple_counter = wideline_reset_stipple_counter; 216b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul wide->stage.destroy = wideline_destroy; 217b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul 2181c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane if (!draw_alloc_temp_verts( &wide->stage, 4 )) 2191c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane goto fail; 2201c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane 221b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul return &wide->stage; 2221c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane 2231c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihanefail: 2241c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane if (wide) 2251c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane wide->stage.destroy( &wide->stage ); 2261c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane 2271c377cea1094c0b5414c663adf2fd393bf41ddfbAlan Hourihane return NULL; 228b233b1e2dc2fca2f45b3cb5df167e3675b8cc1fbBrian Paul} 229