1a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell/************************************************************************** 2a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * 3a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas. 4a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * All Rights Reserved. 5a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * 6a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * copy of this software and associated documentation files (the 8a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * "Software"), to deal in the Software without restriction, including 9a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 10a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 11a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * permit persons to whom the Software is furnished to do so, subject to 12a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * the following conditions: 13a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * 14a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * The above copyright notice and this permission notice (including the 15a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * next paragraph) shall be included in all copies or substantial portions 16a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * of the Software. 17a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * 18a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * 26a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell **************************************************************************/ 27a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 28a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell /* 29a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * Authors: 30a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * Keith Whitwell <keith@tungstengraphics.com> 31a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell */ 32a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 334f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 34a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell#include "draw/draw_private.h" 35a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell#include "draw/draw_pipe.h" 36a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 37a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 38a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 39a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid 40a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwelldraw_pipe_passthrough_point(struct draw_stage *stage, struct prim_header *header) 41a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell{ 42a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->next->point(stage->next, header); 43a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell} 44a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 45a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid 46a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwelldraw_pipe_passthrough_line(struct draw_stage *stage, struct prim_header *header) 47a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell{ 48a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->next->line(stage->next, header); 49a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell} 50a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 51a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid 52a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwelldraw_pipe_passthrough_tri(struct draw_stage *stage, struct prim_header *header) 53a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell{ 54a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->next->tri(stage->next, header); 55a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell} 56a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 57a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 58a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 59a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 60a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 61a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell/* This is only used for temporary verts. 62a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell */ 63a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell#define MAX_VERTEX_SIZE ((2 + PIPE_MAX_SHADER_OUTPUTS) * 4 * sizeof(float)) 64a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 65a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 66a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell/** 67a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * Allocate space for temporary post-transform vertices, such as for clipping. 68a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell */ 69a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellboolean draw_alloc_temp_verts( struct draw_stage *stage, unsigned nr ) 70a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell{ 71a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell assert(!stage->tmp); 72a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 73a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->tmp = NULL; 74a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->nr_tmps = nr; 75a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 760d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell if (nr != 0) 770d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell { 780d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell unsigned i; 790d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell ubyte *store = (ubyte *) MALLOC( MAX_VERTEX_SIZE * nr ); 800d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell 810d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell if (store == NULL) 820d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell return FALSE; 83a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 840d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell stage->tmp = (struct vertex_header **) MALLOC( sizeof(struct vertex_header *) * nr ); 850d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell if (stage->tmp == NULL) { 860d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell FREE(store); 870d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell return FALSE; 880d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell } 890d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell 900d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell for (i = 0; i < nr; i++) 910d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell stage->tmp[i] = (struct vertex_header *)(store + i * MAX_VERTEX_SIZE); 920d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell } 93a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 94a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell return TRUE; 95a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell} 96a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 97a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 98a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid draw_free_temp_verts( struct draw_stage *stage ) 99a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell{ 100a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell if (stage->tmp) { 101a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell FREE( stage->tmp[0] ); 102a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell FREE( stage->tmp ); 103a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->tmp = NULL; 104a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell } 105a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell} 106a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 107a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 108a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell/* Reset vertex ids. This is basically a type of flush. 109a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * 110a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell * Called only from draw_pipe_vbuf.c 111a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell */ 112a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwellvoid draw_reset_vertex_ids(struct draw_context *draw) 113a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell{ 114a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell struct draw_stage *stage = draw->pipeline.first; 115a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 116a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell while (stage) { 117a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell unsigned i; 118a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 119a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell for (i = 0; i < stage->nr_tmps; i++) 120a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage->tmp[i]->vertex_id = UNDEFINED_VERTEX_ID; 121a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 122a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell stage = stage->next; 123a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell } 124a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 125a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell if (draw->pipeline.verts) 126a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell { 127a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell unsigned i; 128a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell char *verts = draw->pipeline.verts; 129a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell unsigned stride = draw->pipeline.vertex_stride; 130a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 131a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell for (i = 0; i < draw->pipeline.vertex_count; i++) { 132a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell ((struct vertex_header *)verts)->vertex_id = UNDEFINED_VERTEX_ID; 133a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell verts += stride; 134a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell } 135a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell } 136a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell} 137a918a9c744f656c8bf2e3fd2841732e01a5ccefcKeith Whitwell 138