draw_pipe_vbuf.c revision 7ca0ce38340144794267609646048b3820d594ab
11a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**************************************************************************
21a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
31a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
41a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * All Rights Reserved.
51a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
61a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
71a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * copy of this software and associated documentation files (the
81a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * "Software"), to deal in the Software without restriction, including
91a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
101a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
111a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * permit persons to whom the Software is furnished to do so, subject to
121a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * the following conditions:
131a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
141a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * The above copyright notice and this permission notice (including the
151a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * next paragraph) shall be included in all copies or substantial portions
161a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * of the Software.
171a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
201a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
211a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
231a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
241a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
251a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
261a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca **************************************************************************/
271a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
281a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
291a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * \file
301a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Vertex buffer drawing stage.
311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca *
32ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca * \author Jose Fonseca <jrfonsec@tungstengraphics.com>
331a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * \author Keith Whitwell <keith@tungstengraphics.com>
341a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
37ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
384f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_math.h"
394f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
401a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4109059259bed779360158664625e41a67f7496a74José Fonseca#include "draw_vbuf.h"
4209059259bed779360158664625e41a67f7496a74José Fonseca#include "draw_private.h"
4309059259bed779360158664625e41a67f7496a74José Fonseca#include "draw_vertex.h"
44507fbe2d327efb8d608ce8e07436b97321560808Keith Whitwell#include "draw_pipe.h"
45cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell#include "translate/translate.h"
461a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell#include "translate/translate_cache.h"
4709059259bed779360158664625e41a67f7496a74José Fonseca
481a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
491a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
501a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Vertex buffer emit stage.
511a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
521a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct vbuf_stage {
531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct draw_stage stage; /**< This must be first (base class) */
541a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
551a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_render *render;
561a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
573b93c74a8d6e36039b79ddf38c11e27aa0bd3b9bJosé Fonseca   const struct vertex_info *vinfo;
583b93c74a8d6e36039b79ddf38c11e27aa0bd3b9bJosé Fonseca
591a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /** Vertex size in bytes */
601a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned vertex_size;
611a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
62cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   struct translate *translate;
6309059259bed779360158664625e41a67f7496a74José Fonseca
641a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /* FIXME: we have no guarantee that 'unsigned' is 32bit */
651a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
661a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /** Vertices in hardware format */
671a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned *vertices;
681a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned *vertex_ptr;
691a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned max_vertices;
701a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned nr_vertices;
711a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
721a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /** Indices */
731a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   ushort *indices;
741a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned max_indices;
751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned nr_indices;
761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
77cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Cache point size somewhere it's address won't change:
78cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
79cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   float point_size;
801a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
811a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   struct translate_cache *cache;
821a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca};
831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
841a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Basically a cast wrapper.
871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
881a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic INLINE struct vbuf_stage *
891a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_stage( struct draw_stage *stage )
901a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
911a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   assert(stage);
921a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   return (struct vbuf_stage *)stage;
931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
941a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
951a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
96c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecastatic void vbuf_flush_vertices( struct vbuf_stage *vbuf );
97c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecastatic void vbuf_alloc_vertices( struct vbuf_stage *vbuf );
981a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
991a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1001a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic INLINE boolean
1011a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecaoverflow( void *map, void *ptr, unsigned bytes, unsigned bufsz )
1021a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
1031a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned long used = (unsigned long) ((char *)ptr - (char *)map);
1041a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   return (used + bytes) > bufsz;
1051a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1061a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1071a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1081a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic INLINE void
1091a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecacheck_space( struct vbuf_stage *vbuf, unsigned nr )
1101a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
111befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   if (vbuf->nr_vertices + nr > vbuf->max_vertices ||
112befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell       vbuf->nr_indices + nr > vbuf->max_indices)
113befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   {
114befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      vbuf_flush_vertices( vbuf );
115befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      vbuf_alloc_vertices( vbuf );
116d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   }
1171a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
120f94425b316b57ad19ce067a449b20ebee50064f9José Fonseca
121f94425b316b57ad19ce067a449b20ebee50064f9José Fonseca
1221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
12359e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * Extract the needed fields from post-transformed vertex and emit
12459e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * a hardware(driver) vertex.
1251a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Recall that the vertices are constructed by the 'draw' module and
1261a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * have a couple of slots at the beginning (1-dword header, 4-dword
12759e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * clip pos) that we ignore here.  We only use the vertex->data[] fields.
1281a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
129cb9f0a589623397c3437911aeef39f189213527aKeith Whitwellstatic INLINE ushort
1301a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecaemit_vertex( struct vbuf_stage *vbuf,
1311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca             struct vertex_header *vertex )
1321a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
133cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   if(vertex->vertex_id == UNDEFINED_VERTEX_ID) {
134cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      /* Hmm - vertices are emitted one at a time - better make sure
135cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell       * set_buffer is efficient.  Consider a special one-shot mode for
136cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell       * translate.
137cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell       */
1382161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell      /* Note: we really do want data[0] here, not data[pos]:
1392161b0fafcdc16703162dd489d2ec1e7114cce4cKeith Whitwell       */
140cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      vbuf->translate->set_buffer(vbuf->translate, 0, vertex->data[0], 0);
1417ca0ce38340144794267609646048b3820d594abMichal Krol      vbuf->translate->run(vbuf->translate, 0, 1, 0, vbuf->vertex_ptr);
142cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
14343be7a4819ad342e1cb3f8e3fb966a8a78dc2c1bKeith Whitwell      if (0) draw_dump_emitted_vertex(vbuf->vinfo, (uint8_t *)vbuf->vertex_ptr);
1441a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
145cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      vbuf->vertex_ptr += vbuf->vertex_size/4;
146cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      vertex->vertex_id = vbuf->nr_vertices++;
147cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   }
148909e8ce543a6c1e97d55791d2069cbdc56ea9db6Keith Whitwell
1498808d62f608d1397ee75d0087301d0b0a0278244José Fonseca   return (ushort)vertex->vertex_id;
15009059259bed779360158664625e41a67f7496a74José Fonseca}
15109059259bed779360158664625e41a67f7496a74José Fonseca
15209059259bed779360158664625e41a67f7496a74José Fonseca
1531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
1541a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_tri( struct draw_stage *stage,
1551a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca          struct prim_header *prim )
1561a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
1571a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
1581a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned i;
1591a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1601a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   check_space( vbuf, 3 );
1611a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1628b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul   if (vbuf->stage.draw->rasterizer->flatshade_first) {
1638b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul      /* Put provoking vertex in position expected by the driver.
1648b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul       * Emit last provoking vertex in first pos.
1658b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul       * Swap verts 0 & 1 to preserve polygon winding.
1668b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul       */
1678b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[2] );
1688b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[0] );
1698b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[1] );
1708b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul   }
1718b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul   else {
1728b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul      for (i = 0; i < 3; i++) {
1738b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul         vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] );
1748b45c9ce6e17f9b74f49d308eda3da1c768bc726Brian Paul      }
1751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   }
1761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1771a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1781a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1791a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
1801a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_line( struct draw_stage *stage,
1811a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca           struct prim_header *prim )
1821a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
1831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
1841a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned i;
1851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   check_space( vbuf, 2 );
1871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1881a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   for (i = 0; i < 2; i++) {
189cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] );
1901a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   }
1911a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1921a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1941a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
1951a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_point( struct draw_stage *stage,
1961a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca            struct prim_header *prim )
1971a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
1981a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
1991a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
2001a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   check_space( vbuf, 1 );
2011a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
202cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[0] );
2031a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
2041a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
2051a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
206cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
207cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
20859e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul/**
20959e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * Set the prim type for subsequent vertices.
21059e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * This may result in a new vertex size.  The existing vbuffer (if any)
21159e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * will be flushed if needed and a new one allocated.
21259e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul */
21359e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paulstatic void
214befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwellvbuf_start_prim( struct vbuf_stage *vbuf, uint prim )
21559e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul{
216cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   struct translate_key hw_key;
217cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   unsigned dst_offset;
218cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   unsigned i;
21959e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
220cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->render->set_primitive(vbuf->render, prim);
22159e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
222cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Must do this after set_primitive() above:
223cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    *
224cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    * XXX: need some state managment to track when this needs to be
225cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    * recalculated.  The driver should tell us whether there was a
226cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    * state change.
227cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
228cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->vinfo = vbuf->render->get_vertex_info(vbuf->render);
229befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf->vertex_size = vbuf->vinfo->size * sizeof(float);
23059e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
231cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Translate from pipeline vertices to hw vertices.
232cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
233cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   dst_offset = 0;
234cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
235cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   for (i = 0; i < vbuf->vinfo->num_attribs; i++) {
236cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      unsigned emit_sz = 0;
237cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      unsigned src_buffer = 0;
238cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      unsigned output_format;
23953d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell      unsigned src_offset = (vbuf->vinfo->attrib[i].src_index * 4 * sizeof(float) );
240cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
24153d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell      switch (vbuf->vinfo->attrib[i].emit) {
242cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      case EMIT_4F:
243cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
244cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 4 * sizeof(float);
245cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 break;
246cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      case EMIT_3F:
247cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_R32G32B32_FLOAT;
248cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 3 * sizeof(float);
249cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 break;
250cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      case EMIT_2F:
251cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_R32G32_FLOAT;
252cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 2 * sizeof(float);
253cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 break;
254cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      case EMIT_1F:
255cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_R32_FLOAT;
256cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 1 * sizeof(float);
257cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 break;
258cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      case EMIT_1F_PSIZE:
259cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_R32_FLOAT;
260cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 1 * sizeof(float);
261cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 src_buffer = 1;
262cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 src_offset = 0;
263cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 break;
264cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      case EMIT_4UB:
265cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_B8G8R8A8_UNORM;
266cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 4 * sizeof(ubyte);
267d6a965972b48fec95a2bcb778cf05d0468ba2573Keith Whitwell         break;
268cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      default:
269cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 assert(0);
270cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 output_format = PIPE_FORMAT_NONE;
271cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 emit_sz = 0;
272cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 break;
273cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      }
274cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
275cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
276cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].input_buffer = src_buffer;
277cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].input_offset = src_offset;
2787ca0ce38340144794267609646048b3820d594abMichal Krol      hw_key.element[i].instance_divisor = 0;
279cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].output_format = output_format;
280cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].output_offset = dst_offset;
281cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
282cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      dst_offset += emit_sz;
283cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   }
284cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
285cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   hw_key.nr_elements = vbuf->vinfo->num_attribs;
286cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   hw_key.output_stride = vbuf->vinfo->size * 4;
287cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
288cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Don't bother with caching at this stage:
289cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
290cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   if (!vbuf->translate ||
2911a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell       translate_key_compare(&vbuf->translate->key, &hw_key) != 0)
292cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   {
2931a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      translate_key_sanitize(&hw_key);
2941a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      vbuf->translate = translate_cache_find(vbuf->cache, &hw_key);
295cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
296cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0);
297cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   }
298cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
299cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->point_size = vbuf->stage.draw->rasterizer->point_size;
300cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
301cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Allocate new buffer?
302cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
303befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   assert(vbuf->vertices == NULL);
304befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_alloc_vertices(vbuf);
30559e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul}
30659e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
30759e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
3081a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
3091a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_first_tri( struct draw_stage *stage,
3101a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                struct prim_header *prim )
3111a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
312c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
313c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
314befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices( vbuf );
315befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_start_prim(vbuf, PIPE_PRIM_TRIANGLES);
3161a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->tri = vbuf_tri;
317d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   stage->tri( stage, prim );
3181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3201a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3211a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
3221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_first_line( struct draw_stage *stage,
3231a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                 struct prim_header *prim )
3241a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
325c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
326c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
327befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices( vbuf );
328befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_start_prim(vbuf, PIPE_PRIM_LINES);
3291a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->line = vbuf_line;
330d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   stage->line( stage, prim );
3311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3321a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3331a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3341a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
3351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_first_point( struct draw_stage *stage,
3361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                  struct prim_header *prim )
3371a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
338c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
339c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
340befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices(vbuf);
341befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_start_prim(vbuf, PIPE_PRIM_POINTS);
3421a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->point = vbuf_point;
343d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   stage->point( stage, prim );
3441a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3451a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3461a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3471a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3481a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
3491a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Flush existing vertex buffer and allocate a new one.
3501a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
3511a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
352c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecavbuf_flush_vertices( struct vbuf_stage *vbuf )
3531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
354befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   if(vbuf->vertices) {
355befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3561c4f67b980b6bec5788336a9cdd18c4fcec5e492Keith Whitwell      vbuf->render->unmap_vertices( vbuf->render, 0, vbuf->nr_vertices - 1 );
357befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
358befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      if (vbuf->nr_indices)
359befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      {
360befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell         vbuf->render->draw(vbuf->render,
361befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                            vbuf->indices,
362befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                            vbuf->nr_indices );
363befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
364befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell         vbuf->nr_indices = 0;
365befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      }
366befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3671a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      /* Reset temporary vertices ids */
3681a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      if(vbuf->nr_vertices)
3691a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca	 draw_reset_vertex_ids( vbuf->stage.draw );
3701a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3711a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      /* Free the vertex buffer */
372befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      vbuf->render->release_vertices( vbuf->render );
373befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3743b93c74a8d6e36039b79ddf38c11e27aa0bd3b9bJosé Fonseca      vbuf->max_vertices = vbuf->nr_vertices = 0;
3751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      vbuf->vertex_ptr = vbuf->vertices = NULL;
3761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   }
377d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul}
3781a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
379d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul
380d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paulstatic void
381c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecavbuf_alloc_vertices( struct vbuf_stage *vbuf )
382d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul{
3831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   assert(!vbuf->nr_indices);
384d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   assert(!vbuf->vertices);
3851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /* Allocate a new vertex buffer */
3871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->max_vertices = vbuf->render->max_vertex_buffer_bytes / vbuf->vertex_size;
3880a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell
389f1401385587882bb9d18a5f5b01dcbb71ddf0a2fBrian Paul   /* even number */
390f1401385587882bb9d18a5f5b01dcbb71ddf0a2fBrian Paul   vbuf->max_vertices = vbuf->max_vertices & ~1;
391f1401385587882bb9d18a5f5b01dcbb71ddf0a2fBrian Paul
392874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca   if(vbuf->max_vertices >= UNDEFINED_VERTEX_ID)
393874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca      vbuf->max_vertices = UNDEFINED_VERTEX_ID - 1;
394874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca
3950a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell   /* Must always succeed -- driver gives us a
3960a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    * 'max_vertex_buffer_bytes' which it guarantees it can allocate,
3970a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    * and it will flush itself if necessary to do so.  If this does
3980a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    * fail, we are basically without usable hardware.
3990a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    */
400befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf->render->allocate_vertices(vbuf->render,
401befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                                   (ushort) vbuf->vertex_size,
402befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                                   (ushort) vbuf->max_vertices);
403befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
404befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf->vertices = (uint *) vbuf->render->map_vertices( vbuf->render );
405befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
4061a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->vertex_ptr = vbuf->vertices;
4071a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
4081a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4091a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4101a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4111a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
4120bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paulvbuf_flush( struct draw_stage *stage, unsigned flags )
4131a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
414c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
415c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
416befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices( vbuf );
4171603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul
4181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->point = vbuf_first_point;
4191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->line = vbuf_first_line;
4201a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->tri = vbuf_first_tri;
4211a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
4221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4231a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4241a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
4251a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_reset_stipple_counter( struct draw_stage *stage )
4261a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
4271603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul   /* XXX: Need to do something here for hardware with linestipple.
4281603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul    */
429f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul   (void) stage;
4301a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
4311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4321a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
433d75454840672f462de933724daae24a839aac48eMichal Krolstatic void vbuf_destroy( struct draw_stage *stage )
434d75454840672f462de933724daae24a839aac48eMichal Krol{
435d75454840672f462de933724daae24a839aac48eMichal Krol   struct vbuf_stage *vbuf = vbuf_stage( stage );
436d75454840672f462de933724daae24a839aac48eMichal Krol
43709059259bed779360158664625e41a67f7496a74José Fonseca   if(vbuf->indices)
43809059259bed779360158664625e41a67f7496a74José Fonseca      align_free( vbuf->indices );
43909059259bed779360158664625e41a67f7496a74José Fonseca
44019780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol   if (vbuf->render)
44119780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol      vbuf->render->destroy( vbuf->render );
44219780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol
4431a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   if (vbuf->cache)
4441a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      translate_cache_destroy(vbuf->cache);
4451a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
446d75454840672f462de933724daae24a839aac48eMichal Krol   FREE( stage );
447d75454840672f462de933724daae24a839aac48eMichal Krol}
448d75454840672f462de933724daae24a839aac48eMichal Krol
449d75454840672f462de933724daae24a839aac48eMichal Krol
4501a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
4511a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Create a new primitive vbuf/render stage.
4521a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
4531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct draw_stage *draw_vbuf_stage( struct draw_context *draw,
4541a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                                    struct vbuf_render *render )
4551a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
4561a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = CALLOC_STRUCT(vbuf_stage);
4570d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   if (vbuf == NULL)
458d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell      goto fail;
45909059259bed779360158664625e41a67f7496a74José Fonseca
4601a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.draw = draw;
461eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell   vbuf->stage.name = "vbuf";
4621a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.point = vbuf_first_point;
4631a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.line = vbuf_first_line;
4641a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.tri = vbuf_first_tri;
4650bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paul   vbuf->stage.flush = vbuf_flush;
4661a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.reset_stipple_counter = vbuf_reset_stipple_counter;
467d75454840672f462de933724daae24a839aac48eMichal Krol   vbuf->stage.destroy = vbuf_destroy;
4681a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4691a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->render = render;
470d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   vbuf->max_indices = MAX2(render->max_indices, UNDEFINED_VERTEX_ID-1);
4711a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
472d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   vbuf->indices = (ushort *) align_malloc( vbuf->max_indices *
473d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell					    sizeof(vbuf->indices[0]),
474d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell					    16 );
4750d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   if (!vbuf->indices)
476d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell      goto fail;
4771a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
4781a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   vbuf->cache = translate_cache_create();
4791a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   if (!vbuf->cache)
4801a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      goto fail;
4811a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
4821a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->vertices = NULL;
4841a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->vertex_ptr = vbuf->vertices;
48509059259bed779360158664625e41a67f7496a74José Fonseca
4861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   return &vbuf->stage;
487d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell
488d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell fail:
489d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   if (vbuf)
490d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell      vbuf_destroy(&vbuf->stage);
491d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell
492d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   return NULL;
4931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
494