On Mon, 8 Nov 2021 at 23:50, Zebediah Figura <zfigura(a)codeweavers.com> wrote:
+static void wined3d_buffer_set_bo(struct wined3d_buffer *buffer, struct wined3d_context *context, struct wined3d_bo *bo) +{ + struct wined3d_bo *prev_bo = buffer->buffer_object; + + TRACE("buffer %p, context %p, bo %p.\n", buffer, context, bo); + + if (prev_bo) + { + struct wined3d_bo_user *bo_user; + + LIST_FOR_EACH_ENTRY(bo_user, &prev_bo->users, struct wined3d_bo_user, entry) + bo_user->valid = false; + assert(list_empty(&bo->users)); + list_move_head(&bo->users, &prev_bo->users); + + wined3d_context_destroy_bo(context, prev_bo); + heap_free(prev_bo); + } + else + { + list_add_head(&bo->users, &buffer->bo_user.entry); + } + + buffer->buffer_object = bo; + wined3d_buffer_validate_location(buffer, WINED3D_LOCATION_BUFFER); + wined3d_buffer_invalidate_location(buffer, ~WINED3D_LOCATION_BUFFER); +} + The location management could now be in wined3d_buffer_update_sub_resource().