tnl: Push down the gl_vertex_array inputs into tnl drivers.

Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
This commit is contained in:
Mathias Fröhlich 2018-03-25 19:16:54 +02:00 committed by Mathias Fröhlich
parent 7f8db5ca47
commit 784fdef4e7
13 changed files with 88 additions and 9 deletions

View File

@ -380,6 +380,7 @@ void
intelInitDriverFunctions(struct dd_function_table *functions)
{
_mesa_init_driver_functions(functions);
_tnl_init_driver_draw_function(functions);
functions->Flush = intel_glFlush;
functions->Finish = intelFinish;

View File

@ -969,8 +969,8 @@ brw_draw_prims(struct gl_context *ctx,
_mesa_enum_to_string(ctx->RenderMode));
_swsetup_Wakeup(ctx);
_tnl_wakeup(ctx);
_tnl_draw_prims(ctx, prims, nr_prims, ib,
index_bounds_valid, min_index, max_index, NULL, 0, NULL);
_tnl_draw(ctx, prims, nr_prims, ib,
index_bounds_valid, min_index, max_index, NULL, 0, NULL);
return;
}

View File

@ -119,6 +119,7 @@ nouveau_context_init(struct gl_context *ctx, gl_api api,
/* Initialize the function pointers. */
_mesa_init_driver_functions(&functions);
_tnl_init_driver_draw_function(&functions);
nouveau_driver_functions_init(&functions);
nouveau_bufferobj_functions_init(&functions);
nouveau_texture_functions_init(&functions);

View File

@ -537,6 +537,24 @@ TAG(vbo_check_render_prims)(struct gl_context *ctx,
tfb_vertcount, stream, indirect);
}
static void
TAG(vbo_draw)(struct gl_context *ctx,
const struct _mesa_prim *prims, GLuint nr_prims,
const struct _mesa_index_buffer *ib,
GLboolean index_bounds_valid,
GLuint min_index, GLuint max_index,
struct gl_transform_feedback_object *tfb_vertcount,
unsigned stream,
struct gl_buffer_object *indirect)
{
/* Borrow and update the inputs list from the tnl context */
_tnl_bind_inputs(ctx);
TAG(vbo_check_render_prims)(ctx, prims, nr_prims, ib,
index_bounds_valid, min_index, max_index,
tfb_vertcount, stream, indirect);
}
void
TAG(vbo_init)(struct gl_context *ctx)
{
@ -546,7 +564,8 @@ TAG(vbo_init)(struct gl_context *ctx)
for (i = 0; i < VERT_ATTRIB_MAX; i++)
render->map[i] = -1;
vbo_set_draw_func(ctx, TAG(vbo_check_render_prims));
/* Overwrite our draw function */
ctx->Driver.Draw = TAG(vbo_draw);
vbo_use_buffer_objects(ctx);
}

View File

@ -227,6 +227,7 @@ GLboolean r200CreateContext( gl_api api,
* (the texture functions are especially important)
*/
_mesa_init_driver_functions(&functions);
_tnl_init_driver_draw_function(&functions);
r200InitDriverFuncs(&functions);
r200InitIoctlFuncs(&functions);
r200InitStateFuncs(&rmesa->radeon, &functions);

View File

@ -194,6 +194,7 @@ r100CreateContext( gl_api api,
* (the texture functions are especially important)
*/
_mesa_init_driver_functions( &functions );
_tnl_init_driver_draw_function( &functions );
radeonInitTextureFuncs( &rmesa->radeon, &functions );
radeonInitQueryObjFunctions(&functions);

View File

@ -783,6 +783,7 @@ dri_create_context(gl_api api,
/* build table of device driver functions */
_mesa_init_driver_functions(&functions);
swrast_init_driver_functions(&functions);
_tnl_init_driver_draw_function(&functions);
if (share) {
sharedCtx = &share->Base;

View File

@ -832,6 +832,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
/* Initialize device driver function table */
_mesa_init_driver_functions(&functions);
_tnl_init_driver_draw_function(&functions);
/* override with our functions */
functions.GetString = get_string;
functions.UpdateState = osmesa_update_state_wrapper;

View File

@ -906,6 +906,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
/* initialize with default driver functions, then plug in XMesa funcs */
_mesa_init_driver_functions(&functions);
_tnl_init_driver_draw_function(&functions);
xmesa_init_driver_functions(v, &functions);
if (!_mesa_initialize_context(mesaCtx, API_OPENGL_COMPAT, &v->mesa_visual,
share_list ? &(share_list->mesa) : (struct gl_context *) NULL,

View File

@ -96,12 +96,12 @@ _tnl_CreateContext( struct gl_context *ctx )
insert_at_tail( tnl->_ShineTabList, s );
}
/* plug in the VBO drawing function */
vbo_set_draw_func(ctx, _tnl_draw_prims);
_math_init_transformation();
_math_init_translate();
/* Keep our list of gl_vertex_array inputs */
_vbo_init_inputs(&tnl->draw_arrays);
return GL_TRUE;
}

View File

@ -536,6 +536,9 @@ typedef struct
struct tnl_shine_tab *_ShineTable[2]; /**< Active shine tables */
struct tnl_shine_tab *_ShineTabList; /**< MRU list of inactive shine tables */
/**@}*/
/* The list of gl_vertex_array inputs. */
struct vbo_inputs draw_arrays;
} TNLcontext;

View File

@ -35,6 +35,7 @@
#include "main/mtypes.h"
#include "main/macros.h"
#include "main/enums.h"
#include "main/varray.h"
#include "util/half_float.h"
#include "t_context.h"
@ -422,9 +423,7 @@ static void unmap_vbos( struct gl_context *ctx,
}
/* This is the main entrypoint into the slimmed-down software tnl
* module. In a regular swtnl driver, this can be plugged straight
* into the vbo->Driver.DrawPrims() callback.
/* This is the main workhorse doing all the rendering work.
*/
void _tnl_draw_prims(struct gl_context *ctx,
const struct _mesa_prim *prim,
@ -537,3 +536,40 @@ void _tnl_draw_prims(struct gl_context *ctx,
}
}
void
_tnl_bind_inputs( struct gl_context *ctx )
{
TNLcontext *tnl = TNL_CONTEXT(ctx);
_mesa_set_drawing_arrays(ctx, tnl->draw_arrays.inputs);
_vbo_update_inputs(ctx, &tnl->draw_arrays);
}
/* This is the main entrypoint into the slimmed-down software tnl
* module. In a regular swtnl driver, this can be plugged straight
* into the ctx->Driver.Draw() callback.
*/
void
_tnl_draw(struct gl_context *ctx,
const struct _mesa_prim *prim, GLuint nr_prims,
const struct _mesa_index_buffer *ib,
GLboolean index_bounds_valid, GLuint min_index, GLuint max_index,
struct gl_transform_feedback_object *tfb_vertcount,
unsigned stream, struct gl_buffer_object *indirect)
{
/* Update TNLcontext::draw_arrays and set that pointer
* into Array._DrawArrays.
*/
_tnl_bind_inputs(ctx);
_tnl_draw_prims(ctx, prim, nr_prims, ib, index_bounds_valid,
min_index, max_index, tfb_vertcount, stream, indirect);
}
void
_tnl_init_driver_draw_function(struct dd_function_table *functions)
{
functions->Draw = _tnl_draw;
}

View File

@ -48,6 +48,9 @@ _tnl_DestroyContext( struct gl_context *ctx );
extern void
_tnl_InvalidateState( struct gl_context *ctx, GLuint new_state );
extern void
_tnl_init_driver_draw_function(struct dd_function_table *functions);
/* Functions to revive the tnl module after being unhooked from
* dispatch and/or driver callbacks.
*/
@ -60,6 +63,9 @@ _tnl_wakeup( struct gl_context *ctx );
extern void
_tnl_need_projected_coords( struct gl_context *ctx, GLboolean flag );
extern void
_tnl_bind_inputs( struct gl_context *ctx );
/* Control whether T&L does per-vertex fog
*/
@ -87,6 +93,14 @@ _tnl_draw_prims(struct gl_context *ctx,
unsigned stream,
struct gl_buffer_object *indirect );
void
_tnl_draw(struct gl_context *ctx,
const struct _mesa_prim *prim, GLuint nr_prims,
const struct _mesa_index_buffer *ib,
GLboolean index_bounds_valid, GLuint min_index, GLuint max_index,
struct gl_transform_feedback_object *tfb_vertcount, unsigned stream,
struct gl_buffer_object *indirect);
extern void
_tnl_RasterPos(struct gl_context *ctx, const GLfloat vObj[4]);