Signed-off-by: Henri Verbeet hverbeet@codeweavers.com --- dlls/wined3d/buffer.c | 7 ------- dlls/wined3d/context_gl.c | 9 +++++++++ dlls/wined3d/resource.c | 4 ++-- 3 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c index 7a4e48fd9c6..5dbc66449f4 100644 --- a/dlls/wined3d/buffer.c +++ b/dlls/wined3d/buffer.c @@ -741,7 +741,6 @@ void * CDECL wined3d_buffer_get_parent(const struct wined3d_buffer *buffer) static void wined3d_buffer_gl_sync_apple(struct wined3d_buffer_gl *buffer_gl, uint32_t flags, struct wined3d_context_gl *context_gl) { - struct wined3d_device_gl *device_gl = wined3d_device_gl(buffer_gl->b.resource.device); const struct wined3d_gl_info *gl_info = context_gl->gl_info; struct wined3d_bo_gl *bo = &buffer_gl->bo;
@@ -759,12 +758,6 @@ static void wined3d_buffer_gl_sync_apple(struct wined3d_buffer_gl *buffer_gl, bo->command_fence_id = 0; return; } - - TRACE("Synchronizing buffer %p.\n", buffer_gl); - - if (bo->command_fence_id == device_gl->current_fence_id) - wined3d_context_gl_submit_command_fence(context_gl); - wined3d_context_gl_wait_command_fence(context_gl, bo->command_fence_id); }
static void buffer_mark_used(struct wined3d_buffer *buffer) diff --git a/dlls/wined3d/context_gl.c b/dlls/wined3d/context_gl.c index 83c61834f5a..406b325cda8 100644 --- a/dlls/wined3d/context_gl.c +++ b/dlls/wined3d/context_gl.c @@ -2653,6 +2653,7 @@ void wined3d_context_gl_submit_command_fence(struct wined3d_context_gl *context_ void *wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl, const struct wined3d_bo_address *data, size_t size, uint32_t flags) { + struct wined3d_device_gl *device_gl = wined3d_device_gl(context_gl->c.device); const struct wined3d_gl_info *gl_info; struct wined3d_bo_gl *bo; BYTE *memory; @@ -2660,6 +2661,14 @@ void *wined3d_context_gl_map_bo_address(struct wined3d_context_gl *context_gl, if (!(bo = (struct wined3d_bo_gl *)data->buffer_object)) return data->addr;
+ if (flags & (WINED3D_MAP_DISCARD | WINED3D_MAP_NOOVERWRITE)) + goto map; + + if (bo->command_fence_id == device_gl->current_fence_id) + wined3d_context_gl_submit_command_fence(context_gl); + wined3d_context_gl_wait_command_fence(context_gl, bo->command_fence_id); + +map: gl_info = context_gl->gl_info; wined3d_context_gl_bind_bo(context_gl, bo->binding, bo->id);
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c index 97b8b68374d..f6e233d8057 100644 --- a/dlls/wined3d/resource.c +++ b/dlls/wined3d/resource.c @@ -451,11 +451,11 @@ GLbitfield wined3d_resource_gl_map_flags(DWORD d3d_flags) ret |= GL_MAP_WRITE_BIT | GL_MAP_FLUSH_EXPLICIT_BIT; if (d3d_flags & WINED3D_MAP_READ) ret |= GL_MAP_READ_BIT; + else if (!(d3d_flags & WINED3D_MAP_DISCARD)) + ret |= GL_MAP_UNSYNCHRONIZED_BIT;
if (d3d_flags & WINED3D_MAP_DISCARD) ret |= GL_MAP_INVALIDATE_BUFFER_BIT; - if (d3d_flags & WINED3D_MAP_NOOVERWRITE) - ret |= GL_MAP_UNSYNCHRONIZED_BIT;
return ret; }