vbo_save_loopback.c revision 2421b25dd777ebfd614ae45907fd4af8c2713102
1fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/**************************************************************************
2fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell *
3fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * Copyright 2005 Tungsten Graphics, Inc., Cedar Park, Texas.
4fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * 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
8fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * "Software"), to deal in the Software without restriction, including
9fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish,
10fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to
11fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to
12fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * the following conditions:
13fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell *
14fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * The above copyright notice and this permission notice (including the
15fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * next paragraph) shall be included in all copies or substantial portions
16fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * of the Software.
17fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell *
18fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell *
26fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell **************************************************************************/
27fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
28fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "swrast_setup/swrast_setup.h"
29fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "swrast/swrast.h"
30fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "tnl/tnl.h"
31fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "context.h"
32fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
33fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "vbo_context.h"
34fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
35fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "glheader.h"
36fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "enums.h"
37fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "glapi.h"
38fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "imports.h"
39fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "macros.h"
40fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "mtypes.h"
41fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell#include "dispatch.h"
42fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
43fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
44fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwelltypedef void (*attr_func)( GLcontext *ctx, GLint target, const GLfloat * );
45fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
46fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
472421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell/* This file makes heavy use of the aliasing of NV vertex attributes
482421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell * with the legacy attributes.
492421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell */
50fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void VertexAttrib1fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
51fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
52fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   CALL_VertexAttrib1fvNV(ctx->Exec, (target, v));
53fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
54fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
55fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void VertexAttrib2fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
56fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
57fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   CALL_VertexAttrib2fvNV(ctx->Exec, (target, v));
58fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
59fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
60fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void VertexAttrib3fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
61fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
62fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   CALL_VertexAttrib3fvNV(ctx->Exec, (target, v));
63fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
64fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
65fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void VertexAttrib4fvNV(GLcontext *ctx, GLint target, const GLfloat *v)
66fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
67fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   CALL_VertexAttrib4fvNV(ctx->Exec, (target, v));
68fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
69fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
70fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic attr_func vert_attrfunc[4] = {
71fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   VertexAttrib1fvNV,
72fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   VertexAttrib2fvNV,
73fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   VertexAttrib3fvNV,
74fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   VertexAttrib4fvNV
75fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell};
76fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
77fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstruct loopback_attr {
78fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLint target;
79fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLint sz;
80fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   attr_func func;
81fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell};
82fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
83fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* Don't emit ends and begins on wrapped primitives.  Don't replay
84fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * wrapped vertices.  If we get here, it's probably because the the
85fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * precalculated wrapping is wrong.
86fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */
87fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void loopback_prim( GLcontext *ctx,
88fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			   const GLfloat *buffer,
89fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			   const struct _mesa_prim *prim,
90fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			   GLuint wrap_count,
91fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			   GLuint vertex_size,
92fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			   const struct loopback_attr *la, GLuint nr )
93fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
94fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLint start = prim->start;
95fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLint end = start + prim->count;
96fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   const GLfloat *data;
97fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLint j;
98fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLuint k;
99fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
100fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   if (0)
101fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      _mesa_printf("loopback prim %s(%s,%s) verts %d..%d\n",
102fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell		   _mesa_lookup_enum_by_nr(prim->mode),
103fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell		   prim->begin ? "begin" : "..",
104fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell		   prim->end ? "end" : "..",
105fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell		   start,
106fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell		   end);
107fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
108fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   if (prim->begin) {
109fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      CALL_Begin(GET_DISPATCH(), ( prim->mode ));
110fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   }
111fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   else {
112fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      assert(start == 0);
113fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      start += wrap_count;
114fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   }
115fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
116fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   data = buffer + start * vertex_size;
117fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
118fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   for (j = start ; j < end ; j++) {
119fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      const GLfloat *tmp = data + la[0].sz;
120fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
121fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      for (k = 1 ; k < nr ; k++) {
122fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 la[k].func( ctx, la[k].target, tmp );
123fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 tmp += la[k].sz;
124fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      }
125fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
126fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      /* Fire the vertex
127fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell       */
128fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      la[0].func( ctx, VBO_ATTRIB_POS, data );
129fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      data = tmp;
130fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   }
131fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
132fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   if (prim->end) {
133fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      CALL_End(GET_DISPATCH(), ());
134fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   }
135fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
136fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
137fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell/* Primitives generated by DrawArrays/DrawElements/Rectf may be
138fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * caught here.  If there is no primitive in progress, execute them
139fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * normally, otherwise need to track and discard the generated
140fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell * primitives.
141fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell */
142fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellstatic void loopback_weak_prim( GLcontext *ctx,
143fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell				const struct _mesa_prim *prim )
144fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
145fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   /* Use the prim_weak flag to ensure that if this primitive
146fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell    * wraps, we don't mistake future vertex_lists for part of the
147fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell    * surrounding primitive.
148fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell    *
149fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell    * While this flag is set, we are simply disposing of data
150fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell    * generated by an operation now known to be a noop.
151fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell    */
152fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   if (prim->begin)
153fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      ctx->Driver.CurrentExecPrimitive |= VBO_SAVE_PRIM_WEAK;
154fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   if (prim->end)
155fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      ctx->Driver.CurrentExecPrimitive &= ~VBO_SAVE_PRIM_WEAK;
156fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
157fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
158fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
159fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwellvoid vbo_loopback_vertex_list( GLcontext *ctx,
160fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			       const GLfloat *buffer,
161fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			       const GLubyte *attrsz,
162fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			       const struct _mesa_prim *prim,
163fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			       GLuint prim_count,
164fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			       GLuint wrap_count,
165fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell			       GLuint vertex_size)
166fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell{
167fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   struct loopback_attr la[VBO_ATTRIB_MAX];
168fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   GLuint i, nr = 0;
169fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
1702421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell   /* All Legacy, NV, ARB and Material attributes are routed through
1712421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell    * the NV attributes entrypoints:
1722421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell    */
1732421b25dd777ebfd614ae45907fd4af8c2713102Keith Whitwell   for (i = 0 ; i < VBO_ATTRIB_MAX ; i++) {
174fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      if (attrsz[i]) {
175fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 la[nr].target = i;
176fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 la[nr].sz = attrsz[i];
177fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 la[nr].func = vert_attrfunc[attrsz[i]-1];
178fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 nr++;
179fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      }
180fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   }
181fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell
182fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   for (i = 0 ; i < prim_count ; i++) {
183fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      if ((prim[i].mode & VBO_SAVE_PRIM_WEAK) &&
184fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	  (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END))
185fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      {
186fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 loopback_weak_prim( ctx, &prim[i] );
187fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      }
188fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      else
189fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      {
190fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell	 loopback_prim( ctx, buffer, &prim[i], wrap_count, vertex_size, la, nr );
191fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell      }
192fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell   }
193fd12b37dbada6f945a94b93ecf332d0b6a8eef06Keith Whitwell}
194