13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/************************************************************************** 23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * All Rights Reserved. 53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * copy of this software and associated documentation files (the 83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * "Software"), to deal in the Software without restriction, including 93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * permit persons to whom the Software is furnished to do so, subject to 123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * the following conditions: 133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * The above copyright notice and this permission notice (including the 153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * next paragraph) shall be included in all copies or substantial portions 163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * of the Software. 173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org **************************************************************************/ 273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Authors: Keith Whitwell <keith@tungstengraphics.com> 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 31760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org#include "pipe/p_context.h" 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_defines.h" 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "pipe/p_shader_tokens.h" 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_math.h" 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_memory.h" 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "draw_private.h" 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "draw_pipe.h" 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct wideline_stage { 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct draw_stage stage; 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org float half_line_width; 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org}; 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic INLINE struct wideline_stage *wideline_stage( struct draw_stage *stage ) 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return (struct wideline_stage *)stage; 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Draw a wide line by drawing a quad (two triangles). 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void wideline_line( struct draw_stage *stage, 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct prim_header *header ) 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /*const struct wideline_stage *wide = wideline_stage(stage);*/ 62760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org const unsigned pos = draw_current_shader_position_output(stage->draw); 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const float half_width = 0.5f * stage->draw->rasterizer->line_width; 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct prim_header tri; 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vertex_header *v0 = dup_vert(stage, header->v[0], 0); 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vertex_header *v1 = dup_vert(stage, header->v[0], 1); 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vertex_header *v2 = dup_vert(stage, header->v[1], 2); 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct vertex_header *v3 = dup_vert(stage, header->v[1], 3); 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org float *pos0 = v0->data[pos]; 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org float *pos1 = v1->data[pos]; 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org float *pos2 = v2->data[pos]; 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org float *pos3 = v3->data[pos]; 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const float dx = fabsf(pos0[0] - pos2[0]); 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org const float dy = fabsf(pos0[1] - pos2[1]); 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 80760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org const boolean gl_rasterization_rules = 81760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org stage->draw->rasterizer->gl_rasterization_rules; 82760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* small tweak to meet GL specification */ 84760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org const float bias = gl_rasterization_rules ? 0.125f : 0.0f; 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Draw wide line as a quad (two tris) by "stretching" the line along 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * X or Y. 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * We need to tweak coords in several ways to be conformant here. 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (dx > dy) { 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* x-major line */ 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos0[1] = pos0[1] - half_width - bias; 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos1[1] = pos1[1] + half_width - bias; 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos2[1] = pos2[1] - half_width - bias; 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos3[1] = pos3[1] + half_width - bias; 98760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (gl_rasterization_rules) { 99760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (pos0[0] < pos2[0]) { 100760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org /* left to right line */ 101760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos0[0] -= 0.5f; 102760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos1[0] -= 0.5f; 103760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos2[0] -= 0.5f; 104760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos3[0] -= 0.5f; 105760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org } 106760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org else { 107760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org /* right to left line */ 108760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos0[0] += 0.5f; 109760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos1[0] += 0.5f; 110760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos2[0] += 0.5f; 111760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos3[0] += 0.5f; 112760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org } 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org else { 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org /* y-major line */ 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos0[0] = pos0[0] - half_width + bias; 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos1[0] = pos1[0] + half_width + bias; 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos2[0] = pos2[0] - half_width + bias; 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org pos3[0] = pos3[0] + half_width + bias; 121760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (gl_rasterization_rules) { 122760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (pos0[1] < pos2[1]) { 123760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org /* top to bottom line */ 124760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos0[1] -= 0.5f; 125760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos1[1] -= 0.5f; 126760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos2[1] -= 0.5f; 127760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos3[1] -= 0.5f; 128760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org } 129760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org else { 130760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org /* bottom to top line */ 131760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos0[1] += 0.5f; 132760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos1[1] += 0.5f; 133760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos2[1] += 0.5f; 134760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pos3[1] += 0.5f; 135760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org } 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.det = header->det; /* only the sign matters */ 1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.v[0] = v0; 1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.v[1] = v2; 1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.v[2] = v3; 1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->tri( stage->next, &tri ); 1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.v[0] = v0; 1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.v[1] = v3; 1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org tri.v[2] = v1; 1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->tri( stage->next, &tri ); 1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 152760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgstatic void wideline_first_line( struct draw_stage *stage, 153760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct prim_header *header ) 154760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org{ 155760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct draw_context *draw = stage->draw; 156760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct pipe_context *pipe = draw->pipe; 157760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org const struct pipe_rasterizer_state *rast = draw->rasterizer; 158760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org void *r; 159760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 160760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org /* Disable triangle culling, stippling, unfilled mode etc. */ 161760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org r = draw_get_rasterizer_no_cull(draw, rast->scissor, rast->flatshade); 162760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org draw->suspend_flushing = TRUE; 163760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pipe->bind_rasterizer_state(pipe, r); 164760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org draw->suspend_flushing = FALSE; 165760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 166760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org stage->line = wideline_line; 167760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 168760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org wideline_line(stage, header); 169760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org} 170760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 171760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void wideline_flush( struct draw_stage *stage, unsigned flags ) 1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 174760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct draw_context *draw = stage->draw; 175760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org struct pipe_context *pipe = draw->pipe; 176760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 177760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org stage->line = wideline_first_line; 1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->flush( stage->next, flags ); 179760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 180760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org /* restore original rasterizer state */ 181760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (draw->rast_handle) { 182760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org draw->suspend_flushing = TRUE; 183760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org pipe->bind_rasterizer_state(pipe, draw->rast_handle); 184760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org draw->suspend_flushing = FALSE; 185760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org } 1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void wideline_reset_stipple_counter( struct draw_stage *stage ) 1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->reset_stipple_counter( stage->next ); 1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstatic void wideline_destroy( struct draw_stage *stage ) 1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org draw_free_temp_verts( stage ); 1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE( stage ); 1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgstruct draw_stage *draw_wide_line_stage( struct draw_context *draw ) 2033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 2043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct wideline_stage *wide = CALLOC_STRUCT(wideline_stage); 205760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (wide == NULL) 206760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org goto fail; 2073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 2083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.draw = draw; 2093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.name = "wide-line"; 2103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.next = NULL; 2113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.point = draw_pipe_passthrough_point; 212760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org wide->stage.line = wideline_first_line; 2133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.tri = draw_pipe_passthrough_tri; 2143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.flush = wideline_flush; 2153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.reset_stipple_counter = wideline_reset_stipple_counter; 2163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org wide->stage.destroy = wideline_destroy; 2173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 218760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (!draw_alloc_temp_verts( &wide->stage, 4 )) 219760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org goto fail; 220760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 2213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return &wide->stage; 222760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 223760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.orgfail: 224760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org if (wide) 225760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org wide->stage.destroy( &wide->stage ); 226760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org 227760fd893ba809a7a5daa25c2749ff502f7186e83kbr@chromium.org return NULL; 2283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 229