X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Ftnl%2Ft_vtx_api.c;h=e75ac5b3397963456c3e87b0ada6f8a6a61d9ba1;hb=931ef21c423768d2ff9999fcb0c1067c8053dcae;hp=926b277dc9794e2eea7de6375d88c079e5872461;hpb=ee22ed2fb4294612e3c4d5d6723e28d723bbb45e;p=mesa.git diff --git a/src/mesa/tnl/t_vtx_api.c b/src/mesa/tnl/t_vtx_api.c index 926b277dc97..e75ac5b3397 100644 --- a/src/mesa/tnl/t_vtx_api.c +++ b/src/mesa/tnl/t_vtx_api.c @@ -45,8 +45,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. static void reset_attrfv( TNLcontext *tnl ); -static attrfv_func choose[_TNL_MAX_ATTR_CODEGEN+1][4]; /* +1 for ERROR_ATTRIB */ -static attrfv_func generic_attr_func[_TNL_MAX_ATTR_CODEGEN][4]; +static tnl_attrfv_func choose[_TNL_MAX_ATTR_CODEGEN+1][4]; /* +1 for ERROR_ATTRIB */ +static tnl_attrfv_func generic_attr_func[_TNL_MAX_ATTR_CODEGEN][4]; /* Close off the last primitive, execute the buffer, restart the @@ -102,8 +102,10 @@ static void _tnl_wrap_buffers( GLcontext *ctx ) /* Deal with buffer wrapping where provoked by the vertex buffer * filling up, as opposed to upgrade_vertex(). + * + * Make it GLAPIENTRY, so we can tail from the codegen'ed Vertex*fv */ -void _tnl_wrap_filled_vertex( GLcontext *ctx ) +void GLAPIENTRY _tnl_wrap_filled_vertex( GLcontext *ctx ) { TNLcontext *tnl = TNL_CONTEXT(ctx); GLfloat *data = tnl->vtx.copied.buffer; @@ -273,10 +275,15 @@ static void _tnl_wrap_upgrade_vertex( GLcontext *ctx, for (j = 0 ; j < _TNL_ATTRIB_MAX ; j++) { if (tnl->vtx.attrsz[j]) { if (j == attr) { - COPY_SZ_4V( dest, newsz, tnl->vtx.current[j] ); - COPY_SZ_4V( dest, oldsz, data ); - data += oldsz; - dest += newsz; + if (oldsz) { + ASSIGN_4V( dest, 0, 0, 0, 1 ); + COPY_SZ_4V( dest, oldsz, data ); + data += oldsz; + dest += newsz; + } else { + COPY_SZ_4V( dest, newsz, tnl->vtx.current[j] ); + dest += newsz; + } } else { GLuint sz = tnl->vtx.attrsz[j]; @@ -327,6 +334,15 @@ static void _tnl_fixup_vertex( GLcontext *ctx, GLuint attr, GLuint sz ) for (i = sz ; i <= tnl->vtx.attrsz[attr] ; i++) tnl->vtx.attrptr[attr][i-1] = id[i-1]; } + + /* Does setting NeedFlush belong here? Necessitates resetting + * vtxfmt on each flush (otherwise flags won't get reset + * afterwards). + */ + if (attr == 0) + ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; + else + ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT; } @@ -343,7 +359,7 @@ static struct _tnl_dynfn *lookup( struct _tnl_dynfn *l, GLuint key ) } -static attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz ) +static tnl_attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz ) { TNLcontext *tnl = TNL_CONTEXT(ctx); struct _tnl_dynfn *dfn = 0; @@ -366,7 +382,7 @@ static attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz ) } if (dfn) - return (attrfv_func) dfn->code; + return (tnl_attrfv_func) dfn->code; else return 0; } @@ -375,7 +391,7 @@ static attrfv_func do_codegen( GLcontext *ctx, GLuint attr, GLuint sz ) * entrypoint is called for the first time. */ -static attrfv_func do_choose( GLuint attr, GLuint sz ) +static tnl_attrfv_func do_choose( GLuint attr, GLuint sz ) { GET_CURRENT_CONTEXT( ctx ); TNLcontext *tnl = TNL_CONTEXT(ctx); @@ -391,19 +407,11 @@ static attrfv_func do_choose( GLuint attr, GLuint sz ) _tnl_fixup_vertex( ctx, attr, sz ); - /* Does setting NeedFlush belong here? Necessitates resetting - * vtxfmt on each flush (otherwise flags won't get reset - * afterwards). - */ - if (attr == 0) - ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES; - else - ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT; } /* Try to use codegen: - */ + */ #ifdef USE_X86_ASM if (tnl->AllowCodegen) tnl->vtx.tabfv[attr][sz-1] = do_codegen( ctx, attr, sz ); @@ -424,7 +432,7 @@ static attrfv_func do_choose( GLuint attr, GLuint sz ) #define CHOOSE( ATTR, N ) \ static void choose_##ATTR##_##N( const GLfloat *v ) \ { \ - attrfv_func f = do_choose(ATTR, N); \ + tnl_attrfv_func f = do_choose(ATTR, N); \ f( v ); \ } @@ -473,11 +481,15 @@ static void reset_attrfv( TNLcontext *tnl ) for (i = 0 ; i < _TNL_ATTRIB_MAX ; i++) if (tnl->vtx.attrsz[i]) { - GLuint j = tnl->vtx.attrsz[i] - 1; + GLint j = tnl->vtx.attrsz[i] - 1; tnl->vtx.attrsz[i] = 0; - if (i < _TNL_MAX_ATTR_CODEGEN) - tnl->vtx.tabfv[i][j] = choose[i][j]; + if (i < _TNL_MAX_ATTR_CODEGEN) { + while (j >= 0) { + tnl->vtx.tabfv[i][j] = choose[i][j]; + j--; + } + } } tnl->vtx.vertex_size = 0; @@ -511,7 +523,6 @@ do { \ if (N>1) dest[1] = (params)[1]; \ if (N>2) dest[2] = (params)[2]; \ if (N>3) dest[3] = (params)[3]; \ - ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT; \ } \ } while (0) @@ -625,7 +636,7 @@ static void GLAPIENTRY _tnl_EvalCoord1f( GLfloat u ) for (i = 0 ; i <= _TNL_ATTRIB_INDEX ; i++) { if (tnl->vtx.eval.map1[i].map) - if (tnl->vtx.attrsz[i] < tnl->vtx.eval.map1[i].sz) + if (tnl->vtx.attrsz[i] != tnl->vtx.eval.map1[i].sz) _tnl_fixup_vertex( ctx, i, tnl->vtx.eval.map1[i].sz ); } } @@ -653,12 +664,12 @@ static void GLAPIENTRY _tnl_EvalCoord2f( GLfloat u, GLfloat v ) for (i = 0 ; i <= _TNL_ATTRIB_INDEX ; i++) { if (tnl->vtx.eval.map2[i].map) - if (tnl->vtx.attrsz[i] < tnl->vtx.eval.map2[i].sz) + if (tnl->vtx.attrsz[i] != tnl->vtx.eval.map2[i].sz) _tnl_fixup_vertex( ctx, i, tnl->vtx.eval.map2[i].sz ); } if (ctx->Eval.AutoNormal) - if (tnl->vtx.attrsz[_TNL_ATTRIB_NORMAL] < 3) + if (tnl->vtx.attrsz[_TNL_ATTRIB_NORMAL] != 3) _tnl_fixup_vertex( ctx, _TNL_ATTRIB_NORMAL, 3 ); } @@ -713,21 +724,20 @@ static void GLAPIENTRY _tnl_Begin( GLenum mode ) { GET_CURRENT_CONTEXT( ctx ); - if ((ctx->VertexProgram.Enabled - && !ctx->VertexProgram.Current->Instructions) || - (ctx->FragmentProgram.Enabled - && !ctx->FragmentProgram.Current->Instructions)) { - _mesa_error(ctx, GL_INVALID_OPERATION, - "glBegin (invalid vertex/fragment program)"); - return; - } - if (ctx->Driver.CurrentExecPrimitive == GL_POLYGON+1) { TNLcontext *tnl = TNL_CONTEXT(ctx); int i; if (ctx->NewState) { _mesa_update_state( ctx ); + + if ((ctx->VertexProgram.Enabled && !ctx->VertexProgram._Enabled) || + (ctx->FragmentProgram.Enabled && !ctx->FragmentProgram._Enabled)) { + _mesa_error(ctx, GL_INVALID_OPERATION, + "glBegin (invalid vertex/fragment program)"); + return; + } + if (!(tnl->Driver.NotifyBegin && tnl->Driver.NotifyBegin( ctx, mode ))) ctx->Exec->Begin(mode); @@ -904,7 +914,9 @@ void _tnl_vtx_init( GLcontext *ctx ) tnl->vtx.gen.Attribute[i] = no_codegen; } +#ifdef USE_X86_ASM _tnl_InitX86Codegen( &tnl->vtx.gen ); +#endif _tnl_current_init( ctx ); _tnl_exec_vtxfmt_init( ctx );