aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-03-27 07:57:07 -0400
committerMarge Bot <[email protected]>2020-04-30 22:01:55 +0000
commit3707cef4fb3c4a2f5e015ea2525fcd41d8875f0b (patch)
tree194025f1a5a4afe4013403ed9bf5bc775d19b053 /src/mesa
parent42842306d3c7ba71f89022a1ebb09a4454a1b6e0 (diff)
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>
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/main/mtypes.h30
-rw-r--r--src/mesa/vbo/vbo.h132
-rw-r--r--src/mesa/vbo/vbo_context.c6
-rw-r--r--src/mesa/vbo/vbo_exec.h76
-rw-r--r--src/mesa/vbo/vbo_private.h17
-rw-r--r--src/mesa/vbo/vbo_save.h47
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;
/*@}*/
@@ -2067,19 +2067,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
*/
struct gl_program
@@ -4867,6 +4854,19 @@ struct gl_client_attrib_node
};
/**
+ * 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.
*
* This is the central context data structure for Mesa. Almost all
@@ -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);