wined3d: Use wined3d_context_map_bo_address() in wined3d_buffer_gl_map().

Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
stable
Henri Verbeet 2019-09-23 14:54:18 +03:30 committed by Alexandre Julliard
parent 179c8cc86f
commit 47701b7231
1 changed files with 25 additions and 39 deletions

View File

@ -772,8 +772,9 @@ void * CDECL wined3d_buffer_get_parent(const struct wined3d_buffer *buffer)
/* The caller provides a context and binds the buffer */ /* The caller provides a context and binds the buffer */
static void wined3d_buffer_gl_sync_apple(struct wined3d_buffer_gl *buffer_gl, static void wined3d_buffer_gl_sync_apple(struct wined3d_buffer_gl *buffer_gl,
DWORD flags, const struct wined3d_gl_info *gl_info) uint32_t flags, struct wined3d_context_gl *context_gl)
{ {
const struct wined3d_gl_info *gl_info = context_gl->gl_info;
enum wined3d_fence_result ret; enum wined3d_fence_result ret;
HRESULT hr; HRESULT hr;
@ -784,6 +785,8 @@ static void wined3d_buffer_gl_sync_apple(struct wined3d_buffer_gl *buffer_gl,
if (flags & WINED3D_MAP_DISCARD) if (flags & WINED3D_MAP_DISCARD)
{ {
wined3d_buffer_gl_bind(buffer_gl, context_gl);
GL_EXTCALL(glBufferData(buffer_gl->buffer_type_hint, buffer_gl->b.resource.size, GL_EXTCALL(glBufferData(buffer_gl->buffer_type_hint, buffer_gl->b.resource.size,
NULL, buffer_gl->buffer_object_usage)); NULL, buffer_gl->buffer_object_usage));
checkGLcall("glBufferData"); checkGLcall("glBufferData");
@ -834,6 +837,7 @@ drop_fence:
} }
gl_info->gl_ops.gl.p_glFinish(); gl_info->gl_ops.gl.p_glFinish();
wined3d_buffer_gl_bind(buffer_gl, context_gl);
GL_EXTCALL(glBufferParameteriAPPLE(buffer_gl->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)); GL_EXTCALL(glBufferParameteriAPPLE(buffer_gl->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE));
checkGLcall("glBufferParameteriAPPLE(buffer_gl->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)"); checkGLcall("glBufferParameteriAPPLE(buffer_gl->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)");
buffer_gl->b.flags &= ~WINED3D_BUFFER_APPLESYNC; buffer_gl->b.flags &= ~WINED3D_BUFFER_APPLESYNC;
@ -964,7 +968,6 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
unsigned int offset, unsigned int size, BYTE **data, DWORD flags) unsigned int offset, unsigned int size, BYTE **data, DWORD flags)
{ {
struct wined3d_device *device = buffer_gl->b.resource.device; struct wined3d_device *device = buffer_gl->b.resource.device;
struct wined3d_context_gl *context_gl;
struct wined3d_context *context; struct wined3d_context *context;
LONG count; LONG count;
BYTE *base; BYTE *base;
@ -976,6 +979,7 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
if (buffer_gl->b.buffer_object) if (buffer_gl->b.buffer_object)
{ {
unsigned int dirty_offset = offset, dirty_size = size; unsigned int dirty_offset = offset, dirty_size = size;
struct wined3d_bo_address addr;
/* DISCARD invalidates the entire buffer, regardless of the specified /* DISCARD invalidates the entire buffer, regardless of the specified
* offset and size. Some applications also depend on the entire buffer * offset and size. Some applications also depend on the entire buffer
@ -1003,11 +1007,7 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
} }
else else
{ {
const struct wined3d_gl_info *gl_info;
context = context_acquire(device, NULL, 0); context = context_acquire(device, NULL, 0);
context_gl = wined3d_context_gl(context);
gl_info = context_gl->gl_info;
if (flags & WINED3D_MAP_DISCARD) if (flags & WINED3D_MAP_DISCARD)
wined3d_buffer_validate_location(&buffer_gl->b, WINED3D_LOCATION_BUFFER); wined3d_buffer_validate_location(&buffer_gl->b, WINED3D_LOCATION_BUFFER);
@ -1025,8 +1025,6 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
if (count == 1) if (count == 1)
{ {
wined3d_buffer_gl_bind(buffer_gl, context_gl);
/* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001 /* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001
* multitexture fill rate test seems to depend on this. When * multitexture fill rate test seems to depend on this. When
* we map a buffer with GL_MAP_INVALIDATE_BUFFER_BIT, the * we map a buffer with GL_MAP_INVALIDATE_BUFFER_BIT, the
@ -1037,28 +1035,19 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
if (buffer_gl->b.flags & WINED3D_BUFFER_DISCARD) if (buffer_gl->b.flags & WINED3D_BUFFER_DISCARD)
flags &= ~WINED3D_MAP_DISCARD; flags &= ~WINED3D_MAP_DISCARD;
if (gl_info->supported[ARB_MAP_BUFFER_RANGE]) if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
{ wined3d_buffer_gl_sync_apple(buffer_gl, flags, wined3d_context_gl(context));
GLbitfield mapflags = wined3d_resource_gl_map_flags(flags);
buffer_gl->b.map_ptr = GL_EXTCALL(glMapBufferRange(buffer_gl->buffer_type_hint, addr.buffer_object = buffer_gl->b.buffer_object;
0, buffer_gl->b.resource.size, mapflags)); addr.addr = 0;
checkGLcall("glMapBufferRange"); buffer_gl->b.map_ptr = wined3d_context_map_bo_address(context, &addr,
} buffer_gl->b.resource.size, buffer_gl->b.resource.bind_flags, flags);
else
{
if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
wined3d_buffer_gl_sync_apple(buffer_gl, flags, gl_info);
buffer_gl->b.map_ptr = GL_EXTCALL(glMapBuffer(buffer_gl->buffer_type_hint,
wined3d_resource_gl_legacy_map_flags(flags)));
checkGLcall("glMapBuffer");
}
if (((DWORD_PTR)buffer_gl->b.map_ptr) & (RESOURCE_ALIGNMENT - 1)) if (((DWORD_PTR)buffer_gl->b.map_ptr) & (RESOURCE_ALIGNMENT - 1))
{ {
WARN("Pointer %p is not %u byte aligned.\n", buffer_gl->b.map_ptr, RESOURCE_ALIGNMENT); WARN("Pointer %p is not %u byte aligned.\n", buffer_gl->b.map_ptr, RESOURCE_ALIGNMENT);
GL_EXTCALL(glUnmapBuffer(buffer_gl->buffer_type_hint)); wined3d_context_unmap_bo_address(context, &addr, buffer_gl->b.resource.bind_flags, 0, NULL);
checkGLcall("glUnmapBuffer");
buffer_gl->b.map_ptr = NULL; buffer_gl->b.map_ptr = NULL;
if (buffer_gl->b.resource.usage & WINED3DUSAGE_DYNAMIC) if (buffer_gl->b.resource.usage & WINED3DUSAGE_DYNAMIC)
@ -1122,36 +1111,33 @@ static void wined3d_buffer_gl_unmap(struct wined3d_buffer_gl *buffer_gl)
if (buffer_gl->b.map_ptr) if (buffer_gl->b.map_ptr)
{ {
struct wined3d_device *device = buffer_gl->b.resource.device; struct wined3d_device *device = buffer_gl->b.resource.device;
unsigned int range_count = buffer_gl->b.modified_areas;
const struct wined3d_gl_info *gl_info; const struct wined3d_gl_info *gl_info;
struct wined3d_context_gl *context_gl; struct wined3d_context_gl *context_gl;
struct wined3d_context *context; struct wined3d_context *context;
struct wined3d_bo_address addr;
context = context_acquire(device, NULL, 0); context = context_acquire(device, NULL, 0);
context_gl = wined3d_context_gl(context); context_gl = wined3d_context_gl(context);
gl_info = context_gl->gl_info; gl_info = context_gl->gl_info;
wined3d_buffer_gl_bind(buffer_gl, context_gl); if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
{ {
for (i = 0; i < buffer_gl->b.modified_areas; ++i) wined3d_buffer_gl_bind(buffer_gl, context_gl);
{ for (i = 0; i < range_count; ++i)
GL_EXTCALL(glFlushMappedBufferRange(buffer_gl->buffer_type_hint,
buffer_gl->b.maps[i].offset, buffer_gl->b.maps[i].size));
checkGLcall("glFlushMappedBufferRange");
}
}
else if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
{
for (i = 0; i < buffer_gl->b.modified_areas; ++i)
{ {
GL_EXTCALL(glFlushMappedBufferRangeAPPLE(buffer_gl->buffer_type_hint, GL_EXTCALL(glFlushMappedBufferRangeAPPLE(buffer_gl->buffer_type_hint,
buffer_gl->b.maps[i].offset, buffer_gl->b.maps[i].size)); buffer_gl->b.maps[i].offset, buffer_gl->b.maps[i].size));
checkGLcall("glFlushMappedBufferRangeAPPLE"); checkGLcall("glFlushMappedBufferRangeAPPLE");
} }
range_count = 0;
} }
GL_EXTCALL(glUnmapBuffer(buffer_gl->buffer_type_hint)); addr.buffer_object = buffer_gl->b.buffer_object;
addr.addr = 0;
wined3d_context_unmap_bo_address(context, &addr,
buffer_gl->b.resource.bind_flags, range_count, buffer_gl->b.maps);
context_release(context); context_release(context);
buffer_clear_dirty_areas(&buffer_gl->b); buffer_clear_dirty_areas(&buffer_gl->b);