diff options
author | Marek Olšák <[email protected]> | 2020-03-21 21:36:28 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2020-04-06 10:28:53 -0400 |
commit | e630271e0ec3eee7d921d76d3924873f6ee6b59b (patch) | |
tree | 28f71d8b21fbf1805325178c71233209920cdcd8 /src/mesa/main | |
parent | a0a0c68150b4dbba469c62159a327ae9465f6016 (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.c | 13 | ||||
-rw-r--r-- | src/mesa/main/arrayobj.c | 6 | ||||
-rw-r--r-- | src/mesa/main/bufferobj.c | 2 | ||||
-rw-r--r-- | src/mesa/main/draw.c | 4 | ||||
-rw-r--r-- | src/mesa/main/get.c | 15 | ||||
-rw-r--r-- | src/mesa/main/varray.c | 79 |
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"); |