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>
This commit is contained in:
parent
42842306d3
commit
3707cef4fb
|
@ -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;
|
||||
/*@}*/
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue