tnl: Push down the gl_vertex_array inputs into tnl drivers.
authorMathias Fröhlich <mathias.froehlich@web.de>
Sun, 25 Mar 2018 17:16:54 +0000 (19:16 +0200)
committerMathias Fröhlich <Mathias.Froehlich@gmx.net>
Sat, 31 Mar 2018 04:32:13 +0000 (06:32 +0200)
Reviewed-by: Brian Paul <brianp@vmware.com>
Signed-off-by: Mathias Fröhlich <Mathias.Froehlich@web.de>
13 files changed:
src/mesa/drivers/dri/i915/intel_context.c
src/mesa/drivers/dri/i965/brw_draw.c
src/mesa/drivers/dri/nouveau/nouveau_context.c
src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
src/mesa/drivers/dri/r200/r200_context.c
src/mesa/drivers/dri/radeon/radeon_context.c
src/mesa/drivers/dri/swrast/swrast.c
src/mesa/drivers/osmesa/osmesa.c
src/mesa/drivers/x11/xm_api.c
src/mesa/tnl/t_context.c
src/mesa/tnl/t_context.h
src/mesa/tnl/t_draw.c
src/mesa/tnl/tnl.h

index 96d09ca9472b3feee43a225bb417e7013c01479a..f22ebbd7ac2b3be188462e08864320159d7d238b 100644 (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;
index 5f52404bd6e0f2b17ada2ccdee71ea34fe7f859e..4caaadd560d9eb8ff01146187a53fa9933f926b8 100644 (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;
    }
 
index 5fab81d8663089085527f6dfae928724a4aca59d..93f6ce473a1f8ebc28a74a36fb6e47a84aff2406 100644 (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);
index a7b911c50eac6c582d7849e2592d61a63c0e6faf..10b5c15e41da96c793458da75b0606c0ec92a15b 100644 (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);
 }
 
index eb7d92f3c60e067fbc4e8bd8e768464faefa5d7a..4524f06d10c3e1e20bbade798c0874436cd772a2 100644 (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);
index 8c5c16719961f5c42c14f55d2f033f17ce551c51..28ced814e590b9361abd2c6ec0ca397378460f1d 100644 (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);
 
index 8084be64393e3bfe22bc0fff26899182c45932e6..ae5874f59278b74d0787ec88957e1eed849d7918 100644 (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;
index e0f87b850a7f1155374df8f8ab9dd71a47bf690b..3423eb632369f843fdf6116f26eabfe51c0f779a 100644 (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;
index 069e9e12b98af19fd15e263b7475397d162b673d..3d54193580e66960a470a883def4e86ae5e470c2 100644 (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,
index bb5d9fc07b97d3476dc2b0d86062a1a57efdeb14..345f0bf8584154bbe842ed32cdbad928fd11d140 100644 (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;
 }
 
index 082110c6070c97e7aaf463468dd24a276ec3ea1d..4827480e1a7cf34ab5c019719bb642a2d0922db0 100644 (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;
 
 
index b314278889204593d5a5e0577daee09ce711e045..96d6b988d3efffbbfd11c8e2c21983c175f749f8 100644 (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;
+}
index 7f425a58d2834c4433f4e62bfbce8a83d09cf66a..14e590501efe06a6b075a531bd1e3b1615337221 100644 (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]);