draw_pipe_vbuf.c revision aa661306828b8c76c1511f05e0fae577f06477b8
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{ 133aa661306828b8c76c1511f05e0fae577f06477b8Brian Paul if (vertex->vertex_id == UNDEFINED_VERTEX_ID && vbuf->vertex_ptr) { 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 { 327740e50c60f03d194aafab93d5251699964800979Brian Paul vbuf->render->draw_elements(vbuf->render, 328740e50c60f03d194aafab93d5251699964800979Brian Paul vbuf->indices, 329740e50c60f03d194aafab93d5251699964800979Brian Paul 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 } 344931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul 345931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul /* Reset point/line/tri function pointers. 346931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul * If (for example) we transition from points to tris and back to points 347931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul * again, we need to call the vbuf_first_point() function again to flush 348931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul * the triangles before drawing more points. This can happen when drawing 349931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul * with front polygon mode = filled and back polygon mode = line or point. 350931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul */ 351931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul vbuf->stage.point = vbuf_first_point; 352931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul vbuf->stage.line = vbuf_first_line; 353931432fea69c29b4029ff23613468c8ad2c0181eBrian Paul vbuf->stage.tri = vbuf_first_tri; 354d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul} 3551a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 356d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul 357d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paulstatic void 358c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonsecavbuf_alloc_vertices( struct vbuf_stage *vbuf ) 359d11fd189ff84ec24df0fb988e5c3e1a9260e038cBrian Paul{ 360aa661306828b8c76c1511f05e0fae577f06477b8Brian Paul if (vbuf->vertex_ptr) { 361aa661306828b8c76c1511f05e0fae577f06477b8Brian Paul assert(!vbuf->nr_indices); 362aa661306828b8c76c1511f05e0fae577f06477b8Brian Paul assert(!vbuf->vertices); 363aa661306828b8c76c1511f05e0fae577f06477b8Brian Paul } 3641a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 3651a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca /* Allocate a new vertex buffer */ 3661a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->max_vertices = vbuf->render->max_vertex_buffer_bytes / vbuf->vertex_size; 3670a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell 368874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca if(vbuf->max_vertices >= UNDEFINED_VERTEX_ID) 369874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca vbuf->max_vertices = UNDEFINED_VERTEX_ID - 1; 370874f364e9ea3a03d29ae4b6e1c7e2843ef8b9e79José Fonseca 3710a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell /* Must always succeed -- driver gives us a 3720a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell * 'max_vertex_buffer_bytes' which it guarantees it can allocate, 3730a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell * and it will flush itself if necessary to do so. If this does 3740a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell * fail, we are basically without usable hardware. 3750a4aea0e86a897d9afb9f2a0ec27f03faf8f1b21Keith Whitwell */ 376befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell vbuf->render->allocate_vertices(vbuf->render, 377befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell (ushort) vbuf->vertex_size, 378befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell (ushort) vbuf->max_vertices); 379befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell 380befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell vbuf->vertices = (uint *) vbuf->render->map_vertices( vbuf->render ); 381befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell 3821a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->vertex_ptr = vbuf->vertices; 3831a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca} 3841a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 3851a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 3861a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 3871a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void 3880bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paulvbuf_flush( struct draw_stage *stage, unsigned flags ) 3891a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{ 390c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca struct vbuf_stage *vbuf = vbuf_stage( stage ); 391c3f10aef386e0af90f8735d8b9598959c17a590fJosé Fonseca 392befa4ff50ec4728de70c04532f8c7342fbd70147Keith Whitwell vbuf_flush_vertices( vbuf ); 3931a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca} 3941a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 3951a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 3961a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastatic void 3971a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecavbuf_reset_stipple_counter( struct draw_stage *stage ) 3981a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{ 3991603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul /* XXX: Need to do something here for hardware with linestipple. 4001603a33fb276d7e78a2e872dfa05aa0093d1329aBrian Paul */ 401f1fb69a6e52260193ec16a9820a66e3e4bb03eddBrian Paul (void) stage; 4021a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca} 4031a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 4041a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 405d75454840672f462de933724daae24a839aac48eMichal Krolstatic void vbuf_destroy( struct draw_stage *stage ) 406d75454840672f462de933724daae24a839aac48eMichal Krol{ 407d75454840672f462de933724daae24a839aac48eMichal Krol struct vbuf_stage *vbuf = vbuf_stage( stage ); 408d75454840672f462de933724daae24a839aac48eMichal Krol 40909059259bed779360158664625e41a67f7496a74José Fonseca if(vbuf->indices) 41009059259bed779360158664625e41a67f7496a74José Fonseca align_free( vbuf->indices ); 41109059259bed779360158664625e41a67f7496a74José Fonseca 41219780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol if (vbuf->render) 41319780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol vbuf->render->destroy( vbuf->render ); 41419780237ff0e6a89f31ecb9079781568bc2d3fdcMichal Krol 4151a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell if (vbuf->cache) 4161a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell translate_cache_destroy(vbuf->cache); 4171a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell 418d75454840672f462de933724daae24a839aac48eMichal Krol FREE( stage ); 419d75454840672f462de933724daae24a839aac48eMichal Krol} 420d75454840672f462de933724daae24a839aac48eMichal Krol 421d75454840672f462de933724daae24a839aac48eMichal Krol 4221a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca/** 4231a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca * Create a new primitive vbuf/render stage. 4241a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca */ 4251a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonsecastruct draw_stage *draw_vbuf_stage( struct draw_context *draw, 4261a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca struct vbuf_render *render ) 4271a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca{ 4281a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca struct vbuf_stage *vbuf = CALLOC_STRUCT(vbuf_stage); 4290d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell if (vbuf == NULL) 430d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell goto fail; 43109059259bed779360158664625e41a67f7496a74José Fonseca 4321a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->stage.draw = draw; 433eb979cef8535914f428d2462e78f713da558fc18Keith Whitwell vbuf->stage.name = "vbuf"; 4341a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->stage.point = vbuf_first_point; 4351a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->stage.line = vbuf_first_line; 4361a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->stage.tri = vbuf_first_tri; 4370bfd085e2866fbbd40209dcee23f0e6240583fe8Brian Paul vbuf->stage.flush = vbuf_flush; 4381a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->stage.reset_stipple_counter = vbuf_reset_stipple_counter; 439d75454840672f462de933724daae24a839aac48eMichal Krol vbuf->stage.destroy = vbuf_destroy; 4401a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 4411a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->render = render; 4423c56280d330f50025fc948041f1413af55c50581Kurt Daverman vbuf->max_indices = MIN2(render->max_indices, UNDEFINED_VERTEX_ID-1); 4431a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 444d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell vbuf->indices = (ushort *) align_malloc( vbuf->max_indices * 445d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell sizeof(vbuf->indices[0]), 446d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell 16 ); 4470d4ece4c5a243dc4b684331bad49f220311e5520Keith Whitwell if (!vbuf->indices) 448d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell goto fail; 4491a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell 4501a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell vbuf->cache = translate_cache_create(); 4511a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell if (!vbuf->cache) 4521a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell goto fail; 4531a03812fb57e956b438cd42ac68978facb49a99dKeith Whitwell 4541a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca 4551a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->vertices = NULL; 4561a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca vbuf->vertex_ptr = vbuf->vertices; 45709059259bed779360158664625e41a67f7496a74José Fonseca 4581a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca return &vbuf->stage; 459d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell 460d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell fail: 461d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell if (vbuf) 462d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell vbuf_destroy(&vbuf->stage); 463d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell 464d8c389171872b69af3c94ebab02ad5f4bcd2d4dfKeith Whitwell return NULL; 4651a8daf0627dde44aaa7c40786782618d4d5a6a36José Fonseca} 466