draw_pipe_vbuf.c revision cb136a93aba4dc64db7e446b0fbc36c9172e4017
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       */
1402a30d3d74a0b87f8066659952628ccd072a4e2b0José Fonseca      vbuf->translate->set_buffer(vbuf->translate, 0, vertex->data[0], 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
162cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul   for (i = 0; i < 3; i++) {
163cb136a93aba4dc64db7e446b0fbc36c9172e4017Brian Paul      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] );
1641a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   }
1651a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1661a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1671a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1681a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
1691a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_line( struct draw_stage *stage,
1701a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca           struct prim_header *prim )
1711a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
1721a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
1731a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   unsigned i;
1741a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   check_space( vbuf, 2 );
1761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1771a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   for (i = 0; i < 2; i++) {
178cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[i] );
1791a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   }
1801a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1811a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1821a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
1841a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_point( struct draw_stage *stage,
1851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca            struct prim_header *prim )
1861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
1871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
1881a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1891a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   check_space( vbuf, 1 );
1901a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
191cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->indices[vbuf->nr_indices++] = emit_vertex( vbuf, prim->v[0] );
1921a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
1931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
1941a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
195cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
196cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
19759e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul/**
19859e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * Set the prim type for subsequent vertices.
19959e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * This may result in a new vertex size.  The existing vbuffer (if any)
20059e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul * will be flushed if needed and a new one allocated.
20159e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul */
20259e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paulstatic void
203befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwellvbuf_start_prim( struct vbuf_stage *vbuf, uint prim )
20459e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul{
205cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   struct translate_key hw_key;
206cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   unsigned dst_offset;
207cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   unsigned i;
20859e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
209cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->render->set_primitive(vbuf->render, prim);
21059e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
211cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Must do this after set_primitive() above:
212cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    *
213cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    * XXX: need some state managment to track when this needs to be
214cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    * recalculated.  The driver should tell us whether there was a
215cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    * state change.
216cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
217cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->vinfo = vbuf->render->get_vertex_info(vbuf->render);
218befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf->vertex_size = vbuf->vinfo->size * sizeof(float);
21959e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
220cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Translate from pipeline vertices to hw vertices.
221cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
222cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   dst_offset = 0;
223cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
224cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   for (i = 0; i < vbuf->vinfo->num_attribs; i++) {
225cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      unsigned emit_sz = 0;
226cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      unsigned src_buffer = 0;
227b609cfc7c9c38f26e7e6d6f7dd5dd6d38f4ed209José Fonseca      enum pipe_format output_format;
22853d4706c6c0922160f310834daaec5718ff1c511Keith Whitwell      unsigned src_offset = (vbuf->vinfo->attrib[i].src_index * 4 * sizeof(float) );
229cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
23084a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      output_format = draw_translate_vinfo_format(vbuf->vinfo->attrib[i].emit);
23184a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      emit_sz = draw_translate_vinfo_size(vbuf->vinfo->attrib[i].emit);
23284a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz
23384a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      /* doesn't handle EMIT_OMIT */
23484a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      assert(emit_sz != 0);
23584a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz
23684a8347b9f6ef0c1b2519e9bd5fef2ce3c85afb7Jakob Bornecrantz      if (vbuf->vinfo->attrib[i].emit == EMIT_1F_PSIZE) {
237cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 src_buffer = 1;
238cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell	 src_offset = 0;
239cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      }
240543b9566bdaa48fea2df1866fa1310c1cdbcde27Michal Krol
241543b9566bdaa48fea2df1866fa1310c1cdbcde27Michal Krol      hw_key.element[i].type = TRANSLATE_ELEMENT_NORMAL;
242cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].input_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
243cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].input_buffer = src_buffer;
244cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].input_offset = src_offset;
2457ca0ce38340144794267609646048b3820d594abMichal Krol      hw_key.element[i].instance_divisor = 0;
246cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].output_format = output_format;
247cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      hw_key.element[i].output_offset = dst_offset;
248cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
249cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell      dst_offset += emit_sz;
250cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   }
251cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
252cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   hw_key.nr_elements = vbuf->vinfo->num_attribs;
253cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   hw_key.output_stride = vbuf->vinfo->size * 4;
254cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
255cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Don't bother with caching at this stage:
256cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
257cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   if (!vbuf->translate ||
2581a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell       translate_key_compare(&vbuf->translate->key, &hw_key) != 0)
259cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   {
2601a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      translate_key_sanitize(&hw_key);
2611a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      vbuf->translate = translate_cache_find(vbuf->cache, &hw_key);
262cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
2632a30d3d74a0b87f8066659952628ccd072a4e2b0José Fonseca      vbuf->translate->set_buffer(vbuf->translate, 1, &vbuf->point_size, 0, ~0);
264cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   }
265cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
266cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   vbuf->point_size = vbuf->stage.draw->rasterizer->point_size;
267cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell
268cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell   /* Allocate new buffer?
269cb9f0a589623397c3437911aeef39f189213527aKeith Whitwell    */
270befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   assert(vbuf->vertices == NULL);
271befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_alloc_vertices(vbuf);
27259e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul}
27359e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
27459e8f3e5e91f27c5d12b810375247fb1ddea68feBrian Paul
2751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
2761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_first_tri( struct draw_stage *stage,
2771a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                struct prim_header *prim )
2781a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
279c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
280c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
281befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices( vbuf );
282befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_start_prim(vbuf, PIPE_PRIM_TRIANGLES);
2831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->tri = vbuf_tri;
284d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   stage->tri( stage, prim );
2851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
2861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
2871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
2881a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
2891a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_first_line( struct draw_stage *stage,
2901a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                 struct prim_header *prim )
2911a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
292c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
293c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
294befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices( vbuf );
295befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_start_prim(vbuf, PIPE_PRIM_LINES);
2961a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->line = vbuf_line;
297d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   stage->line( stage, prim );
2981a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
2991a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3001a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3011a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
3021a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_first_point( struct draw_stage *stage,
3031a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                  struct prim_header *prim )
3041a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
305c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
306c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
307befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices(vbuf);
308befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_start_prim(vbuf, PIPE_PRIM_POINTS);
3091a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->point = vbuf_point;
310d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   stage->point( stage, prim );
3111a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3121a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3131a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3141a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3151a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
3161a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Flush existing vertex buffer and allocate a new one.
3171a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
3181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
319c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecavbuf_flush_vertices( struct vbuf_stage *vbuf )
3201a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
321befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   if(vbuf->vertices) {
322befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3231c4f67b980b6bec5788336a9cdd18c4fcec5e492Keith Whitwell      vbuf->render->unmap_vertices( vbuf->render, 0, vbuf->nr_vertices - 1 );
324befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
325befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      if (vbuf->nr_indices)
326befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      {
327befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell         vbuf->render->draw(vbuf->render,
328befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                            vbuf->indices,
329befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                            vbuf->nr_indices );
330befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
331befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell         vbuf->nr_indices = 0;
332befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      }
333befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3341a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      /* Reset temporary vertices ids */
3351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      if(vbuf->nr_vertices)
3361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca	 draw_reset_vertex_ids( vbuf->stage.draw );
3371a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3381a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      /* Free the vertex buffer */
339befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell      vbuf->render->release_vertices( vbuf->render );
340befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3413b93c74a8d6e36039b79ddf38c11e27aa0bd3b9bJosé Fonseca      vbuf->max_vertices = vbuf->nr_vertices = 0;
3421a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca      vbuf->vertex_ptr = vbuf->vertices = NULL;
3431a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   }
344d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul}
3451a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
346d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul
347d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paulstatic void
348c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecavbuf_alloc_vertices( struct vbuf_stage *vbuf )
349d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul{
3501a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   assert(!vbuf->nr_indices);
351d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul   assert(!vbuf->vertices);
3521a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   /* Allocate a new vertex buffer */
3541a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->max_vertices = vbuf->render->max_vertex_buffer_bytes / vbuf->vertex_size;
3550a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell
356f1401385587882bb9d18a5f5b01dcbb71ddf0a2fBrian Paul   /* even number */
357f1401385587882bb9d18a5f5b01dcbb71ddf0a2fBrian Paul   vbuf->max_vertices = vbuf->max_vertices & ~1;
358f1401385587882bb9d18a5f5b01dcbb71ddf0a2fBrian Paul
359874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca   if(vbuf->max_vertices >= UNDEFINED_VERTEX_ID)
360874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca      vbuf->max_vertices = UNDEFINED_VERTEX_ID - 1;
361874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca
3620a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell   /* Must always succeed -- driver gives us a
3630a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    * 'max_vertex_buffer_bytes' which it guarantees it can allocate,
3640a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    * and it will flush itself if necessary to do so.  If this does
3650a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    * fail, we are basically without usable hardware.
3660a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell    */
367befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf->render->allocate_vertices(vbuf->render,
368befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                                   (ushort) vbuf->vertex_size,
369befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell                                   (ushort) vbuf->max_vertices);
370befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
371befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf->vertices = (uint *) vbuf->render->map_vertices( vbuf->render );
372befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell
3731a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->vertex_ptr = vbuf->vertices;
3741a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3751a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3761a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3771a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3781a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
3790bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paulvbuf_flush( struct draw_stage *stage, unsigned flags )
3801a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
381c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca   struct vbuf_stage *vbuf = vbuf_stage( stage );
382c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca
383befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell   vbuf_flush_vertices( vbuf );
3841603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul
3851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->point = vbuf_first_point;
3861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->line = vbuf_first_line;
3871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   stage->tri = vbuf_first_tri;
3881a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3891a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3901a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3911a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void
3921a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_reset_stipple_counter( struct draw_stage *stage )
3931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
3941603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul   /* XXX: Need to do something here for hardware with linestipple.
3951603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul    */
396f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul   (void) stage;
3971a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
3981a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
3991a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
400d75454840672f462de933724daae24a839aac48eMichal Krolstatic void vbuf_destroy( struct draw_stage *stage )
401d75454840672f462de933724daae24a839aac48eMichal Krol{
402d75454840672f462de933724daae24a839aac48eMichal Krol   struct vbuf_stage *vbuf = vbuf_stage( stage );
403d75454840672f462de933724daae24a839aac48eMichal Krol
40409059259bed779360158664625e41a67f7496a74José Fonseca   if(vbuf->indices)
40509059259bed779360158664625e41a67f7496a74José Fonseca      align_free( vbuf->indices );
40609059259bed779360158664625e41a67f7496a74José Fonseca
40719780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol   if (vbuf->render)
40819780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol      vbuf->render->destroy( vbuf->render );
40919780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol
4101a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   if (vbuf->cache)
4111a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      translate_cache_destroy(vbuf->cache);
4121a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
413d75454840672f462de933724daae24a839aac48eMichal Krol   FREE( stage );
414d75454840672f462de933724daae24a839aac48eMichal Krol}
415d75454840672f462de933724daae24a839aac48eMichal Krol
416d75454840672f462de933724daae24a839aac48eMichal Krol
4171a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/**
4181a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Create a new primitive vbuf/render stage.
4191a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */
4201a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct draw_stage *draw_vbuf_stage( struct draw_context *draw,
4211a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca                                    struct vbuf_render *render )
4221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{
4231a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   struct vbuf_stage *vbuf = CALLOC_STRUCT(vbuf_stage);
4240d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   if (vbuf == NULL)
425d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell      goto fail;
42609059259bed779360158664625e41a67f7496a74José Fonseca
4271a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.draw = draw;
428eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell   vbuf->stage.name = "vbuf";
4291a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.point = vbuf_first_point;
4301a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.line = vbuf_first_line;
4311a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.tri = vbuf_first_tri;
4320bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paul   vbuf->stage.flush = vbuf_flush;
4331a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->stage.reset_stipple_counter = vbuf_reset_stipple_counter;
434d75454840672f462de933724daae24a839aac48eMichal Krol   vbuf->stage.destroy = vbuf_destroy;
4351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->render = render;
437d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   vbuf->max_indices = MAX2(render->max_indices, UNDEFINED_VERTEX_ID-1);
4381a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
439d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   vbuf->indices = (ushort *) align_malloc( vbuf->max_indices *
440d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell					    sizeof(vbuf->indices[0]),
441d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell					    16 );
4420d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell   if (!vbuf->indices)
443d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell      goto fail;
4441a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
4451a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   vbuf->cache = translate_cache_create();
4461a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell   if (!vbuf->cache)
4471a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell      goto fail;
4481a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell
4491a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca
4501a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->vertices = NULL;
4511a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   vbuf->vertex_ptr = vbuf->vertices;
45209059259bed779360158664625e41a67f7496a74José Fonseca
4531a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca   return &vbuf->stage;
454d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell
455d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell fail:
456d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   if (vbuf)
457d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell      vbuf_destroy(&vbuf->stage);
458d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell
459d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell   return NULL;
4601a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca}
461