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 | |
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')
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_array.c | 31 | ||||
-rw-r--r-- | src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 7 | ||||
-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 | ||||
-rw-r--r-- | src/mesa/tnl/t_split_copy.c | 18 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_context.c | 4 | ||||
-rw-r--r-- | src/mesa/vbo/vbo_exec_api.c | 12 |
11 files changed, 113 insertions, 78 deletions
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_array.c b/src/mesa/drivers/dri/nouveau/nouveau_array.c index b77932f9c9c..114e98d9fa2 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_array.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_array.c @@ -109,26 +109,29 @@ nouveau_init_array(struct nouveau_array *a, int attr, int stride, a->type = type; a->buf = NULL; - if (obj) { - if (nouveau_bufferobj_hw(obj)) { - struct nouveau_bufferobj *nbo = - to_nouveau_bufferobj(obj); + if (nouveau_bufferobj_hw(obj)) { + struct nouveau_bufferobj *nbo = + to_nouveau_bufferobj(obj); - nouveau_bo_ref(nbo->bo, &a->bo); - a->offset = (intptr_t)ptr; + nouveau_bo_ref(nbo->bo, &a->bo); + a->offset = (intptr_t)ptr; - if (map) { - nouveau_bo_map(a->bo, NOUVEAU_BO_RD, client); - a->buf = a->bo->map + a->offset; - } + if (map) { + nouveau_bo_map(a->bo, NOUVEAU_BO_RD, client); + a->buf = a->bo->map + a->offset; + } - } else { - nouveau_bo_ref(NULL, &a->bo); - a->offset = 0; + } else { + nouveau_bo_ref(NULL, &a->bo); + a->offset = 0; - if (map) + if (map) { + if (obj) { a->buf = ADD_POINTERS( nouveau_bufferobj_sys(obj), ptr); + } else { + a->buf = ptr; + } } } diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c index f516bd3e4ab..d7e6c34c1e2 100644 --- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c +++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c @@ -343,8 +343,13 @@ vbo_bind_vertices(struct gl_context *ctx, const struct tnl_vertex_array *arrays, } else { int n = max_index - min_index + 1; - char *sp = (char *)ADD_POINTERS( + const char *sp; + if (obj) { + sp = (char *)ADD_POINTERS( nouveau_bufferobj_sys(obj), p) + delta; + } else { + sp = p + delta; + } char *dp = nouveau_get_scratch(ctx, n * a->stride, &bo[i], &offset[i]); 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"); diff --git a/src/mesa/tnl/t_split_copy.c b/src/mesa/tnl/t_split_copy.c index 57ff5bf0e03..5b300e93553 100644 --- a/src/mesa/tnl/t_split_copy.c +++ b/src/mesa/tnl/t_split_copy.c @@ -455,13 +455,17 @@ replay_init(struct copy_context *copy) copy->varying[j].size = attrib->Format._ElementSize; copy->vertex_size += attrib->Format._ElementSize; - if (_mesa_is_bufferobj(vbo) && - !_mesa_bufferobj_mapped(vbo, MAP_INTERNAL)) - ctx->Driver.MapBufferRange(ctx, 0, vbo->Size, GL_MAP_READ_BIT, vbo, - MAP_INTERNAL); + if (_mesa_is_bufferobj(vbo)) { + if (!_mesa_bufferobj_mapped(vbo, MAP_INTERNAL)) { + ctx->Driver.MapBufferRange(ctx, 0, vbo->Size, GL_MAP_READ_BIT, vbo, + MAP_INTERNAL); + } - copy->varying[j].src_ptr = - ADD_POINTERS(vbo->Mappings[MAP_INTERNAL].Pointer, ptr); + copy->varying[j].src_ptr = + ADD_POINTERS(vbo->Mappings[MAP_INTERNAL].Pointer, ptr); + } else { + copy->varying[j].src_ptr = ptr; + } copy->dstarray[i].VertexAttrib = ©->varying[j].dstattribs; copy->dstarray[i].BufferBinding = ©->varying[j].dstbinding; @@ -532,7 +536,7 @@ replay_init(struct copy_context *copy) dstattr->Format = srcattr->Format; dstattr->Ptr = copy->dstbuf + offset; dstbind->Stride = copy->vertex_size; - dstbind->BufferObj = ctx->Shared->NullBufferObj; + dstbind->BufferObj = NULL; dst->BufferBinding = dstbind; dst->VertexAttrib = dstattr; diff --git a/src/mesa/vbo/vbo_context.c b/src/mesa/vbo/vbo_context.c index ac8f9973f98..ad23655e6f0 100644 --- a/src/mesa/vbo/vbo_context.c +++ b/src/mesa/vbo/vbo_context.c @@ -168,8 +168,7 @@ _vbo_CreateContext(struct gl_context *ctx, bool use_buffer_objects) vbo->binding.Offset = 0; vbo->binding.Stride = 0; vbo->binding.InstanceDivisor = 0; - _mesa_reference_buffer_object(ctx, &vbo->binding.BufferObj, - ctx->Shared->NullBufferObj); + init_legacy_currval(ctx); init_generic_currval(ctx); init_mat_currval(ctx); @@ -202,7 +201,6 @@ _vbo_DestroyContext(struct gl_context *ctx) struct vbo_context *vbo = vbo_context(ctx); if (vbo) { - _mesa_reference_buffer_object(ctx, &vbo->binding.BufferObj, NULL); vbo_exec_destroy(ctx); diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c index 53269f18d3b..74be1c574a8 100644 --- a/src/mesa/vbo/vbo_exec_api.c +++ b/src/mesa/vbo/vbo_exec_api.c @@ -1013,10 +1013,7 @@ vbo_exec_vtx_init(struct vbo_exec_context *exec, bool use_buffer_objects) assert(exec->vtx.buffer_ptr); } else { /* Use allocated memory for immediate mode. */ - _mesa_reference_buffer_object(ctx, - &exec->vtx.bufferobj, - ctx->Shared->NullBufferObj); - + exec->vtx.bufferobj = NULL; exec->vtx.buffer_map = _mesa_align_malloc(ctx->Const.glBeginEndBufferSize, 64); exec->vtx.buffer_ptr = exec->vtx.buffer_map; @@ -1039,9 +1036,9 @@ vbo_exec_vtx_destroy(struct vbo_exec_context *exec) /* True VBOs should already be unmapped */ if (exec->vtx.buffer_map) { - assert(exec->vtx.bufferobj->Name == 0 || + assert(!exec->vtx.bufferobj || exec->vtx.bufferobj->Name == IMM_BUFFER_NAME); - if (exec->vtx.bufferobj->Name == 0) { + if (!exec->vtx.bufferobj) { _mesa_align_free(exec->vtx.buffer_map); exec->vtx.buffer_map = NULL; exec->vtx.buffer_ptr = NULL; @@ -1050,7 +1047,8 @@ vbo_exec_vtx_destroy(struct vbo_exec_context *exec) /* Free the vertex buffer. Unmap first if needed. */ - if (_mesa_bufferobj_mapped(exec->vtx.bufferobj, MAP_INTERNAL)) { + if (exec->vtx.bufferobj && + _mesa_bufferobj_mapped(exec->vtx.bufferobj, MAP_INTERNAL)) { ctx->Driver.UnmapBuffer(ctx, exec->vtx.bufferobj, MAP_INTERNAL); } _mesa_reference_buffer_object(ctx, &exec->vtx.bufferobj, NULL); |