[PATCH 5/5] wined3d: Use wined3d_context_map_bo_address() in wined3d_buffer_gl_map().
Henri Verbeet
hverbeet at codeweavers.com
Mon Sep 23 06:24:18 CDT 2019
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
---
dlls/wined3d/buffer.c | 64 ++++++++++++++++++++-------------------------------
1 file changed, 25 insertions(+), 39 deletions(-)
diff --git a/dlls/wined3d/buffer.c b/dlls/wined3d/buffer.c
index f483c523406..b8c5117f89e 100644
--- a/dlls/wined3d/buffer.c
+++ b/dlls/wined3d/buffer.c
@@ -772,8 +772,9 @@ void * CDECL wined3d_buffer_get_parent(const struct wined3d_buffer *buffer)
/* The caller provides a context and binds the buffer */
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;
HRESULT hr;
@@ -784,6 +785,8 @@ static void wined3d_buffer_gl_sync_apple(struct wined3d_buffer_gl *buffer_gl,
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,
NULL, buffer_gl->buffer_object_usage));
checkGLcall("glBufferData");
@@ -834,6 +837,7 @@ drop_fence:
}
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));
checkGLcall("glBufferParameteriAPPLE(buffer_gl->buffer_type_hint, GL_BUFFER_SERIALIZED_MODIFY_APPLE, GL_TRUE)");
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)
{
struct wined3d_device *device = buffer_gl->b.resource.device;
- struct wined3d_context_gl *context_gl;
struct wined3d_context *context;
LONG count;
BYTE *base;
@@ -976,6 +979,7 @@ static HRESULT wined3d_buffer_gl_map(struct wined3d_buffer_gl *buffer_gl,
if (buffer_gl->b.buffer_object)
{
unsigned int dirty_offset = offset, dirty_size = size;
+ struct wined3d_bo_address addr;
/* DISCARD invalidates the entire buffer, regardless of the specified
* 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
{
- const struct wined3d_gl_info *gl_info;
-
context = context_acquire(device, NULL, 0);
- context_gl = wined3d_context_gl(context);
- gl_info = context_gl->gl_info;
if (flags & WINED3D_MAP_DISCARD)
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)
{
- wined3d_buffer_gl_bind(buffer_gl, context_gl);
-
/* Filter redundant WINED3D_MAP_DISCARD maps. The 3DMark2001
* multitexture fill rate test seems to depend on this. When
* 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)
flags &= ~WINED3D_MAP_DISCARD;
- if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
- {
- GLbitfield mapflags = wined3d_resource_gl_map_flags(flags);
- buffer_gl->b.map_ptr = GL_EXTCALL(glMapBufferRange(buffer_gl->buffer_type_hint,
- 0, buffer_gl->b.resource.size, mapflags));
- checkGLcall("glMapBufferRange");
- }
- 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 (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
+ wined3d_buffer_gl_sync_apple(buffer_gl, flags, wined3d_context_gl(context));
+
+ addr.buffer_object = buffer_gl->b.buffer_object;
+ addr.addr = 0;
+ buffer_gl->b.map_ptr = wined3d_context_map_bo_address(context, &addr,
+ buffer_gl->b.resource.size, buffer_gl->b.resource.bind_flags, flags);
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);
- GL_EXTCALL(glUnmapBuffer(buffer_gl->buffer_type_hint));
- checkGLcall("glUnmapBuffer");
+ wined3d_context_unmap_bo_address(context, &addr, buffer_gl->b.resource.bind_flags, 0, NULL);
buffer_gl->b.map_ptr = NULL;
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)
{
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;
struct wined3d_context_gl *context_gl;
struct wined3d_context *context;
+ struct wined3d_bo_address addr;
context = context_acquire(device, NULL, 0);
context_gl = wined3d_context_gl(context);
gl_info = context_gl->gl_info;
- wined3d_buffer_gl_bind(buffer_gl, context_gl);
-
- if (gl_info->supported[ARB_MAP_BUFFER_RANGE])
+ if (buffer_gl->b.flags & WINED3D_BUFFER_APPLESYNC)
{
- for (i = 0; i < buffer_gl->b.modified_areas; ++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)
+ wined3d_buffer_gl_bind(buffer_gl, context_gl);
+ for (i = 0; i < range_count; ++i)
{
GL_EXTCALL(glFlushMappedBufferRangeAPPLE(buffer_gl->buffer_type_hint,
buffer_gl->b.maps[i].offset, buffer_gl->b.maps[i].size));
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);
buffer_clear_dirty_areas(&buffer_gl->b);
--
2.11.0
More information about the wine-devel
mailing list