Mesa (master): mesa: inline vbo_context inside gl_context to remove vbo_context dereferences

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Thu Apr 30 22:24:57 UTC 2020


Module: Mesa
Branch: master
Commit: 3707cef4fb3c4a2f5e015ea2525fcd41d8875f0b
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3707cef4fb3c4a2f5e015ea2525fcd41d8875f0b

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Fri Mar 27 07:57:07 2020 -0400

mesa: inline vbo_context inside gl_context to remove vbo_context dereferences

The number of lines in the disassembly of vbo_exec_api.c.o decreased
by 4.5%, which roughly corresponds to a decrease in instructions
for immediate mode thanks to the removal of ctx->vbo_context dereferences.

It increases performance in one Viewperf11 subtest by 2.8%.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4314>

---

 src/mesa/main/mtypes.h     |  30 +++++------
 src/mesa/vbo/vbo.h         | 132 +++++++++++++++++++++++++++++++++++++++++++++
 src/mesa/vbo/vbo_context.c |   6 +--
 src/mesa/vbo/vbo_exec.h    |  76 --------------------------
 src/mesa/vbo/vbo_private.h |  17 +-----
 src/mesa/vbo/vbo_save.h    |  47 ----------------
 6 files changed, 151 insertions(+), 157 deletions(-)

diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index f7cccbcc0a0..7e31adcfaad 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -50,6 +50,7 @@
 #include "compiler/glsl/list.h"
 #include "util/simple_mtx.h"
 #include "util/u_dynarray.h"
+#include "vbo/vbo.h"
 
 
 #ifdef __cplusplus
@@ -79,7 +80,6 @@ struct gl_program_parameter_list;
 struct gl_shader_spirv_data;
 struct set;
 struct shader_includes;
-struct vbo_context;
 /*@}*/
 
 
@@ -2066,19 +2066,6 @@ struct gl_bindless_image
 };
 
 
-/**
- * Current vertex processing mode: fixed function vs. shader.
- * In reality, fixed function is probably implemented by a shader but that's
- * not what we care about here.
- */
-typedef enum
-{
-   VP_MODE_FF,     /**< legacy / fixed function */
-   VP_MODE_SHADER, /**< ARB vertex program or GLSL vertex shader */
-   VP_MODE_MAX     /**< for sizing arrays */
-} gl_vertex_processing_mode;
-
-
 /**
  * Base class for any kind of program object
  */
@@ -4866,6 +4853,19 @@ struct gl_client_attrib_node
    struct gl_pixelstore_attrib Unpack;
 };
 
+/**
+ * The VBO module implemented in src/vbo.
+ */
+struct vbo_context {
+   struct gl_vertex_buffer_binding binding;
+   struct gl_array_attributes current[VBO_ATTRIB_MAX];
+
+   struct gl_vertex_array_object *VAO;
+
+   struct vbo_exec_context exec;
+   struct vbo_save_context save;
+};
+
 /**
  * Mesa rendering context.
  *
@@ -5213,7 +5213,7 @@ struct gl_context
    void *swrast_context;
    void *swsetup_context;
    void *swtnl_context;
-   struct vbo_context *vbo_context;
+   struct vbo_context vbo_context;
    struct st_context *st;
    /*@}*/
 
diff --git a/src/mesa/vbo/vbo.h b/src/mesa/vbo/vbo.h
index bd99e246514..e087ce0e1b2 100644
--- a/src/mesa/vbo/vbo.h
+++ b/src/mesa/vbo/vbo.h
@@ -33,13 +33,145 @@
 
 #include <stdbool.h>
 #include "main/glheader.h"
+#include "main/dd.h"
 #include "main/draw.h"
+#include "main/macros.h"
+#include "vbo_attrib.h"
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 struct gl_context;
+struct vbo_module;
+
+/**
+ * Max number of primitives (number of glBegin/End pairs) per VBO.
+ */
+#define VBO_MAX_PRIM 64
+
+
+/**
+ * Current vertex processing mode: fixed function vs. shader.
+ * In reality, fixed function is probably implemented by a shader but that's
+ * not what we care about here.
+ */
+typedef enum
+{
+   VP_MODE_FF,     /**< legacy / fixed function */
+   VP_MODE_SHADER, /**< ARB vertex program or GLSL vertex shader */
+   VP_MODE_MAX     /**< for sizing arrays */
+} gl_vertex_processing_mode;
+
+
+struct vbo_exec_eval1_map {
+   struct gl_1d_map *map;
+   GLuint sz;
+};
+
+struct vbo_exec_eval2_map {
+   struct gl_2d_map *map;
+   GLuint sz;
+};
+
+struct vbo_exec_copied_vtx {
+   fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
+   GLuint nr;
+};
+
+struct vbo_exec_context
+{
+   struct gl_context *ctx;
+   GLvertexformat vtxfmt;
+   GLvertexformat vtxfmt_noop;
+
+   struct {
+      struct gl_buffer_object *bufferobj;
+
+      GLuint vertex_size;       /* in dwords */
+      GLuint vertex_size_no_pos;
+
+      struct _mesa_prim prim[VBO_MAX_PRIM];
+      GLuint prim_count;
+
+      fi_type *buffer_map;
+      fi_type *buffer_ptr;              /* cursor, points into buffer */
+      GLuint   buffer_used;             /* in bytes */
+      unsigned buffer_offset;           /* only for persistent mappings */
+      fi_type vertex[VBO_ATTRIB_MAX*4]; /* current vertex */
+
+      GLuint vert_count;   /**< Number of vertices currently in buffer */
+      GLuint max_vert;     /**< Max number of vertices allowed in buffer */
+      struct vbo_exec_copied_vtx copied;
+
+      GLbitfield64 enabled;             /**< mask of enabled vbo arrays. */
+
+      /* Keep these packed in a structure for faster access. */
+      struct {
+         GLenum16 type;       /**< GL_FLOAT, GL_DOUBLE, GL_INT, etc */
+         GLubyte active_size; /**< number of components, but can shrink */
+         GLubyte size;        /**< number of components (1..4) */
+      } attr[VBO_ATTRIB_MAX];
+
+      /** pointers into the current 'vertex' array, declared above */
+      fi_type *attrptr[VBO_ATTRIB_MAX];
+   } vtx;
+
+   struct {
+      GLboolean recalculate_maps;
+      struct vbo_exec_eval1_map map1[VERT_ATTRIB_MAX];
+      struct vbo_exec_eval2_map map2[VERT_ATTRIB_MAX];
+   } eval;
+
+#ifndef NDEBUG
+   GLint flush_call_depth;
+#endif
+};
+
+struct vbo_save_copied_vtx {
+   fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
+   GLuint nr;
+};
+
+struct vbo_save_context {
+   struct gl_context *ctx;
+   GLvertexformat vtxfmt;
+   GLvertexformat vtxfmt_noop;  /**< Used if out_of_memory is true */
+
+   GLbitfield64 enabled; /**< mask of enabled vbo arrays. */
+   GLubyte attrsz[VBO_ATTRIB_MAX];  /**< 1, 2, 3 or 4 */
+   GLenum16 attrtype[VBO_ATTRIB_MAX];  /**< GL_FLOAT, GL_INT, etc */
+   GLubyte active_sz[VBO_ATTRIB_MAX];  /**< 1, 2, 3 or 4 */
+   GLuint vertex_size;  /**< size in GLfloats */
+   struct gl_vertex_array_object *VAO[VP_MODE_MAX];
+
+   GLboolean out_of_memory;  /**< True if last VBO allocation failed */
+
+   GLbitfield replay_flags;
+
+   struct _mesa_prim *prims;
+   GLuint prim_count, prim_max;
+
+   bool no_current_update;
+
+   struct vbo_save_vertex_store *vertex_store;
+   struct vbo_save_primitive_store *prim_store;
+
+   fi_type *buffer_map;            /**< Mapping of vertex_store's buffer */
+   fi_type *buffer_ptr;		   /**< cursor, points into buffer_map */
+   fi_type vertex[VBO_ATTRIB_MAX*4];	   /* current values */
+   fi_type *attrptr[VBO_ATTRIB_MAX];
+   GLuint vert_count;
+   GLuint max_vert;
+   GLboolean dangling_attr_ref;
+
+   GLuint opcode_vertex_list;
+
+   struct vbo_save_copied_vtx copied;
+
+   fi_type *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */
+   GLubyte *currentsz[VBO_ATTRIB_MAX];
+};
 
 GLboolean
 _vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects);
diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c
index 698419efe0a..9cef64018ef 100644
--- a/src/mesa/vbo/vbo_context.c
+++ b/src/mesa/vbo/vbo_context.c
@@ -160,9 +160,9 @@ vbo_exec_update_eval_maps(struct gl_context *ctx)
 GLboolean
 _vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects)
 {
-   struct vbo_context *vbo = CALLOC_STRUCT(vbo_context);
+   struct vbo_context *vbo = &ctx->vbo_context;
 
-   ctx->vbo_context = vbo;
+   memset(vbo, 0, sizeof(*vbo));
 
    vbo->binding.Offset = 0;
    vbo->binding.Stride = 0;
@@ -206,8 +206,6 @@ _vbo_DestroyContext(struct gl_context *ctx)
       if (ctx->API == API_OPENGL_COMPAT)
          vbo_save_destroy(ctx);
       _mesa_reference_vao(ctx, &vbo->VAO, NULL);
-      free(vbo);
-      ctx->vbo_context = NULL;
    }
 }
 
diff --git a/src/mesa/vbo/vbo_exec.h b/src/mesa/vbo/vbo_exec.h
index 040dfc19046..c8b141dbc5b 100644
--- a/src/mesa/vbo/vbo_exec.h
+++ b/src/mesa/vbo/vbo_exec.h
@@ -39,82 +39,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "vbo.h"
 #include "vbo_attrib.h"
 
-
-/**
- * Max number of primitives (number of glBegin/End pairs) per VBO.
- */
-#define VBO_MAX_PRIM 64
-
-
-struct vbo_exec_eval1_map {
-   struct gl_1d_map *map;
-   GLuint sz;
-};
-
-struct vbo_exec_eval2_map {
-   struct gl_2d_map *map;
-   GLuint sz;
-};
-
-
-
-struct vbo_exec_copied_vtx {
-   fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
-   GLuint nr;
-};
-
-
-struct vbo_exec_context
-{
-   struct gl_context *ctx;
-   GLvertexformat vtxfmt;
-   GLvertexformat vtxfmt_noop;
-
-   struct {
-      struct gl_buffer_object *bufferobj;
-
-      GLuint vertex_size;       /* in dwords */
-      GLuint vertex_size_no_pos;
-
-      struct _mesa_prim prim[VBO_MAX_PRIM];
-      GLuint prim_count;
-
-      fi_type *buffer_map;
-      fi_type *buffer_ptr;              /* cursor, points into buffer */
-      GLuint   buffer_used;             /* in bytes */
-      unsigned buffer_offset;           /* only for persistent mappings */
-      fi_type vertex[VBO_ATTRIB_MAX*4]; /* current vertex */
-
-      GLuint vert_count;   /**< Number of vertices currently in buffer */
-      GLuint max_vert;     /**< Max number of vertices allowed in buffer */
-      struct vbo_exec_copied_vtx copied;
-
-      GLbitfield64 enabled;             /**< mask of enabled vbo arrays. */
-
-      /* Keep these packed in a structure for faster access. */
-      struct {
-         GLenum16 type;       /**< GL_FLOAT, GL_DOUBLE, GL_INT, etc */
-         GLubyte active_size; /**< number of components, but can shrink */
-         GLubyte size;        /**< number of components (1..4) */
-      } attr[VBO_ATTRIB_MAX];
-
-      /** pointers into the current 'vertex' array, declared above */
-      fi_type *attrptr[VBO_ATTRIB_MAX];
-   } vtx;
-
-   struct {
-      GLboolean recalculate_maps;
-      struct vbo_exec_eval1_map map1[VERT_ATTRIB_MAX];
-      struct vbo_exec_eval2_map map2[VERT_ATTRIB_MAX];
-   } eval;
-
-#ifndef NDEBUG
-   GLint flush_call_depth;
-#endif
-};
-
-
-
 void
 vbo_exec_init(struct gl_context *ctx, bool use_buffer_objects);
 
diff --git a/src/mesa/vbo/vbo_private.h b/src/mesa/vbo/vbo_private.h
index 85396654682..97cd2776400 100644
--- a/src/mesa/vbo/vbo_private.h
+++ b/src/mesa/vbo/vbo_private.h
@@ -40,31 +40,18 @@
 
 
 struct _glapi_table;
-struct _mesa_prim;
-
-
-struct vbo_context {
-   struct gl_vertex_buffer_binding binding;
-   struct gl_array_attributes current[VBO_ATTRIB_MAX];
-
-   struct gl_vertex_array_object *VAO;
-
-   struct vbo_exec_context exec;
-   struct vbo_save_context save;
-};
-
 
 static inline struct vbo_context *
 vbo_context(struct gl_context *ctx)
 {
-   return ctx->vbo_context;
+   return &ctx->vbo_context;
 }
 
 
 static inline const struct vbo_context *
 vbo_context_const(const struct gl_context *ctx)
 {
-   return ctx->vbo_context;
+   return &ctx->vbo_context;
 }
 
 
diff --git a/src/mesa/vbo/vbo_save.h b/src/mesa/vbo/vbo_save.h
index e8677b1ac59..a9842514011 100644
--- a/src/mesa/vbo/vbo_save.h
+++ b/src/mesa/vbo/vbo_save.h
@@ -37,13 +37,6 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 #include "vbo.h"
 #include "vbo_attrib.h"
 
-
-struct vbo_save_copied_vtx {
-   fi_type buffer[VBO_ATTRIB_MAX * 4 * VBO_MAX_COPIED_VERTS];
-   GLuint nr;
-};
-
-
 /* For display lists, this structure holds a run of vertices of the
  * same format, and a strictly well-formed set of begin/end pairs,
  * starting on the first vertex and ending at the last.  Vertex
@@ -153,46 +146,6 @@ struct vbo_save_primitive_store {
 };
 
 
-struct vbo_save_context {
-   struct gl_context *ctx;
-   GLvertexformat vtxfmt;
-   GLvertexformat vtxfmt_noop;  /**< Used if out_of_memory is true */
-
-   GLbitfield64 enabled; /**< mask of enabled vbo arrays. */
-   GLubyte attrsz[VBO_ATTRIB_MAX];  /**< 1, 2, 3 or 4 */
-   GLenum16 attrtype[VBO_ATTRIB_MAX];  /**< GL_FLOAT, GL_INT, etc */
-   GLubyte active_sz[VBO_ATTRIB_MAX];  /**< 1, 2, 3 or 4 */
-   GLuint vertex_size;  /**< size in GLfloats */
-   struct gl_vertex_array_object *VAO[VP_MODE_MAX];
-
-   GLboolean out_of_memory;  /**< True if last VBO allocation failed */
-
-   GLbitfield replay_flags;
-
-   struct _mesa_prim *prims;
-   GLuint prim_count, prim_max;
-
-   bool no_current_update;
-
-   struct vbo_save_vertex_store *vertex_store;
-   struct vbo_save_primitive_store *prim_store;
-
-   fi_type *buffer_map;            /**< Mapping of vertex_store's buffer */
-   fi_type *buffer_ptr;		   /**< cursor, points into buffer_map */
-   fi_type vertex[VBO_ATTRIB_MAX*4];	   /* current values */
-   fi_type *attrptr[VBO_ATTRIB_MAX];
-   GLuint vert_count;
-   GLuint max_vert;
-   GLboolean dangling_attr_ref;
-
-   GLuint opcode_vertex_list;
-
-   struct vbo_save_copied_vtx copied;
-
-   fi_type *current[VBO_ATTRIB_MAX]; /* points into ctx->ListState */
-   GLubyte *currentsz[VBO_ATTRIB_MAX];
-};
-
 void vbo_save_init(struct gl_context *ctx);
 void vbo_save_destroy(struct gl_context *ctx);
 



More information about the mesa-commit mailing list