1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* 2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Mesa 3-D graphics library 3fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. 5fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 6fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 7fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * copy of this software and associated documentation files (the "Software"), 8fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * to deal in the Software without restriction, including without limitation 9fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * and/or sell copies of the Software, and to permit persons to whom the 11fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Software is furnished to do so, subject to the following conditions: 12fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 13fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * The above copyright notice and this permission notice shall be included 14fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * in all copies or substantial portions of the Software. 15fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 16fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 193d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 203d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 213d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 223d8d5b298a268b119d840bc9bae0ee9e0c9244a9Kenneth Graunke * OTHER DEALINGS IN THE SOFTWARE. 23fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 24fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Authors: 25877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Keith Whitwell <keithw@vmware.com> 26fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 27fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 28fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 29c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian Paul#include "main/api_arrayelt.h" 30c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian Paul#include "main/glheader.h" 31c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian Paul#include "main/mtypes.h" 32c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian Paul#include "main/vtxfmt.h" 33fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h" 34fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 353644dbbdbd1abe19a1dad37fa9d7f0577e2471b3Brian Paul 363644dbbdbd1abe19a1dad37fa9d7f0577e2471b3Brian Paul 37f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid vbo_exec_init( struct gl_context *ctx ) 38fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_exec_context *exec = &vbo_context(ctx)->exec; 40fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 41fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell exec->ctx = ctx; 42fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 43fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell /* Initialize the arrayelt helper 44fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 45fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (!ctx->aelt_context && 46fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell !_ae_create_context( ctx )) 47fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell return; 48fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 49fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_exec_vtx_init( exec ); 50fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 51fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->Driver.NeedFlush = 0; 52fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END; 53fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 54e8abd098b36c30d76b4c396970fd793ae58e0702Keith Whitwell vbo_exec_invalidate_state( ctx, ~0 ); 55fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 56fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 57fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 58f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergvoid vbo_exec_destroy( struct gl_context *ctx ) 59fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 60fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell struct vbo_exec_context *exec = &vbo_context(ctx)->exec; 61fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 62fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell if (ctx->aelt_context) { 63fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _ae_destroy_context( ctx ); 64fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell ctx->aelt_context = NULL; 65fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell } 66fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 67fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell vbo_exec_vtx_destroy( exec ); 68fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 69fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 703644dbbdbd1abe19a1dad37fa9d7f0577e2471b3Brian Paul 713644dbbdbd1abe19a1dad37fa9d7f0577e2471b3Brian Paul/** 723644dbbdbd1abe19a1dad37fa9d7f0577e2471b3Brian Paul * Really want to install these callbacks to a central facility to be 73fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * invoked according to the state flags. That will have to wait for a 74fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * mesa rework: 75fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */ 76c81ddc2092cceb07178a9554aabc5ecf92d15557Brian Paulvoid vbo_exec_invalidate_state( struct gl_context *ctx, GLbitfield new_state ) 77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{ 788eef6ad2e2f90feac231a2e09ed4765f23ed1557Marek Olšák struct vbo_context *vbo = vbo_context(ctx); 798eef6ad2e2f90feac231a2e09ed4765f23ed1557Marek Olšák struct vbo_exec_context *exec = &vbo->exec; 80fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 818eef6ad2e2f90feac231a2e09ed4765f23ed1557Marek Olšák if (!exec->validating && new_state & (_NEW_PROGRAM|_NEW_ARRAY)) { 82784dd51198433e5c299da4a7742c68d21d68d1c1Marek Olšák exec->array.recalculate_inputs = GL_TRUE; 83784dd51198433e5c299da4a7742c68d21d68d1c1Marek Olšák } 84784dd51198433e5c299da4a7742c68d21d68d1c1Marek Olšák 85c0120c250945dd4cc56685ab92e053fb60b661e9Eric Anholt if (new_state & _NEW_EVAL) 86ffe529352b9648b9a0c54d20fbe79c2d04b98ed5Brian Paul exec->eval.recalculate_maps = GL_TRUE; 87fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell 88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell _ae_invalidate_state(ctx, new_state); 89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell} 90dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry 91dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry 92dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry/** 93dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry * Figure out the number of transform feedback primitives that will be output 9461c1b065fbdd224fa547f035991210859c7af310Paul Berry * considering the drawing mode, number of vertices, and instance count, 9561c1b065fbdd224fa547f035991210859c7af310Paul Berry * assuming that no geometry shading is done and primitive restart is not 9661c1b065fbdd224fa547f035991210859c7af310Paul Berry * used. 97dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry * 9861c1b065fbdd224fa547f035991210859c7af310Paul Berry * This is used by driver back-ends in implementing the PRIMITIVES_GENERATED 9961c1b065fbdd224fa547f035991210859c7af310Paul Berry * and TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN queries. It is also used to 10061c1b065fbdd224fa547f035991210859c7af310Paul Berry * pre-validate draw calls in GLES3 (where draw calls only succeed if there is 10161c1b065fbdd224fa547f035991210859c7af310Paul Berry * enough room in the transform feedback buffer for the result). 102dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry */ 103dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berrysize_t 10461c1b065fbdd224fa547f035991210859c7af310Paul Berryvbo_count_tessellated_primitives(GLenum mode, GLuint count, 10561c1b065fbdd224fa547f035991210859c7af310Paul Berry GLuint num_instances) 106dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry{ 107dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry size_t num_primitives; 10861c1b065fbdd224fa547f035991210859c7af310Paul Berry switch (mode) { 109dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_POINTS: 11061c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count; 111dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 112dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_LINE_STRIP: 11361c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count >= 2 ? count - 1 : 0; 114dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 115dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_LINE_LOOP: 11661c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count >= 2 ? count : 0; 117dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 118dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_LINES: 11961c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count / 2; 120dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 121dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_TRIANGLE_STRIP: 122dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_TRIANGLE_FAN: 123dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_POLYGON: 12461c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count >= 3 ? count - 2 : 0; 125dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 126dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_TRIANGLES: 12761c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count / 3; 128dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 129dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_QUAD_STRIP: 13061c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = count >= 4 ? ((count / 2) - 1) * 2 : 0; 131dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 132dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry case GL_QUADS: 13361c1b065fbdd224fa547f035991210859c7af310Paul Berry num_primitives = (count / 4) * 2; 134dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 1352924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry case GL_LINES_ADJACENCY: 1362924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry num_primitives = count / 4; 1372924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry break; 1382924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry case GL_LINE_STRIP_ADJACENCY: 1392924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry num_primitives = count >= 4 ? count - 3 : 0; 1402924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry break; 1412924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry case GL_TRIANGLES_ADJACENCY: 1422924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry num_primitives = count / 6; 1432924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry break; 1442924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry case GL_TRIANGLE_STRIP_ADJACENCY: 1452924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry num_primitives = count >= 6 ? (count - 4) / 2 : 0; 1462924b5f73bd9468e59da9bf53e88c314669a729fPaul Berry break; 147dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry default: 148dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry assert(!"Unexpected primitive type in count_tessellated_primitives"); 149dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry num_primitives = 0; 150dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry break; 151dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry } 15261c1b065fbdd224fa547f035991210859c7af310Paul Berry return num_primitives * num_instances; 153dc7b6d7d6defdfe4f79fb682d3378a3bed8b5db9Paul Berry} 1543702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 1553702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 1563702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 1573702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul/** 1583702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * In some degenarate cases we can improve our ability to merge 1593702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * consecutive primitives. For example: 1603702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glBegin(GL_LINE_STRIP); 1613702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glVertex(1); 1623702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glVertex(1); 1633702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glEnd(); 1643702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glBegin(GL_LINE_STRIP); 1653702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glVertex(1); 1663702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glVertex(1); 1673702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * glEnd(); 1683702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * Can be merged as a GL_LINES prim with four vertices. 1693702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * 1703702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * This function converts 2-vertex line strips/loops into GL_LINES, etc. 1713702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul */ 1723702d2508249bb264ab502c0093dbbc10b0b02faBrian Paulvoid 1733702d2508249bb264ab502c0093dbbc10b0b02faBrian Paulvbo_try_prim_conversion(struct _mesa_prim *p) 1743702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul{ 1753702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p->mode == GL_LINE_STRIP && p->count == 2) { 1763702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* convert 2-vertex line strip to a separate line */ 1773702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul p->mode = GL_LINES; 1783702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul } 1793702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul else if ((p->mode == GL_TRIANGLE_STRIP || p->mode == GL_TRIANGLE_FAN) 1803702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul && p->count == 3) { 1813702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* convert 3-vertex tri strip or fan to a separate triangle */ 1823702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul p->mode = GL_TRIANGLES; 1833702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul } 1843702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 1853702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* Note: we can't convert a 4-vertex quad strip to a separate quad 1863702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * because the vertex ordering is different. We'd have to muck 1873702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * around in the vertex data to make it work. 1883702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul */ 1893702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul} 1903702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 1913702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 1923702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul/** 1933702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * Helper function for determining if two subsequent glBegin/glEnd 1943702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * primitives can be combined. This is only possible for GL_POINTS, 1953702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * GL_LINES, GL_TRIANGLES and GL_QUADS. 1963702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * If we return true, it means that we can concatenate p1 onto p0 (and 1973702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * discard p1). 1983702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul */ 1993702d2508249bb264ab502c0093dbbc10b0b02faBrian Paulbool 2003702d2508249bb264ab502c0093dbbc10b0b02faBrian Paulvbo_can_merge_prims(const struct _mesa_prim *p0, const struct _mesa_prim *p1) 2013702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul{ 2023702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (!p0->begin || 2033702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul !p1->begin || 2043702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul !p0->end || 2053702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul !p1->end) 2063702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return false; 2073702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2083702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* The prim mode must match (ex: both GL_TRIANGLES) */ 2093702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->mode != p1->mode) 2103702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return false; 2113702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2123702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* p1's vertices must come right after p0 */ 2133702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->start + p0->count != p1->start) 2143702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return false; 2153702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2163702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->basevertex != p1->basevertex || 2173702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul p0->num_instances != p1->num_instances || 2183702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul p0->base_instance != p1->base_instance) 2193702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return false; 2203702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2213702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* can always merge subsequent GL_POINTS primitives */ 2223702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->mode == GL_POINTS) 2233702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return true; 2243702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2253702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* independent lines with no extra vertices */ 2263702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->mode == GL_LINES && p0->count % 2 == 0 && p1->count % 2 == 0) 2273702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return true; 2283702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2293702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* independent tris */ 2303702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->mode == GL_TRIANGLES && p0->count % 3 == 0 && p1->count % 3 == 0) 2313702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return true; 2323702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2333702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul /* independent quads */ 2343702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul if (p0->mode == GL_QUADS && p0->count % 4 == 0 && p1->count % 4 == 0) 2353702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return true; 2363702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2373702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul return false; 2383702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul} 2393702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2403702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2413702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul/** 2423702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * If we've determined that p0 and p1 can be merged, this function 2433702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul * concatenates p1 onto p0. 2443702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul */ 2453702d2508249bb264ab502c0093dbbc10b0b02faBrian Paulvoid 2463702d2508249bb264ab502c0093dbbc10b0b02faBrian Paulvbo_merge_prims(struct _mesa_prim *p0, const struct _mesa_prim *p1) 2473702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul{ 2483702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul assert(vbo_can_merge_prims(p0, p1)); 2493702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul 2503702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul p0->count += p1->count; 2513702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul p0->end = p1->end; 2523702d2508249bb264ab502c0093dbbc10b0b02faBrian Paul} 253