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