summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2020-03-21 21:36:28 -0400
committerMarek Olšák <[email protected]>2020-04-06 10:28:53 -0400
commite630271e0ec3eee7d921d76d3924873f6ee6b59b (patch)
tree28f71d8b21fbf1805325178c71233209920cdcd8 /src/mesa/main
parenta0a0c68150b4dbba469c62159a327ae9465f6016 (diff)
mesa: don't ever set NullBufferObj in gl_vertex_array_binding
This improves performance by 5% in the game "torcs", FPS: 98.83 -> 103.73 It does a lot of glPush/PopClientAttrib, which exacerbates the overhead of setting NullBufferObj. Reviewed-by: Pierre-Eric Pelloux-Prayer <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4466>
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/api_arrayelt.c13
-rw-r--r--src/mesa/main/arrayobj.c6
-rw-r--r--src/mesa/main/bufferobj.c2
-rw-r--r--src/mesa/main/draw.c4
-rw-r--r--src/mesa/main/get.c15
-rw-r--r--src/mesa/main/varray.c79
6 files changed, 73 insertions, 46 deletions
diff --git a/src/mesa/main/api_arrayelt.c b/src/mesa/main/api_arrayelt.c
index 022a1285c26..0dae3ef7740 100644
--- a/src/mesa/main/api_arrayelt.c
+++ b/src/mesa/main/api_arrayelt.c
@@ -1413,11 +1413,14 @@ attrib_src(const struct gl_vertex_array_object *vao,
{
const struct gl_vertex_buffer_binding *binding =
&vao->BufferBinding[array->BufferBindingIndex];
- const GLubyte *src
- = ADD_POINTERS(binding->BufferObj->Mappings[MAP_INTERNAL].Pointer,
- _mesa_vertex_attrib_address(array, binding))
- + elt * binding->Stride;
- return src;
+ const GLubyte *src = _mesa_vertex_attrib_address(array, binding);
+
+ if (_mesa_is_bufferobj(binding->BufferObj)) {
+ src = ADD_POINTERS(binding->BufferObj->Mappings[MAP_INTERNAL].Pointer,
+ src);
+ }
+
+ return src + elt * binding->Stride;
}
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
index 2c2c164123d..c05627b05b9 100644
--- a/src/mesa/main/arrayobj.c
+++ b/src/mesa/main/arrayobj.c
@@ -398,12 +398,6 @@ _mesa_initialize_vao(struct gl_context *ctx,
vao->Name = name;
_mesa_reference_buffer_object(ctx, &vao->IndexBufferObj,
ctx->Shared->NullBufferObj);
-
- /* Vertex array buffers */
- for (unsigned i = 0; i < ARRAY_SIZE(vao->BufferBinding); i++) {
- _mesa_reference_buffer_object(ctx, &vao->BufferBinding[i].BufferObj,
- ctx->Shared->NullBufferObj);
- }
}
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index 881a9d3e00e..9c4630bca12 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -1171,7 +1171,7 @@ unbind(struct gl_context *ctx,
struct gl_buffer_object *obj)
{
if (vao->BufferBinding[index].BufferObj == obj) {
- _mesa_bind_vertex_buffer(ctx, vao, index, ctx->Shared->NullBufferObj,
+ _mesa_bind_vertex_buffer(ctx, vao, index, NULL,
vao->BufferBinding[index].Offset,
vao->BufferBinding[index].Stride);
}
diff --git a/src/mesa/main/draw.c b/src/mesa/main/draw.c
index e856d9c5ef3..5bb254e00d2 100644
--- a/src/mesa/main/draw.c
+++ b/src/mesa/main/draw.c
@@ -90,7 +90,7 @@ check_array_data(struct gl_context *ctx, struct gl_vertex_array_object *vao,
array->Format.Type, array->Format.Size,
binding->Stride);
printf(" Address/offset %p in Buffer Object %u\n",
- array->Ptr, bo->Name);
+ array->Ptr, bo ? bo->Name : 0);
f[k] = 1.0F; /* XXX replace the bad value! */
}
/*assert(!IS_INF_OR_NAN(f[k])); */
@@ -255,7 +255,7 @@ print_draw_arrays(struct gl_context *ctx,
"ptr %p Bufobj %u\n",
gl_vert_attrib_name((gl_vert_attrib) i),
array->Format.Size, binding->Stride,
- array->Ptr, bufObj->Name);
+ array->Ptr, bufObj ? bufObj->Name : 0);
if (_mesa_is_bufferobj(bufObj)) {
GLubyte *p = bufObj->Mappings[MAP_INTERNAL].Pointer;
diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 8325786a396..cbfe9c8b309 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -690,7 +690,7 @@ static const int extra_EXT_disjoint_timer_query[] = {
static void
find_custom_value(struct gl_context *ctx, const struct value_desc *d, union value *v)
{
- struct gl_buffer_object **buffer_obj;
+ struct gl_buffer_object **buffer_obj, *buf;
struct gl_array_attributes *array;
GLuint unit, *p;
@@ -1006,14 +1006,14 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
buffer_obj = (struct gl_buffer_object **)
((char *) ctx->Array.VAO + d->offset);
- v->value_int = (*buffer_obj)->Name;
+ v->value_int = (*buffer_obj) ? (*buffer_obj)->Name : 0;
break;
case GL_ARRAY_BUFFER_BINDING_ARB:
v->value_int = ctx->Array.ArrayBufferObj->Name;
break;
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
- v->value_int =
- ctx->Array.VAO->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj->Name;
+ buf = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj;
+ v->value_int = buf ? buf->Name : 0;
break;
case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
v->value_int = ctx->Array.VAO->IndexBufferObj->Name;
@@ -1079,7 +1079,8 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
ctx->CurrentRenderbuffer ? ctx->CurrentRenderbuffer->Name : 0;
break;
case GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES:
- v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_POINT_SIZE].BufferObj->Name;
+ buf = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_POINT_SIZE].BufferObj;
+ v->value_int = buf ? buf->Name : 0;
break;
case GL_FOG_COLOR:
@@ -2394,6 +2395,7 @@ static enum value_type
find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
{
GET_CURRENT_CONTEXT(ctx);
+ struct gl_buffer_object *buf;
switch (pname) {
@@ -2642,7 +2644,8 @@ find_value_indexed(const char *func, GLenum pname, GLuint index, union value *v)
goto invalid_enum;
if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs)
goto invalid_value;
- v->value_int = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj->Name;
+ buf = ctx->Array.VAO->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj;
+ v->value_int = buf ? buf->Name : 0;
return TYPE_INT;
/* ARB_shader_image_load_store */
diff --git a/src/mesa/main/varray.c b/src/mesa/main/varray.c
index df63e556a36..ec5e7191761 100644
--- a/src/mesa/main/varray.c
+++ b/src/mesa/main/varray.c
@@ -204,6 +204,8 @@ _mesa_bind_vertex_buffer(struct gl_context *ctx,
assert(!vao->SharedAndImmutable);
struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[index];
+ assert(vbo != ctx->Shared->NullBufferObj);
+
if (ctx->Const.VertexBufferOffsetIsInt32 && (int)offset < 0 &&
_mesa_is_bufferobj(vbo)) {
/* The offset will be interpreted as a signed int, so make sure
@@ -899,6 +901,10 @@ update_array(struct gl_context *ctx,
assert((vao->NewArrays | ~vao->Enabled) & VERT_BIT(attrib));
array->Ptr = ptr;
+ /* TODO: remove this hack by not using NullBufferObj in callers */
+ if (obj == ctx->Shared->NullBufferObj)
+ obj = NULL;
+
/* Update the vertex buffer binding */
GLsizei effectiveStride = stride != 0 ?
stride : array->Format._ElementSize;
@@ -932,7 +938,7 @@ _lookup_vao_and_vbo_dsa(struct gl_context *ctx,
return false;
}
} else {
- *vbo = ctx->Shared->NullBufferObj;
+ *vbo = NULL;
}
return true;
@@ -2065,6 +2071,7 @@ get_vertex_array_attrib(struct gl_context *ctx,
const char *caller)
{
const struct gl_array_attributes *array;
+ struct gl_buffer_object *buf;
if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
_mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
@@ -2087,7 +2094,8 @@ get_vertex_array_attrib(struct gl_context *ctx,
case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
return array->Format.Normalized;
case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
- return vao->BufferBinding[array->BufferBindingIndex].BufferObj->Name;
+ buf = vao->BufferBinding[array->BufferBindingIndex].BufferObj;
+ return buf ? buf->Name : 0;
case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
if ((_mesa_is_desktop_gl(ctx)
&& (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))
@@ -2329,6 +2337,7 @@ _mesa_GetVertexArrayIndexediv(GLuint vaobj, GLuint index,
{
GET_CURRENT_CONTEXT(ctx);
struct gl_vertex_array_object *vao;
+ struct gl_buffer_object *buf;
/* The ARB_direct_state_access specification says:
*
@@ -2376,7 +2385,8 @@ _mesa_GetVertexArrayIndexediv(GLuint vaobj, GLuint index,
params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].InstanceDivisor;
break;
case GL_VERTEX_BINDING_BUFFER:
- params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj;
+ params[0] = buf ? buf->Name : 0;
break;
default:
params[0] = get_vertex_array_attrib(ctx, vao, index, pname,
@@ -2895,9 +2905,11 @@ vertex_array_vertex_buffer(struct gl_context *ctx,
GLsizei stride, bool no_error, const char *func)
{
struct gl_buffer_object *vbo;
- if (buffer ==
- vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj->Name) {
- vbo = vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj;
+ struct gl_buffer_object *current_buf =
+ vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj;
+
+ if (current_buf && buffer == current_buf->Name) {
+ vbo = current_buf;
} else if (buffer != 0) {
vbo = _mesa_lookup_bufferobj(ctx, buffer);
@@ -2923,7 +2935,7 @@ vertex_array_vertex_buffer(struct gl_context *ctx,
* "If <buffer> is zero, any buffer object attached to this
* bindpoint is detached."
*/
- vbo = ctx->Shared->NullBufferObj;
+ vbo = NULL;
}
_mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex),
@@ -3090,11 +3102,9 @@ vertex_array_vertex_buffers(struct gl_context *ctx,
* associated with the binding points are set to default values,
* ignoring <offsets> and <strides>."
*/
- struct gl_buffer_object *vbo = ctx->Shared->NullBufferObj;
-
for (i = 0; i < count; i++)
_mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(first + i),
- vbo, 0, 16);
+ NULL, 0, 16);
return;
}
@@ -3156,15 +3166,21 @@ vertex_array_vertex_buffers(struct gl_context *ctx,
struct gl_vertex_buffer_binding *binding =
&vao->BufferBinding[VERT_ATTRIB_GENERIC(first + i)];
- if (buffers[i] == binding->BufferObj->Name)
+ if (buffers[i] == 0)
+ vbo = NULL;
+ else if (binding->BufferObj && binding->BufferObj->Name == buffers[i])
vbo = binding->BufferObj;
- else
+ else {
vbo = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, i, func);
+ if (!vbo)
+ continue;
- if (!vbo)
- continue;
+ /* TODO: remove this hack */
+ if (vbo == ctx->Shared->NullBufferObj)
+ vbo = NULL;
+ }
} else {
- vbo = ctx->Shared->NullBufferObj;
+ vbo = NULL;
}
_mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(first + i),
@@ -3783,8 +3799,8 @@ _mesa_print_arrays(struct gl_context *ctx)
gl_vert_attrib_name((gl_vert_attrib)i),
array->Ptr, _mesa_enum_to_string(array->Format.Type),
array->Format.Size,
- array->Format._ElementSize, binding->Stride, bo->Name,
- (unsigned long) bo->Size);
+ array->Format._ElementSize, binding->Stride, bo ? bo->Name : 0,
+ (unsigned long) bo ? bo->Size : 0);
}
}
@@ -3903,6 +3919,7 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
{
GET_CURRENT_CONTEXT(ctx);
struct gl_vertex_array_object* vao;
+ struct gl_buffer_object *buf;
void* ptr;
vao = _mesa_lookup_vao_err(ctx, vaobj, true,
@@ -3932,7 +3949,8 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_POS].Stride;
break;
case GL_VERTEX_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_POS].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_POS].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_COLOR_ARRAY_SIZE:
*param = vao->VertexAttrib[VERT_ATTRIB_COLOR0].Format.Size;
@@ -3944,13 +3962,15 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_COLOR0].Stride;
break;
case GL_COLOR_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_COLOR0].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_COLOR0].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_EDGE_FLAG_ARRAY_STRIDE:
*param = vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Stride;
break;
case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_EDGEFLAG].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_EDGEFLAG].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_INDEX_ARRAY_TYPE:
*param = vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Format.Type;
@@ -3959,7 +3979,8 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Stride;
break;
case GL_INDEX_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_COLOR_INDEX].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_COLOR_INDEX].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_NORMAL_ARRAY_TYPE:
*param = vao->VertexAttrib[VERT_ATTRIB_NORMAL].Format.Type;
@@ -3968,7 +3989,8 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_NORMAL].Stride;
break;
case GL_NORMAL_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_NORMAL].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_NORMAL].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_TEXTURE_COORD_ARRAY_SIZE:
*param = vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Format.Size;
@@ -3980,7 +4002,8 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Stride;
break;
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_FOG_COORD_ARRAY_TYPE:
*param = vao->VertexAttrib[VERT_ATTRIB_FOG].Format.Type;
@@ -3989,7 +4012,8 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_FOG].Stride;
break;
case GL_FOG_COORD_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_FOG].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_FOG].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
case GL_SECONDARY_COLOR_ARRAY_SIZE:
*param = vao->VertexAttrib[VERT_ATTRIB_COLOR1].Format.Size;
@@ -4001,7 +4025,8 @@ _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
*param = vao->VertexAttrib[VERT_ATTRIB_COLOR1].Stride;
break;
case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_COLOR1].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_COLOR1].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
/* Tokens using IsEnabled */
@@ -4089,6 +4114,7 @@ _mesa_GetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLin
{
GET_CURRENT_CONTEXT(ctx);
struct gl_vertex_array_object* vao;
+ struct gl_buffer_object *buf;
vao = _mesa_lookup_vao_err(ctx, vaobj, true,
"glGetVertexArrayIntegeri_vEXT");
@@ -4120,7 +4146,8 @@ _mesa_GetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLin
*param = vao->VertexAttrib[VERT_ATTRIB_TEX(index)].Stride;
break;
case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
- *param = vao->BufferBinding[VERT_ATTRIB_TEX(index)].BufferObj->Name;
+ buf = vao->BufferBinding[VERT_ATTRIB_TEX(index)].BufferObj;
+ *param = buf ? buf->Name : 0;
break;
default:
*param = get_vertex_array_attrib(ctx, vao, index, pname, "glGetVertexArrayIntegeri_vEXT");