Analogous to d71358f5e9e20f4a99354a0192b67009019b78d3 for the Vulkan backend.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52574 Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/wined3d/context_gl.c | 12 ++++++++++++ dlls/wined3d/wined3d_private.h | 1 + 2 files changed, 13 insertions(+)
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index bb186706ad5..8ac5c28c892 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -2713,6 +2713,7 @@ void wined3d_context_gl_submit_command_fence(struct wined3d_context_gl *context_ device_gl->completed_fence_id = 0; device_gl->current_fence_id = 1; } + device_gl->retired_bo_size = 0; wined3d_context_gl_cleanup_resources(context_gl); }
@@ -3123,15 +3124,26 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl,
void wined3d_context_gl_destroy_bo(struct wined3d_context_gl *context_gl, struct wined3d_bo_gl *bo) { + struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device); const struct wined3d_gl_info *gl_info = context_gl->gl_info;
TRACE("context_gl %p, bo %p.\n", context_gl, bo);
if (bo->memory) { + unsigned int order = bo->memory->order; + if (bo->b.map_ptr) wined3d_allocator_chunk_gl_unmap(wined3d_allocator_chunk_gl(bo->memory->chunk), context_gl); wined3d_context_gl_destroy_allocator_block(context_gl, bo->memory, bo->command_fence_id); + + if (bo->command_fence_id == device_gl->current_fence_id) + { + device_gl->retired_bo_size += WINED3D_ALLOCATOR_CHUNK_SIZE >> order; + if (device_gl->retired_bo_size > WINED3D_RETIRED_BO_SIZE_THRESHOLD) + wined3d_context_gl_submit_command_fence(context_gl); + } + bo->id = 0; return; } diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e46b6dfb9e0..e0a60a5807d 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4154,6 +4154,7 @@ struct wined3d_device_gl struct wined3d_allocator allocator; uint64_t completed_fence_id; uint64_t current_fence_id; + uint64_t retired_bo_size;
struct wined3d_retired_block_gl {