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 /* 293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Authors: 303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Keith Whitwell <keith@tungstengraphics.com> 313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "util/u_memory.h" 343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "draw/draw_private.h" 353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#include "draw/draw_pipe.h" 363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgdraw_pipe_passthrough_point(struct draw_stage *stage, struct prim_header *header) 413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->point(stage->next, header); 433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgdraw_pipe_passthrough_line(struct draw_stage *stage, struct prim_header *header) 473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->line(stage->next, header); 493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid 523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgdraw_pipe_passthrough_tri(struct draw_stage *stage, struct prim_header *header) 533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->next->tri(stage->next, header); 553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* This is only used for temporary verts. 623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org#define MAX_VERTEX_SIZE ((2 + PIPE_MAX_SHADER_OUTPUTS) * 4 * sizeof(float)) 643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/** 673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Allocate space for temporary post-transform vertices, such as for clipping. 683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgboolean draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr ) 703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org assert(!stage->tmp); 723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->tmp = NULL; 743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->nr_tmps = nr; 753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (nr != 0) 773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org { 783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ubyte *store = (ubyte *) MALLOC( MAX_VERTEX_SIZE * nr ); 803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (store == NULL) 823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return FALSE; 833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->tmp = (struct vertex_header **) MALLOC( sizeof(struct vertex_header *) * nr ); 853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (stage->tmp == NULL) { 863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE(store); 873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return FALSE; 883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for (i = 0; i < nr; i++) 913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->tmp[i] = (struct vertex_header *)(store + i * MAX_VERTEX_SIZE); 923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org return TRUE; 953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid draw_free_temp_verts( struct draw_stage *stage ) 993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (stage->tmp) { 1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE( stage->tmp[0] ); 1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org FREE( stage->tmp ); 1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->tmp = NULL; 1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org/* Reset vertex ids. This is basically a type of flush. 1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * 1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org * Called only from draw_pipe_vbuf.c 1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org */ 1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgvoid draw_reset_vertex_ids(struct draw_context *draw) 1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org{ 1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org struct draw_stage *stage = draw->pipeline.first; 1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org while (stage) { 1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for (i = 0; i < stage->nr_tmps; i++) 1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage->tmp[i]->vertex_id = UNDEFINED_VERTEX_ID; 1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org stage = stage->next; 1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org if (draw->pipeline.verts) 1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org { 1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned i; 1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org char *verts = draw->pipeline.verts; 1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org unsigned stride = draw->pipeline.vertex_stride; 1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org for (i = 0; i < draw->pipeline.vertex_count; i++) { 1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org ((struct vertex_header *)verts)->vertex_id = UNDEFINED_VERTEX_ID; 1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org verts += stride; 1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org } 1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org} 1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org 138