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