From: Zebediah Figura zfigura@codeweavers.com
Instead of using glBufferSubData(). In practice, this means that we will either discard and rename the BO (if it's still in use) or write directly into it (if not).
This improves performance drastically on NVidia GL drivers.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=53408 --- dlls/wined3d/context_gl.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index 8c27b661617..0217e12d903 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -3118,14 +3118,23 @@ void wined3d_context_gl_copy_bo_address(struct wined3d_context_gl *context_gl, } else if (dst_bo && !src_bo) { - wined3d_context_gl_bind_bo(context_gl, dst_bo->binding, dst_bo->id); - for (i = 0; i < range_count; ++i) - GL_EXTCALL(glBufferSubData(dst_bo->binding, - dst_bo->b.buffer_offset + (GLintptr)dst->addr + ranges[i].offset, - ranges[i].size, src->addr + ranges[i].offset)); - checkGLcall("buffer upload"); + if ((map_flags & WINED3D_MAP_DISCARD) && (dst_bo->flags & GL_MAP_WRITE_BIT)) + { + dst_ptr = wined3d_context_gl_map_bo_address(context_gl, dst, dst_bo->size, map_flags); + memcpy(dst_ptr, src->addr, dst_bo->size); + wined3d_context_gl_unmap_bo_address(context_gl, dst, range_count, ranges); + } + else + { + wined3d_context_gl_bind_bo(context_gl, dst_bo->binding, dst_bo->id); + for (i = 0; i < range_count; ++i) + GL_EXTCALL(glBufferSubData(dst_bo->binding, + dst_bo->b.buffer_offset + (GLintptr)dst->addr + ranges[i].offset, + ranges[i].size, src->addr + ranges[i].offset)); + checkGLcall("buffer upload");
- wined3d_context_gl_reference_bo(context_gl, dst_bo); + wined3d_context_gl_reference_bo(context_gl, dst_bo); + } } else {