From 3707cef4fb3c4a2f5e015ea2525fcd41d8875f0b Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 27 Mar 2020 07:57:07 -0400 Subject: [PATCH] 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: --- 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 #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); -- 2.30.2