vbo: merge use_buffer_objects into vbo_CreateContext to skip the big malloc
authorMarek Olšák <marek.olsak@amd.com>
Tue, 4 Feb 2020 01:20:05 +0000 (20:20 -0500)
committerMarge Bot <eric+marge@anholt.net>
Tue, 11 Feb 2020 00:34:57 +0000 (00:34 +0000)
Reviewed-by: Mathias Fröhlich <mathias.froehlich@web.de>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/merge_requests/3766>

16 files changed:
src/mesa/drivers/dri/i915/intel_context.c
src/mesa/drivers/dri/i965/brw_context.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/main/tests/dispatch_sanity.cpp
src/mesa/state_tracker/st_context.c
src/mesa/vbo/vbo.h
src/mesa/vbo/vbo_context.c
src/mesa/vbo/vbo_exec.c
src/mesa/vbo/vbo_exec.h
src/mesa/vbo/vbo_exec_api.c

index 993ad8bf05f80b7d23337778d5810189e2046f10..ab4a0bf496166c806bf2ad7936046f0bd9a03205 100644 (file)
@@ -499,7 +499,7 @@ intelInitContext(struct intel_context *intel,
    ctx->Const.MaxRenderbufferSize = 2048;
 
    _swrast_CreateContext(ctx);
-   _vbo_CreateContext(ctx);
+   _vbo_CreateContext(ctx, false);
    if (ctx->swrast_context) {
       _tnl_CreateContext(ctx);
       _swsetup_CreateContext(ctx);
index eda8ba2fe70f261116da50f178c8560db58c43f7..92b27cc6864044217542452f327544a56b071c31 100644 (file)
@@ -1000,7 +1000,7 @@ brwCreateContext(gl_api api,
       _swrast_CreateContext(ctx);
    }
 
-   _vbo_CreateContext(ctx);
+   _vbo_CreateContext(ctx, true);
    if (ctx->swrast_context) {
       _tnl_CreateContext(ctx);
       TNL_CONTEXT(ctx)->Driver.RunPipeline = _tnl_run_pipeline;
@@ -1134,8 +1134,6 @@ brwCreateContext(gl_api api,
    if (ctx->Extensions.INTEL_performance_query)
       brw_init_performance_queries(brw);
 
-   vbo_use_buffer_objects(ctx);
-
    brw->ctx.Cache = brw->screen->disk_cache;
 
    if (driContextPriv->driScreenPriv->dri2.backgroundCallable &&
index 838e909ee3f28b722c958aa47842791945f59c7c..a63e0a19ddddd9983ce91aabbdb3114f906c346f 100644 (file)
@@ -133,7 +133,7 @@ nouveau_context_init(struct gl_context *ctx, gl_api api,
        nouveau_scratch_init(ctx);
        _mesa_meta_init(ctx);
        _swrast_CreateContext(ctx);
-       _vbo_CreateContext(ctx);
+       _vbo_CreateContext(ctx, true);
        _tnl_CreateContext(ctx);
        nouveau_span_functions_init(ctx);
        _mesa_allow_light_in_model(ctx, GL_FALSE);
index f037bd2015d1e298d9658c107146a52e98c58a7d..280c0ecc2913782c4fa2378a1c93483a5f3ecab0 100644 (file)
@@ -569,7 +569,6 @@ TAG(vbo_init)(struct gl_context *ctx)
 
        /* Overwrite our draw function */
        ctx->Driver.Draw = TAG(vbo_draw);
-       vbo_use_buffer_objects(ctx);
 }
 
 void
index 82733ece9a0c00c39a8130cb7fa860b38e71b937..4db7e9d005a3be81771f00860a4e35acf4ad3d93 100644 (file)
@@ -253,7 +253,7 @@ GLboolean r200CreateContext( gl_api api,
    /* Initialize the software rasterizer and helper modules.
     */
    _swrast_CreateContext( ctx );
-   _vbo_CreateContext( ctx );
+   _vbo_CreateContext( ctx, false );
    _tnl_CreateContext( ctx );
    _swsetup_CreateContext( ctx );
 
index e880ccc1aab693fdf639bc6dffad0098d3003c0f..d7ab93f5b87e83b5e2d0ee1e94fe695097222460 100644 (file)
@@ -216,7 +216,7 @@ r100CreateContext( gl_api api,
    /* Initialize the software rasterizer and helper modules.
     */
    _swrast_CreateContext( ctx );
-   _vbo_CreateContext( ctx );
+   _vbo_CreateContext( ctx, false );
    _tnl_CreateContext( ctx );
    _swsetup_CreateContext( ctx );
 
index 2bf4f0b9fed33068905264367693257b0095821e..20ba8ff510663b6733129bfb91f120dcf1217e86 100644 (file)
@@ -809,7 +809,7 @@ dri_create_context(gl_api api,
 
     /* create module contexts */
     _swrast_CreateContext( mesaCtx );
-    _vbo_CreateContext( mesaCtx );
+    _vbo_CreateContext( mesaCtx, false );
     _tnl_CreateContext( mesaCtx );
     _swsetup_CreateContext( mesaCtx );
     _swsetup_Wakeup( mesaCtx );
index 9aeb4059a9155c60ce51a634691ffae2b8d0a733..30e6c07e6aadaf46a87e90c1786184d4c8590fd1 100644 (file)
@@ -890,7 +890,7 @@ OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
          TNLcontext *tnl;
 
         if (!_swrast_CreateContext( ctx ) ||
-             !_vbo_CreateContext( ctx ) ||
+             !_vbo_CreateContext( ctx, false ) ||
              !_tnl_CreateContext( ctx ) ||
              !_swsetup_CreateContext( ctx )) {
             _mesa_destroy_visual(osmesa->gl_visual);
index 1e8e6a9d71ab4d3a848fcdea77cb27d10bf78644..88f6630ed6a713a56939f462954ac9e1b74cc523 100644 (file)
@@ -941,7 +941,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
    /* Initialize the software rasterizer and helper modules.
     */
    if (!_swrast_CreateContext( mesaCtx ) ||
-       !_vbo_CreateContext( mesaCtx ) ||
+       !_vbo_CreateContext( mesaCtx, false ) ||
        !_tnl_CreateContext( mesaCtx ) ||
        !_swsetup_CreateContext( mesaCtx )) {
       _mesa_free_context_data(&c->mesa);
index 7298aa663082ac2fb772ffed446ebbe9e3e8524c..0a86c127d0543dfd0b8cc75099ee3b7c124fcf6f 100644 (file)
@@ -110,7 +110,7 @@ DispatchSanity_test::SetUpCtx(gl_api api, unsigned int version)
                             &visual,
                             NULL, // share_list
                             &driver_functions);
-   _vbo_CreateContext(&ctx);
+   _vbo_CreateContext(&ctx, false);
 
    _mesa_override_extensions(&ctx);
    ctx.Version = version;
index d66bd2b904b5cd684dab29daa9b9caf2b551236f..2ec0532ce5725a8f02ad283fbf373a4f816d2302 100644 (file)
@@ -571,10 +571,6 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
 
    st->ctx = ctx;
    st->pipe = pipe;
-
-   /* state tracker needs the VBO module */
-   _vbo_CreateContext(ctx);
-
    st->dirty = ST_ALL_STATES_MASK;
 
    st->can_bind_const_buffer_as_vertex =
@@ -617,9 +613,6 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
       st->util_velems[2].src_format = PIPE_FORMAT_R32G32_FLOAT;
    }
 
-   /* we want all vertex data to be placed in buffer objects */
-   vbo_use_buffer_objects(ctx);
-
    /* Need these flags:
     */
    ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
@@ -809,6 +802,11 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
       return NULL;
    }
 
+   /* This must be done after extensions are initialized to enable persistent
+    * mappings immediately.
+    */
+   _vbo_CreateContext(ctx, true);
+
    _mesa_initialize_dispatch_tables(ctx);
    _mesa_initialize_vbo_vtxfmt(ctx);
    st_init_driver_flags(st);
index 3dcc44857578a51c97441225545d901b1e8cb3da..17d668e386f8418423dc05fbe5bd1124f36ba9dd 100644 (file)
@@ -42,7 +42,7 @@ extern "C" {
 struct gl_context;
 
 GLboolean
-_vbo_CreateContext(struct gl_context *ctx);
+_vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects);
 
 void
 _vbo_DestroyContext(struct gl_context *ctx);
@@ -92,9 +92,6 @@ vbo_get_minmax_indices(struct gl_context *ctx, const struct _mesa_prim *prim,
                        const struct _mesa_index_buffer *ib,
                        GLuint *min_index, GLuint *max_index, GLuint nr_prims);
 
-void
-vbo_use_buffer_objects(struct gl_context *ctx);
-
 void
 vbo_sw_primitive_restart(struct gl_context *ctx,
                          const struct _mesa_prim *prim,
index 4ba0a22bf02aea2433ce74bec0c78da20513e192..ac8f9973f98f19b33b6749d38c5d1e7755510b4c 100644 (file)
@@ -159,7 +159,7 @@ vbo_exec_invalidate_state(struct gl_context *ctx)
 
 
 GLboolean
-_vbo_CreateContext(struct gl_context *ctx)
+_vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects)
 {
    struct vbo_context *vbo = CALLOC_STRUCT(vbo_context);
 
@@ -181,7 +181,7 @@ _vbo_CreateContext(struct gl_context *ctx)
     * will pretty much be permanently installed, which means that the
     * vtxfmt mechanism can be removed now.
     */
-   vbo_exec_init(ctx);
+   vbo_exec_init(ctx, use_buffer_objects);
    if (ctx->API == API_OPENGL_COMPAT)
       vbo_save_init(ctx);
 
index c4d4bc6e0efe7cdb9abc8d743f32971a00b7073f..e4775ba5c12bd0e69aae1d8b2d9b9fe4c21e4b9d 100644 (file)
@@ -109,13 +109,13 @@ _vbo_attribute_alias_map[VP_MODE_MAX][VERT_ATTRIB_MAX] = {
 
 
 void
-vbo_exec_init(struct gl_context *ctx)
+vbo_exec_init(struct gl_context *ctx, bool use_buffer_objects)
 {
    struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
 
    exec->ctx = ctx;
 
-   vbo_exec_vtx_init(exec);
+   vbo_exec_vtx_init(exec, use_buffer_objects);
 
    ctx->Driver.NeedFlush = 0;
    ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
index 92556906a15f55f1e2dfd7dc35a8b350b3261936..0d056b35dc933c64ed22a47bdf39fb6ed7b0ea7e 100644 (file)
@@ -122,13 +122,13 @@ struct vbo_exec_context
 
 
 void
-vbo_exec_init(struct gl_context *ctx);
+vbo_exec_init(struct gl_context *ctx, bool use_buffer_objects);
 
 void
 vbo_exec_destroy(struct gl_context *ctx);
 
 void
-vbo_exec_vtx_init(struct vbo_exec_context *exec);
+vbo_exec_vtx_init(struct vbo_exec_context *exec, bool use_buffer_objects);
 
 void
 vbo_exec_vtx_destroy(struct vbo_exec_context *exec);
index 9d048363782255b7921fe61a6be8b7189d6c3f37..758953162931cabc11278ff17eab4f97c778fd06 100644 (file)
@@ -979,38 +979,6 @@ vbo_exec_vtxfmt_init(struct vbo_exec_context *exec)
 }
 
 
-/**
- * Tell the VBO module to use a real OpenGL vertex buffer object to
- * store accumulated immediate-mode vertex data.
- * This replaces the malloced buffer which was created in
- * vb_exec_vtx_init() below.
- */
-void
-vbo_use_buffer_objects(struct gl_context *ctx)
-{
-   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
-   /* Any buffer name but 0 can be used here since this bufferobj won't
-    * go into the bufferobj hashtable.
-    */
-   GLuint bufName = IMM_BUFFER_NAME;
-
-   /* Make sure this func is only used once */
-   assert(exec->vtx.bufferobj == ctx->Shared->NullBufferObj);
-
-   _mesa_align_free(exec->vtx.buffer_map);
-   exec->vtx.buffer_map = NULL;
-   exec->vtx.buffer_ptr = NULL;
-
-   /* Allocate a real buffer object now */
-   _mesa_reference_buffer_object(ctx, &exec->vtx.bufferobj, NULL);
-   exec->vtx.bufferobj = ctx->Driver.NewBufferObject(ctx, bufName);
-
-   /* Map the buffer. */
-   vbo_exec_vtx_map(exec);
-   assert(exec->vtx.buffer_ptr);
-}
-
-
 static void
 vbo_reset_all_attr(struct vbo_exec_context *exec)
 {
@@ -1029,21 +997,28 @@ vbo_reset_all_attr(struct vbo_exec_context *exec)
 
 
 void
-vbo_exec_vtx_init(struct vbo_exec_context *exec)
+vbo_exec_vtx_init(struct vbo_exec_context *exec, bool use_buffer_objects)
 {
    struct gl_context *ctx = exec->ctx;
 
-   /* Allocate a buffer object.  Will just reuse this object
-    * continuously, unless vbo_use_buffer_objects() is called to enable
-    * use of real VBOs.
-    */
-   _mesa_reference_buffer_object(ctx,
-                                 &exec->vtx.bufferobj,
-                                 ctx->Shared->NullBufferObj);
+   if (use_buffer_objects) {
+      /* Use buffer objects for immediate mode. */
+      struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
 
-   assert(!exec->vtx.buffer_map);
-   exec->vtx.buffer_map = _mesa_align_malloc(VBO_VERT_BUFFER_SIZE, 64);
-   exec->vtx.buffer_ptr = exec->vtx.buffer_map;
+      exec->vtx.bufferobj = ctx->Driver.NewBufferObject(ctx, IMM_BUFFER_NAME);
+
+      /* Map the buffer. */
+      vbo_exec_vtx_map(exec);
+      assert(exec->vtx.buffer_ptr);
+   } else {
+      /* Use allocated memory for immediate mode. */
+      _mesa_reference_buffer_object(ctx,
+                                    &exec->vtx.bufferobj,
+                                    ctx->Shared->NullBufferObj);
+
+      exec->vtx.buffer_map = _mesa_align_malloc(VBO_VERT_BUFFER_SIZE, 64);
+      exec->vtx.buffer_ptr = exec->vtx.buffer_map;
+   }
 
    vbo_exec_vtxfmt_init(exec);
    _mesa_noop_vtxfmt_init(ctx, &exec->vtxfmt_noop);