From: Elizabeth Figura zfigura@codeweavers.com
This is normal and expected, and only a concern for performance. Avoid polluting warn+d3d logs. --- dlls/wined3d/adapter_gl.c | 1 - dlls/wined3d/device.c | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/dlls/wined3d/adapter_gl.c b/dlls/wined3d/adapter_gl.c index 1d622c298cb..de4729a56fc 100644 --- a/dlls/wined3d/adapter_gl.c +++ b/dlls/wined3d/adapter_gl.c @@ -4657,7 +4657,6 @@ static bool adapter_gl_alloc_bo(struct wined3d_device *device, struct wined3d_re
if (!(wined3d_device_gl_create_bo(device_gl, NULL, size, binding, usage, coherent, flags, bo_gl))) { - WARN("Failed to create OpenGL buffer.\n"); heap_free(bo_gl); return false; } diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index 201b76eab28..e529a8fd2d0 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1130,6 +1130,8 @@ bool wined3d_device_gl_create_bo(struct wined3d_device_gl *device_gl, struct win { if ((memory = wined3d_device_gl_allocate_memory(device_gl, context_gl, memory_type_idx, size, &id))) buffer_offset = memory->offset; + else if (!context_gl) + WARN_(d3d_perf)("Failed to suballocate buffer from the client thread.\n"); } else if (context_gl) { @@ -1139,7 +1141,8 @@ bool wined3d_device_gl_create_bo(struct wined3d_device_gl *device_gl, struct win
if (!id) { - WARN("Failed to allocate buffer.\n"); + if (context_gl) + WARN("Failed to allocate buffer.\n"); return false; } }
From: Elizabeth Figura zfigura@codeweavers.com
I don't know for sure that this is why iris (or nvidia) performs badly, but it seems perfectly plausible, and I don't think we lose anything by letting the driver allocate here.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=54223 --- dlls/wined3d/device.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index e529a8fd2d0..4aeade1d2de 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -1126,16 +1126,34 @@ bool wined3d_device_gl_create_bo(struct wined3d_device_gl *device_gl, struct win
if (gl_info->supported[ARB_BUFFER_STORAGE]) { - if (use_buffer_chunk_suballocation(device_gl, gl_info, binding)) + /* Only suballocate dynamic buffers. + * + * We only need suballocation so that we can allocate GL buffers from + * the client thread and thereby accelerate DISCARD maps. + * + * For other buffer types, suballocating means that a whole-buffer + * upload won't be replacing the whole buffer anymore. If the driver + * isn't smart enough to track individual buffer ranges then it'll + * force synchronizing that BO with the GPU. Even using ARB_sync + * ourselves won't help here, because glBufferSubData() is still + * implicitly synchronized. */ + if (flags & GL_CLIENT_STORAGE_BIT) { - if ((memory = wined3d_device_gl_allocate_memory(device_gl, context_gl, memory_type_idx, size, &id))) - buffer_offset = memory->offset; - else if (!context_gl) - WARN_(d3d_perf)("Failed to suballocate buffer from the client thread.\n"); + if (use_buffer_chunk_suballocation(device_gl, gl_info, binding)) + { + if ((memory = wined3d_device_gl_allocate_memory(device_gl, context_gl, memory_type_idx, size, &id))) + buffer_offset = memory->offset; + else if (!context_gl) + WARN_(d3d_perf)("Failed to suballocate buffer from the client thread.\n"); + } + else if (context_gl) + { + WARN_(d3d_perf)("Not allocating chunk memory for binding type %#x.\n", binding); + id = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type_idx, size); + } } - else if (context_gl) + else { - WARN_(d3d_perf)("Not allocating chunk memory for binding type %#x.\n", binding); id = wined3d_context_gl_allocate_vram_chunk_buffer(context_gl, memory_type_idx, size); }